sqlboiler/strmangle/strmangle_test.go

367 lines
7.6 KiB
Go
Raw Normal View History

package strmangle
2016-03-02 04:11:47 +01:00
import (
"strings"
2016-03-02 04:11:47 +01:00
"testing"
)
func TestStack(t *testing.T) {
t.Parallel()
stack := smartStack{}
if stack.pop() != stateNothing {
t.Errorf("Expected state nothing for empty stack")
}
stack.push(stateFunction)
stack.push(stateSubExpression)
stack.push(stateNothing)
if len(stack) != 3 {
t.Errorf("Expected 3 state on stack, got %d", len(stack))
}
if r := stack.pop(); r != stateNothing {
t.Errorf("Expected stateNothing, got %v", r)
}
if len(stack) != 2 {
t.Errorf("Expected 2 state on stack, got %d", len(stack))
}
if r := stack.pop(); r != stateSubExpression {
t.Errorf("Expected stateSubExpression, got %v", r)
}
if len(stack) != 1 {
t.Errorf("Expected 1 state on stack, got %d", len(stack))
}
stack.push(stateSubExpression)
if len(stack) != 2 {
t.Errorf("Expected 2 state on stack, got %d", len(stack))
}
if r := stack.pop(); r != stateSubExpression {
t.Errorf("Expected stateSubExpression, got %v", r)
}
if len(stack) != 1 {
t.Errorf("Expected 1 state on stack, got %d", len(stack))
}
if r := stack.pop(); r != stateFunction {
t.Errorf("Expected stateFunction, got %v", r)
}
if len(stack) != 0 {
t.Errorf("Expected 0 state on stack, got %d", len(stack))
}
if stack.pop() != stateNothing {
t.Errorf("Expected state nothing for empty stack")
}
}
func TestSmartQuote(t *testing.T) {
t.Parallel()
tests := []struct {
In string
Out string
}{
{In: `count(*) as thing, thing as stuff`, Out: `count(*) as thing, "thing" as stuff`},
{In: `select (select 1) as thing, thing as stuff`, Out: `select (select 1) as thing, "thing" as stuff`},
{
In: `select (select stuff as thing from thing where id=1 or name="thing") as stuff`,
Out: `select (select "stuff" as thing from thing where id=1 or name="thing") as stuff`,
},
{In: `thing`, Out: `"thing"`},
{In: `thing, stuff`, Out: `"thing", "stuff"`},
{In: `*`, Out: `*`},
}
for _, test := range tests {
if got := SmartQuote(test.In); got != test.Out {
t.Errorf("want: %s, got: %s", test.Out, got)
}
}
}
func TestIDGen(t *testing.T) {
t.Parallel()
tests := []struct {
In int
Out string
}{
{In: 0, Out: "a"},
{In: 25, Out: "z"},
{In: 26, Out: "ba"},
{In: 52, Out: "ca"},
{In: 675, Out: "zz"},
{In: 676, Out: "baa"},
}
for _, test := range tests {
if got := Identifier(test.In); got != test.Out {
t.Errorf("[%d] want: %q, got: %q", test.In, test.Out, got)
}
}
}
func TestDriverUsesLastInsertID(t *testing.T) {
t.Parallel()
if DriverUsesLastInsertID("postgres") {
t.Error("postgres does not support LastInsertId")
}
if !DriverUsesLastInsertID("mysql") {
t.Error("postgres does support LastInsertId")
}
}
func TestGenerateParamFlags(t *testing.T) {
t.Parallel()
x := GenerateParamFlags(5, 1)
want := "$1,$2,$3,$4,$5"
if want != x {
t.Errorf("want %s, got %s", want, x)
}
}
func TestSingular(t *testing.T) {
t.Parallel()
tests := []struct {
In string
Out string
}{
{"hello_people", "hello_person"},
{"hello_person", "hello_person"},
{"friends", "friend"},
}
for i, test := range tests {
if out := Singular(test.In); out != test.Out {
t.Errorf("[%d] (%s) Out was wrong: %q, want: %q", i, test.In, out, test.Out)
}
}
}
func TestPlural(t *testing.T) {
t.Parallel()
tests := []struct {
In string
Out string
}{
{"hello_person", "hello_people"},
{"friend", "friends"},
{"friends", "friends"},
}
for i, test := range tests {
if out := Plural(test.In); out != test.Out {
t.Errorf("[%d] (%s) Out was wrong: %q, want: %q", i, test.In, out, test.Out)
}
}
}
2016-03-02 04:11:47 +01:00
func TestTitleCase(t *testing.T) {
2016-03-03 05:14:21 +01:00
t.Parallel()
2016-03-02 04:11:47 +01:00
tests := []struct {
In string
Out string
}{
{"hello_there", "HelloThere"},
{"", ""},
{"fun_id", "FunID"},
2016-07-17 05:33:16 +02:00
{"uid", "UID"},
{"guid", "GUID"},
{"uid", "UID"},
{"uuid", "UUID"},
{"ssn", "SSN"},
{"tz", "TZ"},
{"thing_guid", "ThingGUID"},
{"guid_thing", "GUIDThing"},
{"thing_guid_thing", "ThingGUIDThing"},
2016-03-02 04:11:47 +01:00
}
for i, test := range tests {
if out := TitleCase(test.In); out != test.Out {
2016-03-02 04:11:47 +01:00
t.Errorf("[%d] (%s) Out was wrong: %q, want: %q", i, test.In, out, test.Out)
}
}
}
func TestCamelCase(t *testing.T) {
2016-03-03 05:14:21 +01:00
t.Parallel()
2016-03-02 04:11:47 +01:00
tests := []struct {
In string
Out string
}{
{"hello_there_sunny", "helloThereSunny"},
{"", ""},
{"fun_id_times", "funIDTimes"},
2016-07-17 05:33:16 +02:00
{"uid", "uid"},
{"guid", "guid"},
{"uid", "uid"},
{"uuid", "uuid"},
{"ssn", "ssn"},
{"tz", "tz"},
{"thing_guid", "thingGUID"},
{"guid_thing", "guidThing"},
{"thing_guid_thing", "thingGUIDThing"},
2016-03-02 04:11:47 +01:00
}
for i, test := range tests {
if out := CamelCase(test.In); out != test.Out {
2016-03-02 04:11:47 +01:00
t.Errorf("[%d] (%s) Out was wrong: %q, want: %q", i, test.In, out, test.Out)
}
}
}
func TestMakeStringMap(t *testing.T) {
t.Parallel()
var m map[string]string
r := MakeStringMap(m)
if r != "" {
t.Errorf("Expected empty result, got: %s", r)
}
m = map[string]string{
"TestOne": "interval",
"TestTwo": "integer",
}
r = MakeStringMap(m)
2016-07-17 05:33:16 +02:00
e1 := `"TestOne": "interval", "TestTwo": "integer"`
e2 := `"TestTwo": "integer", "TestOne": "interval"`
if r != e1 && r != e2 {
t.Errorf("Got %s", r)
}
}
func TestStringMap(t *testing.T) {
2016-03-03 05:14:21 +01:00
t.Parallel()
mapped := StringMap(strings.ToLower, []string{"HELLO", "WORLD"})
if got := strings.Join(mapped, " "); got != "hello world" {
t.Errorf("mapped was wrong: %q", got)
2016-03-02 04:11:47 +01:00
}
}
func TestMakeDBName(t *testing.T) {
2016-03-03 05:14:21 +01:00
t.Parallel()
if out := MakeDBName("a", "b"); out != "a_b" {
t.Error("Out was wrong:", out)
2016-03-02 04:11:47 +01:00
}
}
func TestHasElement(t *testing.T) {
2016-06-19 23:50:35 +02:00
t.Parallel()
elements := []string{"one", "two"}
if got := HasElement("one", elements); !got {
t.Error("should have found element key")
}
if got := HasElement("three", elements); got {
t.Error("should not have found element key")
2016-03-02 04:11:47 +01:00
}
}
func TestPrefixStringSlice(t *testing.T) {
2016-03-03 05:14:21 +01:00
t.Parallel()
slice := PrefixStringSlice("o.", []string{"one", "two"})
if got := strings.Join(slice, " "); got != "o.one o.two" {
t.Error("wrong output:", got)
}
}
2016-04-04 12:28:58 +02:00
func TestWhereClause(t *testing.T) {
2016-04-04 12:28:58 +02:00
t.Parallel()
tests := []struct {
Cols []string
2016-04-04 12:28:58 +02:00
Start int
Should string
}{
{Cols: []string{"col1"}, Start: 2, Should: `"col1"=$2`},
{Cols: []string{"col1", "col2"}, Start: 4, Should: `"col1"=$4 AND "col2"=$5`},
{Cols: []string{"col1", "col2", "col3"}, Start: 4, Should: `"col1"=$4 AND "col2"=$5 AND "col3"=$6`},
2016-04-04 12:28:58 +02:00
}
for i, test := range tests {
r := WhereClause(test.Cols, test.Start)
2016-04-04 12:28:58 +02:00
if r != test.Should {
t.Errorf("(%d) want: %s, got: %s\nTest: %#v", i, test.Should, r, test)
}
}
}
func TestWherePrimaryKeyPanic(t *testing.T) {
t.Parallel()
defer func() {
if recover() == nil {
t.Error("did not panic")
}
}()
WhereClause(nil, 0)
}
func TestSubstring(t *testing.T) {
t.Parallel()
str := "hello"
if got := Substring(0, 5, str); got != "hello" {
t.Errorf("substring was wrong: %q", got)
}
if got := Substring(1, 4, str); got != "ell" {
t.Errorf("substring was wrong: %q", got)
}
if got := Substring(2, 3, str); got != "l" {
t.Errorf("substring was wrong: %q", got)
}
if got := Substring(5, 5, str); got != "" {
t.Errorf("substring was wrong: %q", got)
}
}
func TestJoinSlices(t *testing.T) {
t.Parallel()
ret := JoinSlices("", nil, nil)
if ret != nil {
t.Error("want nil, got:", ret)
}
ret = JoinSlices(" ", []string{"one", "two"}, []string{"three", "four"})
if got := ret[0]; got != "one three" {
t.Error("ret element was wrong:", got)
}
if got := ret[1]; got != "two four" {
t.Error("ret element was wrong:", got)
}
}
func TestJoinSlicesFail(t *testing.T) {
t.Parallel()
defer func() {
if recover() == nil {
t.Error("did not panic")
}
}()
JoinSlices("", nil, []string{"hello"})
}