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  }