addosi4_test.zig (2203B) - Raw
1 const addv = @import("addo.zig"); 2 const testing = @import("std").testing; 3 4 fn test__addosi4(a: i32, b: i32) !void { 5 var result_ov: c_int = undefined; 6 var expected_ov: c_int = undefined; 7 const result = addv.__addosi4(a, b, &result_ov); 8 const expected: i32 = simple_addosi4(a, b, &expected_ov); 9 try testing.expectEqual(expected, result); 10 try testing.expectEqual(expected_ov, result_ov); 11 } 12 13 fn simple_addosi4(a: i32, b: i32, overflow: *c_int) i32 { 14 overflow.* = 0; 15 const min: i32 = -2147483648; 16 const max: i32 = 2147483647; 17 if (((a > 0) and (b > max - a)) or 18 ((a < 0) and (b < min - a))) 19 overflow.* = 1; 20 return a +% b; 21 } 22 23 test "addosi4" { 24 // -2^31 <= i32 <= 2^31-1 25 // 2^31 = 2147483648 26 // 2^31-1 = 2147483647 27 const min: i32 = -2147483648; 28 const max: i32 = 2147483647; 29 var i: i32 = 1; 30 while (i < max) : (i *|= 2) { 31 try test__addosi4(i, i); 32 try test__addosi4(-i, -i); 33 try test__addosi4(i, -i); 34 try test__addosi4(-i, i); 35 } 36 37 // edge cases 38 // 0 + 0 = 0 39 // MIN + MIN overflow 40 // MAX + MAX overflow 41 // 0 + MIN MIN 42 // 0 + MAX MAX 43 // MIN + 0 MIN 44 // MAX + 0 MAX 45 // MIN + MAX -1 46 // MAX + MIN -1 47 try test__addosi4(0, 0); 48 try test__addosi4(min, min); 49 try test__addosi4(max, max); 50 try test__addosi4(0, min); 51 try test__addosi4(0, max); 52 try test__addosi4(min, 0); 53 try test__addosi4(max, 0); 54 try test__addosi4(min, max); 55 try test__addosi4(max, min); 56 57 // derived edge cases 58 // MIN+1 + MIN overflow 59 // MAX-1 + MAX overflow 60 // 1 + MIN = MIN+1 61 // -1 + MIN overflow 62 // -1 + MAX = MAX-1 63 // +1 + MAX overflow 64 // MIN + 1 = MIN+1 65 // MIN + -1 overflow 66 // MAX + 1 overflow 67 // MAX + -1 = MAX-1 68 try test__addosi4(min + 1, min); 69 try test__addosi4(max - 1, max); 70 try test__addosi4(1, min); 71 try test__addosi4(-1, min); 72 try test__addosi4(-1, max); 73 try test__addosi4(1, max); 74 try test__addosi4(min, 1); 75 try test__addosi4(min, -1); 76 try test__addosi4(max, -1); 77 try test__addosi4(max, 1); 78 }