bitbucket.org/ai69/amoy@v0.2.3/sequence_test.go (about) 1 package amoy 2 3 import ( 4 "reflect" 5 "testing" 6 ) 7 8 func TestParseIntSequence(t *testing.T) { 9 type args struct { 10 s string 11 splitSep string 12 rangeSep string 13 } 14 tests := []struct { 15 name string 16 args args 17 want []int 18 wantErr bool 19 }{ 20 {name: "Empty", args: args{s: "", splitSep: ",", rangeSep: "-"}, want: nil, wantErr: true}, 21 {name: "Separator1", args: args{s: ",", splitSep: ",", rangeSep: "-"}, want: nil, wantErr: true}, 22 {name: "Separator1", args: args{s: "-", splitSep: ",", rangeSep: "-"}, want: nil, wantErr: true}, 23 {name: "No Separator1", args: args{s: "42", splitSep: "", rangeSep: "-"}, want: nil, wantErr: true}, 24 {name: "No Separator2", args: args{s: "42", splitSep: ",", rangeSep: ""}, want: nil, wantErr: true}, 25 {name: "Same Separators", args: args{s: "42", splitSep: "-", rangeSep: "-"}, want: nil, wantErr: true}, 26 {name: "Too Many Separators", args: args{s: "1-2-3", splitSep: "-", rangeSep: "-"}, want: nil, wantErr: true}, 27 {name: "Reversed Range", args: args{s: "5-3", splitSep: ",", rangeSep: "-"}, want: nil, wantErr: true}, 28 {name: "Invalid Number1", args: args{s: "1>5,9,10", splitSep: ",", rangeSep: "-"}, want: nil, wantErr: true}, 29 {name: "Invalid Number2", args: args{s: "1-5,9,a", splitSep: ",", rangeSep: "-"}, want: nil, wantErr: true}, 30 {name: "Invalid Number3", args: args{s: "a-5,9,10", splitSep: ",", rangeSep: "-"}, want: nil, wantErr: true}, 31 {name: "Invalid Number4", args: args{s: "1-b,9,10", splitSep: ",", rangeSep: "-"}, want: nil, wantErr: true}, 32 {name: "Only Parts", args: args{s: "1,2,3", splitSep: ",", rangeSep: "-"}, want: []int{1, 2, 3}, wantErr: false}, 33 {name: "Only Ranges", args: args{s: "1-5", splitSep: ",", rangeSep: "-"}, want: []int{1, 2, 3, 4, 5}, wantErr: false}, 34 {name: "Same Range", args: args{s: "5-5", splitSep: ",", rangeSep: "-"}, want: []int{5}, wantErr: false}, 35 {name: "Hybrid", args: args{s: "1-5,6,9", splitSep: ",", rangeSep: "-"}, want: []int{1, 2, 3, 4, 5, 6, 9}, wantErr: false}, 36 {name: "Order", args: args{s: "5,1-3,7", splitSep: ",", rangeSep: "-"}, want: []int{1, 2, 3, 5, 7}, wantErr: false}, 37 {name: "Overlap", args: args{s: "5,1-6,8,2-4", splitSep: ",", rangeSep: "-"}, want: []int{1, 2, 3, 4, 5, 6, 8}, wantErr: false}, 38 {name: "Large Numbers", args: args{s: "99-101,1024", splitSep: ",", rangeSep: "-"}, want: []int{99, 100, 101, 1024}, wantErr: false}, 39 {name: "Negative Numbers", args: args{s: "-99~-95,1024", splitSep: ",", rangeSep: "~"}, want: []int{-99, -98, -97, -96, -95, 1024}, wantErr: false}, 40 {name: "Large Sequence", args: args{s: "1-100", splitSep: ",", rangeSep: "-"}, want: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100}, wantErr: false}, 41 } 42 for _, tt := range tests { 43 t.Run(tt.name, func(t *testing.T) { 44 got, err := ParseIntSequence(tt.args.s, tt.args.splitSep, tt.args.rangeSep) 45 if (err != nil) != tt.wantErr { 46 t.Errorf("ParseIntSequence() error = %v, wantErr %v", err, tt.wantErr) 47 return 48 } 49 if !reflect.DeepEqual(got, tt.want) { 50 t.Errorf("ParseIntSequence() got = %v, want %v", got, tt.want) 51 } 52 }) 53 } 54 } 55 56 func TestDistinctInts(t *testing.T) { 57 tests := []struct { 58 name string 59 ori []int 60 want []int 61 }{ 62 {"Nil", nil, []int{}}, 63 {"Empty", []int{}, []int{}}, 64 {"One", []int{42}, []int{42}}, 65 {"Two1", []int{10, 100}, []int{10, 100}}, 66 {"Two2", []int{100, 10}, []int{100, 10}}, 67 {"Same", []int{100, 100}, []int{100}}, 68 {"Unique", []int{53, 11, 26}, []int{53, 11, 26}}, 69 {"Normal", []int{7, 0, 0, 1, 2, 1, 0, 3, 5, 1, 4, 4, 4, 0, 3}, []int{7, 0, 1, 2, 3, 5, 4}}, 70 } 71 for _, tt := range tests { 72 t.Run(tt.name, func(t *testing.T) { 73 if got := DistinctInts(tt.ori); !reflect.DeepEqual(got, tt.want) { 74 t.Errorf("DistinctInts(%v) = %v, want %v", tt.ori, got, tt.want) 75 } 76 }) 77 } 78 } 79 80 func TestMergeIntSequence(t *testing.T) { 81 tests := []struct { 82 name string 83 num []int 84 splitSep string 85 rangeSep string 86 want string 87 }{ 88 {"None", []int{}, ",", "-", ""}, 89 {"Single One", []int{1}, ",", "-", "1"}, 90 {"Duplicate Zero", []int{0, 0, 0, 0, 0, 0}, ",", "-", "0"}, 91 {"Duplicate One", []int{2, 2}, ",", "-", "2"}, 92 {"More Duplicate One", []int{3, 3, 3}, ",", "-", "3"}, 93 {"Separate Two", []int{1, 3}, ",", "-", "1,3"}, 94 {"Unordered & Duplicate Two", []int{5, 3, 5, 3, 5, 5}, ",", "-", "3,5"}, 95 {"Nearby Two", []int{4, 5, 4, 5}, ",", "-", "4-5"}, 96 {"Simple Sequence", []int{1, 2, 3, 4, 5}, ",", "-", "1-5"}, 97 {"Two Sequences", []int{1, 2, 3, 4, 5, 8, 9, 10}, ",", "-", "1-5,8-10"}, 98 {"Unordered Sequences", []int{5, 1, 2, 9, 10, 1, 1, 3, 4, 2, 5, 8, 9}, ",", "-", "1-5,8-10"}, 99 {"Mixed Sequences", []int{5, 1, 2, 9, 10, 1, 3, 4, 2, 5, 8, 9, 100, 102, 101, 80}, ",", "-", "1-5,8-10,80,100-102"}, 100 {"Large Sequence", []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100}, ",", "-", "1-100"}, 101 } 102 for _, tt := range tests { 103 t.Run(tt.name, func(t *testing.T) { 104 if got := MergeIntSequence(tt.num, tt.splitSep, tt.rangeSep); got != tt.want { 105 t.Errorf("MergeIntSequence(%v, %s, %s) = %q, want %q", tt.num, tt.splitSep, tt.rangeSep, got, tt.want) 106 } 107 }) 108 } 109 }