Subversion Repositories planix.SVN

Rev

Rev 26 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
26 7u83 1
#include <u.h>
2
#include <libc.h>
3
#include <mp.h>
4
 
5
/* these tests suck but better than nothing... but really should test more values than just 1<<i */
6
 
7
#define MPTOX(_name,_type,_func)  \
8
void \
9
_name(void) \
10
{ \
11
	mpint *m; \
12
	int i, sign, mag; \
13
	_type v, e; \
14
	int fail; \
15
	 \
16
	fail = 0; \
17
	m = mpnew(0); \
18
	for(i = 0; i < 256; i++){ \
19
		sign = i >= 128 ? -1 : 1; \
20
		mag = i % 128; \
21
		itomp(sign, m); \
22
		mpleft(m, mag, m); \
23
		v = _func(m); \
24
		e = 0xcafebabe; USED(e);
25
#define MPTOX_END(_func,_format)  \
26
		if(v != e){ \
27
			fprint(2, "FAIL: _func(%#B): return value: got "_format", expected "_format"\n", m, v, e); \
28
			fail=1; \
29
		} \
30
	} \
31
	mpfree(m); \
32
	if(!fail) \
33
		fprint(2, "_func: passed\n"); \
34
}
35
 
36
#define XTOMP(_name,_type,_func)  \
37
void \
38
_name(void) \
39
{ \
40
	mpint *m, *r; \
41
	int i, sign, mag; \
42
	_type v; \
43
	int fail; \
44
	 \
45
	fail = 0; \
46
	m = mpnew(0); \
47
	r = mpnew(0); \
48
	for(i = 0; i < 256; i++){ \
49
		sign = i >= 128 ? -1 : 1; \
50
		mag = i % 128; \
51
		itomp(sign, r); \
52
		mpleft(r, mag, r);
53
#define XTOMP_END(_func,_type,_format)  \
54
		_func(sign * ((_type)1<<mag), m); \
55
		if(mpcmp(r, m) != 0){ \
56
			fprint(2, "FAIL: _func("_format"): return value: got %#B, expected %#B\n", sign * ((_type)1<<mag), m, r); \
57
			fail=1; \
58
		} \
59
	} \
60
	mpfree(m); \
61
	mpfree(r); \
62
	if(!fail) \
63
		fprint(2, "_func: passed\n"); \
64
}
65
 
66
MPTOX(test_mptoi, int, mptoi)
67
	if(mag < 31)
68
		e = sign*(1<<mag);
69
	else
70
		e = sign > 0 ? (1<<31)-1 : 1<<31;
71
MPTOX_END(mptoi, "%#x")
72
 
73
MPTOX(test_mptoui, uint, mptoui)
74
	if(mag < 32 && sign > 0)
75
		e = 1<<mag;
76
	else
77
		e = sign > 0 ? -1 : 0;
78
MPTOX_END(mptoui, "%#ux")
79
 
80
 
81
MPTOX(test_mptov, vlong, mptov)
82
	if(mag < 63)
83
		e = sign*(1LL<<mag);
84
	else
85
		e = sign > 0 ? (1LL<<63)-1 : 1LL<<63;
86
MPTOX_END(mptov, "%#llx")
87
 
88
MPTOX(test_mptouv, uvlong, mptouv)
89
	if(mag < 64 && sign > 0)
90
		e = 1LL<<mag;
91
	else
92
		e = sign > 0 ? -1ULL : 0;
93
MPTOX_END(mptouv, "%#llux")
94
 
95
XTOMP(test_itomp, int, itomp)
96
	if(mag >= 31) continue;
97
XTOMP_END(vtomp, vlong, "%lld")
98
 
99
XTOMP(test_uitomp, uint, uitomp)
100
	if(mag >= 32 || sign < 0) continue;
101
XTOMP_END(uitomp, uint, "%lld")
102
 
103
XTOMP(test_vtomp, vlong, vtomp)
104
	if(mag >= 63) continue;
105
XTOMP_END(vtomp, vlong, "%lld")
106
 
107
XTOMP(test_uvtomp, uvlong, uvtomp)
108
	if(mag >= 64 || sign < 0) continue;
109
XTOMP_END(uvtomp, vlong, "%lld")
110
 
111
 
112
void
113
convtests(void)
114
{
115
	test_mptoi();
116
	test_mptoui();
117
	test_mptov();
118
	test_mptouv();
119
	test_itomp();
120
	test_uitomp();
121
	test_vtomp();
122
	test_uvtomp();
123
}
124