TEST_F(ClangQueryGatherer, FilterDuplicates)
{
    manyGatherer.setProcessingSlotCount(3);
    manyGatherer.startCreateNextSourceRangesMessages();
    manyGatherer.waitForFinished();

    auto messages = manyGatherer.finishedMessages();

    ASSERT_THAT(messages,
                AllOf(SizeIs(3),
                      UnorderedElementsAre(
                          Field(&SourceRangesForQueryMessage::sourceRanges,
                                Field(&SourceRangesContainer::sourceRangeWithTextContainers,
                                      UnorderedElementsAre(
                                          IsSourceRangeWithText(1, 1, 1, 9, "void f();"),
                                          IsSourceRangeWithText(2, 1, 2, 12, "void f() {}")))),
                          Field(&SourceRangesForQueryMessage::sourceRanges,
                                Field(&SourceRangesContainer::sourceRangeWithTextContainers,
                                      UnorderedElementsAre(
                                          IsSourceRangeWithText(1, 1, 1, 13, "int header();"),
                                          IsSourceRangeWithText(3, 1, 3, 15, "int function();")))),
                          Field(&SourceRangesForQueryMessage::sourceRanges,
                                Field(&SourceRangesContainer::sourceRangeWithTextContainers,
                                      UnorderedElementsAre(
                                          IsSourceRangeWithText(3, 1, 3, 15, "int function();")))))));
}
TEST_F(BaseTestSpecTests, TestSuite_WithGroups) {
    RawTestSuite rawTestSuite = specWithTestGroups.buildRawTestSuite();
    EXPECT_THAT(rawTestSuite.sampleTests(), SizeIs(2));
    EXPECT_THAT(rawTestSuite.officialTests(), ElementsAre(
            AllOf(Property(&OfficialTestGroup::id, 1), Property(&OfficialTestGroup::officialTestCases, SizeIs(3))),
            AllOf(Property(&OfficialTestGroup::id, 2), Property(&OfficialTestGroup::officialTestCases, SizeIs(2)))));
}
TEST_F(ClangQueryGatherer, AfterRestartCreateSourceRangesMessagesFutureCountIsTwos)
{
    manyGatherer.startCreateNextSourceRangesMessages();

    manyGatherer.startCreateNextSourceRangesMessages();

    ASSERT_THAT(manyGatherer.sourceFutures(), SizeIs(2));
}
TEST_F(ClangQueryGatherer, AfterGetFinishedMessagesFuturesAreReduced)
{
    manyGatherer.startCreateNextSourceRangesMessages();
    manyGatherer.waitForFinished();

    manyGatherer.finishedMessages();

    ASSERT_THAT(manyGatherer.sourceFutures(), SizeIs(0));
}
TEST_F(ClangQueryGatherer, SourceFutureIsOneInTheSecondRun)
{
    manyGatherer.startCreateNextSourceRangesMessages();
    manyGatherer.waitForFinished();
    manyGatherer.finishedMessages();

    manyGatherer.startCreateNextSourceRangesMessages();

    ASSERT_THAT(manyGatherer.sourceFutures(), SizeIs(1));
}
TEST_F(ClangQueryGatherer, GetOneMessageInTheSecondRun)
{
    manyGatherer.startCreateNextSourceRangesMessages();
    manyGatherer.waitForFinished();
    manyGatherer.finishedMessages();
    manyGatherer.startCreateNextSourceRangesMessages();
    manyGatherer.waitForFinished();

    auto messages = manyGatherer.finishedMessages();

    ASSERT_THAT(messages, SizeIs(1));
}
TEST_F(ClangQueryGatherer, GetFinishedMessagesAfterSecondPass)
{
    manyGatherer.startCreateNextSourceRangesMessages();
    manyGatherer.waitForFinished();
    manyGatherer.finishedMessages();
    manyGatherer.startCreateNextSourceRangesMessages();
    manyGatherer.waitForFinished();

    auto messages = manyGatherer.finishedMessages();

    ASSERT_THAT(messages,
                AllOf(SizeIs(1),
                      ElementsAre(
                          Field(&SourceRangesForQueryMessage::sourceRanges,
                                Field(&SourceRangesContainer::sourceRangeWithTextContainers,
                                      UnorderedElementsAre(
                                          IsSourceRangeWithText(3, 1, 3, 15, "int function();")))))));
}
TEST_F(ClangQueryGatherer, StartCreateSourceRangesForNextSourcePopsSource)
{
    manyGatherer.startCreateNextSourceRangesMessage();

    ASSERT_THAT(manyGatherer.sources(), SizeIs(2));
}