github.com/mattn/anko@v0.1.10/env/envExternalLookup_test.go (about) 1 package env 2 3 import ( 4 "fmt" 5 "reflect" 6 "strings" 7 "testing" 8 ) 9 10 type TestExternalLookup struct { 11 values map[string]reflect.Value 12 types map[string]reflect.Type 13 } 14 15 func NewTestExternalLookup() *TestExternalLookup { 16 return &TestExternalLookup{ 17 values: make(map[string]reflect.Value), 18 types: make(map[string]reflect.Type), 19 } 20 } 21 22 func (testExternalLookup *TestExternalLookup) SetValue(symbol string, value interface{}) error { 23 if strings.Contains(symbol, ".") { 24 return ErrSymbolContainsDot 25 } 26 27 if value == nil { 28 testExternalLookup.values[symbol] = NilValue 29 } else { 30 testExternalLookup.values[symbol] = reflect.ValueOf(value) 31 } 32 33 return nil 34 } 35 36 func (testExternalLookup *TestExternalLookup) Get(symbol string) (reflect.Value, error) { 37 if value, ok := testExternalLookup.values[symbol]; ok { 38 return value, nil 39 } 40 return NilValue, fmt.Errorf("undefined symbol '%s'", symbol) 41 } 42 43 func (testExternalLookup *TestExternalLookup) DefineType(symbol string, aType interface{}) error { 44 if strings.Contains(symbol, ".") { 45 return ErrSymbolContainsDot 46 } 47 48 var reflectType reflect.Type 49 if aType == nil { 50 reflectType = NilType 51 } else { 52 var ok bool 53 reflectType, ok = reflectType.(reflect.Type) 54 if !ok { 55 reflectType = reflect.TypeOf(aType) 56 } 57 } 58 59 testExternalLookup.types[symbol] = reflectType 60 return nil 61 } 62 63 func (testExternalLookup *TestExternalLookup) Type(symbol string) (reflect.Type, error) { 64 if value, ok := testExternalLookup.types[symbol]; ok { 65 return value, nil 66 } 67 return NilType, fmt.Errorf("undefined symbol '%s'", symbol) 68 } 69 70 func TestExternalLookupValueAndGet(t *testing.T) { 71 var err error 72 var value interface{} 73 tests := []struct { 74 testInfo string 75 varName string 76 varDefineValue interface{} 77 varGetValue interface{} 78 varKind reflect.Kind 79 defineError error 80 getError error 81 }{ 82 {testInfo: "nil", varName: "a", varDefineValue: nil, varGetValue: nil, varKind: reflect.Interface}, 83 {testInfo: "bool", varName: "a", varDefineValue: true, varGetValue: true, varKind: reflect.Bool}, 84 {testInfo: "int16", varName: "a", varDefineValue: int16(1), varGetValue: int16(1), varKind: reflect.Int16}, 85 {testInfo: "int32", varName: "a", varDefineValue: int32(1), varGetValue: int32(1), varKind: reflect.Int32}, 86 {testInfo: "int64", varName: "a", varDefineValue: int64(1), varGetValue: int64(1), varKind: reflect.Int64}, 87 {testInfo: "uint32", varName: "a", varDefineValue: uint32(1), varGetValue: uint32(1), varKind: reflect.Uint32}, 88 {testInfo: "uint64", varName: "a", varDefineValue: uint64(1), varGetValue: uint64(1), varKind: reflect.Uint64}, 89 {testInfo: "float32", varName: "a", varDefineValue: float32(1), varGetValue: float32(1), varKind: reflect.Float32}, 90 {testInfo: "float64", varName: "a", varDefineValue: float64(1), varGetValue: float64(1), varKind: reflect.Float64}, 91 {testInfo: "string", varName: "a", varDefineValue: "a", varGetValue: "a", varKind: reflect.String}, 92 93 {testInfo: "string with dot", varName: "a.a", varDefineValue: "a", varGetValue: nil, varKind: reflect.String, defineError: ErrSymbolContainsDot, getError: fmt.Errorf("undefined symbol 'a.a'")}, 94 {testInfo: "string with quotes", varName: "a", varDefineValue: `"a"`, varGetValue: `"a"`, varKind: reflect.String}, 95 } 96 97 // ExternalLookup set And get 98 for _, test := range tests { 99 testExternalLookup := NewTestExternalLookup() 100 env := NewEnv() 101 env.SetExternalLookup(testExternalLookup) 102 103 err = testExternalLookup.SetValue(test.varName, test.varDefineValue) 104 if err != nil && test.defineError != nil { 105 if err.Error() != test.defineError.Error() { 106 t.Errorf("TestExternalLookupValueAndGet %v - SetValue error - received: %v - expected: %v", test.testInfo, err, test.defineError) 107 continue 108 } 109 } else if err != test.defineError { 110 t.Errorf("TestExternalLookupValueAndGet %v - SetValue error - received: %v - expected: %v", test.testInfo, err, test.defineError) 111 continue 112 } 113 value, err = env.Get(test.varName) 114 if err != nil && test.getError != nil { 115 if err.Error() != test.getError.Error() { 116 t.Errorf("TestExternalLookupValueAndGet %v - Get error - received: %v - expected: %v", test.testInfo, err, test.getError) 117 continue 118 } 119 } else if err != test.getError { 120 t.Errorf("TestExternalLookupValueAndGet %v - Get error - received: %v - expected: %v", test.testInfo, err, test.getError) 121 continue 122 } 123 if value != test.varGetValue { 124 t.Errorf("TestExternalLookupValueAndGet %v - value check - received %#v expected: %#v", test.testInfo, value, test.varGetValue) 125 } 126 } 127 } 128 129 func TestExternalLookupTypeAndGet(t *testing.T) { 130 var err error 131 var valueType reflect.Type 132 tests := []struct { 133 testInfo string 134 varName string 135 varDefineValue interface{} 136 defineError error 137 typeError error 138 }{ 139 {testInfo: "nil", varName: "a", varDefineValue: nil}, 140 {testInfo: "bool", varName: "a", varDefineValue: true}, 141 {testInfo: "int16", varName: "a", varDefineValue: int16(1)}, 142 {testInfo: "int32", varName: "a", varDefineValue: int32(1)}, 143 {testInfo: "int64", varName: "a", varDefineValue: int64(1)}, 144 {testInfo: "uint32", varName: "a", varDefineValue: uint32(1)}, 145 {testInfo: "uint64", varName: "a", varDefineValue: uint64(1)}, 146 {testInfo: "float32", varName: "a", varDefineValue: float32(1)}, 147 {testInfo: "float64", varName: "a", varDefineValue: float64(1)}, 148 {testInfo: "string", varName: "a", varDefineValue: "a"}, 149 150 {testInfo: "string with dot", varName: "a.a", varDefineValue: nil, defineError: ErrSymbolContainsDot, typeError: fmt.Errorf("undefined type 'a.a'")}, 151 } 152 153 // DefineType 154 for _, test := range tests { 155 testExternalLookup := NewTestExternalLookup() 156 env := NewEnv() 157 env.SetExternalLookup(testExternalLookup) 158 159 err = testExternalLookup.DefineType(test.varName, test.varDefineValue) 160 if err != nil && test.defineError != nil { 161 if err.Error() != test.defineError.Error() { 162 t.Errorf("TestExternalLookupTypeAndGet %v - DefineType error - received: %v - expected: %v", test.testInfo, err, test.defineError) 163 continue 164 } 165 } else if err != test.defineError { 166 t.Errorf("TestExternalLookupTypeAndGet %v - DefineType error - received: %v - expected: %v", test.testInfo, err, test.defineError) 167 continue 168 } 169 170 valueType, err = env.Type(test.varName) 171 if err != nil && test.typeError != nil { 172 if err.Error() != test.typeError.Error() { 173 t.Errorf("TestExternalLookupTypeAndGet %v - Type error - received: %v - expected: %v", test.testInfo, err, test.typeError) 174 continue 175 } 176 } else if err != test.typeError { 177 t.Errorf("TestExternalLookupTypeAndGet %v - Type error - received: %v - expected: %v", test.testInfo, err, test.typeError) 178 continue 179 } 180 if valueType == nil || test.varDefineValue == nil { 181 if valueType != reflect.TypeOf(test.varDefineValue) { 182 t.Errorf("TestExternalLookupTypeAndGet %v - Type check - received: %v - expected: %v", test.testInfo, valueType, reflect.TypeOf(test.varDefineValue)) 183 } 184 } else if valueType.String() != reflect.TypeOf(test.varDefineValue).String() { 185 t.Errorf("TestExternalLookupTypeAndGet %v - Type check - received: %v - expected: %v", test.testInfo, valueType, reflect.TypeOf(test.varDefineValue)) 186 } 187 } 188 189 } 190 191 func TestExternalLookupAddr(t *testing.T) { 192 var err error 193 tests := []struct { 194 testInfo string 195 varName string 196 varDefineValue interface{} 197 defineError error 198 addrError error 199 }{ 200 {testInfo: "nil", varName: "a", varDefineValue: nil, addrError: nil}, 201 {testInfo: "bool", varName: "a", varDefineValue: true, addrError: fmt.Errorf("unaddressable")}, 202 {testInfo: "int64", varName: "a", varDefineValue: int64(1), addrError: fmt.Errorf("unaddressable")}, 203 {testInfo: "float64", varName: "a", varDefineValue: float64(1), addrError: fmt.Errorf("unaddressable")}, 204 {testInfo: "string", varName: "a", varDefineValue: "a", addrError: fmt.Errorf("unaddressable")}, 205 } 206 207 for _, test := range tests { 208 envParent := NewEnv() 209 testExternalLookup := NewTestExternalLookup() 210 envParent.SetExternalLookup(testExternalLookup) 211 envChild := envParent.NewEnv() 212 213 err = testExternalLookup.SetValue(test.varName, test.varDefineValue) 214 if err != nil && test.defineError != nil { 215 if err.Error() != test.defineError.Error() { 216 t.Errorf("TestExternalLookupAddr %v - SetValue error - received: %v - expected: %v", test.testInfo, err, test.defineError) 217 continue 218 } 219 } else if err != test.defineError { 220 t.Errorf("TestExternalLookupAddr %v - SetValue error - received: %v - expected: %v", test.testInfo, err, test.defineError) 221 continue 222 } 223 224 _, err = envChild.Addr(test.varName) 225 if err != nil && test.addrError != nil { 226 if err.Error() != test.addrError.Error() { 227 t.Errorf("TestExternalLookupAddr %v - Addr error - received: %v - expected: %v", test.testInfo, err, test.addrError) 228 continue 229 } 230 } else if err != test.addrError { 231 t.Errorf("TestExternalLookupAddr %v - Addr error - received: %v - expected: %v", test.testInfo, err, test.addrError) 232 continue 233 } 234 } 235 }