0b4ed7607cb0eef610a7ab987203389c2975cd0f
[scilab.git] / scilab / modules / elementary_functions / tests / unit_tests / bitcmp.tst
1 // =============================================================================
2 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 // Copyright (C) 2013 - Scilab Enterprises - Charlotte HECQUET
4 // Copyright (C) 2020 - Samuel GOUGEON
5 //
6 //  This file is distributed under the same license as the Scilab package.
7 // =============================================================================
8
9 // <-- CLI SHELL MODE -->
10 // <-- NO CHECK REF -->
11
12 // unit test for bitcmp function
13 // =============================================================================
14
15 function r = cint64(valstr)
16     // Returns the uint64 or int64 value matching its given literal representation
17     s = strsplit(valstr)($:-1:1);
18     neg = s($)=="-"
19     if neg, s($) = [], end
20     s = evstr(s);
21     r = 0
22     for i = 1:size(s,"*")
23         r = r + uint64(10).^(i-1)*s(i)
24     end
25     if neg, r = -int64(r), end
26 endfunction
27
28 // =====================
29 // With encoded integers
30 // =====================
31 // Tests for one input argument
32 // ----------------------------
33 assert_checkequal(bitcmp(int8(99)),  int8(-100));
34 assert_checkequal(bitcmp(int16(99)), int16(-100));
35 assert_checkequal(bitcmp(int32(99)), int32(-100));
36 assert_checkequal(bitcmp(int64(99)), int64(-100));
37
38 assert_checkequal(bitcmp(uint8(99)),  uint8(156));
39 assert_checkequal(bitcmp(uint16(99)), uint16(65436));
40 assert_checkequal(bitcmp(uint32(99)), uint32(4294967196));
41 assert_checkequal(bitcmp(uint64(99)), cint64("18446744073709551516"));
42 assert_checkequal(bitcmp(cint64("18446744073709551516")), uint64(99));
43
44 assert_checkequal(bitcmp(int8([13,99])),  int8([-14 -100]));
45 assert_checkequal(bitcmp(int16([13,99])), int16([-14 -100]));
46 assert_checkequal(bitcmp(int32([13,99])), int32([-14 -100]));
47 assert_checkequal(bitcmp(int64([13,99])), int64([-14 -100]));
48
49 assert_checkequal(bitcmp(uint8([13,99])),  uint8([242,156]));
50 assert_checkequal(bitcmp(uint16([13,99])), uint16([65522,65436]));
51 assert_checkequal(bitcmp(uint32([13,99])), uint32([4294967282,4294967196]));
52 assert_checkequal(bitcmp(uint64([13,99])), [cint64("18446744073709551602") cint64("18446744073709551516")]);
53 assert_checkequal(bitcmp([cint64("18446744073709551602") cint64("18446744073709551516")]), uint64([13,99]));
54 m = uint64(%inf);
55 r = bitcmp([uint64(0:2), m-2, m-1, m]);
56 assert_checkequal(r, [cint64("18446744073709551613")+[2 1 0] uint64([2 1 0])]);
57
58 // Tests for two input arguments
59 // -----------------------------
60 // scalar bitnum
61 assert_checkequal(bitcmp(int8([-71 -34 -1 0 33 70]), 8), int8([70 33 0 -1 -34 -71]));
62 assert_checkequal(bitcmp(int8([-71 -34 -1 0 33 70]), 7), int8([70 33 0 127 94 57]));
63 assert_checkequal(bitcmp(int8([-71 -34 -1 0 33 70]), 6), int8([6 33 0 63 30 57]));
64 assert_checkequal(bitcmp(int8([-71 -34 -1 0 33 70]), 5), int8([6 1 0 31 30 25]));
65 assert_checkequal(bitcmp(int8([-71 -34 -1 0 33 70]), 4), int8([6 1 0 15 14 9]));
66 assert_checkequal(bitcmp(int8([-71 -34 -1 0 33 70]), 3), int8([6 1 0 7 6 1]));
67 assert_checkequal(bitcmp(int8([-71 -34 -1 0 33 70]), 2), int8([2 1 0 3 2 1]));
68
69 assert_checkequal(bitcmp(uint8(99),8), uint8(156));
70 assert_checkequal(bitcmp(uint16(99),16), uint16(65436));
71 assert_checkequal(bitcmp(uint32(99),32), uint32(4294967196));
72
73 assert_checkequal(bitcmp(uint8([13,99]),8),  uint8([242,156]));
74 assert_checkequal(bitcmp(uint16([13,99]),16), uint16([65522,65436]));
75 assert_checkequal(bitcmp(uint32([13,99]),32), uint32([4294967282,4294967196]));
76 ui64 = cint64("1844674407370955161");
77 b = bitget(ui64,1:64);
78 for i = 2:63
79     assert_checkequal(bitcmp(ui64, i), bitset(uint64(0), 1:i, 1-b(1:i)));
80 end
81 // bitnum array
82 [in, out] = ([0 0 0 0 0], [7 15 31 63 127]);
83 assert_checkequal(bitcmp(uint8(in), 3:7), uint8(out));
84 assert_checkequal(bitcmp(uint16(in), 3:7), uint16(out));
85 assert_checkequal(bitcmp(uint32(in), 3:7), uint32(out));
86 assert_checkequal(bitcmp(uint64(in), 3:7), uint64(out));
87 assert_checkequal(bitcmp(in, 3:7), out);
88
89 // =====================
90 // With decimal integers
91 // =====================
92 assert_checkequal(bitcmp(99,8), 156);
93 assert_checkequal(bitcmp(99,16), 65436);
94 assert_checkequal(bitcmp(99,32), 4294967196);
95
96 assert_checkequal(bitcmp([13,99],8),  [242,156]);
97 assert_checkequal(bitcmp([13,99],16), [65522,65436]);
98 assert_checkequal(bitcmp([13,99],32), [4294967282,4294967196]);
99
100 assert_checkequal(bitcmp(0:10, 8), double(bitcmp(uint8(0:10))));
101 assert_checkequal(bitcmp(0:10, 16), double(bitcmp(uint16(0:10))));
102 assert_checkequal(bitcmp(0:10, 32), double(bitcmp(uint32(0:10))));
103 assert_checkequal(bitcmp(0:10, 40)-2^40, -1:-1:-11);
104 assert_checkequal(bitcmp(0:10, 52)-2^52, -1:-1:-11);
105 assert_checkequal(bitcmp(2^52 + (-11:-1),52), 10:-1:0);
106 assert_checkequal(bitcmp(2^40 + (-11:-1), 40), 10:-1:0);
107
108 // with bitnum > 53
109 // ----------------
110 b = bitget(1e100,281:333); // log2(1e100) == 332.ddd
111 bcmp332 = bitset(0,281:333,1-b); // 7.4980057982640933D+99
112 assert_checkalmostequal(bitcmp(1e100,333), bcmp332, %eps);
113 assert_checkalmostequal(bitcmp(1e100), bcmp332, %eps);
114 assert_checkalmostequal(bitcmp(bcmp332,333), 1e100, %eps);
115 r = bitcmp(0,333);
116 assert_checkalmostequal(bitcmp(r,333)/2^333, 0, 0, %eps);
117
118 V = [1e100 2e150 1e200 3e250 1e300];
119 // one by one:
120 for v = V
121     n = int(log2(v)) + 1;
122     bits = bitget(v, n:-1:n-51);
123     cbits = bitget(bitcmp(v,n), n:-1:n-51);
124     assert_checktrue(and((bits+cbits)==1));
125 end
126 // in a vector:
127 n = int(log2(V)) + 1;
128     // with distinct implicit bitnums
129 r = bitcmp(V);
130 r = bitcmp(r, n);
131 assert_checkalmostequal(r, V, %eps);
132
133
134 // ==============
135 // Error messages
136 // ==============
137 errmsg = msprintf(_("%s: Wrong number of input arguments: %d or %d expected.\n"), "bitcmp", 1, 2);
138 assert_checkerror("bitcmp()", errmsg);       // no input argument
139 errmsg = _("Wrong number of input arguments.")
140 assert_checkerror("bitcmp(1,2,3)", errmsg);  // too many argins
141
142 // argin#1
143 errmsg = msprintf(_("%s: Argument #%d: Decimal or encoded integers expected.\n"), "bitcmp", 1);
144 assert_checkerror("bitcmp(""s"")", errmsg);
145 assert_checkerror("bitcmp(%i)", errmsg);
146 errmsg = msprintf(_("%s: Argument #%d: Positive decimal integers expected.\n"), "bitcmp", 1);
147 assert_checkerror("bitcmp(1.2)", errmsg);
148 assert_checkerror("bitcmp(-2)", errmsg);
149
150 // argin#2
151 errmsg = msprintf(_("%s: Argument #%d: Wrong size.\n"), "bitcmp", 2);
152 assert_checkerror("bitcmp(2, [1 2])", errmsg);
153 errmsg = msprintf(_("%s: Argument #%d: Real or encoded integer expected.\n"), "bitcmp", 2);
154 assert_checkerror("bitcmp(2, 4.5)", errmsg);
155 assert_checkerror("bitcmp(2, 3+%i)", errmsg);
156 errmsg = msprintf(_("%s: Argument #%d: Must be in the interval [%d, %d].\n"),"bitcmp", 2, 1, 8);
157 assert_checkerror("bitcmp(uint8(99), 9)", errmsg);
158 assert_checkerror("bitcmp(uint8(99), 16)", errmsg);