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  }