mirror of
https://github.com/dolthub/dolt.git
synced 2026-02-11 10:33:08 -06:00
142 lines
3.9 KiB
Go
142 lines
3.9 KiB
Go
// Copyright 2016 Attic Labs, Inc. All rights reserved.
|
|
// Licensed under the Apache License, version 2.0:
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
package csv
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/csv"
|
|
"fmt"
|
|
"io"
|
|
"io/ioutil"
|
|
"os"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/attic-labs/noms/go/chunks"
|
|
"github.com/attic-labs/noms/go/d"
|
|
"github.com/attic-labs/noms/go/datas"
|
|
"github.com/attic-labs/noms/go/types"
|
|
"github.com/attic-labs/noms/go/util/clienttest"
|
|
"github.com/attic-labs/testify/suite"
|
|
)
|
|
|
|
const (
|
|
TEST_ROW_STRUCT_NAME = "row"
|
|
TEST_ROW_FIELDS = "anid,month,rainfall,year"
|
|
TEST_DATA_SIZE = 200
|
|
TEST_YEAR = 2012
|
|
)
|
|
|
|
func TestCSVWrite(t *testing.T) {
|
|
suite.Run(t, &csvWriteTestSuite{})
|
|
}
|
|
|
|
type csvWriteTestSuite struct {
|
|
clienttest.ClientTestSuite
|
|
fieldTypes []*types.Type
|
|
rowStructDesc types.StructDesc
|
|
comma rune
|
|
tmpFileName string
|
|
}
|
|
|
|
func typesToKinds(ts []*types.Type) KindSlice {
|
|
kinds := make(KindSlice, len(ts))
|
|
for i, t := range ts {
|
|
kinds[i] = t.Kind()
|
|
}
|
|
return kinds
|
|
}
|
|
|
|
func (s *csvWriteTestSuite) SetupTest() {
|
|
input, err := ioutil.TempFile(s.TempDir, "")
|
|
d.Chk.NoError(err)
|
|
s.tmpFileName = input.Name()
|
|
defer input.Close()
|
|
|
|
fieldNames := strings.Split(TEST_ROW_FIELDS, ",")
|
|
s.fieldTypes = []*types.Type{types.StringType, types.NumberType, types.NumberType, types.NumberType}
|
|
rowStructType := types.MakeStructType(TEST_ROW_STRUCT_NAME, fieldNames, s.fieldTypes)
|
|
s.rowStructDesc = rowStructType.Desc.(types.StructDesc)
|
|
s.comma, _ = StringToRune(",")
|
|
createCsvTestExpectationFile(input)
|
|
}
|
|
|
|
func (s *csvWriteTestSuite) TearDownTest() {
|
|
os.Remove(s.tmpFileName)
|
|
}
|
|
|
|
func createCsvTestExpectationFile(w io.Writer) {
|
|
_, err := io.WriteString(w, TEST_ROW_FIELDS)
|
|
d.Chk.NoError(err)
|
|
_, err = io.WriteString(w, "\n")
|
|
d.Chk.NoError(err)
|
|
for i := 0; i < TEST_DATA_SIZE; i++ {
|
|
_, err = io.WriteString(w, fmt.Sprintf("a - %3d,%d,%d,%d\n", i, i%12, i%32, TEST_YEAR+i%4))
|
|
d.Chk.NoError(err)
|
|
}
|
|
}
|
|
|
|
func startReadingCsvTestExpectationFile(s *csvWriteTestSuite) (cr *csv.Reader, headers []string) {
|
|
res, err := os.Open(s.tmpFileName)
|
|
d.PanicIfError(err)
|
|
cr = NewCSVReader(res, s.comma)
|
|
headers, err = cr.Read()
|
|
d.PanicIfError(err)
|
|
return
|
|
}
|
|
|
|
func createTestList(s *csvWriteTestSuite) types.List {
|
|
ds := datas.NewDatabase(chunks.NewMemoryStore())
|
|
cr, headers := startReadingCsvTestExpectationFile(s)
|
|
l, _ := ReadToList(cr, TEST_ROW_STRUCT_NAME, headers, typesToKinds(s.fieldTypes), ds)
|
|
return l
|
|
}
|
|
|
|
func createTestMap(s *csvWriteTestSuite) types.Map {
|
|
ds := datas.NewDatabase(chunks.NewMemoryStore())
|
|
cr, headers := startReadingCsvTestExpectationFile(s)
|
|
return ReadToMap(cr, TEST_ROW_STRUCT_NAME, headers, []string{"anid"}, typesToKinds(s.fieldTypes), ds)
|
|
}
|
|
|
|
func createTestNestedMap(s *csvWriteTestSuite) types.Map {
|
|
ds := datas.NewDatabase(chunks.NewMemoryStore())
|
|
cr, headers := startReadingCsvTestExpectationFile(s)
|
|
return ReadToMap(cr, TEST_ROW_STRUCT_NAME, headers, []string{"anid", "year"}, typesToKinds(s.fieldTypes), ds)
|
|
}
|
|
|
|
func verifyOutput(s *csvWriteTestSuite, r io.Reader) {
|
|
res, err := os.Open(s.tmpFileName)
|
|
d.PanicIfError(err)
|
|
actual, err := ioutil.ReadAll(r)
|
|
d.Chk.NoError(err)
|
|
expected, err := ioutil.ReadAll(res)
|
|
d.Chk.NoError(err)
|
|
s.True(string(expected) == string(actual), "csv files are different")
|
|
}
|
|
|
|
func (s *csvWriteTestSuite) TestCSVWriteList() {
|
|
l := createTestList(s)
|
|
w := new(bytes.Buffer)
|
|
s.True(TEST_DATA_SIZE == l.Len(), "list length")
|
|
WriteList(l, s.rowStructDesc, s.comma, w)
|
|
verifyOutput(s, w)
|
|
}
|
|
|
|
func (s *csvWriteTestSuite) TestCSVWriteMap() {
|
|
m := createTestMap(s)
|
|
w := new(bytes.Buffer)
|
|
s.True(TEST_DATA_SIZE == m.Len(), "map length")
|
|
WriteMap(m, s.rowStructDesc, s.comma, w)
|
|
verifyOutput(s, w)
|
|
}
|
|
|
|
func (s *csvWriteTestSuite) TestCSVWriteNestedMap() {
|
|
m := createTestNestedMap(s)
|
|
w := new(bytes.Buffer)
|
|
s.True(TEST_DATA_SIZE == m.Len(), "nested map length")
|
|
WriteMap(m, s.rowStructDesc, s.comma, w)
|
|
verifyOutput(s, w)
|
|
}
|