comparison tests/libserver/id/main.cpp @ 0:8991989c4708

Initial import
author David Demelier <markand@malikania.fr>
date Tue, 22 Mar 2016 18:26:05 +0100
parents
children 45b3c770803c
comparison
equal deleted inserted replaced
-1:000000000000 0:8991989c4708
1 /*
2 * main.cpp -- test Id
3 *
4 * Copyright (c) 2013-2016 Malikania Authors
5 *
6 * Permission to use, copy, modify, and/or distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19 #include <cstdint>
20 #include <thread>
21
22 #include <gtest/gtest.h>
23
24 #include <malikania/Id.h>
25
26 using namespace malikania;
27
28 /* --------------------------------------------------------
29 * Basic use case
30 * -------------------------------------------------------- */
31
32 class TestId : public testing::Test {
33 protected:
34 IdGen<unsigned> m_idgen;
35
36 public:
37 ~TestId()
38 {
39 m_idgen.reset();
40 }
41 };
42
43 TEST_F(TestId, simple)
44 {
45 ASSERT_EQ(0U, m_idgen.next());
46 ASSERT_EQ(1U, m_idgen.next());
47 ASSERT_EQ(2U, m_idgen.next());
48 ASSERT_EQ(3U, m_idgen.next());
49 ASSERT_EQ(4U, m_idgen.next());
50 }
51
52 TEST_F(TestId, reset)
53 {
54 m_idgen.next();
55 m_idgen.next();
56 m_idgen.next();
57
58 m_idgen.reset();
59
60 ASSERT_EQ(0U, m_idgen.next());
61 }
62
63 TEST_F(TestId, release1)
64 {
65 m_idgen.next(); // 0
66 m_idgen.next(); // 1
67 m_idgen.next(); // 2
68 m_idgen.release(1);
69
70 /*
71 * 0 and 2 are currently in use.
72 *
73 * The next id must be 1 and then 3.
74 */
75 ASSERT_EQ(1U, m_idgen.next());
76 ASSERT_EQ(3U, m_idgen.next());
77 }
78
79 TEST_F(TestId, release2)
80 {
81 m_idgen.next(); // 0
82 m_idgen.next(); // 1
83 m_idgen.next(); // 2
84 m_idgen.release(1);
85 m_idgen.release(0);
86
87 /*
88 * Only 2 is in use, next id must be:
89 *
90 * - 1
91 * - 0
92 * - 3
93 */
94 ASSERT_EQ(1U, m_idgen.next());
95 ASSERT_EQ(0U, m_idgen.next());
96 ASSERT_EQ(3U, m_idgen.next());
97 }
98
99 /* --------------------------------------------------------
100 * Id RAII class
101 * -------------------------------------------------------- */
102
103 TEST(IdLocker, basic)
104 {
105 IdGen<int8_t> gen;
106 Id<int8_t> id(gen);
107
108 ASSERT_EQ(0, id);
109 }
110
111 TEST(IdLocker, two)
112 {
113 IdGen<int8_t> gen;
114 Id<int8_t> id(gen);
115 Id<int8_t> id2(gen);
116
117 ASSERT_EQ(0, id);
118 ASSERT_EQ(1, id2);
119 }
120
121 TEST(IdLocker, already)
122 {
123 IdGen<int8_t> gen;
124 Id<int8_t> id(gen, gen.next());
125
126 ASSERT_EQ(0, id);
127 }
128
129 /* --------------------------------------------------------
130 * Limit test
131 * -------------------------------------------------------- */
132
133 TEST(Limits, max)
134 {
135 IdGen<int8_t> idgen;
136 int8_t last;
137
138 try {
139 for (int i = 0; i < 127; ++i) {
140 last = idgen.next();
141 }
142 } catch (const std::exception &ex) {
143 FAIL() << ex.what();
144 }
145
146 ASSERT_EQ(126, last);
147 }
148
149 TEST(Limits, fail)
150 {
151 IdGen<int8_t> idgen;
152 int8_t last;
153
154 try {
155 for (int i = 0; i < 200; ++i) {
156 last = idgen.next();
157 }
158
159 FAIL() << "Exception expected";
160 } catch (const std::exception &ex) {
161 }
162
163 ASSERT_EQ(126, last);
164 }
165
166 int main(int argc, char **argv)
167 {
168 testing::InitGoogleTest(&argc, argv);
169
170 return RUN_ALL_TESTS();
171 }