2021-11-04 04:17:15 +08:00
|
|
|
package fs
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"fmt"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Check it satisfies the interface
|
|
|
|
var _ flagger = (*Tristate)(nil)
|
|
|
|
|
|
|
|
func TestTristateString(t *testing.T) {
|
|
|
|
for _, test := range []struct {
|
|
|
|
in Tristate
|
|
|
|
want string
|
|
|
|
}{
|
|
|
|
{Tristate{}, "unset"},
|
|
|
|
{Tristate{Valid: false, Value: false}, "unset"},
|
|
|
|
{Tristate{Valid: false, Value: true}, "unset"},
|
|
|
|
{Tristate{Valid: true, Value: false}, "false"},
|
|
|
|
{Tristate{Valid: true, Value: true}, "true"},
|
|
|
|
} {
|
|
|
|
got := test.in.String()
|
|
|
|
assert.Equal(t, test.want, got)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestTristateSet(t *testing.T) {
|
|
|
|
for _, test := range []struct {
|
|
|
|
in string
|
|
|
|
want Tristate
|
|
|
|
err bool
|
|
|
|
}{
|
|
|
|
{"", Tristate{Valid: false, Value: false}, false},
|
|
|
|
{"nil", Tristate{Valid: false, Value: false}, false},
|
|
|
|
{"null", Tristate{Valid: false, Value: false}, false},
|
|
|
|
{"UNSET", Tristate{Valid: false, Value: false}, false},
|
|
|
|
{"true", Tristate{Valid: true, Value: true}, false},
|
|
|
|
{"1", Tristate{Valid: true, Value: true}, false},
|
|
|
|
{"false", Tristate{Valid: true, Value: false}, false},
|
|
|
|
{"0", Tristate{Valid: true, Value: false}, false},
|
|
|
|
{"potato", Tristate{Valid: false, Value: false}, true},
|
|
|
|
} {
|
|
|
|
var got Tristate
|
|
|
|
err := got.Set(test.in)
|
|
|
|
if test.err {
|
|
|
|
require.Error(t, err)
|
|
|
|
} else {
|
|
|
|
require.NoError(t, err)
|
|
|
|
assert.Equal(t, test.want, got)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestTristateScan(t *testing.T) {
|
|
|
|
var v Tristate
|
|
|
|
n, err := fmt.Sscan(" true ", &v)
|
|
|
|
require.NoError(t, err)
|
|
|
|
assert.Equal(t, 1, n)
|
|
|
|
assert.Equal(t, Tristate{Valid: true, Value: true}, v)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestTristateUnmarshalJSON(t *testing.T) {
|
|
|
|
for _, test := range []struct {
|
|
|
|
in string
|
|
|
|
want Tristate
|
|
|
|
err bool
|
|
|
|
}{
|
|
|
|
{`null`, Tristate{}, false},
|
|
|
|
{`true`, Tristate{Valid: true, Value: true}, false},
|
|
|
|
{`false`, Tristate{Valid: true, Value: false}, false},
|
|
|
|
{`potato`, Tristate{}, true},
|
|
|
|
{``, Tristate{}, true},
|
|
|
|
} {
|
|
|
|
var got Tristate
|
|
|
|
err := json.Unmarshal([]byte(test.in), &got)
|
|
|
|
if test.err {
|
|
|
|
require.Error(t, err, test.in)
|
|
|
|
} else {
|
|
|
|
require.NoError(t, err, test.in)
|
|
|
|
}
|
|
|
|
assert.Equal(t, test.want, got, test.in)
|
|
|
|
}
|
|
|
|
}
|
2023-03-17 02:20:23 +08:00
|
|
|
|
|
|
|
func TestTristateMarshalJSON(t *testing.T) {
|
|
|
|
for _, test := range []struct {
|
|
|
|
in Tristate
|
|
|
|
want string
|
|
|
|
}{
|
|
|
|
{Tristate{}, `null`},
|
|
|
|
{Tristate{Valid: true, Value: true}, `true`},
|
|
|
|
{Tristate{Valid: true, Value: false}, `false`},
|
|
|
|
} {
|
|
|
|
got, err := json.Marshal(&test.in)
|
|
|
|
require.NoError(t, err)
|
|
|
|
assert.Equal(t, test.want, string(got), fmt.Sprintf("%#v", test.in))
|
|
|
|
}
|
|
|
|
}
|