mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-08-28 02:44:59 +00:00
* Pre csv cleanup * Implement the CSV writer This adds the `format` sub-command to `\pset` in order to choose between formats `aligned` and `csv`.
188 lines
4 KiB
Go
188 lines
4 KiB
Go
package cli
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"strings"
|
|
"testing"
|
|
|
|
featurebase "github.com/featurebasedb/featurebase/v3"
|
|
dax "github.com/featurebasedb/featurebase/v3/dax"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestWriter(t *testing.T) {
|
|
t.Run("writeTable", func(t *testing.T) {
|
|
wqr := &featurebase.WireQueryResponse{
|
|
Schema: featurebase.WireQuerySchema{
|
|
Fields: []*featurebase.WireQueryField{
|
|
{Name: "_id", Type: dax.BaseTypeID},
|
|
{Name: "name", Type: dax.BaseTypeString},
|
|
{Name: "age", Type: dax.BaseTypeInt},
|
|
},
|
|
},
|
|
Data: [][]interface{}{
|
|
{1, "Amy", 44},
|
|
{2, "Bob", 32},
|
|
{3, "Cindy", 28},
|
|
},
|
|
}
|
|
|
|
// TODO(tlt): used for debugging
|
|
// format := defaultWriteOptions()
|
|
// assert.NoError(t, writeTable(wqr, format, os.Stdout, os.Stdout, os.Stdout))
|
|
// return
|
|
|
|
tests := []struct {
|
|
format *writeOptions
|
|
expQOut string
|
|
expOut string
|
|
expErr string
|
|
}{
|
|
{
|
|
// default format
|
|
format: defaultWriteOptions(),
|
|
expQOut: stringOfLines(
|
|
" _id | name | age ",
|
|
"-----+-------+-----",
|
|
" 1 | Amy | 44 ",
|
|
" 2 | Bob | 32 ",
|
|
" 3 | Cindy | 28 ",
|
|
"",
|
|
),
|
|
expOut: "",
|
|
expErr: "",
|
|
},
|
|
{
|
|
// timing on
|
|
format: &writeOptions{
|
|
border: 1,
|
|
expanded: false,
|
|
format: formatAligned,
|
|
timing: true,
|
|
tuplesOnly: false,
|
|
},
|
|
expQOut: stringOfLines(
|
|
" _id | name | age ",
|
|
"-----+-------+-----",
|
|
" 1 | Amy | 44 ",
|
|
" 2 | Bob | 32 ",
|
|
" 3 | Cindy | 28 ",
|
|
"",
|
|
),
|
|
expOut: "Execution time: 0μs\n",
|
|
expErr: "",
|
|
},
|
|
{
|
|
// format.border = 2 (or higher)
|
|
format: &writeOptions{
|
|
border: 2,
|
|
expanded: false,
|
|
format: formatAligned,
|
|
timing: false,
|
|
tuplesOnly: false,
|
|
},
|
|
expQOut: stringOfLines(
|
|
"+-----+-------+-----+",
|
|
"| _id | name | age |",
|
|
"+-----+-------+-----+",
|
|
"| 1 | Amy | 44 |",
|
|
"| 2 | Bob | 32 |",
|
|
"| 3 | Cindy | 28 |",
|
|
"+-----+-------+-----+",
|
|
"",
|
|
),
|
|
expOut: "",
|
|
expErr: "",
|
|
},
|
|
{
|
|
// format.border = 0
|
|
format: &writeOptions{
|
|
border: 0,
|
|
expanded: false,
|
|
format: formatAligned,
|
|
timing: false,
|
|
tuplesOnly: false,
|
|
},
|
|
expQOut: stringOfLines(
|
|
"_id name age",
|
|
"--- ----- ---",
|
|
" 1 Amy 44",
|
|
" 2 Bob 32",
|
|
" 3 Cindy 28",
|
|
"",
|
|
),
|
|
expOut: "",
|
|
expErr: "",
|
|
},
|
|
{
|
|
// format.tuplesOnly = true
|
|
format: &writeOptions{
|
|
border: 1,
|
|
expanded: false,
|
|
format: formatAligned,
|
|
timing: false,
|
|
tuplesOnly: true,
|
|
},
|
|
expQOut: stringOfLines(
|
|
" 1 | Amy | 44 ",
|
|
" 2 | Bob | 32 ",
|
|
" 3 | Cindy | 28 ",
|
|
"",
|
|
),
|
|
expOut: "",
|
|
expErr: "",
|
|
},
|
|
{
|
|
// format.border = 2, expanded
|
|
format: &writeOptions{
|
|
border: 2,
|
|
expanded: true,
|
|
format: formatAligned,
|
|
timing: false,
|
|
tuplesOnly: false,
|
|
},
|
|
expQOut: stringOfLines(
|
|
"+------+-------+",
|
|
"| _id | 1 |",
|
|
"| name | Amy |",
|
|
"| age | 44 |",
|
|
"+------+-------+",
|
|
"| _id | 2 |",
|
|
"| name | Bob |",
|
|
"| age | 32 |",
|
|
"+------+-------+",
|
|
"| _id | 3 |",
|
|
"| name | Cindy |",
|
|
"| age | 28 |",
|
|
"+------+-------+",
|
|
"",
|
|
),
|
|
expOut: "",
|
|
expErr: "",
|
|
},
|
|
}
|
|
for i, test := range tests {
|
|
t.Run(fmt.Sprintf("test-%d", i), func(t *testing.T) {
|
|
// Set up buffers to capture the output.
|
|
qOut := bytes.NewBuffer(make([]byte, 0, 100000))
|
|
wOut := bytes.NewBuffer(make([]byte, 0, 100000))
|
|
wErr := bytes.NewBuffer(make([]byte, 0, 100000))
|
|
|
|
assert.NoError(t, writeOutput(wqr, test.format, qOut, wOut, wErr))
|
|
|
|
assert.Equal(t, test.expQOut, qOut.String())
|
|
assert.Equal(t, test.expOut, wOut.String())
|
|
assert.Equal(t, test.expErr, wErr.String())
|
|
})
|
|
}
|
|
})
|
|
}
|
|
|
|
func stringOfLines(lines ...string) string {
|
|
var sb strings.Builder
|
|
for _, line := range lines {
|
|
sb.WriteString(line + "\n")
|
|
}
|
|
return sb.String()
|
|
}
|