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