1 // Copyright 2016 Google Inc. All Rights Reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS-IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 //
15
16 // Author: ericv@google.com (Eric Veach)
17
18 #include "s2/value_lexicon.h"
19
20 #include <memory>
21
22 #include <gtest/gtest.h>
23 #include "s2/third_party/absl/memory/memory.h"
24 #include "s2/s1angle.h"
25 #include "s2/s2point.h"
26
27 using absl::make_unique;
28
TEST(ValueLexicon,DuplicateValues)29 TEST(ValueLexicon, DuplicateValues) {
30 ValueLexicon<int64> lex;
31 EXPECT_EQ(0, lex.Add(5));
32 EXPECT_EQ(1, lex.Add(0));
33 EXPECT_EQ(1, lex.Add(0));
34 EXPECT_EQ(2, lex.Add(-3));
35 EXPECT_EQ(0, lex.Add(5));
36 EXPECT_EQ(1, lex.Add(0));
37 EXPECT_EQ(3, lex.Add(0x7fffffffffffffff));
38 EXPECT_EQ(4, lex.Add(-0x8000000000000000));
39 EXPECT_EQ(3, lex.Add(0x7fffffffffffffff));
40 EXPECT_EQ(4, lex.Add(-0x8000000000000000));
41 EXPECT_EQ(5, lex.size());
42 EXPECT_EQ(5, lex.value(0));
43 EXPECT_EQ(0, lex.value(1));
44 EXPECT_EQ(-3, lex.value(2));
45 EXPECT_EQ(0x7fffffffffffffff, lex.value(3));
46 EXPECT_EQ(-0x8000000000000000, lex.value(4));
47 }
48
TEST(ValueLexicon,Clear)49 TEST(ValueLexicon, Clear) {
50 ValueLexicon<int64> lex;
51 EXPECT_EQ(0, lex.Add(1));
52 EXPECT_EQ(1, lex.Add(2));
53 EXPECT_EQ(0, lex.Add(1));
54 lex.Clear();
55 EXPECT_EQ(0, lex.Add(2));
56 EXPECT_EQ(1, lex.Add(1));
57 EXPECT_EQ(0, lex.Add(2));
58 }
59
TEST(ValueLexicon,FloatEquality)60 TEST(ValueLexicon, FloatEquality) {
61 ValueLexicon<S2Point, S2PointHash> lex;
62 S2Point a(1, 0.0, 0.0);
63 S2Point b(1, -0.0, 0.0);
64 S2Point c(1, 0.0, -0.0);
65 EXPECT_NE(0, memcmp(&a, &b, sizeof(a)));
66 EXPECT_NE(0, memcmp(&a, &c, sizeof(a)));
67 EXPECT_NE(0, memcmp(&b, &c, sizeof(a)));
68 EXPECT_EQ(0, lex.Add(a));
69 EXPECT_EQ(0, lex.Add(b));
70 EXPECT_EQ(0, lex.Add(c));
71 EXPECT_EQ(1, lex.size());
72 EXPECT_EQ(0, memcmp(&a, &lex.value(0), sizeof(a)));
73 }
74
TEST(ValueLexicon,CopyConstructor)75 TEST(ValueLexicon, CopyConstructor) {
76 auto original = make_unique<ValueLexicon<int64>>();
77 EXPECT_EQ(0, original->Add(5));
78 auto lex = *original;
79 original.reset(nullptr);
80 EXPECT_EQ(1, lex.Add(10));
81 EXPECT_EQ(5, lex.value(0));
82 EXPECT_EQ(10, lex.value(1));
83 }
84
TEST(ValueLexicon,MoveConstructor)85 TEST(ValueLexicon, MoveConstructor) {
86 auto original = make_unique<ValueLexicon<int64>>();
87 EXPECT_EQ(0, original->Add(5));
88 auto lex = std::move(*original);
89 original.reset(nullptr);
90 EXPECT_EQ(1, lex.Add(10));
91 EXPECT_EQ(5, lex.value(0));
92 EXPECT_EQ(10, lex.value(1));
93 }
94
TEST(ValueLexicon,CopyAssignmentOperator)95 TEST(ValueLexicon, CopyAssignmentOperator) {
96 auto original = make_unique<ValueLexicon<int64>>();
97 EXPECT_EQ(0, original->Add(5));
98 ValueLexicon<int64> lex;
99 EXPECT_EQ(0, lex.Add(10));
100 EXPECT_EQ(1, lex.Add(15));
101 lex = *original;
102 original.reset(nullptr);
103 lex = *&lex; // Tests self-assignment.
104 EXPECT_EQ(1, lex.Add(20));
105 EXPECT_EQ(5, lex.value(0));
106 EXPECT_EQ(20, lex.value(1));
107 }
108
TEST(ValueLexicon,MoveAssignmentOperator)109 TEST(ValueLexicon, MoveAssignmentOperator) {
110 auto original = make_unique<ValueLexicon<int64>>();
111 EXPECT_EQ(0, original->Add(5));
112 ValueLexicon<int64> lex;
113 EXPECT_EQ(0, lex.Add(10));
114 EXPECT_EQ(1, lex.Add(15));
115 lex = std::move(*original);
116 original.reset(nullptr);
117 EXPECT_EQ(1, lex.Add(20));
118 EXPECT_EQ(5, lex.value(0));
119 EXPECT_EQ(20, lex.value(1));
120 }
121
122