| 621 | |
| 622 | |
| 623 | def test_unit_strs_sequence_slicing(): |
| 624 | native = "1, 2, 3, 4, 5, 6" |
| 625 | big = Str(native) |
| 626 | big_sequence = big.split(", ") |
| 627 | |
| 628 | def to_str(seq): |
| 629 | return "".join([str(x) for x in seq]) |
| 630 | |
| 631 | assert big_sequence[1:3] == ["2", "3"], to_str(big_sequence[1:3]) |
| 632 | assert big_sequence[1:] == ["2", "3", "4", "5", "6"], to_str(big_sequence[1:]) |
| 633 | assert big_sequence[:3] == ["1", "2", "3"], to_str(big_sequence[:3]) |
| 634 | |
| 635 | # Use negative indices to slice from the end |
| 636 | assert big_sequence[-1:] == ["6"], to_str(big_sequence[-1:]) |
| 637 | assert big_sequence[:-1] == ["1", "2", "3", "4", "5"], to_str(big_sequence[:-1]) |
| 638 | assert big_sequence[-3:] == ["4", "5", "6"], to_str(big_sequence[-3:]) |
| 639 | assert big_sequence[:-3] == ["1", "2", "3"], to_str(big_sequence[:-3]) |
| 640 | |
| 641 | # Introduce a step to skip some values |
| 642 | assert big_sequence[::2] == ["1", "3", "5"], to_str(big_sequence[::2]) |
| 643 | assert big_sequence[::-1] == ["6", "5", "4", "3", "2", "1"], to_str(big_sequence[::-1]) |
| 644 | |
| 645 | # Let's go harder with nested slicing |
| 646 | assert big_sequence[1:][::-1] == ["6", "5", "4", "3", "2"] |
| 647 | assert big_sequence[1:][::-2] == ["6", "4", "2"] |
| 648 | assert big_sequence[1:][::-3] == ["6", "3"] |
| 649 | |
| 650 | # Edge cases: slices of length 1 and 0 |
| 651 | # Test single element slices (length 1) |
| 652 | assert big_sequence[0:1] == ["1"], "Single element slice [0:1] failed" |
| 653 | assert big_sequence[1:2] == ["2"], "Single element slice [1:2] failed" |
| 654 | assert big_sequence[-1:] == ["6"], "Single element slice [-1:] failed" |
| 655 | assert big_sequence[-2:-1] == ["5"], "Single element slice [-2:-1] failed" |
| 656 | |
| 657 | # Test empty slices (length 0) |
| 658 | assert big_sequence[0:0] == [], "Empty slice [0:0] failed" |
| 659 | assert big_sequence[1:1] == [], "Empty slice [1:1] failed" |
| 660 | assert big_sequence[5:5] == [], "Empty slice [5:5] failed" |
| 661 | assert big_sequence[10:10] == [], "Empty slice [10:10] out of bounds failed" |
| 662 | assert big_sequence[1:0] == [], "Empty slice [1:0] (start > end) failed" |
| 663 | assert big_sequence[3:1] == [], "Empty slice [3:1] (start > end) failed" |
| 664 | |
| 665 | # Test edge cases with pre-constructed Strs objects passed as slices |
| 666 | single_slice = big_sequence[0:1] # Length 1 slice |
| 667 | empty_slice = big_sequence[0:0] # Length 0 slice |
| 668 | |
| 669 | # Verify the slices work correctly when passed around |
| 670 | assert len(single_slice) == 1, "Single slice length incorrect" |
| 671 | assert len(empty_slice) == 0, "Empty slice length incorrect" |
| 672 | assert str(single_slice[0]) == "1", "Single slice element access failed" |
| 673 | |
| 674 | # Test iteration over edge case slices |
| 675 | single_items = [str(item) for item in single_slice] |
| 676 | assert single_items == ["1"], "Single slice iteration failed" |
| 677 | |
| 678 | empty_items = [str(item) for item in empty_slice] |
| 679 | assert empty_items == [], "Empty slice iteration failed" |
| 680 | |