1 // Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <gtest/gtest.h>
6
7 #include "array.h"
8
9 namespace {
10
11 struct point {
12 int x, y;
13 };
14
15 DECLARE_ARRAY_TYPE(double, double_array);
16 DECLARE_ARRAY_TYPE(struct point, point_array);
17
TEST(ArrayTest,Basic)18 TEST(ArrayTest, Basic) {
19 double_array a = ARRAY_INIT;
20
21 /* create an array {1.0, 2.0} */
22 ARRAY_APPEND(&a, 1.0);
23 double *p = ARRAY_APPEND_ZERO(&a);
24 EXPECT_EQ(0.0, *p);
25 *p = 2.0;
26
27 EXPECT_EQ(2, ARRAY_COUNT(&a));
28 EXPECT_EQ(2, a.count);
29 EXPECT_GE(a.size, 2);
30 EXPECT_EQ(1.0, *ARRAY_ELEMENT(&a, 0));
31 EXPECT_EQ(2.0, *ARRAY_ELEMENT(&a, 1));
32 EXPECT_EQ(1.0, a.element[0]);
33 EXPECT_EQ(2.0, a.element[1]);
34 EXPECT_EQ(0, ARRAY_FIND(&a, 1.0));
35 EXPECT_EQ(1, ARRAY_FIND(&a, 2.0));
36 EXPECT_EQ(-1, ARRAY_FIND(&a, 0.0));
37 EXPECT_EQ(0, ARRAY_INDEX(&a, ARRAY_ELEMENT(&a, 0)));
38 EXPECT_EQ(1, ARRAY_INDEX(&a, ARRAY_ELEMENT(&a, 1)));
39
40 ARRAY_FREE(&a);
41 EXPECT_EQ(0, ARRAY_COUNT(&a));
42 EXPECT_EQ(0, a.count);
43 EXPECT_EQ(0, a.size);
44 EXPECT_EQ(NULL, a.element);
45 }
46
TEST(ArrayTest,StructElement)47 TEST(ArrayTest, StructElement) {
48 struct point p = {1, 2};
49 struct point q = {3, 4};
50 point_array a = ARRAY_INIT;
51
52 ARRAY_APPEND(&a, p);
53 ARRAY_APPEND(&a, q);
54
55 EXPECT_EQ(2, ARRAY_COUNT(&a));
56 EXPECT_EQ(1, ARRAY_ELEMENT(&a, 0)->x);
57 EXPECT_EQ(2, ARRAY_ELEMENT(&a, 0)->y);
58 EXPECT_EQ(3, a.element[1].x);
59 EXPECT_EQ(4, a.element[1].y);
60 ARRAY_ELEMENT(&a, 1)->y = 5;
61 EXPECT_EQ(5, a.element[1].y);
62
63 ARRAY_FREE(&a);
64 EXPECT_EQ(0, ARRAY_COUNT(&a));
65 EXPECT_EQ(0, a.size);
66 EXPECT_EQ(NULL, a.element);
67 }
68
TEST(ArrayTest,AppendZeroStruct)69 TEST(ArrayTest, AppendZeroStruct) {
70 point_array a = ARRAY_INIT;
71 struct point *p, *q;
72
73 p = ARRAY_APPEND_ZERO(&a);
74 EXPECT_EQ(0, p->x);
75 EXPECT_EQ(0, p->y);
76 EXPECT_EQ(1, a.count);
77
78 q = ARRAY_APPEND_ZERO(&a);
79 EXPECT_EQ(0, q->x);
80 EXPECT_EQ(0, q->y);
81 EXPECT_EQ(2, a.count);
82
83 ARRAY_FREE(&a);
84 }
85
TEST(ArrayTest,ForLoop)86 TEST(ArrayTest, ForLoop) {
87 int i;
88 double *p;
89 double_array a = ARRAY_INIT;
90
91 for (i = 0; i < 100; i++) {
92 ARRAY_APPEND(&a, i * 2);
93 }
94
95 int expectedIndex = 0;
96 double expectedValue = 0;
97 FOR_ARRAY_ELEMENT(&a, i, p) {
98 EXPECT_EQ(expectedIndex, i);
99 EXPECT_EQ(expectedValue, *p);
100 expectedIndex++;
101 expectedValue += 2;
102 }
103 EXPECT_EQ(expectedIndex, 100);
104
105 ARRAY_FREE(&a);
106 EXPECT_EQ(0, a.count);
107 EXPECT_EQ(0, a.size);
108 EXPECT_EQ(NULL, a.element);
109 }
110
111 } // namespace
112
main(int argc,char ** argv)113 int main(int argc, char **argv) {
114 ::testing::InitGoogleTest(&argc, argv);
115 return RUN_ALL_TESTS();
116 }
117