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.
5 
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)
9 
10 //  libs/uuid/test/test_uuid_no_simd.cpp  -------------------------------//
11 
12 // This test is a subset of libs/uuid/test/test_uuid.cpp, compiled without any
13 // SIMD optimizations. The test specifically verifies generic implementations
14 // of the routines.
15 
16 #define BOOST_UUID_NO_SIMD
17 
18 #include <iostream>
19 #include <boost/uuid/uuid.hpp>
20 #include <boost/uuid/uuid_io.hpp>
21 #include <boost/detail/lightweight_test.hpp>
22 #include <boost/current_function.hpp>
23 
test_uuid_equal_array(char const * file,int line,char const * function,boost::uuids::uuid const & lhs,const unsigned char (& rhs)[16])24 void test_uuid_equal_array(char const * file, int line, char const * function,
25                            boost::uuids::uuid const& lhs, const unsigned char (&rhs)[16])
26 {
27     for (size_t i=0; i<16; i++) {
28         if ( *(lhs.begin()+i) != rhs[i]) {
29             std::cerr << file << "(" << line << "): uuid " << lhs << " not equal " << "{";
30             for (size_t j=0; j<16; j++) {
31                 if (j != 0) {
32                     std::cerr << " ";
33                 }
34                 std::cerr << std::hex << (int)rhs[j];
35             }
36             std::cerr << "} in function '" << function << "'" << std::endl;
37             ++boost::detail::test_errors();
38             return;
39         }
40     }
41 }
42 
43 
44 #define BOOST_TEST_UUID(lhs, rhs) ( test_uuid_equal_array(__FILE__, __LINE__, BOOST_CURRENT_FUNCTION, lhs, rhs) )
45 
46 
main(int,char * [])47 int main(int, char*[])
48 {
49     using namespace boost::uuids;
50 
51     { // uuid::operator=()
52         uuid u1 = {{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}};
53         uuid u2 = u1;
54         BOOST_TEST_EQ(u2, u1);
55     }
56 
57     { // uuid::is_nil()
58         uuid u1 = {{0}};
59         BOOST_TEST_EQ(u1.is_nil(), true);
60 
61         uuid u2 = {{1,0}};
62         BOOST_TEST_EQ(u2.is_nil(), false);
63     }
64 
65     { // uuid::swap(), swap()
66         uuid u1 = {{0}};
67         uuid u2 = {{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}};
68         u1.swap(u2);
69 
70         unsigned char values1[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
71         unsigned char values2[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
72         BOOST_TEST_UUID(u1, values2);
73         BOOST_TEST_UUID(u2, values1);
74 
75         swap(u1, u2);
76         BOOST_TEST_UUID(u1, values1);
77         BOOST_TEST_UUID(u2, values2);
78     }
79 
80     { // test comparsion
81         uuid u1 = {{0}};
82         uuid u2 = {{1,0}};
83         uuid u3 = {{255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255}};
84         uuid u4 = {{0,1,0}};
85         uuid u5 = {{0,255,0}};
86 
87         BOOST_TEST_EQ(u1, u1);
88 
89         BOOST_TEST_NE(u1, u2);
90 
91         BOOST_TEST(u1 < u2);
92         BOOST_TEST(u2 < u3);
93         BOOST_TEST(u1 < u4);
94         BOOST_TEST(u1 < u5);
95         BOOST_TEST(u4 < u5);
96         BOOST_TEST(u4 < u2);
97         BOOST_TEST(u5 < u2);
98 
99         BOOST_TEST(u1 <= u1);
100         BOOST_TEST(u1 <= u2);
101         BOOST_TEST(u2 <= u3);
102 
103         BOOST_TEST(u2 >= u1);
104         BOOST_TEST(u3 >= u1);
105 
106         BOOST_TEST(u3 >= u3);
107         BOOST_TEST(u2 >= u1);
108         BOOST_TEST(u3 >= u1);
109     }
110 
111     { // ticket 10510
112         // the uuids in the report
113         uuid u6 = {{0x14,0x5c,0xfc,0x95,0x80,0x50,0x45,0x5a,0x83,0x82,0x44,0xca,0x57,0xc1,0x48,0x3b}};
114         uuid u7 = {{0x14,0x5c,0xfc,0x95,0x80,0x50,0x45,0x5a,0x83,0x82,0x44,0xca,0x57,0xc1,0x48,0x3c}};
115 
116         // simple uuids to reproduce problem
117         uuid u8 = {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}};
118         uuid u9 = {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2}};
119         uuid u10 = {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254}};
120         uuid u11 = {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255}};
121 
122         // some additional uuids for testing boundary cases
123         uuid u12 = {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1}};
124         uuid u13 = {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,2}};
125         uuid u14 = {{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}};
126         uuid u15 = {{255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255}};
127 
128         BOOST_TEST(u6 < u7);
129         BOOST_TEST(!(u7 < u6));
130 
131         BOOST_TEST(u8 < u9);
132         BOOST_TEST(!(u9 < u8));
133         BOOST_TEST(u8 < u10);
134         BOOST_TEST(!(u10 < u8));
135         BOOST_TEST(u8 < u11);
136         BOOST_TEST(!(u11 < u8));
137 
138         BOOST_TEST(u9 < u10);
139         BOOST_TEST(!(u10 < u9));
140         BOOST_TEST(u9 < u11);
141         BOOST_TEST(!(u11 < u9));
142 
143         BOOST_TEST(u10 < u11);
144         BOOST_TEST(!(u11 < u10));
145 
146         BOOST_TEST(u12 < u13);
147         BOOST_TEST(!(u13 < u12));
148         BOOST_TEST(u14 < u15);
149         BOOST_TEST(!(u15 < u14));
150     }
151 
152     return boost::report_errors();
153 }
154