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  }