| ... | @@ -1503,6 +1503,72 @@ test "big.int div multi-multi fuzz case #2" { | ... | @@ -1503,6 +1503,72 @@ test "big.int div multi-multi fuzz case #2" { |
| 1503 | try testing.expect(std.mem.eql(u8, rs, "a900000000000000000000000000000000000000000000000000")); | 1503 | try testing.expect(std.mem.eql(u8, rs, "a900000000000000000000000000000000000000000000000000")); |
| 1504 | } | 1504 | } |
| 1505 | | 1505 | |
| | 1506 | test "big.int truncate single unsigned" { |
| | 1507 | var a = try Managed.initSet(testing.allocator, maxInt(u47)); |
| | 1508 | defer a.deinit(); |
| | 1509 | |
| | 1510 | try a.truncate(a.toConst(), .unsigned, 17); |
| | 1511 | |
| | 1512 | try testing.expect((try a.to(u17)) == maxInt(u17)); |
| | 1513 | } |
| | 1514 | |
| | 1515 | test "big.int truncate single signed" { |
| | 1516 | var a = try Managed.initSet(testing.allocator, 0x1_0000); |
| | 1517 | defer a.deinit(); |
| | 1518 | |
| | 1519 | try a.truncate(a.toConst(), .signed, 17); |
| | 1520 | |
| | 1521 | try testing.expect((try a.to(i17)) == minInt(i17)); |
| | 1522 | } |
| | 1523 | |
| | 1524 | test "big.int truncate multi to single unsigned" { |
| | 1525 | var a = try Managed.initSet(testing.allocator, (maxInt(Limb) + 1) | 0x1234_5678_9ABC_DEF0); |
| | 1526 | defer a.deinit(); |
| | 1527 | |
| | 1528 | try a.truncate(a.toConst(), .unsigned, 37); |
| | 1529 | |
| | 1530 | try testing.expect((try a.to(u37)) == 0x18_9ABC_DEF0); |
| | 1531 | } |
| | 1532 | |
| | 1533 | test "big.int truncate multi to single signed" { |
| | 1534 | var a = try Managed.initSet(testing.allocator, maxInt(Limb) << 10); |
| | 1535 | defer a.deinit(); |
| | 1536 | |
| | 1537 | try a.truncate(a.toConst(), .signed, @bitSizeOf(i11)); |
| | 1538 | |
| | 1539 | try testing.expect((try a.to(i11)) == minInt(i11)); |
| | 1540 | } |
| | 1541 | |
| | 1542 | test "big.int truncate multi to multi unsigned" { |
| | 1543 | const bits = @typeInfo(SignedDoubleLimb).Int.bits; |
| | 1544 | const Int = std.meta.Int(.unsigned, bits - 1); |
| | 1545 | |
| | 1546 | var a = try Managed.initSet(testing.allocator, maxInt(SignedDoubleLimb)); |
| | 1547 | defer a.deinit(); |
| | 1548 | |
| | 1549 | try a.truncate(a.toConst(), .unsigned, bits - 1); |
| | 1550 | |
| | 1551 | try testing.expect((try a.to(Int)) == maxInt(Int)); |
| | 1552 | } |
| | 1553 | |
| | 1554 | test "big.int truncate multi to multi signed" { |
| | 1555 | var a = try Managed.initSet(testing.allocator, 3 << @bitSizeOf(Limb)); |
| | 1556 | defer a.deinit(); |
| | 1557 | |
| | 1558 | try a.truncate(a.toConst(), .signed, @bitSizeOf(Limb) + 1); |
| | 1559 | |
| | 1560 | try testing.expect((try a.to(std.meta.Int(.signed, @bitSizeOf(Limb) + 1))) == -1 << @bitSizeOf(Limb)); |
| | 1561 | } |
| | 1562 | |
| | 1563 | test "big.int truncate negative multi to single" { |
| | 1564 | var a = try Managed.initSet(testing.allocator, -@as(SignedDoubleLimb, maxInt(Limb) + 1)); |
| | 1565 | defer a.deinit(); |
| | 1566 | |
| | 1567 | try a.truncate(a.toConst(), .signed, @bitSizeOf(i17)); |
| | 1568 | |
| | 1569 | try testing.expect((try a.to(i17)) == 0); |
| | 1570 | } |
| | 1571 | |
| 1506 | test "big.int shift-right single" { | 1572 | test "big.int shift-right single" { |
| 1507 | var a = try Managed.initSet(testing.allocator, 0xffff0000); | 1573 | var a = try Managed.initSet(testing.allocator, 0xffff0000); |
| 1508 | defer a.deinit(); | 1574 | defer a.deinit(); |