484 lines
10 KiB
Gleam
484 lines
10 KiB
Gleam
import gleam/list
|
|
import gleeunit/should
|
|
import bigi
|
|
import ranged_int/utils
|
|
|
|
const uint8_testset = [
|
|
#(112, 225, 81),
|
|
#(228, 195, 167),
|
|
#(179, 142, 65),
|
|
#(232, 68, 44),
|
|
#(220, 94, 58),
|
|
#(110, 147, 1),
|
|
#(103, 196, 43),
|
|
#(204, 212, 160),
|
|
#(109, 211, 64),
|
|
#(239, 57, 40),
|
|
#(137, 146, 27),
|
|
#(213, 62, 19),
|
|
#(110, 205, 59),
|
|
#(172, 131, 47),
|
|
#(97, 190, 31),
|
|
#(137, 203, 84),
|
|
#(249, 209, 202),
|
|
#(202, 107, 53),
|
|
#(158, 159, 61),
|
|
#(204, 253, 201),
|
|
#(184, 176, 104),
|
|
#(166, 221, 131),
|
|
#(209, 226, 179),
|
|
#(231, 117, 92),
|
|
#(171, 157, 72),
|
|
#(147, 229, 120),
|
|
#(239, 104, 87),
|
|
#(221, 112, 77),
|
|
#(240, 116, 100),
|
|
#(166, 247, 157),
|
|
#(198, 98, 40),
|
|
#(192, 229, 165),
|
|
#(200, 60, 4),
|
|
#(180, 85, 9),
|
|
#(171, 222, 137),
|
|
#(210, 57, 11),
|
|
#(86, 208, 38),
|
|
#(74, 236, 54),
|
|
#(206, 241, 191),
|
|
#(164, 100, 8),
|
|
#(244, 246, 234),
|
|
#(143, 246, 133),
|
|
#(131, 142, 17),
|
|
#(118, 194, 56),
|
|
#(31, 229, 4),
|
|
#(185, 145, 74),
|
|
#(121, 181, 46),
|
|
#(195, 190, 129),
|
|
#(248, 103, 95),
|
|
#(195, 125, 64),
|
|
#(143, 228, 115),
|
|
#(99, 182, 25),
|
|
#(171, 103, 18),
|
|
#(212, 107, 63),
|
|
#(48, 252, 44),
|
|
#(135, 157, 36),
|
|
#(104, 199, 47),
|
|
#(252, 136, 132),
|
|
#(219, 194, 157),
|
|
#(182, 95, 21),
|
|
#(110, 171, 25),
|
|
#(135, 244, 123),
|
|
#(56, 213, 13),
|
|
#(7, 251, 2),
|
|
#(53, 227, 24),
|
|
#(226, 194, 164),
|
|
#(150, 197, 91),
|
|
#(116, 181, 41),
|
|
#(89, 199, 32),
|
|
#(97, 234, 75),
|
|
#(114, 212, 70),
|
|
#(219, 197, 160),
|
|
#(232, 211, 187),
|
|
#(215, 236, 195),
|
|
#(153, 143, 40),
|
|
#(144, 225, 113),
|
|
#(134, 214, 92),
|
|
#(181, 179, 104),
|
|
#(105, 187, 36),
|
|
#(12, 247, 3),
|
|
#(250, 23, 17),
|
|
#(237, 89, 70),
|
|
#(233, 224, 201),
|
|
#(210, 236, 190),
|
|
#(233, 208, 185),
|
|
#(132, 172, 48),
|
|
#(197, 244, 185),
|
|
#(194, 143, 81),
|
|
#(232, 59, 35),
|
|
#(61, 214, 19),
|
|
#(224, 105, 73),
|
|
#(208, 62, 14),
|
|
#(165, 191, 100),
|
|
#(253, 245, 242),
|
|
#(142, 201, 87),
|
|
#(220, 55, 19),
|
|
#(249, 195, 188),
|
|
#(57, 230, 31),
|
|
#(192, 250, 186),
|
|
#(248, 132, 124),
|
|
]
|
|
|
|
const uint16_testset = [
|
|
#(53_507, 23_855, 11_826),
|
|
#(46_924, 25_977, 7365),
|
|
#(65_063, 53_609, 53_136),
|
|
#(57_356, 40_806, 32_626),
|
|
#(57_039, 42_996, 34_499),
|
|
#(52_094, 44_757, 31_315),
|
|
#(51_826, 58_047, 44_337),
|
|
#(34_558, 36_127, 5149),
|
|
#(46_715, 50_409, 31_588),
|
|
#(47_464, 37_618, 19_546),
|
|
#(5454, 61_708, 1626),
|
|
#(58_546, 38_113, 31_123),
|
|
#(42_084, 32_688, 9236),
|
|
#(41_435, 25_026, 925),
|
|
#(30_086, 54_929, 19_479),
|
|
#(23_497, 52_484, 10_445),
|
|
#(53_057, 27_358, 14_879),
|
|
#(39_282, 27_525, 1271),
|
|
#(14_626, 63_958, 13_048),
|
|
#(22_728, 54_372, 11_564),
|
|
#(45_820, 22_584, 2868),
|
|
#(43_481, 47_301, 25_246),
|
|
#(60_280, 43_875, 38_619),
|
|
#(46_998, 64_467, 45_929),
|
|
#(64_531, 3171, 2166),
|
|
#(22_327, 45_778, 2569),
|
|
#(44_104, 57_573, 36_141),
|
|
#(53_933, 21_452, 9849),
|
|
#(28_246, 64_724, 27_434),
|
|
#(63_087, 61_533, 59_084),
|
|
#(62_571, 23_304, 20_339),
|
|
#(51_536, 21_086, 7086),
|
|
#(45_994, 54_043, 34_501),
|
|
#(20_775, 64_334, 19_573),
|
|
#(41_124, 42_995, 18_583),
|
|
#(65_170, 11_754, 11_388),
|
|
#(9262, 62_579, 6305),
|
|
#(50_708, 26_924, 12_096),
|
|
#(48_199, 55_200, 37_863),
|
|
#(60_936, 43_822, 39_222),
|
|
#(60_862, 47_890, 43_216),
|
|
#(50_526, 36_306, 21_296),
|
|
#(24_522, 48_247, 7233),
|
|
#(45_165, 28_277, 7906),
|
|
#(48_854, 42_715, 26_033),
|
|
#(18_201, 47_541, 206),
|
|
#(48_568, 25_429, 8461),
|
|
#(57_765, 30_968, 23_197),
|
|
#(56_158, 38_031, 28_653),
|
|
#(22_481, 60_589, 17_534),
|
|
#(60_561, 35_159, 30_184),
|
|
#(60_390, 46_931, 41_785),
|
|
#(42_584, 51_757, 28_805),
|
|
#(50_536, 16_272, 1272),
|
|
#(47_834, 27_980, 10_278),
|
|
#(54_982, 15_731, 5177),
|
|
#(30_296, 42_947, 7707),
|
|
#(36_689, 63_208, 34_361),
|
|
#(32_499, 62_076, 29_039),
|
|
#(65_165, 31_455, 31_084),
|
|
#(58_090, 20_060, 12_614),
|
|
#(53_436, 29_679, 17_579),
|
|
#(41_189, 44_383, 20_036),
|
|
#(36_593, 52_979, 24_036),
|
|
#(39_633, 61_750, 35_847),
|
|
#(35_551, 33_517, 3532),
|
|
#(20_920, 63_223, 18_607),
|
|
#(58_628, 40_720, 33_812),
|
|
#(18_784, 60_975, 14_223),
|
|
#(52_625, 21_870, 8959),
|
|
#(28_227, 63_187, 25_878),
|
|
#(30_310, 50_085, 14_859),
|
|
#(49_863, 42_716, 27_043),
|
|
#(62_185, 54_112, 50_761),
|
|
#(43_652, 33_395, 11_511),
|
|
#(56_274, 22_812, 13_550),
|
|
#(36_147, 49_560, 20_171),
|
|
#(57_354, 14_989, 6807),
|
|
#(54_674, 24_884, 14_022),
|
|
#(53_699, 50_088, 38_251),
|
|
#(38_902, 37_979, 11_345),
|
|
#(62_742, 64_319, 61_525),
|
|
#(54_841, 12_958, 2263),
|
|
#(7886, 63_011, 5361),
|
|
#(58_935, 21_019, 14_418),
|
|
#(47_831, 26_851, 9146),
|
|
#(45_962, 39_335, 19_761),
|
|
#(53_975, 11_981, 420),
|
|
#(26_477, 58_093, 19_034),
|
|
#(44_588, 53_937, 32_989),
|
|
#(61_810, 49_637, 45_911),
|
|
#(19_980, 62_256, 16_700),
|
|
#(64_110, 17_762, 16_336),
|
|
#(4497, 61_449, 410),
|
|
#(40_318, 38_443, 13_225),
|
|
#(62_311, 39_529, 36_304),
|
|
#(18_039, 64_797, 17_300),
|
|
#(18_179, 52_010, 4653),
|
|
#(52_719, 26_144, 13_327),
|
|
#(48_750, 32_082, 15_296),
|
|
]
|
|
|
|
const int8_multiply_testset = [
|
|
#(87, 66, 110),
|
|
#(47, 34, 62),
|
|
#(-12, -81, -52),
|
|
#(76, 75, 68),
|
|
#(-16, -74, -96),
|
|
#(-66, -59, 54),
|
|
#(46, 48, -96),
|
|
#(-73, -118, -90),
|
|
#(120, 8, -64),
|
|
#(68, 120, -32),
|
|
#(92, 87, 68),
|
|
#(-47, -85, -101),
|
|
#(74, 72, -48),
|
|
#(-127, -43, 85),
|
|
#(97, 108, -20),
|
|
#(37, 12, -68),
|
|
#(120, 67, 104),
|
|
#(97, 19, 51),
|
|
#(-62, -96, 64),
|
|
#(-99, -84, 124),
|
|
#(-14, -103, -94),
|
|
#(106, 66, 84),
|
|
#(-21, -49, 5),
|
|
#(40, 73, 104),
|
|
#(61, 91, -81),
|
|
#(-5, -81, -107),
|
|
#(-69, -22, -18),
|
|
#(11, 35, -127),
|
|
#(-112, -14, 32),
|
|
#(-15, -90, 70),
|
|
#(53, 3, -97),
|
|
#(126, 88, 80),
|
|
#(38, 32, -64),
|
|
#(-114, -65, -14),
|
|
#(31, 71, -103),
|
|
#(8, 35, 24),
|
|
#(34, 96, -64),
|
|
#(23, 103, 65),
|
|
#(-32, -102, -64),
|
|
#(112, 87, 16),
|
|
#(-45, -15, -93),
|
|
#(75, 15, 101),
|
|
#(-32, -106, 64),
|
|
#(11, 109, -81),
|
|
#(99, 30, -102),
|
|
#(88, 51, -120),
|
|
#(-38, -112, -96),
|
|
#(78, 107, -102),
|
|
#(52, 55, 44),
|
|
#(96, 103, -96),
|
|
#(-55, -110, -94),
|
|
#(42, 42, -28),
|
|
#(-109, -83, 87),
|
|
#(117, 124, -84),
|
|
#(49, 108, -84),
|
|
#(17, 93, 45),
|
|
#(-75, -81, -69),
|
|
#(122, 115, -50),
|
|
#(-91, -33, -69),
|
|
#(113, 74, -86),
|
|
#(-99, -44, 4),
|
|
#(-10, -73, -38),
|
|
#(-75, -104, 120),
|
|
#(18, 59, 38),
|
|
#(-77, -18, 106),
|
|
#(-95, -6, 58),
|
|
#(-125, -37, 17),
|
|
#(-99, -42, 62),
|
|
#(118, 110, -76),
|
|
#(-22, -53, -114),
|
|
#(-89, -128, -128),
|
|
#(101, 57, 125),
|
|
#(100, 79, -36),
|
|
#(18, 32, 64),
|
|
#(-19, -12, -28),
|
|
#(90, 120, 48),
|
|
#(57, 20, 116),
|
|
#(-47, -85, -101),
|
|
#(-69, -102, 126),
|
|
#(62, 23, -110),
|
|
#(116, 34, 104),
|
|
#(105, 32, 32),
|
|
#(-22, -7, -102),
|
|
#(-70, -68, -104),
|
|
#(-10, -42, -92),
|
|
#(-5, -75, 119),
|
|
#(115, 42, -34),
|
|
#(-85, -9, -3),
|
|
#(-80, -11, 112),
|
|
#(76, 51, 36),
|
|
#(106, 5, 18),
|
|
#(117, 27, 87),
|
|
#(10, 113, 106),
|
|
#(-40, -116, 32),
|
|
#(-43, -6, 2),
|
|
#(97, 105, -55),
|
|
#(-12, -65, 12),
|
|
#(-55, -118, 90),
|
|
#(-46, -55, -30),
|
|
#(70, 93, 110),
|
|
]
|
|
|
|
const int8_underflow_testset = [
|
|
#(-57, 92, 107),
|
|
#(-123, 11, 122),
|
|
#(-115, 48, 93),
|
|
#(-128, 52, 76),
|
|
#(-125, 105, 26),
|
|
#(-76, 78, 102),
|
|
#(-76, 92, 88),
|
|
#(-46, 101, 109),
|
|
#(-110, 80, 66),
|
|
#(-62, 80, 114),
|
|
#(-75, 77, 104),
|
|
#(-127, 54, 75),
|
|
#(-121, 121, 14),
|
|
#(-127, 3, 126),
|
|
#(-72, 68, 116),
|
|
#(-93, 83, 80),
|
|
#(-110, 112, 34),
|
|
#(-83, 59, 114),
|
|
#(-124, 109, 23),
|
|
#(-121, 81, 54),
|
|
#(-72, 105, 79),
|
|
#(-106, 104, 46),
|
|
#(-122, 78, 56),
|
|
#(-99, 40, 117),
|
|
#(-88, 83, 85),
|
|
#(-68, 97, 91),
|
|
#(-106, 93, 57),
|
|
#(-94, 57, 105),
|
|
#(-78, 125, 53),
|
|
#(-122, 71, 63),
|
|
#(-80, 97, 79),
|
|
#(-118, 51, 87),
|
|
#(-83, 79, 94),
|
|
#(-122, 100, 34),
|
|
#(-102, 49, 105),
|
|
#(-84, 87, 85),
|
|
#(-56, 111, 89),
|
|
#(-82, 56, 118),
|
|
#(-111, 58, 87),
|
|
#(-117, 29, 110),
|
|
#(-112, 57, 87),
|
|
#(-115, 34, 107),
|
|
#(-92, 100, 64),
|
|
#(-107, 99, 50),
|
|
#(-49, 124, 83),
|
|
#(-125, 104, 27),
|
|
#(-116, 122, 18),
|
|
#(-116, 121, 19),
|
|
#(-128, 74, 54),
|
|
#(-34, 102, 120),
|
|
#(-126, 56, 74),
|
|
#(-63, 68, 125),
|
|
#(-13, 116, 127),
|
|
#(-82, 59, 115),
|
|
#(-99, 84, 73),
|
|
#(-65, 77, 114),
|
|
#(-128, 113, 15),
|
|
#(-100, 124, 32),
|
|
#(-63, 104, 89),
|
|
#(-120, 53, 83),
|
|
#(-80, 86, 90),
|
|
#(-36, 101, 119),
|
|
#(-78, 97, 81),
|
|
#(-80, 74, 102),
|
|
#(-52, 105, 99),
|
|
#(-76, 104, 76),
|
|
#(-121, 110, 25),
|
|
#(-102, 35, 119),
|
|
#(-35, 122, 99),
|
|
#(-118, 100, 38),
|
|
#(-82, 111, 63),
|
|
#(-18, 115, 123),
|
|
#(-81, 105, 70),
|
|
#(-113, 79, 64),
|
|
#(-49, 104, 103),
|
|
#(-44, 94, 118),
|
|
#(-46, 85, 125),
|
|
#(-51, 81, 124),
|
|
#(-50, 115, 91),
|
|
#(-50, 105, 101),
|
|
#(-49, 123, 84),
|
|
#(-97, 91, 68),
|
|
#(-89, 67, 100),
|
|
#(-93, 85, 78),
|
|
#(-91, 91, 74),
|
|
#(-102, 38, 116),
|
|
#(-116, 17, 123),
|
|
#(-23, 110, 123),
|
|
#(-45, 95, 116),
|
|
#(-65, 82, 109),
|
|
#(-126, 85, 45),
|
|
#(-33, 123, 100),
|
|
#(-68, 113, 75),
|
|
#(-80, 104, 72),
|
|
#(-127, 49, 80),
|
|
#(-108, 112, 36),
|
|
#(-123, 114, 19),
|
|
#(-76, 75, 105),
|
|
#(-82, 70, 104),
|
|
#(-114, 76, 66),
|
|
]
|
|
|
|
pub fn uint8_overflow_test() {
|
|
list.each(uint8_testset, fn(data) {
|
|
let a = bigi.from_int(data.0)
|
|
let b = bigi.from_int(data.1)
|
|
let c = bigi.add(a, b)
|
|
let d = bigi.subtract(c, bigi.from_int(255))
|
|
should.equal(
|
|
utils.overflow(
|
|
utils.WouldOverflow(d),
|
|
min: bigi.zero(),
|
|
max: bigi.from_int(255),
|
|
),
|
|
bigi.from_int(data.2),
|
|
)
|
|
})
|
|
}
|
|
|
|
pub fn uint16_overflow_test() {
|
|
list.each(uint16_testset, fn(data) {
|
|
let a = bigi.from_int(data.0)
|
|
let b = bigi.from_int(data.1)
|
|
let c = bigi.add(a, b)
|
|
let d = bigi.subtract(c, bigi.from_int(65_535))
|
|
should.equal(
|
|
utils.overflow(
|
|
utils.WouldOverflow(d),
|
|
min: bigi.zero(),
|
|
max: bigi.from_int(65_535),
|
|
),
|
|
bigi.from_int(data.2),
|
|
)
|
|
})
|
|
}
|
|
|
|
pub fn int8_overflow_test() {
|
|
list.each(int8_multiply_testset, fn(data) {
|
|
let a = bigi.from_int(data.0)
|
|
let b = bigi.from_int(data.1)
|
|
let c = bigi.multiply(a, b)
|
|
let d = bigi.subtract(c, bigi.from_int(127))
|
|
should.equal(
|
|
utils.overflow(
|
|
utils.WouldOverflow(d),
|
|
min: bigi.from_int(-128),
|
|
max: bigi.from_int(127),
|
|
),
|
|
bigi.from_int(data.2),
|
|
)
|
|
})
|
|
}
|
|
|
|
pub fn int8_underflow_test() {
|
|
list.each(int8_underflow_testset, fn(data) {
|
|
let a = bigi.from_int(data.0)
|
|
let b = bigi.from_int(data.1)
|
|
let c = bigi.subtract(a, b)
|
|
let d = bigi.absolute(bigi.subtract(c, bigi.from_int(-128)))
|
|
should.equal(
|
|
utils.overflow(
|
|
utils.WouldUnderflow(d),
|
|
min: bigi.from_int(-128),
|
|
max: bigi.from_int(127),
|
|
),
|
|
bigi.from_int(data.2),
|
|
)
|
|
})
|
|
}
|