TEST(CompletionRequest, DuplicateFilteringWithComments) {
  std::string command = "a bad c";
  const unsigned cursor_pos = 3;
  StringList matches, descriptions;

  CompletionResult result;
  CompletionRequest request(command, cursor_pos, 0, 0, result);
  result.GetMatches(matches);
  result.GetDescriptions(descriptions);

  EXPECT_EQ(0U, request.GetNumberOfMatches());

  // Add foo twice with same comment
  request.AddCompletion("foo", "comment");
  result.GetMatches(matches);
  result.GetDescriptions(descriptions);

  EXPECT_EQ(1U, request.GetNumberOfMatches());
  EXPECT_EQ(1U, matches.GetSize());
  EXPECT_EQ(1U, descriptions.GetSize());
  EXPECT_STREQ("foo", matches.GetStringAtIndex(0));
  EXPECT_STREQ("comment", descriptions.GetStringAtIndex(0));

  request.AddCompletion("foo", "comment");
  result.GetMatches(matches);
  result.GetDescriptions(descriptions);

  EXPECT_EQ(1U, request.GetNumberOfMatches());
  EXPECT_EQ(1U, matches.GetSize());
  EXPECT_EQ(1U, descriptions.GetSize());
  EXPECT_STREQ("foo", matches.GetStringAtIndex(0));
  EXPECT_STREQ("comment", descriptions.GetStringAtIndex(0));

  // Add bar twice with different comments
  request.AddCompletion("bar", "comment");
  result.GetMatches(matches);
  result.GetDescriptions(descriptions);

  EXPECT_EQ(2U, request.GetNumberOfMatches());
  EXPECT_EQ(2U, matches.GetSize());
  EXPECT_EQ(2U, descriptions.GetSize());
  EXPECT_STREQ("foo", matches.GetStringAtIndex(0));
  EXPECT_STREQ("bar", matches.GetStringAtIndex(1));

  request.AddCompletion("bar", "another comment");
  result.GetMatches(matches);
  result.GetDescriptions(descriptions);

  EXPECT_EQ(3U, request.GetNumberOfMatches());
  EXPECT_EQ(3U, matches.GetSize());
  EXPECT_EQ(3U, descriptions.GetSize());
  EXPECT_STREQ("foo", matches.GetStringAtIndex(0));
  EXPECT_STREQ("comment", descriptions.GetStringAtIndex(0));
  EXPECT_STREQ("bar", matches.GetStringAtIndex(1));
  EXPECT_STREQ("comment", descriptions.GetStringAtIndex(1));
  EXPECT_STREQ("bar", matches.GetStringAtIndex(2));
  EXPECT_STREQ("another comment", descriptions.GetStringAtIndex(2));

  // Add foo again with no comment
  request.AddCompletion("foo");
  result.GetMatches(matches);
  result.GetDescriptions(descriptions);

  EXPECT_EQ(4U, request.GetNumberOfMatches());
  EXPECT_EQ(4U, matches.GetSize());
  EXPECT_EQ(4U, descriptions.GetSize());
  EXPECT_STREQ("foo", matches.GetStringAtIndex(0));
  EXPECT_STREQ("comment", descriptions.GetStringAtIndex(0));
  EXPECT_STREQ("bar", matches.GetStringAtIndex(1));
  EXPECT_STREQ("comment", descriptions.GetStringAtIndex(1));
  EXPECT_STREQ("bar", matches.GetStringAtIndex(2));
  EXPECT_STREQ("another comment", descriptions.GetStringAtIndex(2));
  EXPECT_STREQ("foo", matches.GetStringAtIndex(3));
  EXPECT_STREQ("", descriptions.GetStringAtIndex(3));
}