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