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