1 // (C) Copyright Andy Tompkins 2007. Permission to copy, use, modify, sell and
2 // distribute this software is granted provided this copyright notice appears
3 // in all copies. This software is provided "as is" without express or implied
4 // warranty, and with no claim as to its suitability for any purpose.
6 // Distributed under the Boost Software License, Version 1.0. (See
7 // accompanying file LICENSE_1_0.txt or copy at
8 // http://www.boost.org/LICENSE_1_0.txt)
10 // libs/uuid/test/test_uuid.cpp -------------------------------//
13 #include <boost/uuid/uuid.hpp>
14 #include <boost/uuid/uuid_io.hpp>
15 #include <boost/detail/lightweight_test.hpp>
16 #include <boost/functional/hash.hpp>
17 #include <boost/current_function.hpp>
19 void test_uuid_equal_array(char const * file
, int line
, char const * function
,
20 boost::uuids::uuid
const& lhs
, const unsigned char (&rhs
)[16])
22 for (size_t i
=0; i
<16; i
++) {
23 if ( *(lhs
.begin()+i
) != rhs
[i
]) {
24 std::cerr
<< file
<< "(" << line
<< "): uuid " << lhs
<< " not equal " << "{";
25 for (size_t j
=0; j
<16; j
++) {
29 std::cerr
<< std::hex
<< (int)rhs
[j
];
31 std::cerr
<< "} in function '" << function
<< "'" << std::endl
;
32 ++boost::detail::test_errors();
39 #define BOOST_TEST_UUID(lhs, rhs) ( test_uuid_equal_array(__FILE__, __LINE__, BOOST_CURRENT_FUNCTION, lhs, rhs) )
41 int main(int, char*[])
43 using namespace boost::uuids
;
46 BOOST_TEST_EQ(uuid::static_size(), 16U);
48 { // uuid::operator=()
49 uuid u1
= {{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}};
51 BOOST_TEST_EQ(u2
, u1
);
54 { // uuid::begin(), end()
55 uuid u
= {{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}};
56 unsigned char values
[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
57 BOOST_TEST_UUID(u
, values
);
60 { // uuid::begin() const, end() const
61 const uuid u
= {{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}};
62 unsigned char values
[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
63 BOOST_TEST_UUID(u
, values
);
67 uuid u
; // uninitialized
68 BOOST_TEST_EQ(u
.size(), 16U);
73 BOOST_TEST_EQ(u1
.is_nil(), true);
76 BOOST_TEST_EQ(u2
.is_nil(), false);
82 boost::uuids::uuid::variant_type variant
;
85 { { 0x00, boost::uuids::uuid::variant_ncs
}
86 , { 0x10, boost::uuids::uuid::variant_ncs
}
87 , { 0x20, boost::uuids::uuid::variant_ncs
}
88 , { 0x30, boost::uuids::uuid::variant_ncs
}
89 , { 0x40, boost::uuids::uuid::variant_ncs
}
90 , { 0x50, boost::uuids::uuid::variant_ncs
}
91 , { 0x60, boost::uuids::uuid::variant_ncs
}
92 , { 0x70, boost::uuids::uuid::variant_ncs
}
93 , { 0x80, boost::uuids::uuid::variant_rfc_4122
}
94 , { 0x90, boost::uuids::uuid::variant_rfc_4122
}
95 , { 0xa0, boost::uuids::uuid::variant_rfc_4122
}
96 , { 0xb0, boost::uuids::uuid::variant_rfc_4122
}
97 , { 0xc0, boost::uuids::uuid::variant_microsoft
}
98 , { 0xd0, boost::uuids::uuid::variant_microsoft
}
99 , { 0xe0, boost::uuids::uuid::variant_future
}
100 , { 0xf0, boost::uuids::uuid::variant_future
}
102 for (size_t i
=0; i
<sizeof(tests
)/sizeof(Test
); i
++) {
104 u
.data
[8] = tests
[i
].octet7
; // note that octet7 is array index 8
106 BOOST_TEST_EQ(u
.variant(), tests
[i
].variant
);
112 unsigned char octet9
;
113 boost::uuids::uuid::version_type version
;
116 { { 0x00, boost::uuids::uuid::version_unknown
}
117 , { 0x10, boost::uuids::uuid::version_time_based
}
118 , { 0x20, boost::uuids::uuid::version_dce_security
}
119 , { 0x30, boost::uuids::uuid::version_name_based_md5
}
120 , { 0x40, boost::uuids::uuid::version_random_number_based
}
121 , { 0x50, boost::uuids::uuid::version_name_based_sha1
}
122 , { 0x60, boost::uuids::uuid::version_unknown
}
123 , { 0x70, boost::uuids::uuid::version_unknown
}
124 , { 0x80, boost::uuids::uuid::version_unknown
}
125 , { 0x90, boost::uuids::uuid::version_unknown
}
126 , { 0xa0, boost::uuids::uuid::version_unknown
}
127 , { 0xb0, boost::uuids::uuid::version_unknown
}
128 , { 0xc0, boost::uuids::uuid::version_unknown
}
129 , { 0xd0, boost::uuids::uuid::version_unknown
}
130 , { 0xe0, boost::uuids::uuid::version_unknown
}
131 , { 0xf0, boost::uuids::uuid::version_unknown
}
133 for (size_t i
=0; i
<sizeof(tests
)/sizeof(Test
); i
++) {
135 u
.data
[6] = tests
[i
].octet9
; // note that octet9 is array index 8
137 BOOST_TEST_EQ(u
.version(), tests
[i
].version
);
141 { // uuid::swap(), swap()
143 uuid u2
= {{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}};
146 unsigned char values1
[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
147 unsigned char values2
[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
148 BOOST_TEST_UUID(u1
, values2
);
149 BOOST_TEST_UUID(u2
, values1
);
152 BOOST_TEST_UUID(u1
, values1
);
153 BOOST_TEST_UUID(u2
, values2
);
159 uuid u3
= {{255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255}};
161 uuid u5
= {{0,255,0}};
163 BOOST_TEST_EQ(u1
, u1
);
165 BOOST_TEST_NE(u1
, u2
);
175 BOOST_TEST(u1
<= u1
);
176 BOOST_TEST(u1
<= u2
);
177 BOOST_TEST(u2
<= u3
);
179 BOOST_TEST(u2
>= u1
);
180 BOOST_TEST(u3
>= u1
);
182 BOOST_TEST(u3
>= u3
);
183 BOOST_TEST(u2
>= u1
);
184 BOOST_TEST(u3
>= u1
);
188 // the uuids in the report
189 uuid u6
= {{0x14,0x5c,0xfc,0x95,0x80,0x50,0x45,0x5a,0x83,0x82,0x44,0xca,0x57,0xc1,0x48,0x3b}};
190 uuid u7
= {{0x14,0x5c,0xfc,0x95,0x80,0x50,0x45,0x5a,0x83,0x82,0x44,0xca,0x57,0xc1,0x48,0x3c}};
192 // simple uuids to reproduce problem
193 uuid u8
= {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}};
194 uuid u9
= {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2}};
195 uuid u10
= {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254}};
196 uuid u11
= {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255}};
198 // some additional uuids for testing boundary cases
199 uuid u12
= {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1}};
200 uuid u13
= {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,2}};
201 uuid u14
= {{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}};
202 uuid u15
= {{255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255}};
205 BOOST_TEST(!(u7
< u6
));
208 BOOST_TEST(!(u9
< u8
));
209 BOOST_TEST(u8
< u10
);
210 BOOST_TEST(!(u10
< u8
));
211 BOOST_TEST(u8
< u11
);
212 BOOST_TEST(!(u11
< u8
));
214 BOOST_TEST(u9
< u10
);
215 BOOST_TEST(!(u10
< u9
));
216 BOOST_TEST(u9
< u11
);
217 BOOST_TEST(!(u11
< u9
));
219 BOOST_TEST(u10
< u11
);
220 BOOST_TEST(!(u11
< u10
));
222 BOOST_TEST(u12
< u13
);
223 BOOST_TEST(!(u13
< u12
));
224 BOOST_TEST(u14
< u15
);
225 BOOST_TEST(!(u15
< u14
));
231 uuid u3
= {{255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255}};
233 boost::hash
<uuid
> uuid_hasher
;
235 BOOST_TEST_NE(uuid_hasher(u1
), uuid_hasher(u2
));
236 BOOST_TEST_NE(uuid_hasher(u1
), uuid_hasher(u3
));
237 BOOST_TEST_NE(uuid_hasher(u2
), uuid_hasher(u3
));
241 BOOST_TEST_EQ(boost::is_pod
<uuid
>::value
, true);
244 return boost::report_errors();