| ... | @@ -2550,6 +2550,43 @@ test "big int conversion read twos complement with padding" { | ... | @@ -2550,6 +2550,43 @@ test "big int conversion read twos complement with padding" { |
| 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 })); | 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 | test "big int conversion write twos complement with padding" { | 2590 | test "big int conversion write twos complement with padding" { |
| 2554 | var a = try Managed.initSet(testing.allocator, 0x01_ffffffff_ffffffff_ffffffff); | 2591 | var a = try Managed.initSet(testing.allocator, 0x01_ffffffff_ffffffff_ffffffff); |
| 2555 | defer a.deinit(); | 2592 | defer a.deinit(); |
| ... | @@ -2564,6 +2601,8 @@ test "big int conversion write twos complement with padding" { | ... | @@ -2564,6 +2601,8 @@ test "big int conversion write twos complement with padding" { |
| 2564 | var bit_count: usize = 12 * 8 + 1; | 2601 | var bit_count: usize = 12 * 8 + 1; |
| 2565 | var buffer: []const u8 = undefined; | 2602 | var buffer: []const u8 = undefined; |
| 2566 | | 2603 | |
| | 2604 | // Test 0x01_02030405_06070809_0a0b0c0d |
| | 2605 | |
| 2567 | buffer = &[_]u8{ 0xd, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0xb }; | 2606 | buffer = &[_]u8{ 0xd, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0xb }; |
| 2568 | m.readTwosComplement(buffer, bit_count, 13, .Little, .unsigned); | 2607 | m.readTwosComplement(buffer, bit_count, 13, .Little, .unsigned); |
| 2569 | try testing.expect(m.toConst().orderAgainstScalar(0x01_02030405_06070809_0a0b0c0d) == .eq); | 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,6 +2621,8 @@ test "big int conversion write twos complement with padding" { |
| 2582 | | 2621 | |
| 2583 | bit_count = 12 * 8 + 2; | 2622 | bit_count = 12 * 8 + 2; |
| 2584 | | 2623 | |
| | 2624 | // Test -0x01_02030405_06070809_0a0b0c0d |
| | 2625 | |
| 2585 | buffer = &[_]u8{ 0xf3, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0x02 }; | 2626 | buffer = &[_]u8{ 0xf3, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0x02 }; |
| 2586 | m.readTwosComplement(buffer, bit_count, 13, .Little, .signed); | 2627 | m.readTwosComplement(buffer, bit_count, 13, .Little, .signed); |
| 2587 | try testing.expect(m.toConst().orderAgainstScalar(-0x01_02030405_06070809_0a0b0c0d) == .eq); | 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,4 +2638,54 @@ test "big int conversion write twos complement with padding" { |
| 2597 | buffer = &[_]u8{ 0xaa, 0xaa, 0xaa, 0x02, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf3 }; | 2638 | buffer = &[_]u8{ 0xaa, 0xaa, 0xaa, 0x02, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf3 }; |
| 2598 | m.readTwosComplement(buffer, bit_count, 16, .Big, .signed); | 2639 | m.readTwosComplement(buffer, bit_count, 16, .Big, .signed); |
| 2599 | try testing.expect(m.toConst().orderAgainstScalar(-0x01_02030405_06070809_0a0b0c0d) == .eq); | 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 | } |