github.com/jmigpin/editor@v1.6.0/util/iout/iorw/all_test.go (about) 1 package iorw 2 3 import ( 4 "bytes" 5 "context" 6 "testing" 7 "unicode" 8 ) 9 10 func TestRW1(t *testing.T) { 11 s := "0123" 12 rw := NewBytesReadWriterAt([]byte(s)) 13 type ow struct { 14 i int 15 l int 16 s string 17 e string // expected 18 } 19 20 var tests = []*ow{ 21 {1, 0, "ab", "0ab123"}, 22 {5, 0, "ab", "0ab12ab3"}, 23 {1, 2, "", "012ab3"}, 24 {3, 2, "", "0123"}, 25 {1, 0, "ab", "0ab123"}, 26 {0, 6, "abcde", "abcde"}, 27 {0, 5, "abc", "abc"}, 28 {0, 1, "abcd", "abcdbc"}, 29 {3, 2, "000", "abc000c"}, 30 {7, 0, "f", "abc000cf"}, 31 } 32 33 for _, w := range tests { 34 if err := rw.OverwriteAt(w.i, w.l, []byte(w.s)); err != nil { 35 t.Fatal(err) 36 } 37 if !bytes.Equal(rw.buf, []byte(w.e)) { 38 t.Fatal(string(rw.buf) + " != " + w.e) 39 } 40 } 41 } 42 43 //---------- 44 45 func TestIndex1(t *testing.T) { 46 s := "" 47 for i := 0; i < 10; i++ { 48 s += "0123456789" 49 } 50 s += "abc" 51 52 rw := NewStringReaderAt(s) 53 54 i, _, err := indexCtx2(context.Background(), rw, 0, []byte("abc"), 4, &IndexOpt{IgnoreCase: true}) 55 if err != nil { 56 t.Fatal(err) 57 } 58 if i < 0 { 59 t.Fatal("not found") 60 } 61 t.Log(i) 62 } 63 64 func TestIndex2(t *testing.T) { 65 s := "0123456789" 66 rw := NewStringReaderAt(s) 67 i, _, err := indexCtx2(context.Background(), rw, 0, []byte("345"), 4, &IndexOpt{IgnoreCase: true}) 68 if err != nil { 69 t.Fatal(err) 70 } 71 if i < 0 { 72 t.Fatal("not found") 73 } 74 } 75 76 func TestLastIndex1(t *testing.T) { 77 s := "-abc" 78 for i := 0; i < 10; i++ { 79 s += "0123456789" 80 } 81 s += "" 82 83 rw := NewStringReaderAt(s) 84 85 i, _, err := lastIndexCtx2(context.Background(), rw, rw.Max(), []byte("abc"), 4, &IndexOpt{IgnoreCase: true}) 86 if err != nil { 87 t.Fatal(err) 88 } 89 if i < 0 { 90 t.Fatal("not found") 91 } 92 t.Log(i) 93 } 94 95 func TestLastIndex2(t *testing.T) { 96 s := "-abc----------abc----------" 97 98 rw := NewStringReaderAt(s) 99 100 i, _, err := lastIndexCtx2(context.Background(), rw, rw.Max(), []byte("abc"), 4, &IndexOpt{IgnoreCase: true}) 101 if err != nil { 102 t.Fatal(err) 103 } 104 if i != 14 { 105 t.Fatal(i) 106 } 107 108 i, _, err = lastIndexCtx2(context.Background(), rw, i, []byte("abc"), 4, &IndexOpt{IgnoreCase: true}) 109 if err != nil { 110 t.Fatal(err) 111 } 112 if i != 1 { 113 t.Fatal(i) 114 } 115 } 116 117 func TestIndexDiacritics1(t *testing.T) { 118 s := "-ìùù-aaáéb--" 119 rw := NewStringReaderAt(s) 120 i, _, err := indexCtx2(context.Background(), rw, 0, []byte("aae"), -1, &IndexOpt{IgnoreCase: true, IgnoreDiacritics: true}) 121 if err != nil { 122 t.Fatal(err) 123 } 124 if i < 0 { 125 t.Fatal("not found") 126 } 127 t.Log(i) 128 } 129 130 func TestIndexDiacritics2(t *testing.T) { 131 s := "úúú-aáé--" 132 rw := NewStringReaderAt(s) 133 i, n, err := indexCtx2(context.Background(), rw, 0, []byte("aae"), -1, &IndexOpt{IgnoreCase: true, IgnoreDiacritics: true}) 134 if err != nil { 135 t.Fatal(err) 136 } 137 if i < 0 { 138 t.Fatal("not found") 139 } 140 if i != 7 { 141 t.Fatal(i) 142 } 143 if n != 5 { 144 t.Fatal(n) 145 } 146 } 147 148 func TestIndexDiacritics3(t *testing.T) { 149 s := "úúú-aáé--ú" 150 rw := NewStringReaderAt(s) 151 i, n, err := lastIndexCtx2(context.Background(), rw, rw.Max(), []byte("aae"), -1, &IndexOpt{IgnoreCase: true, IgnoreDiacritics: true}) 152 if err != nil { 153 t.Fatal(err) 154 } 155 if i < 0 { 156 t.Fatal("not found") 157 } 158 if i != 7 { 159 t.Fatal(i) 160 } 161 if n != 5 { 162 t.Fatal(n) 163 } 164 } 165 166 func TestIndexDiacritics4(t *testing.T) { 167 s := "úúú-aáé--ú" 168 rw := NewStringReaderAt(s) 169 i, n, err := indexCtx2(context.Background(), rw, 0, []byte("aae"), -1, &IndexOpt{IgnoreCase: true, IgnoreDiacritics: true}) 170 if err != nil { 171 t.Fatal(err) 172 } 173 if i < 0 { 174 t.Fatal("not found") 175 } 176 if i != 7 { 177 t.Fatal(i) 178 } 179 if n != 5 { 180 t.Fatal(n) 181 } 182 } 183 184 func TestIndexDiacritics5(t *testing.T) { 185 s := "úúú-aÁé--ú" 186 rw := NewStringReaderAt(s) 187 i, n, err := indexCtx2(context.Background(), rw, 0, []byte("aáé"), -1, &IndexOpt{IgnoreCase: true, IgnoreCaseDiacritics: true}) 188 if err != nil { 189 t.Fatal(err) 190 } 191 if i < 0 { 192 t.Fatal("not found") 193 } 194 if i != 7 { 195 t.Fatal(i) 196 } 197 if n != 5 { 198 t.Fatal(n) 199 } 200 } 201 202 func TestPrepareForCompare(t *testing.T) { 203 fn1 := prepareForCompareFn(&IndexOpt{IgnoreCase: true, IgnoreDiacritics: true}) 204 s1 := "ááBC" 205 p, _, err := fn1([]byte(s1)) 206 if err != nil { 207 t.Fatal(err) 208 } 209 s2 := string(p) 210 if s2 != "aabc" { 211 t.Fatal(s2) 212 } 213 } 214 215 //---------- 216 217 func BenchmarkPrepareForCompare(b *testing.B) { 218 pfcFn := prepareForCompareFn(&IndexOpt{IgnoreCase: true, IgnoreDiacritics: true}) 219 benchmarkPrepareForCompare2(b, pfcFn) 220 } 221 func benchmarkPrepareForCompare2(b *testing.B, pfcFn pfcType) { 222 s3 := "Áńkúabc" 223 for i := 0; i < 15; i++ { 224 s3 += s3 225 } 226 b.ResetTimer() 227 for k := 0; k < b.N; k++ { 228 p, _, err := pfcFn([]byte(s3)) 229 if err != nil { 230 b.Fatal(err) 231 } 232 _ = p 233 } 234 } 235 236 //---------- 237 238 func TestRuneLastIndex1(t *testing.T) { 239 s := "a\n0123\nb" 240 rw := NewStringReaderAt(s) 241 242 fn := func(ru rune) bool { 243 return ru == '\n' 244 } 245 246 i, _, err := RuneLastIndexFn(rw, 6, true, fn) 247 if err != nil { 248 t.Fatal(err) 249 } 250 if i != 1 { 251 t.Fatal(i) 252 } 253 } 254 255 func TestExpandIndex1(t *testing.T) { 256 s := "a 234 b" 257 rw := NewStringReaderAt(s) 258 i := ExpandRuneIndexFn(rw, 3, true, unicode.IsSpace) 259 if i != 5 { 260 t.Fatal(i) 261 } 262 i = ExpandRuneIndexFn(rw, i+1, true, unicode.IsSpace) 263 if i != 7 { 264 t.Fatal(i) 265 } 266 } 267 268 func TestExpandLastIndex1(t *testing.T) { 269 s := "a 234 b" 270 rw := NewStringReaderAt(s) 271 i := ExpandRuneLastIndexFn(rw, 3, true, unicode.IsSpace) 272 if i != 2 { 273 t.Fatal(i) 274 } 275 // repeat from same position 276 i = ExpandRuneLastIndexFn(rw, i, true, unicode.IsSpace) 277 if i != 2 { 278 t.Fatal(i) 279 } 280 281 i = ExpandRuneLastIndexFn(rw, i-1, true, unicode.IsSpace) 282 if i != 0 { 283 t.Fatal(i) 284 } 285 } 286 287 //---------- 288 289 func TestWordAtIndex(t *testing.T) { 290 s := "abc f" 291 rw := NewStringReaderAt(s) 292 w, i, err := WordAtIndex(rw, 3) 293 if err == nil { 294 t.Fatalf("%v %v %v", w, i, err) 295 } 296 } 297 298 //---------- 299 300 func TestLineStartIndex(t *testing.T) { 301 s := "0123456789" 302 rw := NewStringReaderAt(s) 303 rw2 := NewLimitedReaderAt(rw, 3, 5) 304 v, err := LineStartIndex(rw2, 4) 305 if err != nil { 306 t.Fatal(err) 307 } 308 if v != 3 { 309 t.Fatal(err) 310 } 311 } 312 313 func TestLineEndIndex(t *testing.T) { 314 s := "0123456789" 315 rw := NewStringReaderAt(s) 316 rw2 := NewLimitedReaderAt(rw, 3, 5) 317 v, newLine, err := LineEndIndex(rw2, 4) 318 if err != nil { 319 t.Fatal(err) 320 } 321 if !(v == 5 && newLine == false) { 322 t.Fatal(v, newLine) 323 } 324 }