1 // Copyright 2018 The Fuchsia 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 <fuzz-utils/string-map.h>
6 #include <unittest/unittest.h>
7 
8 namespace fuzzing {
9 namespace testing {
10 namespace {
11 
TestEmpty()12 bool TestEmpty() {
13     BEGIN_TEST;
14     StringMap map;
15 
16     EXPECT_TRUE(map.is_empty());
17     map.begin();
18     const char** nil = nullptr;
19     EXPECT_FALSE(map.next(nil, nil));
20 
21     END_TEST;
22 }
23 
TestGetAndSet()24 bool TestGetAndSet() {
25     BEGIN_TEST;
26     StringMap map;
27     const char* val;
28 
29     val = map.get("key1");
30     EXPECT_NULL(val);
31 
32     map.set("key1", "val1");
33     map.set("key2", "val2");
34 
35     val = map.get("key1");
36     ASSERT_NONNULL(val);
37     EXPECT_STR_EQ(val, "val1");
38 
39     val = map.get("key2");
40     ASSERT_NONNULL(val);
41     EXPECT_STR_EQ(val, "val2");
42 
43     map.set("key1", "val2");
44 
45     val = map.get("key1");
46     ASSERT_NONNULL(val);
47     EXPECT_STR_EQ(val, "val2");
48 
49     val = map.get("key2");
50     ASSERT_NONNULL(val);
51     EXPECT_STR_EQ(val, "val2");
52 
53     END_TEST;
54 }
55 
TestBeginAndNext()56 bool TestBeginAndNext() {
57     BEGIN_TEST;
58     StringMap map;
59     const char* key;
60     const char* val;
61 
62     map.set("8", "1");
63     map.set("7", "2");
64     map.set("6", "3");
65     map.set("5", "4");
66     map.set("4", "5");
67     map.set("3", "6");
68     map.set("2", "7");
69     map.set("1", "8");
70 
71     // Iterate over all pairs
72     uint8_t keys = 0;
73     EXPECT_FALSE(map.next(&key, nullptr));
74     map.begin();
75     while (map.next(&key, &val)) {
76         keys |= static_cast<uint8_t>(1 << (key[0] - '0' - 1));
77     }
78     EXPECT_EQ(keys, 0xff);
79 
80     // Reset and iterate again
81     uint8_t vals = 0;
82     EXPECT_FALSE(map.next(nullptr, &val));
83     map.begin();
84     while (map.next(&key, &val)) {
85         vals |= static_cast<uint8_t>(1 << (val[0] - '0' - 1));
86     }
87     EXPECT_EQ(keys, 0xff);
88 
89     END_TEST;
90 }
91 
TestEraseAndClear()92 bool TestEraseAndClear() {
93     BEGIN_TEST;
94     StringMap map;
95     const char* val;
96 
97     map.clear();
98 
99     map.erase("key1");
100     val = map.get("key1");
101     EXPECT_NULL(val);
102 
103     map.set("key1", "val1");
104     map.set("key2", "val2");
105     map.erase("key1");
106 
107     val = map.get("key1");
108     EXPECT_NULL(val);
109 
110     val = map.get("key2");
111     ASSERT_NONNULL(val);
112     EXPECT_STR_EQ(val, "val2");
113 
114     map.set("key1", "val1");
115     map.clear();
116 
117     val = map.get("key1");
118     EXPECT_NULL(val);
119 
120     val = map.get("key2");
121     EXPECT_NULL(val);
122 
123     END_TEST;
124 }
125 
126 BEGIN_TEST_CASE(StringMapTest)
127 RUN_TEST(TestEmpty)
128 RUN_TEST(TestGetAndSet)
129 RUN_TEST(TestBeginAndNext)
130 RUN_TEST(TestEraseAndClear)
131 END_TEST_CASE(StringMapTest)
132 
133 } // namespace
134 } // namespace testing
135 } // namespace fuzzing
136