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 //}