File: AddVerify.cpp

package info (click to toggle)
safeint 3.0.28a%2Bdfsg-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,668 kB
  • sloc: cpp: 24,880; ansic: 3,183; makefile: 53
file content (139 lines) | stat: -rw-r--r-- 4,325 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

#include "TestMain.h"
#include "TestCase.h"

template <typename T, typename U>
void AddVerifyBase(const char* types)
{
	TestVector< T, U, OpType::Add > tests;
	TestCase< T, U, OpType::Add > test = tests.GetNext();

	while (!tests.Done())
	{
		T ret;
		if (SafeAdd(test.x, test.y, ret) != test.fExpected)
		{
			std::string msg = std::string("Error in case ") + types + ": ";
			err_msg(msg.c_str(), test.x, test.y, test.fExpected);
		}

		// Now test throwing version
		bool fSuccess = true;
		try
		{
			SafeInt<T> si(test.x);
			si += test.y;
		}
		catch (...)
		{
			fSuccess = false;
		}

		if (fSuccess != test.fExpected)
		{
			std::string msg = std::string("Error in case ") + types + " throw (1): ";
			err_msg(msg.c_str(), test.x, test.y, test.fExpected);
		}

		// Also need to test the version that assigns back out
		// to a plain int, as it has different logic
		fSuccess = true;
		try
		{
			T x(test.x);
			x += SafeInt<U>(test.y);
		}
		catch (...)
		{
			fSuccess = false;
		}

		if (fSuccess != test.fExpected)
		{
			std::string msg = std::string("Error in case ") + types + " throw (2): ";
			err_msg(msg.c_str(), test.x, test.y, test.fExpected);
		}

		test = tests.GetNext();
	}
}

namespace add_verify
{

void AddVerify()
{
    std::cout << "Verifying Addition:" << std::endl;

    // Unsigned int64, unsigned cases
	AddVerifyBase<std::uint64_t, std::uint64_t>("uint64_uint64");
	AddVerifyBase<std::uint64_t, std::uint32_t>("uint64_uint32");
	AddVerifyBase<std::uint64_t, std::uint16_t>("uint64_uint16");
	AddVerifyBase<std::uint64_t, std::uint8_t>("uint64_uint8");

    // Unsigned int64, signed cases
	AddVerifyBase<std::uint64_t, std::int64_t>("uint64_int64");
	AddVerifyBase<std::uint64_t, std::int32_t>("uint64_int32");
	AddVerifyBase<std::uint64_t, std::int16_t>("uint64_int16");
	AddVerifyBase<std::uint64_t, std::int8_t>("uint64_int8");

	// Signed int64, unsigned cases
	AddVerifyBase<std::int64_t, std::uint64_t>("int64_uint64");
	AddVerifyBase<std::int64_t, std::uint32_t>("int64_uint32");
	AddVerifyBase<std::int64_t, std::uint16_t>("int64_uint16");
	AddVerifyBase<std::int64_t, std::uint16_t>("int64_uint8");

    // Signed int64, signed cases
	AddVerifyBase<std::int64_t, std::int64_t>("int64_int64");
	AddVerifyBase<std::int64_t, std::int32_t>("int64_int32");
	AddVerifyBase<std::int64_t, std::int16_t>("int64_int16");
	AddVerifyBase<std::int64_t, std::int8_t>("int64_int8");

	// Unsigned int32, unsigned cases
	AddVerifyBase<std::uint32_t, std::uint64_t>("uint32_uint64");
	AddVerifyBase<std::uint32_t, std::uint32_t>("uint32_uint32");
	// TBD - 16, 8-bit

	// Unsigned int32, signed cases
	AddVerifyBase<std::uint32_t, std::int64_t>("uint32_int64");
	AddVerifyBase<std::uint32_t, std::int32_t>("uint32_int32");
	// TBD - 16, 8-bit

	// Signed int32, unsigned cases
	AddVerifyBase<std::int32_t, std::uint64_t>("int32_uint64");
	AddVerifyBase<std::int32_t, std::uint32_t>("int32_uint32");
	// TBD - 16, 8-bit

	// Signed int32, signed cases
	AddVerifyBase<std::int32_t, std::int64_t>("int32_int64");
	AddVerifyBase<std::int32_t, std::int32_t>("int32_int32");
	// TBD - 16, 8-bit

	// Unsigned int8, unsigned cases
	AddVerifyBase<std::uint8_t, std::uint64_t>("uint8_t_uint64");
	AddVerifyBase<std::uint8_t, std::uint32_t>("uint8_t_uint32");
	AddVerifyBase<std::uint8_t, std::uint16_t>("uint8_t_uint16");
	AddVerifyBase<std::uint8_t, std::uint8_t>("uint8_t_uint8");

    // Unsigned int8, signed cases
	AddVerifyBase<std::uint8_t, std::int64_t>("uint8_t_int64");
	AddVerifyBase<std::uint8_t, std::int32_t>("uint8_t_int32");
	AddVerifyBase<std::uint8_t, std::int16_t>("uint8_t_int16");
	AddVerifyBase<std::uint8_t, std::int8_t>("uint8_t_int8");

	// Signed int8, unsigned cases
	AddVerifyBase<std::int8_t, std::uint64_t>("int8_t_uint64");
	AddVerifyBase<std::int8_t, std::uint32_t>("int8_t_uint32");
	AddVerifyBase<std::int8_t, std::uint16_t>("int8_t_uint16");
	AddVerifyBase<std::int8_t, std::uint8_t>("int8_t_uint8");

    // Signed int8, signed cases
	AddVerifyBase<std::int8_t, std::int64_t>("int8_t_int64");
	AddVerifyBase<std::int8_t, std::int32_t>("int8_t_int32");
	AddVerifyBase<std::int8_t, std::int16_t>("int8_t_int16");
	AddVerifyBase<std::int8_t, std::int8_t>("int8_t_int8");
}

}