|
8 | 8 | "bytes"
|
9 | 9 | "errors"
|
10 | 10 | "io"
|
| 11 | + "math" |
| 12 | + "strconv" |
11 | 13 | "strings"
|
12 | 14 | "testing"
|
13 | 15 | )
|
@@ -679,52 +681,86 @@ func TestBufferedDecodingPadding(t *testing.T) {
|
679 | 681 | }
|
680 | 682 | }
|
681 | 683 |
|
682 |
| -func TestEncodedDecodedLen(t *testing.T) { |
| 684 | +func TestEncodedLen(t *testing.T) { |
| 685 | + var rawStdEncoding = StdEncoding.WithPadding(NoPadding) |
683 | 686 | type test struct {
|
684 |
| - in int |
685 |
| - wantEnc int |
686 |
| - wantDec int |
687 |
| - } |
688 |
| - data := bytes.Repeat([]byte("x"), 100) |
689 |
| - for _, test := range []struct { |
690 |
| - name string |
691 |
| - enc *Encoding |
692 |
| - cases []test |
693 |
| - }{ |
694 |
| - {"StdEncoding", StdEncoding, []test{ |
695 |
| - {0, 0, 0}, |
696 |
| - {1, 8, 5}, |
697 |
| - {5, 8, 5}, |
698 |
| - {6, 16, 10}, |
699 |
| - {10, 16, 10}, |
700 |
| - }}, |
701 |
| - {"NoPadding", StdEncoding.WithPadding(NoPadding), []test{ |
702 |
| - {0, 0, 0}, |
703 |
| - {1, 2, 1}, |
704 |
| - {2, 4, 2}, |
705 |
| - {5, 8, 5}, |
706 |
| - {6, 10, 6}, |
707 |
| - {7, 12, 7}, |
708 |
| - {10, 16, 10}, |
709 |
| - {11, 18, 11}, |
710 |
| - }}, |
711 |
| - } { |
712 |
| - t.Run(test.name, func(t *testing.T) { |
713 |
| - for _, tc := range test.cases { |
714 |
| - encLen := test.enc.EncodedLen(tc.in) |
715 |
| - decLen := test.enc.DecodedLen(encLen) |
716 |
| - enc := test.enc.EncodeToString(data[:tc.in]) |
717 |
| - if len(enc) != encLen { |
718 |
| - t.Fatalf("EncodedLen(%d) = %d but encoded to %q (%d)", tc.in, encLen, enc, len(enc)) |
719 |
| - } |
720 |
| - if encLen != tc.wantEnc { |
721 |
| - t.Fatalf("EncodedLen(%d) = %d; want %d", tc.in, encLen, tc.wantEnc) |
722 |
| - } |
723 |
| - if decLen != tc.wantDec { |
724 |
| - t.Fatalf("DecodedLen(%d) = %d; want %d", encLen, decLen, tc.wantDec) |
725 |
| - } |
726 |
| - } |
727 |
| - }) |
| 687 | + enc *Encoding |
| 688 | + n int |
| 689 | + want int64 |
| 690 | + } |
| 691 | + tests := []test{ |
| 692 | + {StdEncoding, 0, 0}, |
| 693 | + {StdEncoding, 1, 8}, |
| 694 | + {StdEncoding, 2, 8}, |
| 695 | + {StdEncoding, 3, 8}, |
| 696 | + {StdEncoding, 4, 8}, |
| 697 | + {StdEncoding, 5, 8}, |
| 698 | + {StdEncoding, 6, 16}, |
| 699 | + {StdEncoding, 10, 16}, |
| 700 | + {StdEncoding, 11, 24}, |
| 701 | + {rawStdEncoding, 0, 0}, |
| 702 | + {rawStdEncoding, 1, 2}, |
| 703 | + {rawStdEncoding, 2, 4}, |
| 704 | + {rawStdEncoding, 3, 5}, |
| 705 | + {rawStdEncoding, 4, 7}, |
| 706 | + {rawStdEncoding, 5, 8}, |
| 707 | + {rawStdEncoding, 6, 10}, |
| 708 | + {rawStdEncoding, 7, 12}, |
| 709 | + {rawStdEncoding, 10, 16}, |
| 710 | + {rawStdEncoding, 11, 18}, |
| 711 | + } |
| 712 | + // check overflow |
| 713 | + switch strconv.IntSize { |
| 714 | + case 32: |
| 715 | + tests = append(tests, test{rawStdEncoding, (math.MaxInt-4)/8 + 1, 429496730}) |
| 716 | + tests = append(tests, test{rawStdEncoding, math.MaxInt/8*5 + 4, math.MaxInt}) |
| 717 | + case 64: |
| 718 | + tests = append(tests, test{rawStdEncoding, (math.MaxInt-4)/8 + 1, 1844674407370955162}) |
| 719 | + tests = append(tests, test{rawStdEncoding, math.MaxInt/8*5 + 4, math.MaxInt}) |
| 720 | + } |
| 721 | + for _, tt := range tests { |
| 722 | + if got := tt.enc.EncodedLen(tt.n); int64(got) != tt.want { |
| 723 | + t.Errorf("EncodedLen(%d): got %d, want %d", tt.n, got, tt.want) |
| 724 | + } |
| 725 | + } |
| 726 | +} |
| 727 | + |
| 728 | +func TestDecodedLen(t *testing.T) { |
| 729 | + var rawStdEncoding = StdEncoding.WithPadding(NoPadding) |
| 730 | + type test struct { |
| 731 | + enc *Encoding |
| 732 | + n int |
| 733 | + want int64 |
| 734 | + } |
| 735 | + tests := []test{ |
| 736 | + {StdEncoding, 0, 0}, |
| 737 | + {StdEncoding, 8, 5}, |
| 738 | + {StdEncoding, 16, 10}, |
| 739 | + {StdEncoding, 24, 15}, |
| 740 | + {rawStdEncoding, 0, 0}, |
| 741 | + {rawStdEncoding, 2, 1}, |
| 742 | + {rawStdEncoding, 4, 2}, |
| 743 | + {rawStdEncoding, 5, 3}, |
| 744 | + {rawStdEncoding, 7, 4}, |
| 745 | + {rawStdEncoding, 8, 5}, |
| 746 | + {rawStdEncoding, 10, 6}, |
| 747 | + {rawStdEncoding, 12, 7}, |
| 748 | + {rawStdEncoding, 16, 10}, |
| 749 | + {rawStdEncoding, 18, 11}, |
| 750 | + } |
| 751 | + // check overflow |
| 752 | + switch strconv.IntSize { |
| 753 | + case 32: |
| 754 | + tests = append(tests, test{rawStdEncoding, math.MaxInt/5 + 1, 268435456}) |
| 755 | + tests = append(tests, test{rawStdEncoding, math.MaxInt, 1342177279}) |
| 756 | + case 64: |
| 757 | + tests = append(tests, test{rawStdEncoding, math.MaxInt/5 + 1, 1152921504606846976}) |
| 758 | + tests = append(tests, test{rawStdEncoding, math.MaxInt, 5764607523034234879}) |
| 759 | + } |
| 760 | + for _, tt := range tests { |
| 761 | + if got := tt.enc.DecodedLen(tt.n); int64(got) != tt.want { |
| 762 | + t.Errorf("DecodedLen(%d): got %d, want %d", tt.n, got, tt.want) |
| 763 | + } |
728 | 764 | }
|
729 | 765 | }
|
730 | 766 |
|
|
0 commit comments