1 // Copyright (c) Microsoft Corporation. All rights reserved.
2 // Licensed under the MIT license.
3 
4 #include "kuku/common.h"
5 #include "gtest/gtest.h"
6 #include <cmath>
7 #include <cstdint>
8 
9 using namespace kuku;
10 using namespace std;
11 
12 namespace kuku_tests
13 {
TEST(CommonTests,SetItem)14     TEST(CommonTests, SetItem)
15     {
16         item_type bl;
17 
18         set_item(0, 0, bl);
19         ASSERT_EQ(0, get_low_word(bl));
20         ASSERT_EQ(0, get_high_word(bl));
21 
22         set_item(1, 0, bl);
23         ASSERT_EQ(1, get_low_word(bl));
24         ASSERT_EQ(0, get_high_word(bl));
25 
26         set_item(0, 1, bl);
27         ASSERT_EQ(0, get_low_word(bl));
28         ASSERT_EQ(1, get_high_word(bl));
29 
30         set_item(0xF00F, 0xBABA, bl);
31         ASSERT_EQ(0xF00F, get_low_word(bl));
32         ASSERT_EQ(0xBABA, get_high_word(bl));
33 
34         set_item(0xF00FF00FF00FF00F, 0xBABABABABABABABA, bl);
35         ASSERT_EQ(0xF00FF00FF00FF00F, get_low_word(bl));
36         ASSERT_EQ(0xBABABABABABABABA, get_high_word(bl));
37 
38         unsigned char data[bytes_per_item]{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
39                                             0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };
40         set_item(data, bl);
41         ASSERT_EQ(0x0706050403020100, get_low_word(bl));
42         ASSERT_EQ(0x0706050403020100, get_high_word(bl));
43     }
44 
TEST(CommonTests,SetZeroItem)45     TEST(CommonTests, SetZeroItem)
46     {
47         item_type bl;
48 
49         set_item(0, 0, bl);
50         set_zero_item(bl);
51         ASSERT_EQ(0, get_low_word(bl));
52         ASSERT_EQ(0, get_high_word(bl));
53 
54         set_item(0xF00FF00FF00FF00F, 0xBABABABABABABABA, bl);
55         set_zero_item(bl);
56         ASSERT_EQ(0, get_low_word(bl));
57         ASSERT_EQ(0, get_high_word(bl));
58     }
59 
TEST(CommonTests,SetAllOnesItem)60     TEST(CommonTests, SetAllOnesItem)
61     {
62         item_type bl;
63 
64         set_zero_item(bl);
65         set_all_ones_item(bl);
66         ASSERT_EQ(0xFFFFFFFFFFFFFFFFULL, get_low_word(bl));
67         ASSERT_EQ(0xFFFFFFFFFFFFFFFFULL, get_high_word(bl));
68 
69         set_item(0xF00FF00FF00FF00F, 0xBABABABABABABABA, bl);
70         set_all_ones_item(bl);
71         ASSERT_EQ(0xFFFFFFFFFFFFFFFFULL, get_low_word(bl));
72         ASSERT_EQ(0xFFFFFFFFFFFFFFFFULL, get_high_word(bl));
73     }
74 
TEST(CommonTests,IsZeroItem)75     TEST(CommonTests, IsZeroItem)
76     {
77         item_type bl;
78 
79         set_item(0, 0, bl);
80         ASSERT_TRUE(is_zero_item(bl));
81 
82         set_item(1, 0, bl);
83         ASSERT_FALSE(is_zero_item(bl));
84 
85         set_item(0, 1, bl);
86         ASSERT_FALSE(is_zero_item(bl));
87 
88         set_item(0xF00FF00FF00FF00F, 0xBABABABABABABABA, bl);
89         ASSERT_FALSE(is_zero_item(bl));
90     }
91 
TEST(CommonTests,IsAllOnesItem)92     TEST(CommonTests, IsAllOnesItem)
93     {
94         item_type bl;
95 
96         set_all_ones_item(bl);
97         ASSERT_TRUE(is_all_ones_item(bl));
98 
99         set_item(0xFFFFFFFFFFFFFFFFULL, 0, bl);
100         ASSERT_FALSE(is_all_ones_item(bl));
101 
102         set_item(0, 0xFFFFFFFFFFFFFFFFULL, bl);
103         ASSERT_FALSE(is_all_ones_item(bl));
104 
105         set_item(0xFFFFFFFFFFFFFFFEULL, 0xFFFFFFFFFFFFFFFFULL, bl);
106         ASSERT_FALSE(is_all_ones_item(bl));
107     }
108 
TEST(CommonTests,SetRandomItem)109     TEST(CommonTests, SetRandomItem)
110     {
111         item_type bl;
112 
113         set_random_item(bl);
114         ASSERT_FALSE(is_zero_item(bl));
115         item_type bl2 = bl;
116         ASSERT_TRUE(are_equal_item(bl, bl2));
117         set_random_item(bl);
118         ASSERT_FALSE(is_zero_item(bl));
119         ASSERT_FALSE(are_equal_item(bl, bl2));
120     }
121 
TEST(CommonTests,ZeroItem)122     TEST(CommonTests, ZeroItem)
123     {
124         item_type bl = make_random_item();
125         ASSERT_FALSE(is_zero_item(bl));
126         bl = make_zero_item();
127         ASSERT_TRUE(is_zero_item(bl));
128     }
129 
TEST(CommonTests,IncrementItem)130     TEST(CommonTests, IncrementItem)
131     {
132         item_type bl = make_item(0, 0);
133 
134         increment_item(bl);
135         ASSERT_EQ(1, get_low_word(bl));
136         ASSERT_EQ(0, get_high_word(bl));
137 
138         bl = make_item(0xF00F, 0xBAAB);
139         increment_item(bl);
140         ASSERT_EQ(0xF010, get_low_word(bl));
141         ASSERT_EQ(0xBAAB, get_high_word(bl));
142 
143         bl = make_item(0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFE);
144         increment_item(bl);
145         ASSERT_EQ(0x0, get_low_word(bl));
146         ASSERT_EQ(0xFFFFFFFFFFFFFFFF, get_high_word(bl));
147 
148         bl = make_item(0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF);
149         increment_item(bl);
150         ASSERT_EQ(0x0, get_low_word(bl));
151         ASSERT_EQ(0x0, get_high_word(bl));
152     }
153 } // namespace kuku_tests
154