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  }