cuelang.org/go@v0.10.1/internal/envflag/flag_test.go (about)

     1  package envflag
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/go-quicktest/qt"
     7  )
     8  
     9  type testFlags struct {
    10  	Foo    bool
    11  	BarBaz bool
    12  
    13  	DefaultFalse bool `envflag:"default:false"`
    14  	DefaultTrue  bool `envflag:"default:true"`
    15  }
    16  
    17  func success[T comparable](want T) func(t *testing.T) {
    18  	return func(t *testing.T) {
    19  		var x T
    20  		err := Init(&x, "TEST_VAR")
    21  		qt.Assert(t, qt.IsNil(err))
    22  		qt.Assert(t, qt.Equals(x, want))
    23  	}
    24  }
    25  
    26  func failure[T comparable](want T, wantError string) func(t *testing.T) {
    27  	return func(t *testing.T) {
    28  		var x T
    29  		err := Init(&x, "TEST_VAR")
    30  		qt.Assert(t, qt.ErrorMatches(err, wantError))
    31  		qt.Assert(t, qt.Equals(x, want))
    32  	}
    33  }
    34  
    35  func invalid[T comparable](want T) func(t *testing.T) {
    36  	return func(t *testing.T) {
    37  		var x T
    38  		err := Init(&x, "TEST_VAR")
    39  		qt.Assert(t, qt.ErrorIs(err, InvalidError))
    40  		qt.Assert(t, qt.Equals(x, want))
    41  	}
    42  }
    43  
    44  var tests = []struct {
    45  	testName string
    46  	envVal   string
    47  	test     func(t *testing.T)
    48  }{{
    49  	testName: "Empty",
    50  	envVal:   "",
    51  	test: success(testFlags{
    52  		DefaultTrue: true,
    53  	}),
    54  }, {
    55  	testName: "Unknown",
    56  	envVal:   "ratchet",
    57  	test: failure[testFlags](testFlags{DefaultTrue: true},
    58  		"cannot parse TEST_VAR: unknown ratchet"),
    59  }, {
    60  	testName: "Set",
    61  	envVal:   "foo",
    62  	test: success(testFlags{
    63  		Foo:         true,
    64  		DefaultTrue: true,
    65  	}),
    66  }, {
    67  	testName: "SetTwice",
    68  	envVal:   "foo,foo",
    69  	test: success(testFlags{
    70  		Foo:         true,
    71  		DefaultTrue: true,
    72  	}),
    73  }, {
    74  	testName: "SetWithUnknown",
    75  	envVal:   "foo,other",
    76  	test: failure[testFlags](testFlags{
    77  		Foo:         true,
    78  		DefaultTrue: true,
    79  	}, "cannot parse TEST_VAR: unknown other"),
    80  }, {
    81  	testName: "TwoFlags",
    82  	envVal:   "barbaz,foo",
    83  	test: success(testFlags{
    84  		Foo:         true,
    85  		BarBaz:      true,
    86  		DefaultTrue: true,
    87  	}),
    88  }, {
    89  	testName: "ToggleDefaultFieldsNumeric",
    90  	envVal:   "defaulttrue=0,defaultfalse=1",
    91  	test: success(testFlags{
    92  		DefaultFalse: true,
    93  	}),
    94  }, {
    95  	testName: "ToggleDefaultFieldsWords",
    96  	envVal:   "defaulttrue=false,defaultfalse=true",
    97  	test: success(testFlags{
    98  		DefaultFalse: true,
    99  	}),
   100  }, {
   101  	testName: "MultipleUnknown",
   102  	envVal:   "other1,other2,foo",
   103  	test: failure(testFlags{
   104  		Foo:         true,
   105  		DefaultTrue: true,
   106  	}, "cannot parse TEST_VAR: unknown other1\nunknown other2"),
   107  }, {
   108  	testName: "Invalid",
   109  	envVal:   "foo=2,BarBaz=true",
   110  	test:     invalid(testFlags{DefaultTrue: true}),
   111  }}
   112  
   113  func TestInit(t *testing.T) {
   114  	for _, test := range tests {
   115  		t.Run(test.testName, func(t *testing.T) {
   116  			t.Setenv("TEST_VAR", test.envVal)
   117  			test.test(t)
   118  		})
   119  	}
   120  }