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 }