github.com/rclone/rclone@v1.66.1-0.20240517100346-7b89735ae726/fs/tristate_test.go (about) 1 package fs 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "testing" 7 8 "github.com/stretchr/testify/assert" 9 "github.com/stretchr/testify/require" 10 ) 11 12 // Check it satisfies the interfaces 13 var ( 14 _ flagger = (*Tristate)(nil) 15 _ flaggerNP = Tristate{} 16 ) 17 18 func TestTristateString(t *testing.T) { 19 for _, test := range []struct { 20 in Tristate 21 want string 22 }{ 23 {Tristate{}, "unset"}, 24 {Tristate{Valid: false, Value: false}, "unset"}, 25 {Tristate{Valid: false, Value: true}, "unset"}, 26 {Tristate{Valid: true, Value: false}, "false"}, 27 {Tristate{Valid: true, Value: true}, "true"}, 28 } { 29 got := test.in.String() 30 assert.Equal(t, test.want, got) 31 } 32 } 33 34 func TestTristateSet(t *testing.T) { 35 for _, test := range []struct { 36 in string 37 want Tristate 38 err bool 39 }{ 40 {"", Tristate{Valid: false, Value: false}, false}, 41 {"nil", Tristate{Valid: false, Value: false}, false}, 42 {"null", Tristate{Valid: false, Value: false}, false}, 43 {"UNSET", Tristate{Valid: false, Value: false}, false}, 44 {"true", Tristate{Valid: true, Value: true}, false}, 45 {"1", Tristate{Valid: true, Value: true}, false}, 46 {"false", Tristate{Valid: true, Value: false}, false}, 47 {"0", Tristate{Valid: true, Value: false}, false}, 48 {"potato", Tristate{Valid: false, Value: false}, true}, 49 } { 50 var got Tristate 51 err := got.Set(test.in) 52 if test.err { 53 require.Error(t, err) 54 } else { 55 require.NoError(t, err) 56 assert.Equal(t, test.want, got) 57 } 58 } 59 } 60 61 func TestTristateScan(t *testing.T) { 62 var v Tristate 63 n, err := fmt.Sscan(" true ", &v) 64 require.NoError(t, err) 65 assert.Equal(t, 1, n) 66 assert.Equal(t, Tristate{Valid: true, Value: true}, v) 67 } 68 69 func TestTristateUnmarshalJSON(t *testing.T) { 70 for _, test := range []struct { 71 in string 72 want Tristate 73 err bool 74 }{ 75 {`null`, Tristate{}, false}, 76 {`true`, Tristate{Valid: true, Value: true}, false}, 77 {`false`, Tristate{Valid: true, Value: false}, false}, 78 {`potato`, Tristate{}, true}, 79 {``, Tristate{}, true}, 80 } { 81 var got Tristate 82 err := json.Unmarshal([]byte(test.in), &got) 83 if test.err { 84 require.Error(t, err, test.in) 85 } else { 86 require.NoError(t, err, test.in) 87 } 88 assert.Equal(t, test.want, got, test.in) 89 } 90 } 91 92 func TestTristateMarshalJSON(t *testing.T) { 93 for _, test := range []struct { 94 in Tristate 95 want string 96 }{ 97 {Tristate{}, `null`}, 98 {Tristate{Valid: true, Value: true}, `true`}, 99 {Tristate{Valid: true, Value: false}, `false`}, 100 } { 101 got, err := json.Marshal(&test.in) 102 require.NoError(t, err) 103 assert.Equal(t, test.want, string(got), fmt.Sprintf("%#v", test.in)) 104 } 105 }