1 // Copyright 2006 The RE2 Authors. All Rights Reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
5 // Simple tests that SparseArray behaves.
8 #include "utest/utest.h"
12 static const string kNotFound
= "NOT FOUND";
14 TEST(SparseArray
, BasicOperations
) {
15 static const int n
= 50;
16 SparseArray
<int> set(n
);
20 for (int i
= 0; i
< n
; i
++)
22 for (int i
= 0; i
< n
; i
++)
23 value
[i
] = rand()%1000 + 1;
24 for (int i
= 1; i
< n
; i
++) {
31 for (int i
= 0;; i
++) {
32 for (int j
= 0; j
< i
; j
++) {
33 ASSERT_TRUE(set
.has_index(order
[j
]));
34 ASSERT_EQ(value
[order
[j
]], set
.get(order
[j
], -1));
38 for (int j
= i
; j
< n
; j
++)
39 ASSERT_FALSE(set
.has_index(order
[j
]));
40 set
.set(order
[i
], value
[order
[i
]]);
44 for (SparseArray
<int>::iterator i
= set
.begin(); i
!= set
.end(); ++i
) {
45 ASSERT_EQ(order
[nn
++], i
->index());
46 ASSERT_EQ(value
[i
->index()], i
->value());
51 for (int i
= 0; i
< n
; i
++)
52 ASSERT_FALSE(set
.has_index(i
));
54 ASSERT_EQ(0, set
.size());
55 ASSERT_EQ(0, distance(set
.begin(), set
.end()));
58 class SparseArrayStringTest
: public testing::Test
{
60 SparseArrayStringTest()
62 InsertOrUpdate(&str_map_
, 1, "a");
63 InsertOrUpdate(&str_map_
, 5, "b");
64 InsertOrUpdate(&str_map_
, 2, "c");
65 InsertOrUpdate(&str_map_
, 7, "d");
68 SparseArray
<string
> str_map_
;
69 typedef SparseArray
<string
>::iterator iterator
;
72 TEST_F(SparseArrayStringTest
, FindGetsPresentElement
) {
73 iterator it
= str_map_
.find(2);
74 ASSERT_TRUE(str_map_
.end() != it
);
75 EXPECT_EQ("c", it
->second
);
78 TEST_F(SparseArrayStringTest
, FindDoesNotFindAbsentElement
) {
79 iterator it
= str_map_
.find(3);
80 ASSERT_TRUE(str_map_
.end() == it
);
83 TEST_F(SparseArrayStringTest
, ContainsKey
) {
84 EXPECT_TRUE(ContainsKey(str_map_
, 1));
85 EXPECT_TRUE(ContainsKey(str_map_
, 2));
86 EXPECT_FALSE(ContainsKey(str_map_
, 3));
89 TEST_F(SparseArrayStringTest
, InsertIfNotPresent
) {
90 EXPECT_FALSE(ContainsKey(str_map_
, 3));
91 EXPECT_TRUE(InsertIfNotPresent(&str_map_
, 3, "r"));
92 EXPECT_EQ("r", FindWithDefault(str_map_
, 3, kNotFound
));
93 EXPECT_FALSE(InsertIfNotPresent(&str_map_
, 3, "other value"));
94 EXPECT_EQ("r", FindWithDefault(str_map_
, 3, kNotFound
));
97 TEST(SparseArrayTest
, Erase
) {
98 SparseArray
<string
> str_map(5);
101 EXPECT_EQ("a", FindWithDefault(str_map
, 1, kNotFound
));
102 EXPECT_EQ("b", FindWithDefault(str_map
, 2, kNotFound
));
104 EXPECT_EQ("NOT FOUND", FindWithDefault(str_map
, 1, kNotFound
));
105 EXPECT_EQ("b", FindWithDefault(str_map
, 2, kNotFound
));
108 typedef SparseArrayStringTest SparseArrayStringSurvivesInvalidIndexTest
;
109 // TODO(jyasskin): Cover invalid arguments to every method.
111 TEST_F(SparseArrayStringSurvivesInvalidIndexTest
, SetNegative
) {
112 EXPECT_DEBUG_DEATH(str_map_
.set(-123456789, "hi"),
113 "\\(jyasskin\\) Illegal index -123456789 passed to"
114 " SparseArray\\(10\\).set\\(\\).");
115 EXPECT_EQ(4, str_map_
.size());
118 TEST_F(SparseArrayStringSurvivesInvalidIndexTest
, SetTooBig
) {
119 EXPECT_DEBUG_DEATH(str_map_
.set(12345678, "hi"),
120 "\\(jyasskin\\) Illegal index 12345678 passed to"
121 " SparseArray\\(10\\).set\\(\\).");
122 EXPECT_EQ(4, str_map_
.size());
125 TEST_F(SparseArrayStringSurvivesInvalidIndexTest
, SetNew_Negative
) {
126 EXPECT_DEBUG_DEATH(str_map_
.set_new(-123456789, "hi"),
127 "\\(jyasskin\\) Illegal index -123456789 passed to"
128 " SparseArray\\(10\\).set_new\\(\\).");
129 EXPECT_EQ(4, str_map_
.size());
132 TEST_F(SparseArrayStringSurvivesInvalidIndexTest
, SetNew_Existing
) {
134 str_map_
.set_new(2, "hi");
135 EXPECT_EQ("hi", FindWithDefault(str_map_
, 2, kNotFound
));
137 // The old value for 2 is still present, but can never be removed.
138 // This risks crashing later, if the map fills up.
139 EXPECT_EQ(5, str_map_
.size());
140 }, "Check failed: !has_index\\(i\\)");
143 TEST_F(SparseArrayStringSurvivesInvalidIndexTest
, SetNew_TooBig
) {
144 EXPECT_DEBUG_DEATH(str_map_
.set_new(12345678, "hi"),
145 "\\(jyasskin\\) Illegal index 12345678 passed to"
146 " SparseArray\\(10\\).set_new\\(\\).");
147 EXPECT_EQ(4, str_map_
.size());