featurebase/wireprotocol/wireprimitives_test.go
Matthew Jaffee 6d4c1d9db1
Sup 294 pre sort command (#2209)
* first cut at pre-sort command that works on ndjson

* finish pre_sort command for CSV and JSON and add test

* try fixing golangci-lint

* remove some dumb lint checks

* more linter disabling

* take .golangci.yml from previous repo

* go fmt (facepalm)

* remove ioutil to fix lint
2023-01-23 12:26:38 -06:00

144 lines
2.9 KiB
Go

package wireprotocol_test
import (
"bytes"
"testing"
"time"
"github.com/featurebasedb/featurebase/v3/pql"
"github.com/featurebasedb/featurebase/v3/sql3/parser"
"github.com/featurebasedb/featurebase/v3/sql3/planner/types"
"github.com/featurebasedb/featurebase/v3/wireprotocol"
"github.com/google/go-cmp/cmp"
)
func TestWireProtocol_Schema(t *testing.T) {
s := types.Schema{
&types.PlannerColumn{
ColumnName: "col1",
Type: parser.NewDataTypeID(),
},
&types.PlannerColumn{
ColumnName: "col2",
Type: parser.NewDataTypeInt(),
},
&types.PlannerColumn{
ColumnName: "col3",
Type: parser.NewDataTypeDecimal(4),
},
&types.PlannerColumn{
ColumnName: "col4",
Type: parser.NewDataTypeString(),
},
&types.PlannerColumn{
ColumnName: "col5",
Type: parser.NewDataTypeStringSet(),
},
&types.PlannerColumn{
ColumnName: "col6",
Type: parser.NewDataTypeIDSet(),
},
&types.PlannerColumn{
ColumnName: "col7",
Type: parser.NewDataTypeBool(),
},
&types.PlannerColumn{
ColumnName: "col8",
Type: parser.NewDataTypeTimestamp(),
},
}
b, err := wireprotocol.WriteSchema(s)
if err != nil {
t.Fatal(err)
}
rdr := bytes.NewReader(b)
_, err = wireprotocol.ExpectToken(rdr, wireprotocol.TOKEN_SCHEMA_INFO)
if err != nil {
t.Fatal(err)
}
sr, err := wireprotocol.ReadSchema(rdr)
if err != nil {
t.Fatal(err)
}
if diff := cmp.Diff(s, sr); diff != "" {
t.Fatal(diff)
}
}
func TestWireProtocol_Row(t *testing.T) {
s := types.Schema{
&types.PlannerColumn{
ColumnName: "col1",
Type: parser.NewDataTypeID(),
},
&types.PlannerColumn{
ColumnName: "col2",
Type: parser.NewDataTypeInt(),
},
&types.PlannerColumn{
ColumnName: "col3",
Type: parser.NewDataTypeDecimal(4),
},
&types.PlannerColumn{
ColumnName: "col4",
Type: parser.NewDataTypeString(),
},
&types.PlannerColumn{
ColumnName: "col5",
Type: parser.NewDataTypeStringSet(),
},
&types.PlannerColumn{
ColumnName: "col6",
Type: parser.NewDataTypeIDSet(),
},
&types.PlannerColumn{
ColumnName: "col7",
Type: parser.NewDataTypeBool(),
},
&types.PlannerColumn{
ColumnName: "col8",
Type: parser.NewDataTypeTimestamp(),
},
}
r := types.Row{
int64(1),
int64(2),
pql.NewDecimal(123400, 4),
string("foo"),
[]string{"bar", "baz"},
[]int64{10, 20},
bool(false),
time.Now().UTC(),
}
b, err := wireprotocol.WriteRow(r, s)
if err != nil {
t.Fatal(err)
}
rdr := bytes.NewReader(b)
_, err = wireprotocol.ExpectToken(rdr, wireprotocol.TOKEN_ROW)
if err != nil {
t.Fatal(err)
}
rr, err := wireprotocol.ReadRow(rdr, s)
if err != nil {
t.Fatal(err)
}
opt := cmp.Comparer(func(x, y pql.Decimal) bool {
return x.EqualTo(y)
})
if diff := cmp.Diff(r, rr, opt); diff != "" {
t.Fatal(diff)
}
}