13ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// Copyright (c) 2008, Google Inc.
23ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// All rights reserved.
33ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid//
43ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// Redistribution and use in source and binary forms, with or without
53ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// modification, are permitted provided that the following conditions are
63ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// met:
73ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid//
83ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid//     * Redistributions of source code must retain the above copyright
93ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// notice, this list of conditions and the following disclaimer.
103ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid//     * Redistributions in binary form must reproduce the above
113ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// copyright notice, this list of conditions and the following disclaimer
123ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// in the documentation and/or other materials provided with the
133ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// distribution.
143ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid//     * Neither the name of Google Inc. nor the names of its
153ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// contributors may be used to endorse or promote products derived from
163ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// this software without specific prior written permission.
173ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid//
183ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
193ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
203ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
213ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
223ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
233ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
243ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
253ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
263ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
273ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
283ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
293ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
30303311b8370b307ea38201fc3ad241a5610f8cfcrsesek@chromium.org#include "breakpad_googletest_includes.h"
31303311b8370b307ea38201fc3ad241a5610f8cfcrsesek@chromium.org#include "common/simple_string_dictionary.h"
323ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
33303311b8370b307ea38201fc3ad241a5610f8cfcrsesek@chromium.orgnamespace google_breakpad {
343ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
35c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.orgTEST(NonAllocatingMapTest, Entry) {
36c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  typedef NonAllocatingMap<5, 9, 15> TestMap;
37c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  TestMap map;
38c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org
39c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  const TestMap::Entry* entry = TestMap::Iterator(map).Next();
40c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_FALSE(entry);
41c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org
42c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  // Try setting a key/value and then verify.
43c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  map.SetKeyValue("key1", "value1");
44c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  entry = TestMap::Iterator(map).Next();
45c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  ASSERT_TRUE(entry);
46c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_STREQ(entry->key, "key1");
47c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_STREQ(entry->value, "value1");
48c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org
49c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  // Try setting a new value.
50c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  map.SetKeyValue("key1", "value3");
51c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_STREQ(entry->value, "value3");
52c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org
53c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  // Make sure the key didn't change.
54c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_STREQ(entry->key, "key1");
55c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org
56c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  // Clear the entry and verify the key and value are empty strings.
57c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  map.RemoveKey("key1");
58c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_FALSE(entry->is_active());
59c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_EQ(strlen(entry->key), 0u);
60c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_EQ(strlen(entry->value), 0u);
613ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid}
623ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
63c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.orgTEST(NonAllocatingMapTest, SimpleStringDictionary) {
643ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  // Make a new dictionary
65c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  SimpleStringDictionary dict;
663ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
673ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  // Set three distinct values on three keys
68c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  dict.SetKeyValue("key1", "value1");
69c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  dict.SetKeyValue("key2", "value2");
70c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  dict.SetKeyValue("key3", "value3");
71c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org
72c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_NE(dict.GetValueForKey("key1"), "value1");
73c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_NE(dict.GetValueForKey("key2"), "value2");
74c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_NE(dict.GetValueForKey("key3"), "value3");
75c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_EQ(dict.GetCount(), 3u);
763ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  // try an unknown key
77c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_FALSE(dict.GetValueForKey("key4"));
783ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
793ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  // Remove a key
80c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  dict.RemoveKey("key3");
813ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
823ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  // Now make sure it's not there anymore
83c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_FALSE(dict.GetValueForKey("key3"));
843ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
853ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  // Remove by setting value to NULL
86c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  dict.SetKeyValue("key2", NULL);
873ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
883ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  // Now make sure it's not there anymore
89c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_FALSE(dict.GetValueForKey("key2"));
903ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid}
913ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
92c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.orgTEST(NonAllocatingMapTest, CopyAndAssign) {
93c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  NonAllocatingMap<10, 10, 10> map;
94c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  map.SetKeyValue("one", "a");
95c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  map.SetKeyValue("two", "b");
96c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  map.SetKeyValue("three", "c");
97c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  map.RemoveKey("two");
98c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_EQ(2u, map.GetCount());
99c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org
100c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  // Test copy.
101c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  NonAllocatingMap<10, 10, 10> map_copy(map);
102c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_EQ(2u, map_copy.GetCount());
103c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_STREQ("a", map_copy.GetValueForKey("one"));
104c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_STREQ("c", map_copy.GetValueForKey("three"));
105c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  map_copy.SetKeyValue("four", "d");
106c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_STREQ("d", map_copy.GetValueForKey("four"));
107c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_FALSE(map.GetValueForKey("four"));
108c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org
109c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  // Test assign.
110c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  NonAllocatingMap<10, 10, 10> map_assign;
111c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  map_assign = map;
112c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_EQ(2u, map_assign.GetCount());
113c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_STREQ("a", map_assign.GetValueForKey("one"));
114c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_STREQ("c", map_assign.GetValueForKey("three"));
115c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  map_assign.SetKeyValue("four", "d");
116c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_STREQ("d", map_assign.GetValueForKey("four"));
117c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_FALSE(map.GetValueForKey("four"));
118c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org
119c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  map.RemoveKey("one");
120c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_FALSE(map.GetValueForKey("one"));
121c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_STREQ("a", map_copy.GetValueForKey("one"));
122c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_STREQ("a", map_assign.GetValueForKey("one"));
123c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org}
124c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org
125c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org// Add a bunch of values to the dictionary, remove some entries in the middle,
126c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org// and then add more.
127c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.orgTEST(NonAllocatingMapTest, Iterator) {
128c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  SimpleStringDictionary* dict = new SimpleStringDictionary();
129303311b8370b307ea38201fc3ad241a5610f8cfcrsesek@chromium.org  ASSERT_TRUE(dict);
1303ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
131c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  char key[SimpleStringDictionary::key_size];
132c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  char value[SimpleStringDictionary::value_size];
1333ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
134c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  const int kDictionaryCapacity = SimpleStringDictionary::num_entries;
1353ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  const int kPartitionIndex = kDictionaryCapacity - 5;
1363ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
1373ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  // We assume at least this size in the tests below
138303311b8370b307ea38201fc3ad241a5610f8cfcrsesek@chromium.org  ASSERT_GE(kDictionaryCapacity, 64);
1393ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
1403ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  // We'll keep track of the number of key/value pairs we think should
1413ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  // be in the dictionary
1423ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  int expectedDictionarySize = 0;
1433ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
1443ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  // Set a bunch of key/value pairs like key0/value0, key1/value1, ...
1453ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  for (int i = 0; i < kPartitionIndex; ++i) {
1463ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    sprintf(key, "key%d", i);
1473ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    sprintf(value, "value%d", i);
1483ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    dict->SetKeyValue(key, value);
1493ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  }
1503ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  expectedDictionarySize = kPartitionIndex;
1513ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
1523ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  // set a couple of the keys twice (with the same value) - should be nop
1533ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  dict->SetKeyValue("key2", "value2");
1543ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  dict->SetKeyValue("key4", "value4");
1553ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  dict->SetKeyValue("key15", "value15");
1563ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
1573ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  // Remove some random elements in the middle
1583ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  dict->RemoveKey("key7");
1593ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  dict->RemoveKey("key18");
1603ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  dict->RemoveKey("key23");
1613ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  dict->RemoveKey("key31");
1623ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  expectedDictionarySize -= 4;  // we just removed four key/value pairs
1633ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
1643ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  // Set some more key/value pairs like key59/value59, key60/value60, ...
1653ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  for (int i = kPartitionIndex; i < kDictionaryCapacity; ++i) {
1663ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    sprintf(key, "key%d", i);
1673ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    sprintf(value, "value%d", i);
1683ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    dict->SetKeyValue(key, value);
1693ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  }
1703ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  expectedDictionarySize += kDictionaryCapacity - kPartitionIndex;
1713ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
1723ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  // Now create an iterator on the dictionary
173c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  SimpleStringDictionary::Iterator iter(*dict);
1743ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
1753ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  // We then verify that it iterates through exactly the number of
1763ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  // key/value pairs we expect, and that they match one-for-one with what we
1773ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  // would expect.  The ordering of the iteration does not matter...
1783ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
1793ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  // used to keep track of number of occurrences found for key/value pairs
1803ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  int count[kDictionaryCapacity];
1813ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  memset(count, 0, sizeof(count));
1823ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
1833ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  int totalCount = 0;
1843ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
185c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  const SimpleStringDictionary::Entry* entry;
1863ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  while ((entry = iter.Next())) {
1873ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    totalCount++;
1883ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
1893ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    // Extract keyNumber from a string of the form key<keyNumber>
1903ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    int keyNumber;
191c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org    sscanf(entry->key, "key%d", &keyNumber);
1923ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
1933ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    // Extract valueNumber from a string of the form value<valueNumber>
1943ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    int valueNumber;
195c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org    sscanf(entry->value, "value%d", &valueNumber);
1963ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
1973ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    // The value number should equal the key number since that's how we set them
198303311b8370b307ea38201fc3ad241a5610f8cfcrsesek@chromium.org    EXPECT_EQ(keyNumber, valueNumber);
1993ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
2003ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    // Key and value numbers should be in proper range:
2013ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    // 0 <= keyNumber < kDictionaryCapacity
2023ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    bool isKeyInGoodRange =
2033ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid      (keyNumber >= 0 && keyNumber < kDictionaryCapacity);
2043ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    bool isValueInGoodRange =
2053ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid      (valueNumber >= 0 && valueNumber < kDictionaryCapacity);
206303311b8370b307ea38201fc3ad241a5610f8cfcrsesek@chromium.org    EXPECT_TRUE(isKeyInGoodRange);
207303311b8370b307ea38201fc3ad241a5610f8cfcrsesek@chromium.org    EXPECT_TRUE(isValueInGoodRange);
2083ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
2093ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    if (isKeyInGoodRange && isValueInGoodRange) {
2103ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid      ++count[keyNumber];
2113ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    }
2123ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  }
2133ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
2143ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  // Make sure each of the key/value pairs showed up exactly one time, except
2153ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  // for the ones which we removed.
216c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  for (size_t i = 0; i < kDictionaryCapacity; ++i) {
2173ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    // Skip over key7, key18, key23, and key31, since we removed them
2183ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    if (!(i == 7 || i == 18 || i == 23 || i == 31)) {
219303311b8370b307ea38201fc3ad241a5610f8cfcrsesek@chromium.org      EXPECT_EQ(count[i], 1);
2203ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    }
2213ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  }
2223ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
2233ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  // Make sure the number of iterations matches the expected dictionary size.
224303311b8370b307ea38201fc3ad241a5610f8cfcrsesek@chromium.org  EXPECT_EQ(totalCount, expectedDictionarySize);
2253ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid}
2263ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
227c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org
228c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.orgTEST(NonAllocatingMapTest, AddRemove) {
229c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  NonAllocatingMap<5, 7, 6> map;
230c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  map.SetKeyValue("rob", "ert");
231c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  map.SetKeyValue("mike", "pink");
232c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  map.SetKeyValue("mark", "allays");
233c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org
234c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_EQ(3u, map.GetCount());
235c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_STREQ("ert", map.GetValueForKey("rob"));
236c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_STREQ("pink", map.GetValueForKey("mike"));
237c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_STREQ("allays", map.GetValueForKey("mark"));
238c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org
239c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  map.RemoveKey("mike");
240c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org
241c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_EQ(2u, map.GetCount());
242c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_FALSE(map.GetValueForKey("mike"));
243c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org
244c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  map.SetKeyValue("mark", "mal");
245c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_EQ(2u, map.GetCount());
246c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_STREQ("mal", map.GetValueForKey("mark"));
247c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org
248c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  map.RemoveKey("mark");
249c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_EQ(1u, map.GetCount());
250c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_FALSE(map.GetValueForKey("mark"));
251c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org}
252c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org
253c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.orgTEST(NonAllocatingMapTest, Serialize) {
254c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  typedef NonAllocatingMap<4, 5, 7> TestMap;
255c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  TestMap map;
256c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  map.SetKeyValue("one", "abc");
257c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  map.SetKeyValue("two", "def");
258c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  map.SetKeyValue("tre", "hig");
259c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org
260c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_STREQ("abc", map.GetValueForKey("one"));
261c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_STREQ("def", map.GetValueForKey("two"));
262c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_STREQ("hig", map.GetValueForKey("tre"));
263c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org
264c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  const SerializedNonAllocatingMap* serialized;
265c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  size_t size = map.Serialize(&serialized);
266c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org
267c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  SerializedNonAllocatingMap* serialized_copy =
268c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org      reinterpret_cast<SerializedNonAllocatingMap*>(malloc(size));
269c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  ASSERT_TRUE(serialized_copy);
270c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  memcpy(serialized_copy, serialized, size);
271c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org
272c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  TestMap deserialized(serialized_copy, size);
273c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  free(serialized_copy);
274c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org
275c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_EQ(3u, deserialized.GetCount());
276c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_STREQ("abc", deserialized.GetValueForKey("one"));
277c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_STREQ("def", deserialized.GetValueForKey("two"));
278c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_STREQ("hig", deserialized.GetValueForKey("tre"));
279c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org}
280c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org
2818160f86c54596ed816378bbd07fb83acbe8154farsesek@chromium.org// Running out of space shouldn't crash.
282c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.orgTEST(NonAllocatingMapTest, OutOfSpace) {
283c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  NonAllocatingMap<3, 2, 2> map;
284c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  map.SetKeyValue("a", "1");
285c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  map.SetKeyValue("b", "2");
2868160f86c54596ed816378bbd07fb83acbe8154farsesek@chromium.org  map.SetKeyValue("c", "3");
2878160f86c54596ed816378bbd07fb83acbe8154farsesek@chromium.org  EXPECT_EQ(2u, map.GetCount());
2888160f86c54596ed816378bbd07fb83acbe8154farsesek@chromium.org  EXPECT_FALSE(map.GetValueForKey("c"));
289c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org}
290c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org
2918160f86c54596ed816378bbd07fb83acbe8154farsesek@chromium.org#ifndef NDEBUG
2928160f86c54596ed816378bbd07fb83acbe8154farsesek@chromium.org
293c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.orgTEST(NonAllocatingMapTest, NullKey) {
294c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  NonAllocatingMap<4, 6, 6> map;
295c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  ASSERT_DEATH(map.SetKeyValue(NULL, "hello"), "");
296c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org
297c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  map.SetKeyValue("hi", "there");
298c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  ASSERT_DEATH(map.GetValueForKey(NULL), "");
299c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_STREQ("there", map.GetValueForKey("hi"));
300c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org
301c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  ASSERT_DEATH(map.GetValueForKey(NULL), "");
302c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  map.RemoveKey("hi");
303c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org  EXPECT_EQ(0u, map.GetCount());
304c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org}
305c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org
306c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org#endif  // !NDEBUG
307c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org
308303311b8370b307ea38201fc3ad241a5610f8cfcrsesek@chromium.org}  // namespace google_breakpad
309