-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtests.c
More file actions
130 lines (111 loc) · 4.76 KB
/
tests.c
File metadata and controls
130 lines (111 loc) · 4.76 KB
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
#include <stdio.h>
#include <math.h>
#include "strtodouble.h"
#define EPSILON 1e-15
#define TEST_ASSERT(x,y) _test_assert((x), (y), __LINE__)
static int tests_total = 0;
static int tests_failed = 0;
static void _test_assert(double x, double y, int line)
{
tests_total++;
if(isnan(x) && isnan(y)) return;
if(isinf(x) && isinf(y) && x > 0 && y > 0) return;
if(isinf(x) && isinf(y) && x < 0 && y > 0) return;
if(x == y) return;
if(fabs(1-x/y) < EPSILON) return;
tests_failed++;
fprintf(stderr, "line %d: %g != %g", line, x, y);
}
int main(void)
{
// NANs and infinities
TEST_ASSERT(NAN, strtodouble("NaN", NULL));
TEST_ASSERT(INFINITY, strtodouble("INF", NULL));
TEST_ASSERT(-INFINITY, strtodouble("-INf", NULL));
// 0
TEST_ASSERT(0, strtodouble("0", NULL));
TEST_ASSERT(0, strtodouble("0.", NULL));
TEST_ASSERT(0, strtodouble("0.0", NULL));
TEST_ASSERT(0, strtodouble(".0", NULL));
TEST_ASSERT(0, strtodouble(".0000", NULL));
TEST_ASSERT(0, strtodouble("0.0000", NULL));
TEST_ASSERT(0, strtodouble("00000.0000", NULL));
TEST_ASSERT(0, strtodouble("+0", NULL));
TEST_ASSERT(0, strtodouble("+0.", NULL));
TEST_ASSERT(0, strtodouble("+0.0", NULL));
TEST_ASSERT(0, strtodouble("+.0", NULL));
TEST_ASSERT(0, strtodouble("+.0000", NULL));
TEST_ASSERT(0, strtodouble("+0.0000", NULL));
TEST_ASSERT(0, strtodouble("+00000.0000", NULL));
TEST_ASSERT(0, strtodouble("-0", NULL));
TEST_ASSERT(0, strtodouble("-0.", NULL));
TEST_ASSERT(0, strtodouble("-0.0", NULL));
TEST_ASSERT(0, strtodouble("-.0", NULL));
TEST_ASSERT(0, strtodouble("-.0000", NULL));
TEST_ASSERT(0, strtodouble("-0.0000", NULL));
TEST_ASSERT(0, strtodouble("-00000.0000", NULL));
TEST_ASSERT(0, strtodouble("0e0", NULL));
TEST_ASSERT(0, strtodouble("0.e0", NULL));
TEST_ASSERT(0, strtodouble("0.e10", NULL));
TEST_ASSERT(0, strtodouble("0.e-10", NULL));
TEST_ASSERT(0, strtodouble("-0e0", NULL));
TEST_ASSERT(0, strtodouble("-0.e0", NULL));
TEST_ASSERT(0, strtodouble("-0.e10", NULL));
TEST_ASSERT(0, strtodouble("-0.e-10", NULL));
// 1
TEST_ASSERT(1, strtodouble("1", NULL));
TEST_ASSERT(1, strtodouble("1e0", NULL));
// positive number
TEST_ASSERT(1.234, strtodouble("1.234", NULL));
TEST_ASSERT(1.234, strtodouble("+1.234", NULL));
TEST_ASSERT(1.234, strtodouble("+00001.234", NULL));
TEST_ASSERT(1.234, strtodouble("12.34e-1", NULL));
TEST_ASSERT(1.234, strtodouble("12.34e-0001", NULL));
TEST_ASSERT(1.234, strtodouble("0.1234e1", NULL));
TEST_ASSERT(1.234, strtodouble("0.1234e+1", NULL));
TEST_ASSERT(1.234, strtodouble("0.1234e+0001", NULL));
TEST_ASSERT(1.234, strtodouble(".1234e1", NULL));
TEST_ASSERT(1.234, strtodouble(".1234e+1", NULL));
TEST_ASSERT(1.234, strtodouble(".1234e+0001", NULL));
// negative number
TEST_ASSERT(-1.234, strtodouble("-1.234", NULL));
TEST_ASSERT(-1.234, strtodouble("-1.234", NULL));
TEST_ASSERT(-1.234, strtodouble("-00001.234", NULL));
TEST_ASSERT(-1.234, strtodouble("-12.34e-1", NULL));
TEST_ASSERT(-1.234, strtodouble("-12.34e-0001", NULL));
TEST_ASSERT(-1.234, strtodouble("-0.1234e1", NULL));
TEST_ASSERT(-1.234, strtodouble("-0.1234e+1", NULL));
TEST_ASSERT(-1.234, strtodouble("-0.1234e+0001", NULL));
TEST_ASSERT(-1.234, strtodouble("-.1234e1", NULL));
TEST_ASSERT(-1.234, strtodouble("-.1234e+1", NULL));
TEST_ASSERT(-1.234, strtodouble("-.1234e+0001", NULL));
// trailing characters
TEST_ASSERT(1.234, strtodouble("1.234exx", NULL));
TEST_ASSERT(1.234, strtodouble("1.234e0xx", NULL));
TEST_ASSERT(1.234, strtodouble(".1234e1xx", NULL));
TEST_ASSERT(1.234, strtodouble(".1234e1e1", NULL));
// whitespace
TEST_ASSERT(1.234, strtodouble(" 1.234", NULL));
TEST_ASSERT(1.234, strtodouble(" 1.234", NULL));
TEST_ASSERT(1.234, strtodouble("\r1.234", NULL));
TEST_ASSERT(1.234, strtodouble("\n1.234", NULL));
TEST_ASSERT(1.234, strtodouble("\t1.234", NULL));
TEST_ASSERT(1.234, strtodouble(" \r\n\t1.234", NULL));
// overflow
TEST_ASSERT(INFINITY, strtodouble("1e1000", NULL));
TEST_ASSERT(-INFINITY, strtodouble("-1e1000", NULL));
// underflow
TEST_ASSERT(0, strtodouble("1e-1000", NULL));
TEST_ASSERT(0, strtodouble("-1e-1000", NULL));
// invalid format
TEST_ASSERT(NAN, strtodouble("-e-1", NULL));
TEST_ASSERT(NAN, strtodouble("e1", NULL));
TEST_ASSERT(NAN, strtodouble("+e1", NULL));
TEST_ASSERT(NAN, strtodouble("-e1", NULL));
TEST_ASSERT(NAN, strtodouble("foobar", NULL));
if(tests_failed == 0)
printf("Passed all %d test cases\n", tests_total);
else
printf("Passed %d of %d test cases\n", tests_total-tests_failed, tests_total);
return 0;
}