func createJSONScanners(scanner scanner.Scanner) []tokenscanner.TokenScanner { return []tokenscanner.TokenScanner{ tokenscanner.NewSingleCharacterScanner(token.KindBeginObject, scanner), tokenscanner.NewSingleCharacterScanner(token.KindEndObject, scanner), tokenscanner.NewSingleCharacterScanner(token.KindBeginArray, scanner), tokenscanner.NewSingleCharacterScanner(token.KindEndArray, scanner), tokenscanner.NewSingleCharacterScanner(token.KindSeparator, scanner), tokenscanner.NewSingleCharacterScanner(token.KindComma, scanner), tokenscanner.NewMultiCharacterScanner(token.KindTrue, scanner), tokenscanner.NewMultiCharacterScanner(token.KindFalse, scanner), tokenscanner.NewMultiCharacterScanner(token.KindNull, scanner), tokenscanner.NewStringScanner(scanner), tokenscanner.NewNumberScanner(scanner), } }
func TestNumber1(t *testing.T) { testData := ` -2.8e-10 ` reader := strings.NewReader(testData) jsonScanner := scanner.NewJSONScanner(reader) scanner := tokenscanner.NewNumberScanner(jsonScanner) if !scanner.CanProcess() { t.Error("token can't process") } scannedToken, err := scanner.Scan() if err != nil { t.Error(err) } if scannedToken.Kind != token.KindNumber { t.Error("token must be number") } if scannedToken.Value != "-2.8e-10" { t.Errorf("token value is wrong: %#v", scannedToken.Value) } }
func TestTokenizer1(t *testing.T) { testData := ` { "key": [ { "inner1": "stringValue", "inner2": true, "inner3": false, "inner4": null, "inner5": { "nested": -2.5e-3 } } ] } ` reader := strings.NewReader(testData) jsonScanner := scanner.NewJSONScanner(reader) scanners := []tokenscanner.TokenScanner{ tokenscanner.NewSingleCharacterScanner(token.KindBeginObject, jsonScanner), tokenscanner.NewSingleCharacterScanner(token.KindEndObject, jsonScanner), tokenscanner.NewSingleCharacterScanner(token.KindBeginArray, jsonScanner), tokenscanner.NewSingleCharacterScanner(token.KindEndArray, jsonScanner), tokenscanner.NewSingleCharacterScanner(token.KindSeparator, jsonScanner), tokenscanner.NewSingleCharacterScanner(token.KindComma, jsonScanner), tokenscanner.NewMultiCharacterScanner(token.KindTrue, jsonScanner), tokenscanner.NewMultiCharacterScanner(token.KindFalse, jsonScanner), tokenscanner.NewMultiCharacterScanner(token.KindNull, jsonScanner), tokenscanner.NewStringScanner(jsonScanner), tokenscanner.NewNumberScanner(jsonScanner), } expectedTokens := []token.Token{ token.NewToken(token.KindBeginObject, string(token.KindBeginObject)), token.NewToken(token.KindString, "key"), token.NewToken(token.KindSeparator, string(token.KindSeparator)), token.NewToken(token.KindBeginArray, string(token.KindBeginArray)), token.NewToken(token.KindBeginObject, string(token.KindBeginObject)), token.NewToken(token.KindString, "inner1"), token.NewToken(token.KindSeparator, string(token.KindSeparator)), token.NewToken(token.KindString, "stringValue"), token.NewToken(token.KindComma, string(token.KindComma)), token.NewToken(token.KindString, "inner2"), token.NewToken(token.KindSeparator, string(token.KindSeparator)), token.NewToken(token.KindTrue, string(token.KindTrue)), token.NewToken(token.KindComma, string(token.KindComma)), token.NewToken(token.KindString, "inner3"), token.NewToken(token.KindSeparator, string(token.KindSeparator)), token.NewToken(token.KindFalse, string(token.KindFalse)), token.NewToken(token.KindComma, string(token.KindComma)), token.NewToken(token.KindString, "inner4"), token.NewToken(token.KindSeparator, string(token.KindSeparator)), token.NewToken(token.KindNull, string(token.KindNull)), token.NewToken(token.KindComma, string(token.KindComma)), token.NewToken(token.KindString, "inner5"), token.NewToken(token.KindSeparator, string(token.KindSeparator)), token.NewToken(token.KindBeginObject, string(token.KindBeginObject)), token.NewToken(token.KindString, "nested"), token.NewToken(token.KindSeparator, string(token.KindSeparator)), token.NewToken(token.KindNumber, "-2.5e-3"), token.NewToken(token.KindEndObject, string(token.KindEndObject)), token.NewToken(token.KindEndObject, string(token.KindEndObject)), token.NewToken(token.KindEndArray, string(token.KindEndArray)), token.NewToken(token.KindEndObject, string(token.KindEndObject)), } for { if _, err := jsonScanner.PeekNonWhiteSpaceRune(); err == io.EOF { break } for expectedIndex, expected := range expectedTokens { for scannerIndex, scanner := range scanners { if scanner.CanProcess() { actual, err := scanner.Scan() if err != nil { t.Logf("scanners[%d]: ", scannerIndex) t.Error(err) } if !expected.IsEqualTo(actual) { t.Errorf("expected[%d] = %#v, actual = %#v\n", expectedIndex, expected, actual) } break } } } } }