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(ClangQueryGatherer, AfterStartCreateSourceRangesMessagesGetCollected)
{
    manyGatherer.startCreateNextSourceRangesMessages();

    ASSERT_THAT(manyGatherer.allCurrentProcessedMessages(),
                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();"))))));
}
TEST_F(SwitchInputMapperTest, testConfigureDevice) {
    MockInputReportDefinition reportDef;
    MockInputDeviceNode deviceNode;
    deviceNode.addSwitch(SW_LID);
    deviceNode.addSwitch(SW_CAMERA_LENS_COVER);

    EXPECT_CALL(reportDef, addCollection(INPUT_COLLECTION_ID_SWITCH, 1));
    EXPECT_CALL(reportDef, declareUsages(INPUT_COLLECTION_ID_SWITCH, _, 2))
    .With(Args<1,2>(UnorderedElementsAre(INPUT_USAGE_SWITCH_LID,
                                         INPUT_USAGE_SWITCH_CAMERA_LENS_COVER)));

    EXPECT_TRUE(mMapper->configureInputReport(&deviceNode, &reportDef));
}
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(MatchingContainers, Foo)
{
    MockFoo foo;
    EXPECT_CALL(foo, Bar(ElementsAre(1, Gt(0), _, 5)));
    EXPECT_CALL(foo, Bar(UnorderedElementsAre(2, 3)));
    
    const vector<int> a{1, 2, 3, 5};
    foo.Bar(a);
    
    const vector<int> b{3, 2};
    foo.Bar(b);
}