zig

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

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 }