github.com/mattn/anko@v0.1.10/env/envTypes_test.go (about)

     1  package env
     2  
     3  import (
     4  	"fmt"
     5  	"reflect"
     6  	"testing"
     7  )
     8  
     9  func TestBasicType(t *testing.T) {
    10  	env := NewEnv()
    11  	aType, err := env.Type("string")
    12  	if err != nil {
    13  		t.Fatalf("Type error - %v", err)
    14  	}
    15  	if aType != reflect.TypeOf("a") {
    16  		t.Errorf("Type - received: %v - expected: %v", aType, reflect.TypeOf("a"))
    17  	}
    18  
    19  	aType, err = env.Type("int64")
    20  	if err != nil {
    21  		t.Fatal("Type error:", err)
    22  	}
    23  	if aType != reflect.TypeOf(int64(1)) {
    24  		t.Errorf("Type - received: %v - expected: %v", aType, reflect.TypeOf(int64(1)))
    25  	}
    26  }
    27  
    28  func TestDefineType(t *testing.T) {
    29  	var err error
    30  	var valueType reflect.Type
    31  	tests := []struct {
    32  		testInfo       string
    33  		varName        string
    34  		varDefineValue interface{}
    35  		defineError    error
    36  		typeError      error
    37  	}{
    38  		{testInfo: "nil", varName: "a", varDefineValue: nil},
    39  		{testInfo: "bool", varName: "a", varDefineValue: true},
    40  		{testInfo: "int16", varName: "a", varDefineValue: int16(1)},
    41  		{testInfo: "int32", varName: "a", varDefineValue: int32(1)},
    42  		{testInfo: "int64", varName: "a", varDefineValue: int64(1)},
    43  		{testInfo: "uint32", varName: "a", varDefineValue: uint32(1)},
    44  		{testInfo: "uint64", varName: "a", varDefineValue: uint64(1)},
    45  		{testInfo: "float32", varName: "a", varDefineValue: float32(1)},
    46  		{testInfo: "float64", varName: "a", varDefineValue: float64(1)},
    47  		{testInfo: "string", varName: "a", varDefineValue: "a"},
    48  
    49  		{testInfo: "string with dot", varName: "a.a", varDefineValue: nil, defineError: ErrSymbolContainsDot, typeError: fmt.Errorf("undefined type 'a.a'")},
    50  	}
    51  
    52  	// DefineType
    53  	for _, test := range tests {
    54  		env := NewEnv()
    55  
    56  		err = env.DefineType(test.varName, test.varDefineValue)
    57  		if err != nil && test.defineError != nil {
    58  			if err.Error() != test.defineError.Error() {
    59  				t.Errorf("DefineType %v - Define error - received: %v - expected: %v", test.testInfo, err, test.defineError)
    60  				continue
    61  			}
    62  		} else if err != test.defineError {
    63  			t.Errorf("DefineType %v - Define error - received: %v - expected: %v", test.testInfo, err, test.defineError)
    64  			continue
    65  		}
    66  
    67  		valueType, err = env.Type(test.varName)
    68  		if err != nil && test.typeError != nil {
    69  			if err.Error() != test.typeError.Error() {
    70  				t.Errorf("DefineType %v - Type error - received: %v - expected: %v", test.testInfo, err, test.typeError)
    71  				continue
    72  			}
    73  		} else if err != test.typeError {
    74  			t.Errorf("DefineType %v - Type error - received: %v - expected: %v", test.testInfo, err, test.typeError)
    75  			continue
    76  		}
    77  		if valueType == nil || test.varDefineValue == nil {
    78  			if valueType != reflect.TypeOf(test.varDefineValue) {
    79  				t.Errorf("DefineType %v - Type check - received: %v - expected: %v", test.testInfo, valueType, reflect.TypeOf(test.varDefineValue))
    80  			}
    81  		} else if valueType.String() != reflect.TypeOf(test.varDefineValue).String() {
    82  			t.Errorf("DefineType %v - Type check - received: %v - expected: %v", test.testInfo, valueType, reflect.TypeOf(test.varDefineValue))
    83  		}
    84  	}
    85  
    86  	// DefineType NewEnv
    87  	for _, test := range tests {
    88  		envParent := NewEnv()
    89  		envChild := envParent.NewEnv()
    90  
    91  		err = envParent.DefineType(test.varName, test.varDefineValue)
    92  		if err != nil && test.defineError != nil {
    93  			if err.Error() != test.defineError.Error() {
    94  				t.Errorf("DefineType NewEnv %v - Define error - received: %v - expected: %v", test.testInfo, err, test.defineError)
    95  				continue
    96  			}
    97  		} else if err != test.defineError {
    98  			t.Errorf("DefineType NewEnv %v - Define error - received: %v - expected: %v", test.testInfo, err, test.defineError)
    99  			continue
   100  		}
   101  
   102  		valueType, err = envChild.Type(test.varName)
   103  		if err != nil && test.typeError != nil {
   104  			if err.Error() != test.typeError.Error() {
   105  				t.Errorf("DefineType NewEnv %v - Type error - received: %v - expected: %v", test.testInfo, err, test.typeError)
   106  				continue
   107  			}
   108  		} else if err != test.typeError {
   109  			t.Errorf("DefineType NewEnv %v - Type error - received: %v - expected: %v", test.testInfo, err, test.typeError)
   110  			continue
   111  		}
   112  		if valueType == nil || test.varDefineValue == nil {
   113  			if valueType != reflect.TypeOf(test.varDefineValue) {
   114  				t.Errorf("DefineType NewEnv %v - Type check - received: %v - expected: %v", test.testInfo, valueType, reflect.TypeOf(test.varDefineValue))
   115  			}
   116  		} else if valueType.String() != reflect.TypeOf(test.varDefineValue).String() {
   117  			t.Errorf("DefineType NewEnv %v - Type check - received: %v - expected: %v", test.testInfo, valueType, reflect.TypeOf(test.varDefineValue))
   118  		}
   119  	}
   120  
   121  	// DefineType NewModule
   122  	for _, test := range tests {
   123  		envParent := NewEnv()
   124  		envChild, err := envParent.NewModule("envChild")
   125  		if err != nil {
   126  			t.Fatalf("DefineType NewModule %v - NewModule error - received: %v - expected: %v", test.testInfo, err, nil)
   127  		}
   128  
   129  		err = envParent.DefineType(test.varName, test.varDefineValue)
   130  		if err != nil && test.defineError != nil {
   131  			if err.Error() != test.defineError.Error() {
   132  				t.Errorf("DefineType NewModule %v - Define error - received: %v - expected: %v", test.testInfo, err, test.defineError)
   133  				continue
   134  			}
   135  		} else if err != test.defineError {
   136  			t.Errorf("DefineType NewModule %v - Define error - received: %v - expected: %v", test.testInfo, err, test.defineError)
   137  			continue
   138  		}
   139  
   140  		valueType, err = envChild.Type(test.varName)
   141  		if err != nil && test.typeError != nil {
   142  			if err.Error() != test.typeError.Error() {
   143  				t.Errorf("DefineType NewModule %v - Type error - received: %v - expected: %v", test.testInfo, err, test.typeError)
   144  				continue
   145  			}
   146  		} else if err != test.typeError {
   147  			t.Errorf("DefineType NewModule %v - Type error - received: %v - expected: %v", test.testInfo, err, test.typeError)
   148  			continue
   149  		}
   150  		if valueType == nil || test.varDefineValue == nil {
   151  			if valueType != reflect.TypeOf(test.varDefineValue) {
   152  				t.Errorf("DefineType NewModule %v - Type check - received: %v - expected: %v", test.testInfo, valueType, reflect.TypeOf(test.varDefineValue))
   153  			}
   154  		} else if valueType.String() != reflect.TypeOf(test.varDefineValue).String() {
   155  			t.Errorf("DefineType NewModule %v - Type check - received: %v - expected: %v", test.testInfo, valueType, reflect.TypeOf(test.varDefineValue))
   156  		}
   157  	}
   158  
   159  	// DefineGlobalType
   160  	for _, test := range tests {
   161  		envParent := NewEnv()
   162  		envChild := envParent.NewEnv()
   163  
   164  		err = envChild.DefineGlobalType(test.varName, test.varDefineValue)
   165  		if err != nil && test.defineError != nil {
   166  			if err.Error() != test.defineError.Error() {
   167  				t.Errorf("DefineGlobalType %v - Define error - received: %v - expected: %v", test.testInfo, err, test.defineError)
   168  				continue
   169  			}
   170  		} else if err != test.defineError {
   171  			t.Errorf("DefineGlobalType %v - Define error - received: %v - expected: %v", test.testInfo, err, test.defineError)
   172  			continue
   173  		}
   174  
   175  		valueType, err = envParent.Type(test.varName)
   176  		if err != nil && test.typeError != nil {
   177  			if err.Error() != test.typeError.Error() {
   178  				t.Errorf("DefineGlobalType %v - Type error - received: %v - expected: %v", test.testInfo, err, test.typeError)
   179  				continue
   180  			}
   181  		} else if err != test.typeError {
   182  			t.Errorf("DefineGlobalType %v - Type error - received: %v - expected: %v", test.testInfo, err, test.typeError)
   183  			continue
   184  		}
   185  		if valueType == nil || test.varDefineValue == nil {
   186  			if valueType != reflect.TypeOf(test.varDefineValue) {
   187  				t.Errorf("DefineGlobalType %v - Type check - received: %v - expected: %v", test.testInfo, valueType, reflect.TypeOf(test.varDefineValue))
   188  			}
   189  		} else if valueType.String() != reflect.TypeOf(test.varDefineValue).String() {
   190  			t.Errorf("DefineGlobalType %v - Type check - received: %v - expected: %v", test.testInfo, valueType, reflect.TypeOf(test.varDefineValue))
   191  		}
   192  
   193  		valueType, err = envChild.Type(test.varName)
   194  		if err != nil && test.typeError != nil {
   195  			if err.Error() != test.typeError.Error() {
   196  				t.Errorf("DefineGlobalType %v - Type error - received: %v - expected: %v", test.testInfo, err, test.typeError)
   197  				continue
   198  			}
   199  		} else if err != test.typeError {
   200  			t.Errorf("DefineGlobalType %v - Type error - received: %v - expected: %v", test.testInfo, err, test.typeError)
   201  			continue
   202  		}
   203  		if valueType == nil || test.varDefineValue == nil {
   204  			if valueType != reflect.TypeOf(test.varDefineValue) {
   205  				t.Errorf("DefineGlobalType %v - Type check - received: %v - expected: %v", test.testInfo, valueType, reflect.TypeOf(test.varDefineValue))
   206  			}
   207  		} else if valueType.String() != reflect.TypeOf(test.varDefineValue).String() {
   208  			t.Errorf("DefineGlobalType %v - Type check - received: %v - expected: %v", test.testInfo, valueType, reflect.TypeOf(test.varDefineValue))
   209  		}
   210  	}
   211  
   212  	// DefineGlobalReflectType
   213  	for _, test := range tests {
   214  		envParent := NewEnv()
   215  		envChild := envParent.NewEnv()
   216  
   217  		err = envChild.DefineGlobalReflectType(test.varName, reflect.TypeOf(test.varDefineValue))
   218  		if err != nil && test.defineError != nil {
   219  			if err.Error() != test.defineError.Error() {
   220  				t.Errorf("DefineGlobalReflectType %v - Define error - received: %v - expected: %v", test.testInfo, err, test.defineError)
   221  				continue
   222  			}
   223  		} else if err != test.defineError {
   224  			t.Errorf("DefineGlobalReflectType %v - Define error - received: %v - expected: %v", test.testInfo, err, test.defineError)
   225  			continue
   226  		}
   227  
   228  		valueType, err = envParent.Type(test.varName)
   229  		if err != nil && test.typeError != nil {
   230  			if err.Error() != test.typeError.Error() {
   231  				t.Errorf("DefineGlobalReflectType %v - Type error - received: %v - expected: %v", test.testInfo, err, test.typeError)
   232  				continue
   233  			}
   234  		} else if err != test.typeError {
   235  			t.Errorf("DefineGlobalReflectType %v - Type error - received: %v - expected: %v", test.testInfo, err, test.typeError)
   236  			continue
   237  		}
   238  		if valueType == nil || test.varDefineValue == nil {
   239  			if valueType != reflect.TypeOf(test.varDefineValue) {
   240  				t.Errorf("DefineGlobalReflectType %v - Type check - received: %v - expected: %v", test.testInfo, valueType, reflect.TypeOf(test.varDefineValue))
   241  			}
   242  		} else if valueType.String() != reflect.TypeOf(test.varDefineValue).String() {
   243  			t.Errorf("DefineGlobalReflectType %v - Type check - received: %v - expected: %v", test.testInfo, valueType, reflect.TypeOf(test.varDefineValue))
   244  		}
   245  
   246  		valueType, err = envChild.Type(test.varName)
   247  		if err != nil && test.typeError != nil {
   248  			if err.Error() != test.typeError.Error() {
   249  				t.Errorf("DefineGlobalReflectType %v - Type error - received: %v - expected: %v", test.testInfo, err, test.typeError)
   250  				continue
   251  			}
   252  		} else if err != test.typeError {
   253  			t.Errorf("DefineGlobalReflectType %v - Type error - received: %v - expected: %v", test.testInfo, err, test.typeError)
   254  			continue
   255  		}
   256  		if valueType == nil || test.varDefineValue == nil {
   257  			if valueType != reflect.TypeOf(test.varDefineValue) {
   258  				t.Errorf("DefineGlobalReflectType %v - Type check - received: %v - expected: %v", test.testInfo, valueType, reflect.TypeOf(test.varDefineValue))
   259  			}
   260  		} else if valueType.String() != reflect.TypeOf(test.varDefineValue).String() {
   261  			t.Errorf("DefineGlobalReflectType %v - Type check - received: %v - expected: %v", test.testInfo, valueType, reflect.TypeOf(test.varDefineValue))
   262  		}
   263  	}
   264  }
   265  
   266  func TestDefineTypeFail(t *testing.T) {
   267  	var err error
   268  	tests := []struct {
   269  		testInfo       string
   270  		varName        string
   271  		varDefineValue interface{}
   272  		defineError    error
   273  		typeError      error
   274  	}{
   275  		{testInfo: "nil", varName: "a", varDefineValue: nil, typeError: fmt.Errorf("undefined type 'a'")},
   276  		{testInfo: "bool", varName: "a", varDefineValue: true, typeError: fmt.Errorf("undefined type 'a'")},
   277  		{testInfo: "int16", varName: "a", varDefineValue: int16(1), typeError: fmt.Errorf("undefined type 'a'")},
   278  		{testInfo: "int32", varName: "a", varDefineValue: int32(1), typeError: fmt.Errorf("undefined type 'a'")},
   279  		{testInfo: "int64", varName: "a", varDefineValue: int64(1), typeError: fmt.Errorf("undefined type 'a'")},
   280  		{testInfo: "uint32", varName: "a", varDefineValue: uint32(1), typeError: fmt.Errorf("undefined type 'a'")},
   281  		{testInfo: "uint64", varName: "a", varDefineValue: uint64(1), typeError: fmt.Errorf("undefined type 'a'")},
   282  		{testInfo: "float32", varName: "a", varDefineValue: float32(1), typeError: fmt.Errorf("undefined type 'a'")},
   283  		{testInfo: "float64", varName: "a", varDefineValue: float64(1), typeError: fmt.Errorf("undefined type 'a'")},
   284  		{testInfo: "string", varName: "a", varDefineValue: "a", typeError: fmt.Errorf("undefined type 'a'")},
   285  	}
   286  
   287  	// DefineTypeFail
   288  	for _, test := range tests {
   289  		envParent := NewEnv()
   290  		envChild := envParent.NewEnv()
   291  
   292  		err = envChild.DefineType(test.varName, test.varDefineValue)
   293  		if err != nil && test.defineError != nil {
   294  			if err.Error() != test.defineError.Error() {
   295  				t.Errorf("TestDefineTypeFail %v - Define error - received: %v - expected: %v", test.testInfo, err, test.defineError)
   296  				continue
   297  			}
   298  		} else if err != test.defineError {
   299  			t.Errorf("TestDefineTypeFail %v - Define error - received: %v - expected: %v", test.testInfo, err, test.defineError)
   300  			continue
   301  		}
   302  
   303  		_, err = envParent.Type(test.varName)
   304  		if err != nil && test.typeError != nil {
   305  			if err.Error() != test.typeError.Error() {
   306  				t.Errorf("TestDefineTypeFail %v - Type error - received: %v - expected: %v", test.testInfo, err, test.typeError)
   307  				continue
   308  			}
   309  		} else if err != test.typeError {
   310  			t.Errorf("TestDefineTypeFail %v - Type error - received: %v - expected: %v", test.testInfo, err, test.typeError)
   311  		}
   312  	}
   313  }
   314  
   315  func TestGetTypeSymbols(t *testing.T) {
   316  	var symbols []string
   317  	values := map[string]interface{}{
   318  		"a": int64(1),
   319  		"b": float64(1),
   320  		"c": true,
   321  		"d": "a",
   322  	}
   323  
   324  	env := NewEnv()
   325  	for s, v := range values {
   326  		env.DefineType(s, v)
   327  	}
   328  
   329  	symbols = env.GetTypeSymbols()
   330  	if len(symbols) != len(values) {
   331  		t.Errorf("Expected %d symbols, received %d", len(values), len(symbols))
   332  	}
   333  
   334  	for _, symbol := range symbols {
   335  		_, ok := values[symbol]
   336  		if !ok {
   337  			t.Errorf("Missing %s symbol", symbol)
   338  		}
   339  	}
   340  }