Blender V4.3
BLI_multi_value_map_test.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
6#include "BLI_vector.hh"
7#include "testing/testing.h"
8
9namespace blender::tests {
10
11TEST(multi_value_map, LookupNotExistant)
12{
14 EXPECT_EQ(map.lookup(5).size(), 0);
15 map.add(2, 5);
16 EXPECT_EQ(map.lookup(5).size(), 0);
17}
18
19TEST(multi_value_map, LookupExistant)
20{
22 map.add(2, 4);
23 map.add(2, 5);
24 map.add(3, 6);
25
26 EXPECT_EQ(map.lookup(2).size(), 2);
27 EXPECT_EQ(map.lookup(2)[0], 4);
28 EXPECT_EQ(map.lookup(2)[1], 5);
29
30 EXPECT_EQ(map.lookup(3).size(), 1);
31 EXPECT_EQ(map.lookup(3)[0], 6);
32}
33
34TEST(multi_value_map, LookupMutable)
35{
37 map.add(1, 2);
38 map.add(4, 5);
39 map.add(4, 6);
40 map.add(6, 7);
41
42 MutableSpan<int> span = map.lookup(4);
43 EXPECT_EQ(span.size(), 2);
44 span[0] = 10;
45 span[1] = 20;
46
47 map.add(4, 5);
48 MutableSpan<int> new_span = map.lookup(4);
49 EXPECT_EQ(new_span.size(), 3);
50 EXPECT_EQ(new_span[0], 10);
51 EXPECT_EQ(new_span[1], 20);
52 EXPECT_EQ(new_span[2], 5);
53}
54
55TEST(multi_value_map, AddMultiple)
56{
58 map.add_multiple(2, {4, 5, 6});
59 map.add_multiple(2, {1, 2});
60 map.add_multiple(5, {7, 5, 3});
61
62 EXPECT_EQ(map.lookup(2).size(), 5);
63 EXPECT_EQ(map.lookup(2)[0], 4);
64 EXPECT_EQ(map.lookup(2)[1], 5);
65 EXPECT_EQ(map.lookup(2)[2], 6);
66 EXPECT_EQ(map.lookup(2)[3], 1);
67 EXPECT_EQ(map.lookup(2)[4], 2);
68
69 EXPECT_EQ(map.lookup(5).size(), 3);
70 EXPECT_EQ(map.lookup(5)[0], 7);
71 EXPECT_EQ(map.lookup(5)[1], 5);
72 EXPECT_EQ(map.lookup(5)[2], 3);
73}
74
75TEST(multi_value_map, Keys)
76{
78 map.add(5, 7);
79 map.add(5, 7);
80 map.add_multiple(2, {6, 7, 8});
81
82 Vector<int> keys;
83 for (int key : map.keys()) {
84 keys.append(key);
85 }
86
87 EXPECT_EQ(keys.size(), 2);
88 EXPECT_TRUE(keys.contains(5));
89 EXPECT_TRUE(keys.contains(2));
90}
91
92TEST(multi_value_map, Values)
93{
95 map.add(3, 5);
96 map.add_multiple(3, {1, 2});
97 map.add(6, 1);
98
99 Vector<Span<int>> values;
100 for (Span<int> value_span : map.values()) {
101 values.append(value_span);
102 }
103
104 EXPECT_EQ(values.size(), 2);
105}
106
107TEST(multi_value_map, Items)
108{
110 map.add_multiple(4, {1, 2, 3});
111
112 for (auto &&item : map.items()) {
113 int key = item.key;
114 Span<int> values = item.value;
115 EXPECT_EQ(key, 4);
116 EXPECT_EQ(values.size(), 3);
117 EXPECT_EQ(values[0], 1);
118 EXPECT_EQ(values[1], 2);
119 EXPECT_EQ(values[2], 3);
120 }
121}
122
123TEST(multi_value_map, UniquePtr)
124{
125 /* Mostly testing if it compiles here. */
126 MultiValueMap<std::unique_ptr<int>, std::unique_ptr<int>> map;
127 map.add(std::make_unique<int>(4), std::make_unique<int>(6));
128 map.add(std::make_unique<int>(4), std::make_unique<int>(7));
129 EXPECT_EQ(map.lookup(std::make_unique<int>(10)).size(), 0);
130}
131
132} // namespace blender::tests
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
void add_multiple(const Key &key, Span< Value > values)
void add(const Key &key, const Value &value)
constexpr int64_t size() const
Definition BLI_span.hh:494
int64_t size() const
bool contains(const T &value) const
void append(const T &value)
TEST(any, DefaultConstructor)