Files
dolt/samples/go/csv/schema_test.go
T
2016-06-05 02:37:28 -07:00

296 lines
5.0 KiB
Go

// Copyright 2016 The Noms Authors. All rights reserved.
// Licensed under the Apache License, version 2.0:
// http://www.apache.org/licenses/LICENSE-2.0
package csv
import (
"bytes"
"fmt"
"strings"
"testing"
"github.com/attic-labs/noms/go/types"
"github.com/attic-labs/testify/assert"
)
func TestSchemaDetection(t *testing.T) {
assert := assert.New(t)
test := func(input [][]string, expect []KindSlice) {
options := newSchemaOptions(len(input[0]))
for _, values := range input {
options.Test(values)
}
assert.Equal(expect, options.ValidKinds())
}
test(
[][]string{
[]string{"foo", "1", "5"},
[]string{"bar", "0", "10"},
[]string{"true", "1", "23"},
[]string{"1", "1", "60"},
[]string{"1.1", "false", "75"},
},
[]KindSlice{
KindSlice{types.StringKind},
KindSlice{types.BoolKind, types.StringKind},
KindSlice{
types.NumberKind,
types.StringKind,
},
},
)
test(
[][]string{
[]string{"foo"},
[]string{"bar"},
[]string{"true"},
[]string{"1"},
[]string{"1.1"},
},
[]KindSlice{
KindSlice{types.StringKind},
},
)
test(
[][]string{
[]string{"true"},
[]string{"1"},
[]string{"1.1"},
},
[]KindSlice{
KindSlice{types.StringKind},
},
)
test(
[][]string{
[]string{"true"},
[]string{"false"},
[]string{"True"},
[]string{"False"},
[]string{"TRUE"},
[]string{"FALSE"},
[]string{"1"},
[]string{"0"},
},
[]KindSlice{
KindSlice{types.BoolKind, types.StringKind},
},
)
test(
[][]string{
[]string{"1"},
[]string{"1.1"},
},
[]KindSlice{
KindSlice{
types.NumberKind,
types.StringKind},
},
)
test(
[][]string{
[]string{"1"},
[]string{"1.1"},
[]string{"4.940656458412465441765687928682213723651e-50"},
[]string{"-4.940656458412465441765687928682213723651e-50"},
},
[]KindSlice{
KindSlice{
types.NumberKind,
types.StringKind},
},
)
test(
[][]string{
[]string{"1"},
[]string{"1.1"},
[]string{"1.797693134862315708145274237317043567981e+102"},
[]string{"-1.797693134862315708145274237317043567981e+102"},
},
[]KindSlice{
KindSlice{
types.NumberKind,
types.StringKind},
},
)
test(
[][]string{
[]string{"1"},
[]string{"1.1"},
[]string{"1.797693134862315708145274237317043567981e+309"},
[]string{"-1.797693134862315708145274237317043567981e+309"},
},
[]KindSlice{
KindSlice{
types.StringKind},
},
)
test(
[][]string{
[]string{"1"},
[]string{"0"},
},
[]KindSlice{
KindSlice{
types.NumberKind,
types.BoolKind,
types.StringKind},
},
)
test(
[][]string{
[]string{"1"},
[]string{"0"},
[]string{"-1"},
},
[]KindSlice{
KindSlice{
types.NumberKind,
types.StringKind},
},
)
test(
[][]string{
[]string{"0"},
[]string{"-0"},
},
[]KindSlice{
KindSlice{
types.NumberKind,
types.StringKind},
},
)
test(
[][]string{
[]string{"1"},
[]string{"280"},
[]string{"0"},
[]string{"-1"},
},
[]KindSlice{
KindSlice{
types.NumberKind,
types.StringKind},
},
)
test(
[][]string{
[]string{"1"},
[]string{"-180"},
[]string{"0"},
[]string{"-1"},
},
[]KindSlice{
KindSlice{
types.NumberKind,
types.StringKind},
},
)
test(
[][]string{
[]string{"1"},
[]string{"33000"},
[]string{"0"},
[]string{"-1"},
},
[]KindSlice{
KindSlice{
types.NumberKind,
types.StringKind},
},
)
test(
[][]string{
[]string{"1"},
[]string{"-44000"},
[]string{"0"},
[]string{"-1"},
},
[]KindSlice{
KindSlice{
types.NumberKind,
types.StringKind},
},
)
test(
[][]string{
[]string{"1"},
[]string{"2547483648"},
[]string{"0"},
[]string{"-1"},
},
[]KindSlice{
KindSlice{
types.NumberKind,
types.StringKind},
},
)
test(
[][]string{
[]string{"1"},
[]string{"-4347483648"},
[]string{"0"},
[]string{"-1"},
},
[]KindSlice{
KindSlice{
types.NumberKind,
types.StringKind},
},
)
test(
[][]string{
[]string{fmt.Sprintf("%d", uint64(1<<63))},
[]string{fmt.Sprintf("%d", uint64(1<<63)+1)},
},
[]KindSlice{
KindSlice{
types.NumberKind,
types.StringKind},
},
)
test(
[][]string{
[]string{fmt.Sprintf("%d", uint64(1<<32))},
[]string{fmt.Sprintf("%d", uint64(1<<32)+1)},
},
[]KindSlice{
KindSlice{
types.NumberKind,
types.StringKind},
},
)
}
func TestReportValidFieldTypes(t *testing.T) {
assert := assert.New(t)
data := [][]string{
{"h1", "h2", "h3"},
{"1.1", "true", "d3"},
{"2", "false", "d6"},
}
expectedKinds := []KindSlice{
KindSlice{types.NumberKind, types.StringKind},
KindSlice{types.BoolKind, types.StringKind},
KindSlice{types.StringKind},
}
dataString := ""
for _, row := range data {
dataString = dataString + strings.Join(row, ",") + "\n"
}
r := NewCSVReader(bytes.NewBufferString(dataString), ',')
headers, err := r.Read()
assert.NoError(err)
assert.Equal(data[0], headers)
kinds := ReportValidFieldTypes(r, headers)
for i, ks := range kinds {
assert.Equal(expectedKinds[i], ks)
}
}