1 ///////////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (c) 2015 Microsoft Corporation. All rights reserved.
4 //
5 // This code is licensed under the MIT License (MIT).
6 //
7 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
8 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
9 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
10 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
11 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
12 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
13 // THE SOFTWARE.
14 //
15 ///////////////////////////////////////////////////////////////////////////////
16
17 #include <UnitTest++/UnitTest++.h>
18 #include <gsl/gsl_byte>
19
20 #include <iostream>
21 #include <list>
22 #include <map>
23 #include <memory>
24 #include <string>
25 #include <vector>
26
27 using namespace std;
28 using namespace gsl;
29
30 namespace
31 {
32
SUITE(byte_tests)33 SUITE(byte_tests)
34 {
35 TEST(construction)
36 {
37 {
38 byte b = static_cast<byte>(4);
39 CHECK(static_cast<unsigned char>(b) == 4);
40 }
41
42 {
43 byte b = byte(12);
44 CHECK(static_cast<unsigned char>(b) == 12);
45 }
46
47 {
48 byte b = to_byte<12>();
49 CHECK(static_cast<unsigned char>(b) == 12);
50 }
51 {
52 unsigned char uc = 12;
53 byte b = to_byte(uc);
54 CHECK(static_cast<unsigned char>(b) == 12);
55 }
56
57 // waiting for C++17 enum class direct initializer support
58 //{
59 // byte b { 14 };
60 // CHECK(static_cast<unsigned char>(b) == 14);
61 //}
62 }
63
64 TEST(bitwise_operations)
65 {
66 byte b = to_byte<0xFF>();
67
68 byte a = to_byte<0x00>();
69 CHECK((b | a) == to_byte<0xFF>());
70 CHECK(a == to_byte<0x00>());
71
72 a |= b;
73 CHECK(a == to_byte<0xFF>());
74
75 a = to_byte<0x01>();
76 CHECK((b & a) == to_byte<0x01>());
77
78 a &= b;
79 CHECK(a == to_byte<0x01>());
80
81 CHECK((b ^ a) == to_byte<0xFE>());
82
83 CHECK(a == to_byte<0x01>());
84 a ^= b;
85 CHECK(a == to_byte<0xFE>());
86
87 a = to_byte<0x01>();
88 CHECK(~a == to_byte<0xFE>());
89
90 a = to_byte<0xFF>();
91 CHECK((a << 4) == to_byte<0xF0>());
92 CHECK((a >> 4) == to_byte<0x0F>());
93
94 a <<= 4;
95 CHECK(a == to_byte<0xF0>());
96 a >>= 4;
97 CHECK(a == to_byte<0x0F>());
98 }
99
100 TEST(to_integer)
101 {
102 byte b = to_byte<0x12>();
103
104 CHECK(0x12 == gsl::to_integer<char>(b));
105 CHECK(0x12 == gsl::to_integer<short>(b));
106 CHECK(0x12 == gsl::to_integer<long>(b));
107 CHECK(0x12 == gsl::to_integer<long long>(b));
108
109 CHECK(0x12 == gsl::to_integer<unsigned char>(b));
110 CHECK(0x12 == gsl::to_integer<unsigned short>(b));
111 CHECK(0x12 == gsl::to_integer<unsigned long>(b));
112 CHECK(0x12 == gsl::to_integer<unsigned long long>(b));
113
114 // CHECK(0x12 == gsl::to_integer<float>(b)); // expect compile-time error
115 // CHECK(0x12 == gsl::to_integer<double>(b)); // expect compile-time error
116 }
117
118 int modify_both(gsl::byte& b, int& i)
119 {
120 i = 10;
121 b = to_byte<5>();
122 return i;
123 }
124
125 TEST(aliasing)
126 {
127 int i{ 0 };
128 int res = modify_both(reinterpret_cast<byte&>(i), i);
129 CHECK(res == i);
130 }
131 }
132
133 }
134
main(int,const char * [])135 int main(int, const char* []) { return UnitTest::RunAllTests(); }
136