zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

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 }