ranged_int/test/overflow_test.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),
)
})
}