pqarrays

Paddy 2015-04-19 Child:ce9c92fc81ab

0:bfe2a4af6bdf Go to Latest

pqarrays/parser_test.go

First pass implementation. Use a lexer to generate tokens out of the Array type responses that PostgreSQL will send. Write a parser for string[] array types. Create a StringArray type that fulfills the driver.Valuer and sql.Scanner interfaces using the parser and lexer.

History
paddy@0 1 package pqarrays
paddy@0 2
paddy@0 3 import (
paddy@0 4 "testing"
paddy@0 5 )
paddy@0 6
paddy@0 7 func strPtr(in string) *string {
paddy@0 8 return &in
paddy@0 9 }
paddy@0 10
paddy@0 11 var parseTestInputs = map[string][]*string{
paddy@0 12 `{lions}`: []*string{strPtr("lions")},
paddy@0 13 `{lions,tigers}`: []*string{strPtr("lions"), strPtr("tigers")},
paddy@0 14 `{lions,tigers,NULL}`: []*string{strPtr("lions"), strPtr("tigers"), nil},
paddy@0 15 `{lions,tigers,bears}`: []*string{strPtr("lions"), strPtr("tigers"), strPtr("bears")},
paddy@0 16 `{lions,tigers,bears,"oh my!"}`: []*string{strPtr("lions"), strPtr("tigers"), strPtr("bears"), strPtr("oh my!")},
paddy@0 17 }
paddy@0 18
paddy@0 19 func TestParseInputsTable(t *testing.T) {
paddy@0 20 for input, expected := range parseTestInputs {
paddy@0 21 l := lex(input)
paddy@0 22 output, err := parse(l)
paddy@0 23 if err != nil {
paddy@0 24 t.Fatalf(err.Error())
paddy@0 25 }
paddy@0 26 t.Logf("`%s`: %#+v\n", input, output)
paddy@0 27 if len(output) != len(expected) {
paddy@0 28 t.Fatalf("Expected %d items in array, got %d\n", len(expected), len(output))
paddy@0 29 }
paddy@0 30 for pos, item := range output {
paddy@0 31 if item == nil && expected[pos] != nil {
paddy@0 32 t.Errorf("Expected %d to be %s, got nil instead.", pos, *expected[pos])
paddy@0 33 } else if item != nil && expected[pos] == nil {
paddy@0 34 t.Errorf("Expected %d to be nil, got %s instead.", pos, *item)
paddy@0 35 } else if item != nil && expected[pos] != nil {
paddy@0 36 continue
paddy@0 37 } else if item == nil && expected[pos] == nil {
paddy@0 38 continue
paddy@0 39 } else if *item != *expected[pos] {
paddy@0 40 t.Errorf("Expected %d to be %s, got %s instead.", pos, *expected[pos], *item)
paddy@0 41 }
paddy@0 42 }
paddy@0 43 }
paddy@0 44 }