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>
19 #include <functional>
20
21 using namespace gsl;
22
SUITE(utils_tests)23 SUITE(utils_tests)
24 {
25 void f(int& i)
26 {
27 i += 1;
28 }
29
30 TEST(finally_lambda)
31 {
32 int i = 0;
33 {
34 auto _ = finally([&]() {f(i);});
35 CHECK(i == 0);
36 }
37 CHECK(i == 1);
38 }
39
40 TEST(finally_lambda_move)
41 {
42 int i = 0;
43 {
44 auto _1 = finally([&]() {f(i);});
45 {
46 auto _2 = std::move(_1);
47 CHECK(i == 0);
48 }
49 CHECK(i == 1);
50 {
51 auto _2 = std::move(_1);
52 CHECK(i == 1);
53 }
54 CHECK(i == 1);
55 }
56 CHECK(i == 1);
57 }
58
59 TEST(finally_function_with_bind)
60 {
61 int i = 0;
62 {
63 auto _ = finally(std::bind(&f, std::ref(i)));
64 CHECK(i == 0);
65 }
66 CHECK(i == 1);
67 }
68
69 int j = 0;
70 void g() { j += 1; };
71 TEST(finally_function_ptr)
72 {
73 j = 0;
74 {
75 auto _ = finally(&g);
76 CHECK(j == 0);
77 }
78 CHECK(j == 1);
79 }
80
81 TEST(narrow_cast)
82 {
83 int n = 120;
84 char c = narrow_cast<char>(n);
85 CHECK(c == 120);
86
87 n = 300;
88 unsigned char uc = narrow_cast<unsigned char>(n);
89 CHECK(uc == 44);
90 }
91
92 TEST(narrow)
93 {
94 int n = 120;
95 char c = narrow<char>(n);
96 CHECK(c == 120);
97
98 n = 300;
99 CHECK_THROW(narrow<char>(n), narrowing_error);
100
101 const auto int32_max = std::numeric_limits<int32_t>::max();
102 const auto int32_min = std::numeric_limits<int32_t>::min();
103
104 CHECK(narrow<uint32_t>(int32_t(0)) == 0);
105 CHECK(narrow<uint32_t>(int32_t(1)) == 1);
106 CHECK(narrow<uint32_t>(int32_max) == static_cast<uint32_t>(int32_max));
107
108 CHECK_THROW(narrow<uint32_t>(int32_t(-1)), narrowing_error);
109 CHECK_THROW(narrow<uint32_t>(int32_min), narrowing_error);
110
111 n = -42;
112 CHECK_THROW(narrow<unsigned>(n), narrowing_error);
113 }
114 }
115
main(int,const char * [])116 int main(int, const char *[])
117 {
118 return UnitTest::RunAllTests();
119 }
120