| ... | ... | @@ -2550,6 +2550,43 @@ test "big int conversion read twos complement with padding" { |
| 2550 | 2550 | try testing.expect(std.mem.eql(u8, buffer1, &[_]u8{ 0xff, 0xff, 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf3 })); |
| 2551 | 2551 | } |
| 2552 | 2552 | |
| 2553 | test "big int write twos complement +/- zero" { |
| 2554 | var a = try Managed.initSet(testing.allocator, 0x0); |
| 2555 | defer a.deinit(); |
| 2556 | var m = a.toMutable(); |
| 2557 | |
| 2558 | var buffer1 = try testing.allocator.alloc(u8, 16); |
| 2559 | defer testing.allocator.free(buffer1); |
| 2560 | @memset(buffer1.ptr, 0xaa, buffer1.len); |
| 2561 | |
| 2562 | var bit_count: usize = 0; |
| 2563 | |
| 2564 | // Test zero |
| 2565 | |
| 2566 | m.toConst().writeTwosComplement(buffer1, bit_count, 13, .Little); |
| 2567 | try testing.expect(std.mem.eql(u8, buffer1, &(([_]u8{0} ** 13) ++ ([_]u8{0xaa} ** 3)))); |
| 2568 | m.toConst().writeTwosComplement(buffer1, bit_count, 13, .Big); |
| 2569 | try testing.expect(std.mem.eql(u8, buffer1, &(([_]u8{0} ** 13) ++ ([_]u8{0xaa} ** 3)))); |
| 2570 | m.toConst().writeTwosComplement(buffer1, bit_count, 16, .Little); |
| 2571 | try testing.expect(std.mem.eql(u8, buffer1, &(([_]u8{0} ** 16)))); |
| 2572 | m.toConst().writeTwosComplement(buffer1, bit_count, 16, .Big); |
| 2573 | try testing.expect(std.mem.eql(u8, buffer1, &(([_]u8{0} ** 16)))); |
| 2574 | |
| 2575 | @memset(buffer1.ptr, 0xaa, buffer1.len); |
| 2576 | m.positive = false; |
| 2577 | |
| 2578 | // Test negative zero |
| 2579 | |
| 2580 | m.toConst().writeTwosComplement(buffer1, bit_count, 13, .Little); |
| 2581 | try testing.expect(std.mem.eql(u8, buffer1, &(([_]u8{0} ** 13) ++ ([_]u8{0xaa} ** 3)))); |
| 2582 | m.toConst().writeTwosComplement(buffer1, bit_count, 13, .Big); |
| 2583 | try testing.expect(std.mem.eql(u8, buffer1, &(([_]u8{0} ** 13) ++ ([_]u8{0xaa} ** 3)))); |
| 2584 | m.toConst().writeTwosComplement(buffer1, bit_count, 16, .Little); |
| 2585 | try testing.expect(std.mem.eql(u8, buffer1, &(([_]u8{0} ** 16)))); |
| 2586 | m.toConst().writeTwosComplement(buffer1, bit_count, 16, .Big); |
| 2587 | try testing.expect(std.mem.eql(u8, buffer1, &(([_]u8{0} ** 16)))); |
| 2588 | } |
| 2589 | |
| 2553 | 2590 | test "big int conversion write twos complement with padding" { |
| 2554 | 2591 | var a = try Managed.initSet(testing.allocator, 0x01_ffffffff_ffffffff_ffffffff); |
| 2555 | 2592 | defer a.deinit(); |
| ... | ... | @@ -2564,6 +2601,8 @@ test "big int conversion write twos complement with padding" { |
| 2564 | 2601 | var bit_count: usize = 12 * 8 + 1; |
| 2565 | 2602 | var buffer: []const u8 = undefined; |
| 2566 | 2603 | |
| 2604 | // Test 0x01_02030405_06070809_0a0b0c0d |
| 2605 | |
| 2567 | 2606 | buffer = &[_]u8{ 0xd, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0xb }; |
| 2568 | 2607 | m.readTwosComplement(buffer, bit_count, 13, .Little, .unsigned); |
| 2569 | 2608 | try testing.expect(m.toConst().orderAgainstScalar(0x01_02030405_06070809_0a0b0c0d) == .eq); |
| ... | ... | @@ -2582,6 +2621,8 @@ test "big int conversion write twos complement with padding" { |
| 2582 | 2621 | |
| 2583 | 2622 | bit_count = 12 * 8 + 2; |
| 2584 | 2623 | |
| 2624 | // Test -0x01_02030405_06070809_0a0b0c0d |
| 2625 | |
| 2585 | 2626 | buffer = &[_]u8{ 0xf3, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0x02 }; |
| 2586 | 2627 | m.readTwosComplement(buffer, bit_count, 13, .Little, .signed); |
| 2587 | 2628 | try testing.expect(m.toConst().orderAgainstScalar(-0x01_02030405_06070809_0a0b0c0d) == .eq); |
| ... | ... | @@ -2597,4 +2638,54 @@ test "big int conversion write twos complement with padding" { |
| 2597 | 2638 | buffer = &[_]u8{ 0xaa, 0xaa, 0xaa, 0x02, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf3 }; |
| 2598 | 2639 | m.readTwosComplement(buffer, bit_count, 16, .Big, .signed); |
| 2599 | 2640 | try testing.expect(m.toConst().orderAgainstScalar(-0x01_02030405_06070809_0a0b0c0d) == .eq); |
| 2641 | |
| 2642 | // Test 0 |
| 2643 | |
| 2644 | buffer = &([_]u8{0} ** 16); |
| 2645 | m.readTwosComplement(buffer, bit_count, 13, .Little, .unsigned); |
| 2646 | try testing.expect(m.toConst().orderAgainstScalar(0x0) == .eq); |
| 2647 | m.readTwosComplement(buffer, bit_count, 13, .Big, .unsigned); |
| 2648 | try testing.expect(m.toConst().orderAgainstScalar(0x0) == .eq); |
| 2649 | m.readTwosComplement(buffer, bit_count, 16, .Little, .unsigned); |
| 2650 | try testing.expect(m.toConst().orderAgainstScalar(0x0) == .eq); |
| 2651 | m.readTwosComplement(buffer, bit_count, 16, .Big, .unsigned); |
| 2652 | try testing.expect(m.toConst().orderAgainstScalar(0x0) == .eq); |
| 2653 | |
| 2654 | bit_count = 0; |
| 2655 | buffer = &([_]u8{0xaa} ** 16); |
| 2656 | m.readTwosComplement(buffer, bit_count, 13, .Little, .unsigned); |
| 2657 | try testing.expect(m.toConst().orderAgainstScalar(0x0) == .eq); |
| 2658 | m.readTwosComplement(buffer, bit_count, 13, .Big, .unsigned); |
| 2659 | try testing.expect(m.toConst().orderAgainstScalar(0x0) == .eq); |
| 2660 | m.readTwosComplement(buffer, bit_count, 16, .Little, .unsigned); |
| 2661 | try testing.expect(m.toConst().orderAgainstScalar(0x0) == .eq); |
| 2662 | m.readTwosComplement(buffer, bit_count, 16, .Big, .unsigned); |
| 2663 | try testing.expect(m.toConst().orderAgainstScalar(0x0) == .eq); |
| 2664 | } |
| 2665 | |
| 2666 | test "big int conversion write twos complement zero" { |
| 2667 | var a = try Managed.initSet(testing.allocator, 0x01_ffffffff_ffffffff_ffffffff); |
| 2668 | defer a.deinit(); |
| 2669 | |
| 2670 | var m = a.toMutable(); |
| 2671 | |
| 2672 | // readTwosComplement: |
| 2673 | // (1) should not read beyond buffer[0..abi_size] |
| 2674 | // (2) should correctly interpret bytes based on the provided endianness |
| 2675 | // (3) should ignore any bits from bit_count to 8 * abi_size |
| 2676 | |
| 2677 | var bit_count: usize = 12 * 8 + 1; |
| 2678 | var buffer: []const u8 = undefined; |
| 2679 | |
| 2680 | buffer = &([_]u8{0} ** 13); |
| 2681 | m.readTwosComplement(buffer, bit_count, 13, .Little, .unsigned); |
| 2682 | try testing.expect(m.toConst().orderAgainstScalar(0x0) == .eq); |
| 2683 | m.readTwosComplement(buffer, bit_count, 13, .Big, .unsigned); |
| 2684 | try testing.expect(m.toConst().orderAgainstScalar(0x0) == .eq); |
| 2685 | |
| 2686 | buffer = &([_]u8{0} ** 16); |
| 2687 | m.readTwosComplement(buffer, bit_count, 16, .Little, .unsigned); |
| 2688 | try testing.expect(m.toConst().orderAgainstScalar(0x0) == .eq); |
| 2689 | m.readTwosComplement(buffer, bit_count, 16, .Big, .unsigned); |
| 2690 | try testing.expect(m.toConst().orderAgainstScalar(0x0) == .eq); |
| 2600 | 2691 | } |