bitbucket.org/ai69/amoy@v0.2.3/line_test.go (about) 1 package amoy 2 3 import ( 4 "reflect" 5 "strings" 6 "testing" 7 ) 8 9 func TestExtractTopLines(t *testing.T) { 10 tests := []struct { 11 name string 12 s string 13 n int 14 want []string 15 wantErr bool 16 }{ 17 {"Non-positive N", "Hello", 0, nil, true}, 18 {"Empty string", "", 1, []string{}, false}, 19 {"One line", "Hello", 1, []string{"Hello"}, false}, 20 {"One line and newline", "Hello\n", 2, []string{"Hello"}, false}, 21 {"Two lines", "Hello\nWorld", 2, []string{"Hello", "World"}, false}, 22 {"Two lines and newline", "Hello\nWorld\n", 2, []string{"Hello", "World"}, false}, 23 {"Three lines with newline", "Hello\n\nWorld\n", 3, []string{"Hello", "", "World"}, false}, 24 {"All newlines", "\n\n\n", 1, []string{""}, false}, 25 {"21 lines 1", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", 1, []string{"a"}, false}, 26 {"21 lines 2", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", 2, []string{"a", "b"}, false}, 27 {"21 lines 3", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", 3, []string{"a", "b", "c"}, false}, 28 {"21 lines 4", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", 4, []string{"a", "b", "c", "d"}, false}, 29 {"21 lines 10", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", 10, []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"}, false}, 30 {"21 lines 20", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", 20, []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t"}, false}, 31 {"21 lines 21", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", 21, []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u"}, false}, 32 {"21 lines 22", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", 22, []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u"}, false}, 33 } 34 for _, tt := range tests { 35 t.Run(tt.name, func(t *testing.T) { 36 got, err := ExtractTopLines(strings.NewReader(tt.s), tt.n) 37 if (err != nil) != tt.wantErr { 38 t.Errorf("ExtractTopLines() error = %v, wantErr %v", err, tt.wantErr) 39 return 40 } 41 if !reflect.DeepEqual(got, tt.want) { 42 t.Errorf("ExtractTopLines() got = %v, want %v", got, tt.want) 43 } 44 }) 45 } 46 } 47 48 func TestExtractFirstLine(t *testing.T) { 49 tests := []struct { 50 name string 51 s string 52 want string 53 wantErr bool 54 }{ 55 {"Empty string", "", "", false}, 56 {"One line", "Hello", "Hello", false}, 57 {"One line and newline", "Hello\n", "Hello", false}, 58 {"Two lines", "Hello\nWorld", "Hello", false}, 59 {"Two lines and newline", "Hello\nWorld\n", "Hello", false}, 60 {"Three lines with newline", "Hello\n\nWorld\n", "Hello", false}, 61 {"All newlines", "\n\n\n", "", false}, 62 {"21 lines", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", "a", false}, 63 } 64 for _, tt := range tests { 65 t.Run(tt.name, func(t *testing.T) { 66 got, err := ExtractFirstLine(strings.NewReader(tt.s)) 67 if (err != nil) != tt.wantErr { 68 t.Errorf("ExtractFirstLine() error = %v, wantErr %v", err, tt.wantErr) 69 return 70 } 71 if !reflect.DeepEqual(got, tt.want) { 72 t.Errorf("ExtractFirstLine() got = %v, want %v", got, tt.want) 73 } 74 }) 75 } 76 } 77 78 func TestExtractBottomLines(t *testing.T) { 79 tests := []struct { 80 name string 81 s string 82 n int 83 want []string 84 wantErr bool 85 }{ 86 {"Non-positive N", "Hello", 0, nil, true}, 87 {"Empty string", "", 1, []string{}, false}, 88 {"One line", "Hello", 1, []string{"Hello"}, false}, 89 {"One line and newline", "Hello\n", 2, []string{"Hello"}, false}, 90 {"Two lines 2", "Hello\nWorld", 2, []string{"Hello", "World"}, false}, 91 {"Two lines 1", "Hello\nWorld", 1, []string{"World"}, false}, 92 {"Two lines and newline", "Hello\nWorld\n", 2, []string{"Hello", "World"}, false}, 93 {"Three lines with newline", "Hello\n\nWorld\n", 2, []string{"", "World"}, false}, 94 {"All newlines", "\n\n\n", 1, []string{""}, false}, 95 {"21 lines 1", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", 1, []string{"u"}, false}, 96 {"21 lines 2", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", 2, []string{"t", "u"}, false}, 97 {"21 lines 3", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", 3, []string{"s", "t", "u"}, false}, 98 {"21 lines 4", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", 4, []string{"r", "s", "t", "u"}, false}, 99 {"21 lines 10", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", 10, []string{"l", "m", "n", "o", "p", "q", "r", "s", "t", "u"}, false}, 100 {"21 lines 20", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", 20, []string{"b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u"}, false}, 101 {"21 lines 21", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", 21, []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u"}, false}, 102 {"21 lines 22", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", 22, []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u"}, false}, 103 } 104 for _, tt := range tests { 105 t.Run(tt.name, func(t *testing.T) { 106 got, err := ExtractBottomLines(strings.NewReader(tt.s), tt.n) 107 if (err != nil) != tt.wantErr { 108 t.Errorf("ExtractBottomLines() error = %v, wantErr %v", err, tt.wantErr) 109 return 110 } 111 if !reflect.DeepEqual(got, tt.want) { 112 t.Errorf("ExtractBottomLines() got = %v, want %v", got, tt.want) 113 } 114 }) 115 } 116 } 117 118 func TestExtractLastLine(t *testing.T) { 119 tests := []struct { 120 name string 121 s string 122 want string 123 wantErr bool 124 }{ 125 {"Empty string", "", "", false}, 126 {"One line", "Hello", "Hello", false}, 127 {"One line and newline", "Hello\n", "Hello", false}, 128 {"Two lines", "Hello\nWorld", "World", false}, 129 {"Two lines and newline", "Hello\nWorld\n", "World", false}, 130 {"Three lines with newline", "Hello\n\nWorld\n", "World", false}, 131 {"All newlines", "\n\n\n", "", false}, 132 {"21 lines", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", "u", false}, 133 } 134 for _, tt := range tests { 135 t.Run(tt.name, func(t *testing.T) { 136 got, err := ExtractLastLine(strings.NewReader(tt.s)) 137 if (err != nil) != tt.wantErr { 138 t.Errorf("ExtractLastLine() error = %v, wantErr %v", err, tt.wantErr) 139 return 140 } 141 if !reflect.DeepEqual(got, tt.want) { 142 t.Errorf("ExtractLastLine() got = %v, want %v", got, tt.want) 143 } 144 }) 145 } 146 }