Home | History | Annotate | Download | only in chromium
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "third_party/libaddressinput/chromium/trie.h"
      6 
      7 #include <stdint.h>
      8 #include <set>
      9 #include <string>
     10 
     11 #include "testing/gtest/include/gtest/gtest.h"
     12 
     13 namespace autofill {
     14 
     15 namespace {
     16 
     17 std::vector<uint8_t> ToByteArray(const std::string& text) {
     18   std::vector<uint8_t> result(text.length() + 1, 0);
     19   result.assign(text.begin(), text.end());
     20   return result;
     21 }
     22 
     23 }  // namespace
     24 
     25 TEST(TrieTest, EmptyTrieHasNoData) {
     26   Trie<std::string> trie;
     27   std::set<std::string> result;
     28   trie.FindDataForKeyPrefix(ToByteArray("key"), &result);
     29   EXPECT_TRUE(result.empty());
     30 }
     31 
     32 TEST(TrieTest, CanGetDataByExactKey) {
     33   Trie<std::string> trie;
     34   trie.AddDataForKey(ToByteArray("hello"), "world");
     35   std::set<std::string> result;
     36   trie.FindDataForKeyPrefix(ToByteArray("hello"), &result);
     37   std::set<std::string> expected;
     38   expected.insert("world");
     39   EXPECT_EQ(expected, result);
     40 }
     41 
     42 TEST(TrieTest, CanGetDataByPrefix) {
     43   Trie<std::string> trie;
     44   trie.AddDataForKey(ToByteArray("hello"), "world");
     45   std::set<std::string> result;
     46   trie.FindDataForKeyPrefix(ToByteArray("he"), &result);
     47   std::set<std::string> expected;
     48   expected.insert("world");
     49   EXPECT_EQ(expected, result);
     50 }
     51 
     52 TEST(TrieTest, KeyTooLongNoData) {
     53   Trie<std::string> trie;
     54   trie.AddDataForKey(ToByteArray("hello"), "world");
     55   std::set<std::string> result;
     56   trie.FindDataForKeyPrefix(ToByteArray("helloo"), &result);
     57   EXPECT_TRUE(result.empty());
     58 }
     59 
     60 TEST(TrieTest, CommonPrefixFindsMultipleData) {
     61   Trie<std::string> trie;
     62   trie.AddDataForKey(ToByteArray("hello"), "world");
     63   trie.AddDataForKey(ToByteArray("howdy"), "buddy");
     64   trie.AddDataForKey(ToByteArray("foo"), "bar");
     65   std::set<std::string> results;
     66   trie.FindDataForKeyPrefix(ToByteArray("h"), &results);
     67   std::set<std::string> expected;
     68   expected.insert("world");
     69   expected.insert("buddy");
     70   EXPECT_EQ(expected, results);
     71 }
     72 
     73 TEST(TrieTest, KeyCanBePrefixOfOtherKey) {
     74   Trie<std::string> trie;
     75   trie.AddDataForKey(ToByteArray("hello"), "world");
     76   trie.AddDataForKey(ToByteArray("helloo"), "woorld");
     77   trie.AddDataForKey(ToByteArray("hella"), "warld");
     78   std::set<std::string> results;
     79   trie.FindDataForKeyPrefix(ToByteArray("hello"), &results);
     80   std::set<std::string> expected;
     81   expected.insert("world");
     82   expected.insert("woorld");
     83   EXPECT_EQ(expected, results);
     84 }
     85 
     86 TEST(TrieTest, AllowMutlipleKeys) {
     87   Trie<std::string> trie;
     88   trie.AddDataForKey(ToByteArray("hello"), "world");
     89   trie.AddDataForKey(ToByteArray("hello"), "woorld");
     90   std::set<std::string> results;
     91   trie.FindDataForKeyPrefix(ToByteArray("hello"), &results);
     92   std::set<std::string> expected;
     93   expected.insert("world");
     94   expected.insert("woorld");
     95   EXPECT_EQ(expected, results);
     96 }
     97 
     98 TEST(TrieTest, CanFindVeryLongKey) {
     99   Trie<std::string> trie;
    100   static const char kVeryLongKey[] = "1234567890qwertyuioasdfghj";
    101   trie.AddDataForKey(ToByteArray(kVeryLongKey), "world");
    102   std::set<std::string> result;
    103   trie.FindDataForKeyPrefix(ToByteArray(kVeryLongKey), &result);
    104   std::set<std::string> expected;
    105   expected.insert("world");
    106   EXPECT_EQ(expected, result);
    107 }
    108 
    109 }  // namespace autofill
    110