103 lines
2.8 KiB
Go
103 lines
2.8 KiB
Go
package tokenize_test
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
|
|
tokenize "git.makaay.nl/mauricem/go-parsekit/tokenize"
|
|
)
|
|
|
|
func TestSyntacticSugar(t *testing.T) {
|
|
var a = tokenize.A
|
|
AssertHandlers(t, []HandlerT{
|
|
{"aaaaaa", a.Rune('a').Times(4), true, "aaaa"},
|
|
{"ababab", a.Rune('a').Or(a.Rune('b')).Times(4), true, "abab"},
|
|
{"ababab", a.Rune('a').Then(a.Rune('b')), true, "ab"},
|
|
{"bababa", a.Rune('a').Then(a.Rune('b')), false, ""},
|
|
{"cccccc", a.Rune('c').Optional(), true, "c"},
|
|
{"dddddd", a.Rune('c').Optional(), true, ""},
|
|
{"a,b,c,d", a.ASCII.SeparatedBy(a.Comma), true, "a,b,c,d"},
|
|
{"a, b, c, d", a.ASCII.SeparatedBy(a.Comma.Then(a.Space)), true, "a, b, c, d"},
|
|
{"a, b,c,d", a.ASCII.SeparatedBy(a.Comma.Then(a.Space.Optional())), true, "a, b,c,d"},
|
|
{"a, b, c, d", a.ASCII.SeparatedBy(a.Space.Optional().Then(a.Comma.Then(a.Space.Optional()))), true, "a, b, c, d"},
|
|
{"a,b ,c, d|", a.ASCII.SeparatedBy(a.Space.Optional().Then(a.Comma).Then(a.Space.Optional())), true, "a,b ,c, d"},
|
|
})
|
|
}
|
|
|
|
func ExampleHandler_Times() {
|
|
c, a := tokenize.C, tokenize.A
|
|
phoneNumber := c.Seq(a.Rune('0'), a.Digit.Times(9))
|
|
|
|
fmt.Println(phoneNumber.Match("0201234567"))
|
|
// Output:
|
|
// 0201234567 <nil>
|
|
}
|
|
|
|
func ExampleHandler_Then() {
|
|
c, a := tokenize.C, tokenize.A
|
|
phoneNumber := a.Rune('0').Then(c.Repeated(9, a.Digit))
|
|
|
|
fmt.Println(phoneNumber.Match("0208888888"))
|
|
// Output:
|
|
// 0208888888 <nil>
|
|
}
|
|
|
|
func ExampleHandler_Or() {
|
|
c, a := tokenize.C, tokenize.A
|
|
phoneNumber := c.Seq(a.Str("00").Or(a.Plus), a.Str("31"), a.DigitNotZero, c.Repeated(8, a.Digit))
|
|
|
|
fmt.Println(phoneNumber.Match("+31209876543"))
|
|
fmt.Println(phoneNumber.Match("0031209876543"))
|
|
fmt.Println(phoneNumber.Match("0031020991234"))
|
|
fmt.Println(phoneNumber.Match("0031201234"))
|
|
// Output:
|
|
// +31209876543 <nil>
|
|
// 0031209876543 <nil>
|
|
// <nil> mismatch at start of file
|
|
// <nil> mismatch at start of file
|
|
}
|
|
|
|
func ExampleHandler_SeparatedBy() {
|
|
a, t := tokenize.A, tokenize.T
|
|
csv := t.Int("number", a.Digits).SeparatedBy(a.Comma)
|
|
|
|
r, _ := csv.Match("123,456,7,8,9")
|
|
tokens := r.Tokens()
|
|
for i, token := range tokens {
|
|
fmt.Printf("[%d] %v\n", i, token)
|
|
}
|
|
// Output:
|
|
// [0] number((int)123)
|
|
// [1] number((int)456)
|
|
// [2] number((int)7)
|
|
// [3] number((int)8)
|
|
// [4] number((int)9)
|
|
}
|
|
|
|
func ExampleHandler_Optional() {
|
|
c, a := tokenize.C, tokenize.A
|
|
|
|
spanish := c.Seq(
|
|
a.Rune('¿').Optional(),
|
|
c.OneOrMore(a.AnyRune.Except(a.Question)),
|
|
a.Rune('?').Optional())
|
|
|
|
fmt.Println(spanish.Match("¿Habla español María?"))
|
|
fmt.Println(spanish.Match("Sí, María habla español."))
|
|
// Output:
|
|
// ¿Habla español María? <nil>
|
|
// Sí, María habla español. <nil>
|
|
}
|
|
|
|
func ExampleHandler_Match() {
|
|
r, err := tokenize.A.IPv4.Match("001.002.003.004")
|
|
fmt.Println(r, err)
|
|
|
|
r, err = tokenize.A.IPv4.Match("1.2.3")
|
|
fmt.Println(r, err)
|
|
|
|
// Output:
|
|
// 1.2.3.4 <nil>
|
|
// <nil> mismatch at start of file
|
|
}
|