• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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