github.com/jmigpin/editor@v1.6.0/util/parseutil/scanner_test.go (about)

     1  package parseutil
     2  
     3  import (
     4  	"testing"
     5  )
     6  
     7  func TestScan1(t *testing.T) {
     8  	s := "aa\nbbb"
     9  	sc := newTestScanner(s)
    10  	if sc.M.Sequence("aa") != nil {
    11  		t.Fatal()
    12  	}
    13  	sc.M.ToNLExcludeOrEnd(0)
    14  	if sc.Pos != 2 {
    15  		t.Fatal(sc.Pos)
    16  	}
    17  	sc.M.NRunes(1)
    18  	sc.M.ToNLIncludeOrEnd(0)
    19  	if sc.Pos != len(s) {
    20  		t.Fatal()
    21  	}
    22  }
    23  
    24  func TestScan2(t *testing.T) {
    25  	s := "file:aaab"
    26  	sc := newTestScanner(s)
    27  
    28  	// normal direction
    29  	if sc.M.Sequence("file") != nil {
    30  		t.Fatal()
    31  	}
    32  	if sc.Pos != 4 {
    33  		t.Fatal(sc.Pos)
    34  	}
    35  	if sc.M.Sequence(":aaa") != nil {
    36  		t.Fatal(sc.Pos)
    37  	}
    38  
    39  	// revert direction
    40  	sc.Reverse = true
    41  	if sc.M.Sequence(":aaa") != nil {
    42  		t.Fatal(sc.Pos)
    43  	}
    44  	if sc.M.Sequence("file") != nil {
    45  		t.Fatal()
    46  	}
    47  	if sc.Pos != 0 {
    48  		t.Fatal(sc.Pos)
    49  	}
    50  }
    51  
    52  func TestScanQuote1(t *testing.T) {
    53  	s := `"aa\""bbb`
    54  	es := `"aa\""`
    55  
    56  	sc := newTestScanner(s)
    57  
    58  	pos0 := sc.KeepPos()
    59  	if sc.M.QuotedString() != nil {
    60  		t.Fatal()
    61  	}
    62  	s2 := string(pos0.Bytes())
    63  	if s2 != es {
    64  		t.Fatalf("%v != %v", s, s2)
    65  	}
    66  }
    67  
    68  func TestScanQuote2(t *testing.T) {
    69  	s := `"aa`
    70  	sc := newTestScanner(s)
    71  	if sc.M.QuotedString() == nil {
    72  		t.Fatal()
    73  	}
    74  	if sc.Pos != 0 {
    75  		t.Fatal(sc.Pos)
    76  	}
    77  }
    78  
    79  func TestEscape1(t *testing.T) {
    80  	s := `a\`
    81  	sc := newTestScanner(s)
    82  	sc.Pos = 1
    83  	if sc.M.EscapeAny('\\') == nil || sc.Pos != 1 {
    84  		t.Fatal(sc.Pos)
    85  	}
    86  }
    87  func TestEscape2(t *testing.T) {
    88  	s := `a\\\\ `
    89  	sc := newTestScanner(s)
    90  	sc.Reverse = true
    91  	sc.Pos = len(s)
    92  	if sc.M.EscapeAny('\\') != nil || sc.Pos != 4 {
    93  		t.Fatal(sc.Pos)
    94  	}
    95  }
    96  func TestEscape3(t *testing.T) {
    97  	s := `a\\\ `
    98  	sc := newTestScanner(s)
    99  	sc.Reverse = true
   100  	sc.Pos = len(s)
   101  	if sc.M.EscapeAny('\\') != nil || sc.Pos != 3 {
   102  		t.Fatal(sc.Pos)
   103  	}
   104  }
   105  func TestEscape4(t *testing.T) {
   106  	s := `\\\ `
   107  	sc := newTestScanner(s)
   108  	sc.Reverse = true
   109  	sc.Pos = len(s)
   110  	if sc.M.EscapeAny('\\') != nil || sc.Pos != 2 {
   111  		t.Fatal(sc.Pos)
   112  	}
   113  }
   114  
   115  func TestInt1(t *testing.T) {
   116  	s := `123a`
   117  	sc := newTestScanner(s)
   118  	pos0 := sc.KeepPos()
   119  	if sc.M.Digits() != nil || string(pos0.Bytes()) != "123" {
   120  		t.Fatal()
   121  	}
   122  }
   123  func TestInt2(t *testing.T) {
   124  	s := `-123`
   125  	sc := newTestScanner(s)
   126  	sc.Reverse = true
   127  	sc.Pos = len(s)
   128  	pos0 := sc.KeepPos()
   129  	if sc.M.Integer() != nil {
   130  		t.Fatal()
   131  	}
   132  	res := string(pos0.Bytes())
   133  	if res != "-123" {
   134  		t.Fatal(res)
   135  	}
   136  }
   137  
   138  func TestFloat1(t *testing.T) {
   139  	s := `.23`
   140  	sc := newTestScanner(s)
   141  	pos0 := sc.KeepPos()
   142  	if sc.M.Float() != nil {
   143  		t.Fatal()
   144  	}
   145  	res := string(pos0.Bytes())
   146  	if res != ".23" {
   147  		t.Fatal(res)
   148  	}
   149  }
   150  
   151  //func TestFloat2(t *testing.T) {
   152  //	s := `.23E`
   153  //	sc := newTestScanner(s)
   154  
   155  //	if sc.M.Float() != nil {
   156  //		t.Fatal()
   157  //	}
   158  //	res := node.(float64)
   159  //	if res != 0.23 {
   160  //		t.Fatal(res)
   161  //	}
   162  //}
   163  //func TestFloat3(t *testing.T) {
   164  //	s := `.23E+1`
   165  //	sc := newTestScanner(s)
   166  
   167  //	node, err := sc.Result(sc.Float64NodeF(sc.Float))
   168  //	if err != nil {
   169  //		t.Fatal(err)
   170  //	}
   171  //	res := node.(float64)
   172  //	if res != 2.3 {
   173  //		t.Fatal(res)
   174  //	}
   175  //}
   176  //func TestFloat4(t *testing.T) {
   177  //	s := `00.23`
   178  //	sc := newTestScanner(s)
   179  
   180  //	_, err := sc.Result(sc.Float64NodeF(sc.Float))
   181  //	if err == nil {
   182  //		t.Fatal(err)
   183  //	}
   184  //}
   185  //func TestFloat5(t *testing.T) {
   186  //	s := `12.23`
   187  //	sc := newTestScanner(s)
   188  
   189  //	node, err := sc.Result(sc.Float64NodeF(sc.Float))
   190  //	if err != nil {
   191  //		t.Fatal(err)
   192  //	}
   193  //	res := node.(float64)
   194  //	if res != 12.23 {
   195  //		t.Fatal(res)
   196  //	}
   197  //}
   198  
   199  func TestSequenceExpand(t *testing.T) {
   200  	s := `some string with a space`
   201  	sc := newTestScanner(s)
   202  	sc.Pos = 10
   203  
   204  	if sc.M.RuneSequenceMid([]rune(s)) != nil || sc.Pos != len(s) {
   205  		t.Fatal(sc.Pos)
   206  	}
   207  
   208  	sc.Pos = 10
   209  	sc.Reverse = true
   210  	if sc.M.RuneSequenceMid([]rune(s)) != nil || sc.Pos != 0 {
   211  		t.Fatal(sc.Pos)
   212  	}
   213  
   214  	sc.Pos = 10
   215  	sc.Reverse = true
   216  	if sc.M.RuneSequenceMid([]rune("gaa")) == nil || sc.Pos != 10 {
   217  		t.Fatal(sc.Pos)
   218  	}
   219  }
   220  
   221  //----------
   222  
   223  //func TestParse1(t *testing.T) {
   224  //	s := `0123456789`
   225  //	sc := newTestScanner(s)
   226  //	fn := sc.StringNodeF(sc.AndF(
   227  //		sc.RuneF('0'),
   228  //		sc.OrF(
   229  //			sc.AndF(
   230  //				sc.RuneF('1'),
   231  //				sc.RuneF('3'),
   232  //			),
   233  //			sc.AndF(
   234  //				sc.RuneF('1'),
   235  //				sc.RuneF('2'),
   236  //			),
   237  //		),
   238  //	))
   239  //	node, err := sc.Result(fn)
   240  //	if err != nil {
   241  //		t.Fatal(err)
   242  //	}
   243  //	res := fmt.Sprintf("%v", node)
   244  //	if res != "012" {
   245  //		t.Fatal(node)
   246  //	}
   247  //}
   248  
   249  //----------
   250  
   251  func newTestScanner(s string) *Scanner {
   252  	sc := NewScanner()
   253  	sc.SetSrc([]byte(s))
   254  	return sc
   255  }
   256  
   257  //----------
   258  //----------
   259  //----------
   260  
   261  //func BenchmarkScan1(b *testing.B) {
   262  //	// usefull for cache tests if implemented
   263  
   264  //	s := "0123456789"
   265  //	for i := 0; i < 7; i++ {
   266  //		s += s
   267  //	}
   268  
   269  //	sc := newTestScanner(s)
   270  
   271  //	fn := sc.LoopF(
   272  //		sc.OrF(
   273  //			sc.RuneF('0'),
   274  //			sc.RuneF('1'),
   275  //			sc.RuneF('2'),
   276  //			sc.RuneF('4'),
   277  //			sc.RuneF('5'),
   278  //			sc.RuneF('6'),
   279  //			sc.RuneF('7'),
   280  //			sc.RuneF('8'),
   281  //			sc.RuneF('9'),
   282  //			sc.RuneF('a'),
   283  //			sc.RuneF('b'),
   284  //			sc.RuneF('c'),
   285  //			sc.RuneF('d'),
   286  //			sc.RuneF('e'),
   287  //			sc.NRunesF(1),
   288  //		),
   289  //	)
   290  
   291  //	b.ResetTimer()
   292  //	for i := 0; i < b.N; i++ {
   293  //		sc.Reset()
   294  //		_, err := sc.Result(fn)
   295  //		if err != nil {
   296  //			b.Fatal(err, sc.Pos, len(s))
   297  //		}
   298  //		if sc.Pos != len(s) {
   299  //			b.Fatal("not at end", sc.Pos, len(s))
   300  //		}
   301  //	}
   302  //}