OXYGENHUB
◆ main openmsx / src / unittest / narrow_test.cc
2.7 KiB · C++ · last changed chore(): initial commit 1 month ago source blame history raw
e8555c89 Andy McCall 1
#include "catch.hpp"
2
#include "narrow.hh"
3
4
#include <cstdint>
5
#include <type_traits>
6
7
template<typename From, typename To>
8
bool test_narrow(From from, To expected)
9
{
10
	// When compiling unittests this will throw on error.
11
	// But for normal builds it triggers an assertion.
12
	auto result = narrow<To>(from);
13
	static_assert(std::is_same_v<decltype(result), To>);
14
	CHECK(result == expected);
15
	return true;
16
}
17
18
TEST_CASE("narrow")
19
{
20
	int ERR = 0;
21
22
	SECTION("int32_t -> uint8_t") {
23
		CHECK_NOTHROW(test_narrow(int32_t(   0), uint8_t(  0)));
24
		CHECK_NOTHROW(test_narrow(int32_t( 100), uint8_t(100)));
25
		CHECK_NOTHROW(test_narrow(int32_t( 200), uint8_t(200)));
26
		CHECK_NOTHROW(test_narrow(int32_t( 255), uint8_t(255)));
27
28
		CHECK_THROWS (test_narrow(int32_t(-999), uint8_t(ERR)));
29
		CHECK_THROWS (test_narrow(int32_t(-256), uint8_t(ERR)));
30
		CHECK_THROWS (test_narrow(int32_t(-255), uint8_t(ERR)));
31
		CHECK_THROWS (test_narrow(int32_t(  -1), uint8_t(ERR)));
32
		CHECK_THROWS (test_narrow(int32_t( 256), uint8_t(ERR)));
33
		CHECK_THROWS (test_narrow(int32_t( 300), uint8_t(ERR)));
34
		CHECK_THROWS (test_narrow(int32_t(9999), uint8_t(ERR)));
35
	}
36
	SECTION("int32_t -> int8_t") {
37
		CHECK_NOTHROW(test_narrow(int32_t(-128), int8_t(-128)));
38
		CHECK_NOTHROW(test_narrow(int32_t( -32), int8_t( -32)));
39
		CHECK_NOTHROW(test_narrow(int32_t(   0), int8_t(   0)));
40
		CHECK_NOTHROW(test_narrow(int32_t(   7), int8_t(   7)));
41
		CHECK_NOTHROW(test_narrow(int32_t( 100), int8_t( 100)));
42
		CHECK_NOTHROW(test_narrow(int32_t( 127), int8_t( 127)));
43
44
		CHECK_THROWS (test_narrow(int32_t(-999), int8_t(ERR)));
45
		CHECK_THROWS (test_narrow(int32_t(-456), int8_t(ERR)));
46
		CHECK_THROWS (test_narrow(int32_t(-129), int8_t(ERR)));
47
		CHECK_THROWS (test_narrow(int32_t( 128), int8_t(ERR)));
48
		CHECK_THROWS (test_narrow(int32_t( 356), int8_t(ERR)));
49
		CHECK_THROWS (test_narrow(int32_t(9999), int8_t(ERR)));
50
	}
51
	SECTION("uint32_t -> uint8_t") {
52
		CHECK_NOTHROW(test_narrow(uint32_t(   0), uint8_t(  0)));
53
		CHECK_NOTHROW(test_narrow(uint32_t( 100), uint8_t(100)));
54
		CHECK_NOTHROW(test_narrow(uint32_t( 200), uint8_t(200)));
55
		CHECK_NOTHROW(test_narrow(uint32_t( 255), uint8_t(255)));
56
57
		CHECK_THROWS (test_narrow(uint32_t( 256), uint8_t(ERR)));
58
		CHECK_THROWS (test_narrow(uint32_t( 300), uint8_t(ERR)));
59
		CHECK_THROWS (test_narrow(uint32_t(9999), uint8_t(ERR)));
60
	}
61
	SECTION("uint32_t -> int8_t") {
62
		CHECK_NOTHROW(test_narrow(uint32_t(   0), int8_t(   0)));
63
		CHECK_NOTHROW(test_narrow(uint32_t(   7), int8_t(   7)));
64
		CHECK_NOTHROW(test_narrow(uint32_t( 100), int8_t( 100)));
65
		CHECK_NOTHROW(test_narrow(uint32_t( 127), int8_t( 127)));
66
67
		CHECK_THROWS (test_narrow(uint32_t( 128), int8_t(ERR)));
68
		CHECK_THROWS (test_narrow(uint32_t( 356), int8_t(ERR)));
69
		CHECK_THROWS (test_narrow(uint32_t(9999), int8_t(ERR)));
70
	}
71
}