aboutsummaryrefslogtreecommitdiffstats
path: root/tests/utils_tests.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/utils_tests.cpp')
-rw-r--r--tests/utils_tests.cpp119
1 files changed, 119 insertions, 0 deletions
diff --git a/tests/utils_tests.cpp b/tests/utils_tests.cpp
new file mode 100644
index 0000000..9f4ba02
--- /dev/null
+++ b/tests/utils_tests.cpp
@@ -0,0 +1,119 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2015 Microsoft Corporation. All rights reserved.
+//
+// This code is licensed under the MIT License (MIT).
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include <UnitTest++/UnitTest++.h>
+#include <gsl/gsl>
+#include <functional>
+
+using namespace gsl;
+
+SUITE(utils_tests)
+{
+ void f(int& i)
+ {
+ i += 1;
+ }
+
+ TEST(finally_lambda)
+ {
+ int i = 0;
+ {
+ auto _ = finally([&]() {f(i);});
+ CHECK(i == 0);
+ }
+ CHECK(i == 1);
+ }
+
+ TEST(finally_lambda_move)
+ {
+ int i = 0;
+ {
+ auto _1 = finally([&]() {f(i);});
+ {
+ auto _2 = std::move(_1);
+ CHECK(i == 0);
+ }
+ CHECK(i == 1);
+ {
+ auto _2 = std::move(_1);
+ CHECK(i == 1);
+ }
+ CHECK(i == 1);
+ }
+ CHECK(i == 1);
+ }
+
+ TEST(finally_function_with_bind)
+ {
+ int i = 0;
+ {
+ auto _ = finally(std::bind(&f, std::ref(i)));
+ CHECK(i == 0);
+ }
+ CHECK(i == 1);
+ }
+
+ int j = 0;
+ void g() { j += 1; };
+ TEST(finally_function_ptr)
+ {
+ j = 0;
+ {
+ auto _ = finally(&g);
+ CHECK(j == 0);
+ }
+ CHECK(j == 1);
+ }
+
+ TEST(narrow_cast)
+ {
+ int n = 120;
+ char c = narrow_cast<char>(n);
+ CHECK(c == 120);
+
+ n = 300;
+ unsigned char uc = narrow_cast<unsigned char>(n);
+ CHECK(uc == 44);
+ }
+
+ TEST(narrow)
+ {
+ int n = 120;
+ char c = narrow<char>(n);
+ CHECK(c == 120);
+
+ n = 300;
+ CHECK_THROW(narrow<char>(n), narrowing_error);
+
+ const auto int32_max = std::numeric_limits<int32_t>::max();
+ const auto int32_min = std::numeric_limits<int32_t>::min();
+
+ CHECK(narrow<uint32_t>(int32_t(0)) == 0);
+ CHECK(narrow<uint32_t>(int32_t(1)) == 1);
+ CHECK(narrow<uint32_t>(int32_max) == static_cast<uint32_t>(int32_max));
+
+ CHECK_THROW(narrow<uint32_t>(int32_t(-1)), narrowing_error);
+ CHECK_THROW(narrow<uint32_t>(int32_min), narrowing_error);
+
+ n = -42;
+ CHECK_THROW(narrow<unsigned>(n), narrowing_error);
+ }
+}
+
+int main(int, const char *[])
+{
+ return UnitTest::RunAllTests();
+}