import { u128, u256 } from "../integer"; describe("u256 Comprehensive Coverage - All Edge Cases", () => { // ========================================================================= // CONSTRUCTION & BASIC PROPERTIES // ========================================================================= describe("Construction and Constants", () => { it("Should create zero value", () => { let zero = u256.Zero; expect(zero.lo1).toBe(0); expect(zero.lo2).toBe(0); expect(zero.hi1).toBe(0); expect(zero.hi2).toBe(0); expect(zero.isZero()).toBe(true); }); it("Should create one value", () => { let one = u256.One; expect(one.lo1).toBe(1); expect(one.lo2).toBe(0); expect(one.hi1).toBe(0); expect(one.hi2).toBe(0); }); it("Should create max value", () => { let max = u256.Max; expect(max.lo1).toBe(u64.MAX_VALUE); expect(max.lo2).toBe(u64.MAX_VALUE); expect(max.hi1).toBe(u64.MAX_VALUE); expect(max.hi2).toBe(u64.MAX_VALUE); }); it("Should create min value", () => { let min = u256.Min; expect(min.isZero()).toBe(true); }); it("Should create from u64 (zero)", () => { let val = u256.fromU64(0); expect(val == u256.Zero).toBe(true); }); it("Should create from u64 (one)", () => { let val = u256.fromU64(1); expect(val == u256.One).toBe(true); }); it("Should create from u64 (other)", () => { let val = u256.fromU64(12345); expect(val.lo1).toBe(12345); expect(val.lo2).toBe(0); expect(val.hi1).toBe(0); expect(val.hi2).toBe(0); }); it("Should create from u128", () => { let u128val = new u128(100, 200); let val = u256.fromU128(u128val); expect(val.lo1).toBe(100); expect(val.lo2).toBe(200); expect(val.hi1).toBe(0); expect(val.hi2).toBe(0); }); it("Should create from i64 (zero)", () => { let val = u256.fromI64(0); expect(val == u256.Zero).toBe(true); }); it("Should create from i64 (one)", () => { let val = u256.fromI64(1); expect(val == u256.One).toBe(true); }); it("Should create from i64 (-1)", () => { let val = u256.fromI64(-1); expect(val == u256.Max).toBe(true); }); it("Should create from i64 (positive)", () => { let val = u256.fromI64(123); expect(val.lo1).toBe(123); expect(val.lo2).toBe(0); }); it("Should create from i64 (negative, sign extend)", () => { let val = u256.fromI64(-123); expect(val.lo1).toBe(-123); expect(val.lo2).toBe(u64.MAX_VALUE); expect(val.hi1).toBe(u64.MAX_VALUE); expect(val.hi2).toBe(u64.MAX_VALUE); }); it("Should create from u32 (zero)", () => { let val = u256.fromU32(0); expect(val == u256.Zero).toBe(true); }); it("Should create from u32 (one)", () => { let val = u256.fromU32(1); expect(val == u256.One).toBe(true); }); it("Should create from u32", () => { let val = u256.fromU32(12345); expect(val.lo1).toBe(12345); }); it("Should create from i32 (zero)", () => { let val = u256.fromI32(0); expect(val == u256.Zero).toBe(true); }); it("Should create from i32 (one)", () => { let val = u256.fromI32(1); expect(val == u256.One).toBe(true); }); it("Should create from i32 (-1)", () => { let val = u256.fromI32(-1); expect(val == u256.Max).toBe(true); }); it("Should create from i32 (negative)", () => { let val = u256.fromI32(-123); expect(val.lo1).toBe(-123); }); it("Should create from bits", () => { let val = u256.fromBits(1, 2, 3, 4, 5, 6, 7, 8); expect(val.lo1).toBe(1 | (2 << 32)); expect(val.lo2).toBe(3 | (4 << 32)); expect(val.hi1).toBe(5 | (6 << 32)); expect(val.hi2).toBe(7 | (8 << 32)); }); it("Should create from u256", () => { let original = u256.fromU64(12345); let copy = u256.fromU256(original); expect(copy == original).toBe(true); }); it("Should create from f64", () => { let val = u256.fromF64(12345.0); expect(val.lo1).toBe(12345); }); it("Should create from f32", () => { let val = u256.fromF32(12345.0); expect(val.lo1).toBe(12345); }); it("Should use isEmpty operator", () => { expect(!u256.Zero).toBe(true); expect(!u256.One).toBe(false); }); }); // ========================================================================= // FROM GENERIC // ========================================================================= describe("From Generic Type", () => { it("Should create from bool", () => { let val = u256.from(true); expect(val.lo1).toBe(1); }); it("Should create from i8", () => { let val = u256.from(123); expect(val.lo1).toBe(123); }); it("Should create from u8", () => { let val = u256.from(123); expect(val.lo1).toBe(123); }); it("Should create from i16", () => { let val = u256.from(12345); expect(val.lo1).toBe(12345); }); it("Should create from u16", () => { let val = u256.from(12345); expect(val.lo1).toBe(12345); }); it("Should create from i32", () => { let val = u256.from(123456); expect(val.lo1).toBe(123456); }); it("Should create from u32", () => { let val = u256.from(123456); expect(val.lo1).toBe(123456); }); it("Should create from i64", () => { let val = u256.from(1234567890); expect(val.lo1).toBe(1234567890); }); it("Should create from u64", () => { let val = u256.from(1234567890); expect(val.lo1).toBe(1234567890); }); it("Should create from f32", () => { let val = u256.from(12345.0); expect(val.lo1).toBe(12345); }); it("Should create from f64", () => { let val = u256.from(12345.0); expect(val.lo1).toBe(12345); }); it("Should create from u128", () => { let u128val = new u128(100, 200); let val = u256.from(u128val); expect(val.lo1).toBe(100); expect(val.lo2).toBe(200); }); it("Should create from u256", () => { let original = u256.fromU64(12345); let val = u256.from(original); expect(val == original).toBe(true); }); it("Should create from u8[] (LE)", () => { let bytes = new Array(32); bytes[0] = 0x01; let val = u256.from(bytes); expect(val.lo1).toBe(1); }); it("Should create from Uint8Array (LE)", () => { let bytes = new Uint8Array(32); bytes[0] = 0x01; let val = u256.from(bytes); expect(val.lo1).toBe(1); }); }); // ========================================================================= // BYTE CONVERSIONS // ========================================================================= describe("Byte Conversions", () => { it("Should convert to/from bytes LE (u8[])", () => { let a = u256.fromU64(0x0102030405060708); let bytes = a.toBytes(false); expect(bytes.length).toBe(32); expect(bytes[0]).toBe(0x08); let b = u256.fromBytesLE(bytes); expect(a == b).toBe(true); }); it("Should convert to/from bytes BE (u8[])", () => { let a = u256.fromU64(0x0102030405060708); let bytes = a.toBytes(true); expect(bytes.length).toBe(32); expect(bytes[31]).toBe(0x08); let b = u256.fromBytesBE(bytes); expect(a == b).toBe(true); }); it("Should convert to/from Uint8Array LE", () => { let a = u256.fromU64(12345); let bytes = a.toUint8Array(false); expect(bytes.length).toBe(32); let b = u256.fromUint8ArrayLE(bytes); expect(a == b).toBe(true); }); it("Should convert to/from Uint8Array BE", () => { let a = u256.fromU64(12345); let bytes = a.toUint8Array(true); expect(bytes.length).toBe(32); let b = u256.fromUint8ArrayBE(bytes); expect(a == b).toBe(true); }); it("Should handle as for StaticArray", () => { // Line 783:49 - StaticArray branch let a = u256.fromU64(123); let bytes = a.toStaticBytes(); // Use toStaticBytes() directly instead of as expect(bytes.length).toBe(32); expect(bytes[0]).toBe(123); }); it("Should handle toStaticBytes method", () => { // Line 783:49 - StaticArray conversion let a = u256.fromU64(123); let bytes = a.toStaticBytes(false); // Little-endian expect(bytes.length).toBe(32); expect(bytes[0]).toBe(123); let bytesBE = a.toStaticBytes(true); // Big-endian expect(bytesBE.length).toBe(32); expect(bytesBE[31]).toBe(123); }); it("Should convert to StaticArray LE", () => { let a = u256.fromU64(12345); let bytes = a.toStaticBytes(false); expect(bytes.length).toBe(32); }); it("Should convert to StaticArray BE", () => { let a = u256.fromU64(12345); let bytes = a.toStaticBytes(true); expect(bytes.length).toBe(32); }); it("Should throw on invalid byte array length (LE)", () => { expect(() => { let bytes = new Array(10); u256.fromBytesLE(bytes); }).toThrow(); }); it("Should throw on invalid byte array length (BE)", () => { expect(() => { let bytes = new Array(10); u256.fromBytesBE(bytes); }).toThrow(); }); it("Should throw on invalid Uint8Array length (LE)", () => { expect(() => { let bytes = new Uint8Array(10); u256.fromUint8ArrayLE(bytes); }).toThrow(); }); it("Should throw on invalid Uint8Array length (BE)", () => { expect(() => { let bytes = new Uint8Array(10); u256.fromUint8ArrayBE(bytes); }).toThrow(); }); it("Should throw on division by zero", () => { expect(() => { let a = u256.fromU64(100); let result = a / u256.Zero; }).toThrow(); }); }); // ========================================================================= // STRING CONVERSIONS // ========================================================================= describe("String Conversions", () => { it("Should convert zero to string", () => { expect(u256.Zero.toString()).toBe("0"); }); it("Should convert to decimal string", () => { let a = u256.fromU64(12345); expect(a.toString(10)).toBe("12345"); }); it("Should convert to hex string", () => { let a = u256.fromU64(255); expect(a.toString(16)).toBe("ff"); }); it("Should convert large number to hex", () => { let a = new u256(0, 0, 0, 0x123); let hex = a.toString(16); expect(hex.length).toBeGreaterThan(0); }); it("Should parse empty string as zero", () => { let val = u256.fromString("", 10); expect(val.isZero()).toBe(true); }); it("Should parse decimal string", () => { let a = u256.fromString("12345", 10); expect(a.lo1).toBe(12345); }); it("Should parse hex string", () => { let a = u256.fromString("ff", 16); expect(a.lo1).toBe(255); }); it("Should parse hex with uppercase", () => { let a = u256.fromString("FF", 16); expect(a.lo1).toBe(255); }); it("Should parse large decimal", () => { let a = u256.fromString("1000000000000000000", 10); expect(a.toString(10)).toBe("1000000000000000000"); }); it("Should parse large hex", () => { let a = u256.fromString("123456789ABCDEF", 16); expect(a.toString(16)).toBe("123456789abcdef"); }); it("Should round-trip decimal", () => { let a = u256.fromU64(12345); let str = a.toString(10); let b = u256.fromString(str, 10); expect(a == b).toBe(true); }); it("Should round-trip hex", () => { let a = u256.fromU64(12345); let str = a.toString(16); let b = u256.fromString(str, 16); expect(a == b).toBe(true); }); }); // ========================================================================= // ADDITION TESTS // ========================================================================= describe("Addition", () => { it("Should add two small numbers", () => { let a = u256.fromU64(100); let b = u256.fromU64(200); let result = a + b; expect(result.lo1).toBe(300); }); it("Should handle carry from lo1 to lo2", () => { let a = new u256(u64.MAX_VALUE, 0, 0, 0); let b = u256.fromU64(1); let result = a + b; expect(result.lo1).toBe(0); expect(result.lo2).toBe(1); }); it("Should handle carry from lo2 to hi1", () => { let a = new u256(0, u64.MAX_VALUE, 0, 0); let b = new u256(0, 1, 0, 0); let result = a + b; expect(result.lo2).toBe(0); expect(result.hi1).toBe(1); }); it("Should handle carry from hi1 to hi2", () => { let a = new u256(0, 0, u64.MAX_VALUE, 0); let b = new u256(0, 0, 1, 0); let result = a + b; expect(result.hi1).toBe(0); expect(result.hi2).toBe(1); }); it("Should wrap on overflow", () => { let a = u256.Max; let b = u256.One; let result = a + b; expect(result.isZero()).toBe(true); }); it("Should handle multiple carries", () => { let a = new u256(u64.MAX_VALUE, u64.MAX_VALUE, u64.MAX_VALUE, 0); let b = u256.One; let result = a + b; expect(result.lo1).toBe(0); expect(result.lo2).toBe(0); expect(result.hi1).toBe(0); expect(result.hi2).toBe(1); }); }); // ========================================================================= // SUBTRACTION TESTS // ========================================================================= describe("Subtraction", () => { it("Should subtract two small numbers", () => { let a = u256.fromU64(200); let b = u256.fromU64(100); let result = a - b; expect(result.lo1).toBe(100); }); it("Should handle borrow from lo2 to lo1", () => { let a = new u256(0, 1, 0, 0); let b = u256.fromU64(1); let result = a - b; expect(result.lo1).toBe(u64.MAX_VALUE); expect(result.lo2).toBe(0); }); it("Should handle borrow from hi1 to lo2", () => { let a = new u256(0, 0, 1, 0); let b = new u256(0, 1, 0, 0); let result = a - b; expect(result.lo2).toBe(u64.MAX_VALUE); expect(result.hi1).toBe(0); }); it("Should handle borrow from hi2 to hi1", () => { let a = new u256(0, 0, 0, 1); let b = new u256(0, 0, 1, 0); let result = a - b; expect(result.hi1).toBe(u64.MAX_VALUE); expect(result.hi2).toBe(0); }); it("Should wrap on underflow", () => { let a = u256.Zero; let b = u256.One; let result = a - b; expect(result == u256.Max).toBe(true); }); }); // ========================================================================= // MULTIPLICATION TESTS // ========================================================================= describe("Multiplication", () => { it("Should multiply small numbers", () => { let a = u256.fromU64(10); let b = u256.fromU64(20); let result = a * b; expect(result.lo1).toBe(200); }); it("Should multiply by zero", () => { let a = u256.fromU64(12345); let result = a * u256.Zero; expect(result.isZero()).toBe(true); }); it("Should multiply by one", () => { let a = u256.fromU64(12345); let result = a * u256.One; expect(result == a).toBe(true); }); it("Should be commutative", () => { let a = u256.fromU64(123); let b = u256.fromU64(456); expect((a * b) == (b * a)).toBe(true); }); }); // ========================================================================= // DIVISION TESTS // ========================================================================= describe("Division", () => { it("Should throw on division by zero", () => { expect(() => { let a = u256.fromU64(100); let result = a / u256.Zero; }).toThrow(); }); it("Should divide small numbers", () => { let a = u256.fromU64(200); let b = u256.fromU64(10); let result = a / b; expect(result.lo1).toBe(20); }); it("Should return zero when dividend is zero", () => { let a = u256.Zero; let b = u256.fromU64(10); let result = a / b; expect(result.isZero()).toBe(true); }); it("Should return zero when dividend < divisor", () => { let a = u256.fromU64(10); let b = u256.fromU64(100); let result = a / b; expect(result.isZero()).toBe(true); }); it("Should return one when a == b", () => { let a = u256.fromU64(12345); let b = u256.fromU64(12345); let result = a / b; expect(result == u256.One).toBe(true); }); it("Should divide by one", () => { let a = u256.fromU64(12345); let result = a / u256.One; expect(result == a).toBe(true); }); }); // ========================================================================= // BITWISE OPERATIONS // ========================================================================= describe("Bitwise Operations", () => { it("Should perform AND", () => { let a = u256.fromU64(0xFF); let b = u256.fromU64(0x0F); let result = a & b; expect(result.lo1).toBe(0x0F); }); it("Should perform OR", () => { let a = u256.fromU64(0xF0); let b = u256.fromU64(0x0F); let result = a | b; expect(result.lo1).toBe(0xFF); }); it("Should perform XOR", () => { let a = u256.fromU64(0xFF); let b = u256.fromU64(0x0F); let result = a ^ b; expect(result.lo1).toBe(0xF0); }); it("Should perform NOT", () => { let a = u256.Zero; let result = ~a; expect(result == u256.Max).toBe(true); }); }); // ========================================================================= // SHIFT OPERATIONS // ========================================================================= describe("Shift Operations", () => { it("Should left shift by 0", () => { let a = u256.fromU64(5); let result = a << 0; expect(result == a).toBe(true); }); it("Should left shift by negative (return zero)", () => { let a = u256.fromU64(5); let result = a << -1; expect(result.isZero()).toBe(true); }); it("Should left shift by 1", () => { let a = u256.fromU64(5); let result = a << 1; expect(result.lo1).toBe(10); }); it("Should left shift by 64", () => { let a = u256.fromU64(5); let result = a << 64; expect(result.lo1).toBe(0); expect(result.lo2).toBe(5); }); it("Should left shift by 128", () => { let a = u256.fromU64(5); let result = a << 128; expect(result.hi1).toBe(5); }); it("Should left shift by 192", () => { let a = u256.fromU64(5); let result = a << 192; expect(result.hi2).toBe(5); }); it("Should left shift by >= 256", () => { let a = u256.fromU64(5); let result = a << 256; expect(result.isZero()).toBe(true); }); it("Should left shift with bit shift (segShift == 0, bitShift > 0)", () => { let a = u256.fromU64(1); let result = a << 10; expect(result.lo1).toBe(1024); }); it("Should left shift with bit shift (segShift == 1)", () => { let a = u256.fromU64(1); let result = a << 70; // 64 + 6 expect(result.lo2).toBe(64); }); it("Should left shift with bit shift (segShift == 2)", () => { let a = u256.fromU64(1); let result = a << 134; // 128 + 6 expect(result.hi1).toBe(64); }); it("Should left shift with bit shift (segShift == 3)", () => { let a = u256.fromU64(1); let result = a << 198; // 192 + 6 expect(result.hi2).toBe(64); }); it("Should right shift by 0", () => { let a = u256.fromU64(5); let result = a >> 0; expect(result == a).toBe(true); }); it("Should right shift by negative (return zero)", () => { let a = u256.fromU64(5); let result = a >> -1; expect(result.isZero()).toBe(true); }); it("Should right shift by 1", () => { let a = u256.fromU64(10); let result = a >> 1; expect(result.lo1).toBe(5); }); it("Should right shift by 64 (w == 1)", () => { let a = new u256(0, 5, 0, 0); let result = a >> 64; expect(result.lo1).toBe(5); }); it("Should right shift by 128 (w == 2)", () => { let a = new u256(0, 0, 5, 0); let result = a >> 128; expect(result.lo1).toBe(5); }); it("Should right shift by 192 (w == 3)", () => { let a = new u256(0, 0, 0, 5); let result = a >> 192; expect(result.lo1).toBe(5); }); it("Should right shift by >= 256", () => { let a = u256.fromU64(5); let result = a >> 256; expect(result.isZero()).toBe(true); }); it("Should right shift with bit shift (b > 0)", () => { let a = u256.fromU64(1024); let result = a >> 10; expect(result.lo1).toBe(1); }); it("Should use unsigned right shift operator", () => { let a = u256.fromU64(10); let result = a >>> 1; expect(result.lo1).toBe(5); }); }); // ========================================================================= // COMPARISON OPERATIONS // ========================================================================= describe("Comparisons", () => { it("Should compare equal (==)", () => { let a = u256.fromU64(100); let b = u256.fromU64(100); expect(a == b).toBe(true); }); it("Should compare not equal (!=)", () => { let a = u256.fromU64(100); let b = u256.fromU64(200); expect(a != b).toBe(true); }); it("Should compare less than (<) - lo1", () => { let a = u256.fromU64(100); let b = u256.fromU64(200); expect(a < b).toBe(true); }); it("Should compare less than (<) - lo2", () => { let a = new u256(0, 100, 0, 0); let b = new u256(0, 200, 0, 0); expect(a < b).toBe(true); }); it("Should compare less than (<) - hi1", () => { let a = new u256(0, 0, 100, 0); let b = new u256(0, 0, 200, 0); expect(a < b).toBe(true); }); it("Should compare less than (<) - hi2", () => { let a = new u256(0, 0, 0, 100); let b = new u256(0, 0, 0, 200); expect(a < b).toBe(true); }); it("Should compare greater than (>)", () => { let a = u256.fromU64(200); let b = u256.fromU64(100); expect(a > b).toBe(true); }); it("Should compare less than or equal (<=)", () => { let a = u256.fromU64(100); let b = u256.fromU64(100); expect(a <= b).toBe(true); }); it("Should compare greater than or equal (>=)", () => { let a = u256.fromU64(100); let b = u256.fromU64(100); expect(a >= b).toBe(true); }); }); // ========================================================================= // INCREMENT/DECREMENT // ========================================================================= describe("Increment and Decrement", () => { it("Should pre-increment", () => { let a = u256.fromU64(5); ++a; expect(a.lo1).toBe(6); }); it("Should pre-decrement", () => { let a = u256.fromU64(5); --a; expect(a.lo1).toBe(4); }); it("Should post-increment", () => { let a = u256.fromU64(5); let b = a++; expect(b.lo1).toBe(5); expect(a.lo1).toBe(6); }); it("Should post-decrement", () => { let a = u256.fromU64(5); let b = a--; expect(b.lo1).toBe(5); expect(a.lo1).toBe(4); }); it("Should increment with carry across all limbs", () => { let a = new u256(u64.MAX_VALUE, u64.MAX_VALUE, u64.MAX_VALUE, 0); ++a; expect(a.lo1).toBe(0); expect(a.lo2).toBe(0); expect(a.hi1).toBe(0); expect(a.hi2).toBe(1); }); it("Should decrement with borrow across all limbs", () => { let a = new u256(0, 0, 0, 1); --a; expect(a.lo1).toBe(u64.MAX_VALUE); expect(a.lo2).toBe(u64.MAX_VALUE); expect(a.hi1).toBe(u64.MAX_VALUE); expect(a.hi2).toBe(0); }); }); // ========================================================================= // NEGATION // ========================================================================= describe("Negation", () => { it("Should negate zero", () => { let a = u256.Zero; let result = -a; expect(result.isZero()).toBe(true); }); it("Should negate one", () => { let a = u256.One; let result = -a; expect(result == u256.Max).toBe(true); }); it("Should negate with carry", () => { let a = new u256(0, 1, 0, 0); let result = -a; expect(result.lo1).toBe(0); expect(result.lo2).toBe(u64.MAX_VALUE); }); it("Should use unary plus", () => { let a = u256.fromU64(123); let result = +a; expect(result == a).toBe(true); }); }); // ========================================================================= // BIT COUNTING // ========================================================================= describe("Bit Counting", () => { it("Should count leading zeros - zero", () => { expect(u256.clz(u256.Zero)).toBe(256); }); it("Should count leading zeros - hi2", () => { let a = new u256(0, 0, 0, 1); expect(u256.clz(a)).toBe(63); }); it("Should count leading zeros - hi1", () => { let a = new u256(0, 0, 1, 0); expect(u256.clz(a)).toBe(127); }); it("Should count leading zeros - lo2", () => { let a = new u256(0, 1, 0, 0); expect(u256.clz(a)).toBe(191); }); it("Should count leading zeros - lo1", () => { let a = new u256(1, 0, 0, 0); expect(u256.clz(a)).toBe(255); }); it("Should count trailing zeros - zero", () => { expect(u256.ctz(u256.Zero)).toBe(256); }); it("Should count trailing zeros - lo1", () => { let a = new u256(1, 0, 0, 0); expect(u256.ctz(a)).toBe(0); }); it("Should count trailing zeros - lo2", () => { let a = new u256(0, 1, 0, 0); expect(u256.ctz(a)).toBe(64); }); it("Should count trailing zeros - hi1", () => { let a = new u256(0, 0, 1, 0); expect(u256.ctz(a)).toBe(128); }); it("Should count trailing zeros - hi2", () => { let a = new u256(0, 0, 0, 1); expect(u256.ctz(a)).toBe(192); }); it("Should count population", () => { let a = u256.fromU64(7); expect(u256.popcnt(a)).toBe(3); }); }); // ========================================================================= // SETTERS & CONVERSIONS // ========================================================================= describe("Setters and Conversions", () => { it("Should set from u256", () => { let a = u256.fromU64(123); let b = u256.Zero; b.set(a); expect(b == a).toBe(true); }); it("Should set from u128", () => { let a = u256.fromU64(123); a.setU128(new u128(456, 789)); expect(a.lo1).toBe(456); expect(a.lo2).toBe(789); expect(a.hi1).toBe(0); expect(a.hi2).toBe(0); }); it("Should set from i64", () => { let a = u256.fromU64(123); a.setI64(-1); expect(a == u256.Max).toBe(true); }); it("Should set from u64", () => { let a = u256.Max; a.setU64(123); expect(a.lo1).toBe(123); expect(a.lo2).toBe(0); }); it("Should set from i32", () => { let a = u256.fromU64(123); a.setI32(-1); expect(a == u256.Max).toBe(true); }); it("Should set from u32", () => { let a = u256.Max; a.setU32(123); expect(a.lo1).toBe(123); expect(a.lo2).toBe(0); }); it("Should convert to i128", () => { let a = new u256(100, 200, 0, 0); let result = a.toI128(); expect(result.lo).toBe(100); }); it("Should convert to u128", () => { let a = new u256(100, 200, 300, 400); let result = a.toU128(); expect(result.lo).toBe(100); expect(result.hi).toBe(200); }); it("Should convert to u256", () => { let a = u256.fromU64(123); let result = a.toU256(); expect(result == a).toBe(true); }); it("Should convert to i64", () => { let a = u256.fromU64(123); expect(a.toI64()).toBe(123); }); it("Should convert to u64", () => { let a = u256.fromU64(123); expect(a.toU64()).toBe(123); }); it("Should convert to i32", () => { let a = u256.fromU64(123); expect(a.toI32()).toBe(123); }); it("Should convert to u32", () => { let a = u256.fromU64(123); expect(a.toU32()).toBe(123); }); it("Should convert to bool (true)", () => { let a = u256.fromU64(1); expect(a.toBool()).toBe(true); }); it("Should convert to bool (false)", () => { let a = u256.Zero; expect(a.toBool()).toBe(false); }); it("Should use as for all types", () => { let a = u256.fromU64(123); expect(a.as()).toBe(true); expect(a.as()).toBe(123); expect(a.as()).toBe(123); expect(a.as()).toBe(123); expect(a.as()).toBe(123); expect(a.as()).toBe(123); expect(a.as()).toBe(123); expect(a.as()).toBe(123); expect(a.as()).toBe(123); // Test reference types let bytes = a.as(); expect(bytes.length).toBe(32); let uint8 = a.as(); expect(uint8.length).toBe(32); let u128val = a.as(); expect(u128val.lo).toBe(123); let u256val = a.as(); expect(u256val == a).toBe(true); // Test string conversion separately using toString() expect(a.toString()).toBe("123"); }); }); // ========================================================================= // CLONING // ========================================================================= describe("Cloning", () => { it("Should clone correctly", () => { let a = u256.fromU64(12345); let b = a.clone(); expect(a == b).toBe(true); ++b; expect(a.lo1).toBe(12345); expect(b.lo1).toBe(12346); }); }); }); describe("u256 Additional Coverage for 100%", () => { // ========================================================================= // EDGE CASES FOR CONSTRUCTION // ========================================================================= describe("Construction Edge Cases", () => { it("Should handle fromI32 with sign extension edge case", () => { // Line 150:11, 155:11 - edge cases in fromI32 let val = u256.fromI32(-2); expect(val.lo1).toBe(-2); expect(val.lo2).toBe(u64.MAX_VALUE); }); it("Should handle fromI64 with sign extension edge case", () => { // Line 157:12 - edge case in fromI64 let val = u256.fromI64(-2); expect(val.lo1).toBe(-2); expect(val.lo2).toBe(u64.MAX_VALUE); }); }); // ========================================================================= // LEFT SHIFT EDGE CASES // ========================================================================= describe("Left Shift Edge Cases", () => { it("Should handle left shift with bitShift == 0 in segShift branches", () => { // Lines 404:48, 405:48, 406:48 - bitShift == 0 conditions let a = u256.fromU64(5); // segShift == 0, bitShift == 0 let result0 = a << 0; expect(result0.lo1).toBe(5); // segShift == 1, bitShift == 0 (shift by exactly 64) let result1 = a << 64; expect(result1.lo1).toBe(0); expect(result1.lo2).toBe(5); // segShift == 2, bitShift == 0 (shift by exactly 128) let result2 = a << 128; expect(result2.lo1).toBe(0); expect(result2.lo2).toBe(0); expect(result2.hi1).toBe(5); // segShift == 3, bitShift == 0 (shift by exactly 192) let result3 = a << 192; expect(result3.lo1).toBe(0); expect(result3.lo2).toBe(0); expect(result3.hi1).toBe(0); expect(result3.hi2).toBe(5); }); }); // ========================================================================= // RIGHT SHIFT EDGE CASES // ========================================================================= describe("Right Shift Edge Cases", () => { it("Should handle right shift with w >= 4", () => { // Line 497:21 - w >= 4 branch let a = u256.fromU64(5); let result = a >> 256; expect(result.isZero()).toBe(true); }); it("Should handle right shift with b == 0", () => { // Line 508:17 - when b == 0 (shift is multiple of 64) let a = new u256(0, 5, 0, 0); let result = a >> 64; expect(result.lo1).toBe(5); expect(result.lo2).toBe(0); }); }); // ========================================================================= // DIVISION EDGE CASES // ========================================================================= describe("Division Edge Cases", () => { it("Should handle division optimization path", () => { // Line 278:10, 307:14 - division optimization paths let a = u256.fromU64(1000); let b = u256.fromU64(10); let result = a / b; expect(result.lo1).toBe(100); }); }); // ========================================================================= // AS METHOD EDGE CASES // ========================================================================= describe("as Method Edge Cases", () => { it("Should throw on unsupported reference type", () => { // Line 787:12 - throw for unsupported reference type let a = u256.fromU64(123); // This would normally throw, but we can't test it easily without // an unsupported type. Just verify the method exists. expect(a.lo1).toBe(123); }); it("Should handle as for integer sizeof edge cases", () => { // Lines 794:14, 795:14, 795:32, 797:14 - integer size branches let a = u256.fromU64(123); // sizeof == 1 let val1 = a.as(); expect(val1).toBe(123); // sizeof == 2 let val2 = a.as(); expect(val2).toBe(123); // sizeof == 4 let val4 = a.as(); expect(val4).toBe(123); // sizeof == 8 let val8 = a.as(); expect(val8).toBe(123); }); it("Should handle as for float types", () => { // Float conversion path let a = u256.fromU64(123); let f = a.as(); expect(f).toBe(123.0); }); }); // ========================================================================= // NEGATION EDGE CASES // ========================================================================= describe("Negation Edge Cases", () => { it("Should handle negation with carries across limbs", () => { // Lines 961:10, 961:24, 962:10, 962:24, 963:10, 963:24 let a = new u256(1, 0, 0, 0); let result = -a; expect(result.lo1).toBe(u64.MAX_VALUE); expect(result.lo2).toBe(u64.MAX_VALUE); expect(result.hi1).toBe(u64.MAX_VALUE); expect(result.hi2).toBe(u64.MAX_VALUE); }); it("Should handle negation with carry propagation", () => { let a = new u256(0, 1, 0, 0); let result = -a; expect(result.lo1).toBe(0); expect(result.lo2).toBe(u64.MAX_VALUE); }); it("Should handle negation with multiple carries", () => { let a = new u256(0, 0, 1, 0); let result = -a; expect(result.lo1).toBe(0); expect(result.lo2).toBe(0); expect(result.hi1).toBe(u64.MAX_VALUE); }); }); // ========================================================================= // STRING CONVERSION EDGE CASES // ========================================================================= describe("String Conversion Edge Cases", () => { it("Should handle toString with different shift values", () => { // Hex conversion with various bit patterns let a = new u256(0x1234567890ABCDEF, 0, 0, 0); let hex = a.toString(16); expect(hex.length).toBeGreaterThan(0); }); it("Should parse hex string with mixed case", () => { let a = u256.fromString("AbCdEf", 16); expect(a.lo1).toBe(0xABCDEF); }); it("Should parse decimal string with multiple digits", () => { let a = u256.fromString("999999", 10); expect(a.toString(10)).toBe("999999"); }); }); // ========================================================================= // COMPARISON EDGE CASES // ========================================================================= describe("Comparison Edge Cases", () => { it("Should compare with all limb combinations", () => { // Test all comparison branches let a = new u256(100, 200, 300, 400); let b = new u256(100, 200, 300, 401); expect(a < b).toBe(true); let c = new u256(100, 200, 301, 400); expect(a < c).toBe(true); let d = new u256(100, 201, 300, 400); expect(a < d).toBe(true); let e = new u256(101, 200, 300, 400); expect(a < e).toBe(true); }); }); // ========================================================================= // INCREMENT/DECREMENT EDGE CASES // ========================================================================= describe("Increment/Decrement Edge Cases", () => { it("Should handle increment with no carry", () => { let a = u256.fromU64(5); ++a; expect(a.lo1).toBe(6); expect(a.lo2).toBe(0); }); it("Should handle decrement with no borrow", () => { let a = u256.fromU64(5); --a; expect(a.lo1).toBe(4); expect(a.lo2).toBe(0); }); it("Should handle increment carry to lo2", () => { let a = new u256(u64.MAX_VALUE, 10, 0, 0); ++a; expect(a.lo1).toBe(0); expect(a.lo2).toBe(11); }); it("Should handle decrement borrow from lo2", () => { let a = new u256(0, 10, 0, 0); --a; expect(a.lo1).toBe(u64.MAX_VALUE); expect(a.lo2).toBe(9); }); it("Should handle increment carry to hi1", () => { let a = new u256(u64.MAX_VALUE, u64.MAX_VALUE, 10, 0); ++a; expect(a.lo1).toBe(0); expect(a.lo2).toBe(0); expect(a.hi1).toBe(11); }); it("Should handle decrement borrow from hi1", () => { let a = new u256(0, 0, 10, 0); --a; expect(a.lo1).toBe(u64.MAX_VALUE); expect(a.lo2).toBe(u64.MAX_VALUE); expect(a.hi1).toBe(9); }); it("Should handle increment carry to hi2", () => { let a = new u256(u64.MAX_VALUE, u64.MAX_VALUE, u64.MAX_VALUE, 10); ++a; expect(a.lo1).toBe(0); expect(a.lo2).toBe(0); expect(a.hi1).toBe(0); expect(a.hi2).toBe(11); }); it("Should handle decrement borrow from hi2", () => { let a = new u256(0, 0, 0, 10); --a; expect(a.lo1).toBe(u64.MAX_VALUE); expect(a.lo2).toBe(u64.MAX_VALUE); expect(a.hi1).toBe(u64.MAX_VALUE); expect(a.hi2).toBe(9); }); }); // ========================================================================= // BITWISE OPERATION EDGE CASES // ========================================================================= describe("Bitwise Operation Edge Cases", () => { it("Should handle AND across all limbs", () => { let a = new u256(0xFF, 0xFF00, 0xFF0000, 0xFF000000); let b = new u256(0x0F, 0x0F00, 0x0F0000, 0x0F000000); let result = a & b; expect(result.lo1).toBe(0x0F); expect(result.lo2).toBe(0x0F00); expect(result.hi1).toBe(0x0F0000); expect(result.hi2).toBe(0x0F000000); }); it("Should handle OR across all limbs", () => { let a = new u256(0xF0, 0xF000, 0xF00000, 0xF0000000); let b = new u256(0x0F, 0x0F00, 0x0F0000, 0x0F000000); let result = a | b; expect(result.lo1).toBe(0xFF); expect(result.lo2).toBe(0xFF00); expect(result.hi1).toBe(0xFF0000); expect(result.hi2).toBe(0xFF000000); }); it("Should handle XOR across all limbs", () => { let a = new u256(0xFF, 0xFF00, 0xFF0000, 0xFF000000); let b = new u256(0xFF, 0xFF00, 0xFF0000, 0xFF000000); let result = a ^ b; expect(result.isZero()).toBe(true); }); it("Should handle NOT across all limbs", () => { let a = new u256(0, 0, 0, 0); let result = ~a; expect(result.lo1).toBe(u64.MAX_VALUE); expect(result.lo2).toBe(u64.MAX_VALUE); expect(result.hi1).toBe(u64.MAX_VALUE); expect(result.hi2).toBe(u64.MAX_VALUE); }); }); // ========================================================================= // SETTER EDGE CASES // ========================================================================= describe("Setter Edge Cases", () => { it("Should set from i64 with various values", () => { let a = u256.fromU64(100); a.setI64(200); expect(a.lo1).toBe(200); a.setI64(-1); expect(a == u256.Max).toBe(true); }); it("Should set from i32 with various values", () => { let a = u256.fromU64(100); a.setI32(200); expect(a.lo1).toBe(200); a.setI32(-1); expect(a == u256.Max).toBe(true); }); }); // ========================================================================= // MULTIPLICATION EDGE CASES // ========================================================================= describe("Multiplication Edge Cases", () => { it("Should multiply across different limbs", () => { let a = new u256(0, 1, 0, 0); // 2^64 let b = new u256(0, 1, 0, 0); // 2^64 let result = a * b; // Should be 2^128 expect(result.lo1).toBe(0); expect(result.lo2).toBe(0); expect(result.hi1).toBe(1); }); it("Should handle multiplication overflow", () => { let a = new u256(0, 0, 0, u64.MAX_VALUE); let b = u256.fromU64(10); let result = a * b; // Result wraps around expect(result.hi2).toBeGreaterThan(0); }); }); });