| OLD | NEW | 
|---|
| 1 // Copyright (C) 2014 Google Inc. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 
| 2 // | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // found in the LICENSE file. | 
| 4 // you may not use this file except in compliance with the License. |  | 
| 5 // You may obtain a copy of the License at |  | 
| 6 // |  | 
| 7 // http://www.apache.org/licenses/LICENSE-2.0 |  | 
| 8 // |  | 
| 9 // Unless required by applicable law or agreed to in writing, software |  | 
| 10 // distributed under the License is distributed on an "AS IS" BASIS, |  | 
| 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |  | 
| 12 // See the License for the specific language governing permissions and |  | 
| 13 // limitations under the License. |  | 
| 14 | 4 | 
| 15 #include "util/trie.h" | 5 #include "third_party/libaddressinput/chromium/trie.h" | 
| 16 | 6 | 
|  | 7 #include <stdint.h> | 
| 17 #include <set> | 8 #include <set> | 
| 18 #include <string> | 9 #include <string> | 
| 19 | 10 | 
| 20 #include <gtest/gtest.h> | 11 #include "testing/gtest/include/gtest/gtest.h" | 
| 21 | 12 | 
| 22 namespace i18n { | 13 namespace autofill { | 
| 23 namespace addressinput { |  | 
| 24 | 14 | 
| 25 namespace { | 15 namespace { | 
| 26 | 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 | 
| 27 TEST(TrieTest, EmptyTrieHasNoData) { | 25 TEST(TrieTest, EmptyTrieHasNoData) { | 
| 28   Trie<std::string> trie; | 26   Trie<std::string> trie; | 
| 29   std::set<std::string> result; | 27   std::set<std::string> result; | 
| 30   trie.FindDataForKeyPrefix("key", &result); | 28   trie.FindDataForKeyPrefix(ToByteArray("key"), &result); | 
| 31   EXPECT_TRUE(result.empty()); | 29   EXPECT_TRUE(result.empty()); | 
| 32 } | 30 } | 
| 33 | 31 | 
| 34 TEST(TrieTest, CanGetDataByExactKey) { | 32 TEST(TrieTest, CanGetDataByExactKey) { | 
| 35   Trie<std::string> trie; | 33   Trie<std::string> trie; | 
| 36   trie.AddDataForKey("hello", "world"); | 34   trie.AddDataForKey(ToByteArray("hello"), "world"); | 
| 37   std::set<std::string> result; | 35   std::set<std::string> result; | 
| 38   trie.FindDataForKeyPrefix("hello", &result); | 36   trie.FindDataForKeyPrefix(ToByteArray("hello"), &result); | 
| 39   std::set<std::string> expected; | 37   std::set<std::string> expected; | 
| 40   expected.insert("world"); | 38   expected.insert("world"); | 
| 41   EXPECT_EQ(expected, result); | 39   EXPECT_EQ(expected, result); | 
| 42 } | 40 } | 
| 43 | 41 | 
| 44 TEST(TrieTest, CanGetDataByPrefix) { | 42 TEST(TrieTest, CanGetDataByPrefix) { | 
| 45   Trie<std::string> trie; | 43   Trie<std::string> trie; | 
| 46   trie.AddDataForKey("hello", "world"); | 44   trie.AddDataForKey(ToByteArray("hello"), "world"); | 
| 47   std::set<std::string> result; | 45   std::set<std::string> result; | 
| 48   trie.FindDataForKeyPrefix("he", &result); | 46   trie.FindDataForKeyPrefix(ToByteArray("he"), &result); | 
| 49   std::set<std::string> expected; | 47   std::set<std::string> expected; | 
| 50   expected.insert("world"); | 48   expected.insert("world"); | 
| 51   EXPECT_EQ(expected, result); | 49   EXPECT_EQ(expected, result); | 
| 52 } | 50 } | 
| 53 | 51 | 
| 54 TEST(TrieTest, KeyTooLongNoData) { | 52 TEST(TrieTest, KeyTooLongNoData) { | 
| 55   Trie<std::string> trie; | 53   Trie<std::string> trie; | 
| 56   trie.AddDataForKey("hello", "world"); | 54   trie.AddDataForKey(ToByteArray("hello"), "world"); | 
| 57   std::set<std::string> result; | 55   std::set<std::string> result; | 
| 58   trie.FindDataForKeyPrefix("helloo", &result); | 56   trie.FindDataForKeyPrefix(ToByteArray("helloo"), &result); | 
| 59   EXPECT_TRUE(result.empty()); | 57   EXPECT_TRUE(result.empty()); | 
| 60 } | 58 } | 
| 61 | 59 | 
| 62 TEST(TrieTest, CommonPrefixFindsMultipleData) { | 60 TEST(TrieTest, CommonPrefixFindsMultipleData) { | 
| 63   Trie<std::string> trie; | 61   Trie<std::string> trie; | 
| 64   trie.AddDataForKey("hello", "world"); | 62   trie.AddDataForKey(ToByteArray("hello"), "world"); | 
| 65   trie.AddDataForKey("howdy", "buddy"); | 63   trie.AddDataForKey(ToByteArray("howdy"), "buddy"); | 
| 66   trie.AddDataForKey("foo", "bar"); | 64   trie.AddDataForKey(ToByteArray("foo"), "bar"); | 
| 67   std::set<std::string> results; | 65   std::set<std::string> results; | 
| 68   trie.FindDataForKeyPrefix("h", &results); | 66   trie.FindDataForKeyPrefix(ToByteArray("h"), &results); | 
| 69   std::set<std::string> expected; | 67   std::set<std::string> expected; | 
| 70   expected.insert("world"); | 68   expected.insert("world"); | 
| 71   expected.insert("buddy"); | 69   expected.insert("buddy"); | 
| 72   EXPECT_EQ(expected, results); | 70   EXPECT_EQ(expected, results); | 
| 73 } | 71 } | 
| 74 | 72 | 
| 75 TEST(TrieTest, KeyCanBePrefixOfOtherKey) { | 73 TEST(TrieTest, KeyCanBePrefixOfOtherKey) { | 
| 76   Trie<std::string> trie; | 74   Trie<std::string> trie; | 
| 77   trie.AddDataForKey("hello", "world"); | 75   trie.AddDataForKey(ToByteArray("hello"), "world"); | 
| 78   trie.AddDataForKey("helloo", "woorld"); | 76   trie.AddDataForKey(ToByteArray("helloo"), "woorld"); | 
| 79   trie.AddDataForKey("hella", "warld"); | 77   trie.AddDataForKey(ToByteArray("hella"), "warld"); | 
| 80   std::set<std::string> results; | 78   std::set<std::string> results; | 
| 81   trie.FindDataForKeyPrefix("hello", &results); | 79   trie.FindDataForKeyPrefix(ToByteArray("hello"), &results); | 
| 82   std::set<std::string> expected; | 80   std::set<std::string> expected; | 
| 83   expected.insert("world"); | 81   expected.insert("world"); | 
| 84   expected.insert("woorld"); | 82   expected.insert("woorld"); | 
| 85   EXPECT_EQ(expected, results); | 83   EXPECT_EQ(expected, results); | 
| 86 } | 84 } | 
| 87 | 85 | 
| 88 TEST(TrieTest, AllowMutlipleKeys) { | 86 TEST(TrieTest, AllowMutlipleKeys) { | 
| 89   Trie<std::string> trie; | 87   Trie<std::string> trie; | 
| 90   trie.AddDataForKey("hello", "world"); | 88   trie.AddDataForKey(ToByteArray("hello"), "world"); | 
| 91   trie.AddDataForKey("hello", "woorld"); | 89   trie.AddDataForKey(ToByteArray("hello"), "woorld"); | 
| 92   std::set<std::string> results; | 90   std::set<std::string> results; | 
| 93   trie.FindDataForKeyPrefix("hello", &results); | 91   trie.FindDataForKeyPrefix(ToByteArray("hello"), &results); | 
| 94   std::set<std::string> expected; | 92   std::set<std::string> expected; | 
| 95   expected.insert("world"); | 93   expected.insert("world"); | 
| 96   expected.insert("woorld"); | 94   expected.insert("woorld"); | 
| 97   EXPECT_EQ(expected, results); | 95   EXPECT_EQ(expected, results); | 
| 98 } | 96 } | 
| 99 | 97 | 
| 100 TEST(TrieTest, CanFindVeryLongKey) { | 98 TEST(TrieTest, CanFindVeryLongKey) { | 
| 101   Trie<std::string> trie; | 99   Trie<std::string> trie; | 
| 102   static const char kVeryLongKey[] = "1234567890qwertyuioasdfghj"; | 100   static const char kVeryLongKey[] = "1234567890qwertyuioasdfghj"; | 
| 103   trie.AddDataForKey(kVeryLongKey, "world"); | 101   trie.AddDataForKey(ToByteArray(kVeryLongKey), "world"); | 
| 104   std::set<std::string> result; | 102   std::set<std::string> result; | 
| 105   trie.FindDataForKeyPrefix(kVeryLongKey, &result); | 103   trie.FindDataForKeyPrefix(ToByteArray(kVeryLongKey), &result); | 
| 106   std::set<std::string> expected; | 104   std::set<std::string> expected; | 
| 107   expected.insert("world"); | 105   expected.insert("world"); | 
| 108   EXPECT_EQ(expected, result); | 106   EXPECT_EQ(expected, result); | 
| 109 } | 107 } | 
| 110 | 108 | 
| 111 }  // namespace | 109 }  // namespace autofill | 
| 112 |  | 
| 113 }  // namespace addressinput |  | 
| 114 }  // namespace i18n |  | 
| OLD | NEW | 
|---|