github.com/mattn/anko@v0.1.10/core/testdata/core_test.go (about) 1 package core 2 3 import ( 4 "fmt" 5 "os" 6 "reflect" 7 "strings" 8 "testing" 9 10 "github.com/mattn/anko/packages" 11 "github.com/mattn/anko/vm" 12 ) 13 14 var testCoreEnvSetupFunc = func(t *testing.T, env corelib.Env) { Import(env.(*vm.Env)) } 15 16 func init() { 17 corelib.NewEnv = func() corelib.Env { 18 return vm.NewEnv() 19 } 20 } 21 22 func TestKeys(t *testing.T) { 23 os.Setenv("ANKO_DEBUG", "1") 24 tests := []testlib.Test{ 25 {Script: `a = {}; b = keys(a)`, RunOutput: []interface{}{}, Output: map[string]interface{}{"a": map[interface{}]interface{}{}}}, 26 {Script: `a = {"a": nil}; b = keys(a)`, RunOutput: []interface{}{"a"}, Output: map[string]interface{}{"a": map[interface{}]interface{}{"a": nil}}}, 27 {Script: `a = {"a": 1}; b = keys(a)`, RunOutput: []interface{}{"a"}, Output: map[string]interface{}{"a": map[interface{}]interface{}{"a": int64(1)}}}, 28 } 29 testlib.Run(t, tests, &testlib.Options{EnvSetupFunc: &testCoreEnvSetupFunc}) 30 } 31 32 func TestKindOf(t *testing.T) { 33 os.Setenv("ANKO_DEBUG", "1") 34 tests := []testlib.Test{ 35 {Script: `kindOf(a)`, Input: map[string]interface{}{"a": reflect.Value{}}, RunOutput: "struct", Output: map[string]interface{}{"a": reflect.Value{}}}, 36 {Script: `kindOf(a)`, Input: map[string]interface{}{"a": nil}, RunOutput: "nil", Output: map[string]interface{}{"a": nil}}, 37 {Script: `kindOf(a)`, Input: map[string]interface{}{"a": true}, RunOutput: "bool", Output: map[string]interface{}{"a": true}}, 38 {Script: `kindOf(a)`, Input: map[string]interface{}{"a": int32(1)}, RunOutput: "int32", Output: map[string]interface{}{"a": int32(1)}}, 39 {Script: `kindOf(a)`, Input: map[string]interface{}{"a": int64(1)}, RunOutput: "int64", Output: map[string]interface{}{"a": int64(1)}}, 40 {Script: `kindOf(a)`, Input: map[string]interface{}{"a": float32(1.1)}, RunOutput: "float32", Output: map[string]interface{}{"a": float32(1.1)}}, 41 {Script: `kindOf(a)`, Input: map[string]interface{}{"a": float64(1.1)}, RunOutput: "float64", Output: map[string]interface{}{"a": float64(1.1)}}, 42 {Script: `kindOf(a)`, Input: map[string]interface{}{"a": "a"}, RunOutput: "string", Output: map[string]interface{}{"a": "a"}}, 43 {Script: `kindOf(a)`, Input: map[string]interface{}{"a": 'a'}, RunOutput: "int32", Output: map[string]interface{}{"a": 'a'}}, 44 45 {Script: `kindOf(a)`, Input: map[string]interface{}{"a": interface{}(nil)}, RunOutput: "nil", Output: map[string]interface{}{"a": interface{}(nil)}}, 46 {Script: `kindOf(a)`, Input: map[string]interface{}{"a": interface{}(true)}, RunOutput: "bool", Output: map[string]interface{}{"a": interface{}(true)}}, 47 {Script: `kindOf(a)`, Input: map[string]interface{}{"a": interface{}(int32(1))}, RunOutput: "int32", Output: map[string]interface{}{"a": interface{}(int32(1))}}, 48 {Script: `kindOf(a)`, Input: map[string]interface{}{"a": interface{}(int64(1))}, RunOutput: "int64", Output: map[string]interface{}{"a": interface{}(int64(1))}}, 49 {Script: `kindOf(a)`, Input: map[string]interface{}{"a": interface{}(float32(1))}, RunOutput: "float32", Output: map[string]interface{}{"a": interface{}(float32(1))}}, 50 {Script: `kindOf(a)`, Input: map[string]interface{}{"a": interface{}(float64(1))}, RunOutput: "float64", Output: map[string]interface{}{"a": interface{}(float64(1))}}, 51 {Script: `kindOf(a)`, Input: map[string]interface{}{"a": interface{}("a")}, RunOutput: "string", Output: map[string]interface{}{"a": interface{}("a")}}, 52 53 {Script: `kindOf(a)`, Input: map[string]interface{}{"a": []interface{}{}}, RunOutput: "slice", Output: map[string]interface{}{"a": []interface{}{}}}, 54 {Script: `kindOf(a)`, Input: map[string]interface{}{"a": []interface{}{nil}}, RunOutput: "slice", Output: map[string]interface{}{"a": []interface{}{nil}}}, 55 56 {Script: `kindOf(a)`, Input: map[string]interface{}{"a": map[string]interface{}{}}, RunOutput: "map", Output: map[string]interface{}{"a": map[string]interface{}{}}}, 57 {Script: `kindOf(a)`, Input: map[string]interface{}{"a": map[string]interface{}{"b": "b"}}, RunOutput: "map", Output: map[string]interface{}{"a": map[string]interface{}{"b": "b"}}}, 58 59 {Script: `a = make(interface); kindOf(a)`, RunOutput: "nil", Output: map[string]interface{}{"a": interface{}(nil)}}, 60 } 61 testlib.Run(t, tests, &testlib.Options{EnvSetupFunc: &testCoreEnvSetupFunc}) 62 } 63 64 func TestRange(t *testing.T) { 65 os.Setenv("ANKO_DEBUG", "") 66 tests := []testlib.Test{ 67 // 0 arguments 68 {Script: `range()`, RunError: fmt.Errorf("range expected at least 1 argument, got 0")}, 69 // 1 arguments(step == 1, start == 0) 70 {Script: `range(-1)`, RunOutput: []int64{}}, 71 {Script: `range(0)`, RunOutput: []int64{}}, 72 {Script: `range(1)`, RunOutput: []int64{0}}, 73 {Script: `range(2)`, RunOutput: []int64{0, 1}}, 74 {Script: `range(10)`, RunOutput: []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}, 75 // 2 arguments(step == 1) 76 {Script: `range(-5,-1)`, RunOutput: []int64{-5, -4, -3, -2}}, 77 {Script: `range(-1,1)`, RunOutput: []int64{-1, 0}}, 78 {Script: `range(1,5)`, RunOutput: []int64{1, 2, 3, 4}}, 79 // 3 arguments 80 // step == 2 81 {Script: `range(-5,-1,2)`, RunOutput: []int64{-5, -3}}, 82 {Script: `range(1,5,2)`, RunOutput: []int64{1, 3}}, 83 {Script: `range(-1,5,2)`, RunOutput: []int64{-1, 1, 3}}, 84 // step < 0 and from small to large 85 {Script: `range(-5,-1,-1)`, RunOutput: []int64{}}, 86 {Script: `range(1,5,-1)`, RunOutput: []int64{}}, 87 {Script: `range(-1,5,-1)`, RunOutput: []int64{}}, 88 // step < 0 and from large to small 89 {Script: `range(-1,-5,-1)`, RunOutput: []int64{-1, -2, -3, -4}}, 90 {Script: `range(5,1,-1)`, RunOutput: []int64{5, 4, 3, 2}}, 91 {Script: `range(5,-1,-1)`, RunOutput: []int64{5, 4, 3, 2, 1, 0}}, 92 // 4,5 arguments 93 {Script: `range(1,5,1,1)`, RunError: fmt.Errorf("range expected at most 3 arguments, got 4")}, 94 {Script: `range(1,5,1,1,1)`, RunError: fmt.Errorf("range expected at most 3 arguments, got 5")}, 95 // more 0 test 96 {Script: `range(0,1,2)`, RunOutput: []int64{0}}, 97 {Script: `range(1,0,2)`, RunOutput: []int64{}}, 98 {Script: `range(1,2,0)`, RunError: fmt.Errorf("range argument 3 must not be zero")}, 99 } 100 testlib.Run(t, tests, &testlib.Options{EnvSetupFunc: &testCoreEnvSetupFunc}) 101 } 102 103 func TestLoad(t *testing.T) { 104 os.Setenv("ANKO_DEBUG", "") 105 notFoundRunErrorFunc := func(t *testing.T, err error) { 106 if err == nil || !strings.HasPrefix(err.Error(), "open testdata/not-found.ank:") { 107 t.Errorf("load not-found.ank failed - received: %v", err) 108 } 109 } 110 tests := []testlib.Test{ 111 {Script: `load('testdata/test.ank'); X(1)`, RunOutput: int64(2)}, 112 {Script: `load('testdata/not-found.ank'); X(1)`, RunErrorFunc: ¬FoundRunErrorFunc}, 113 {Script: `load('testdata/broken.ank'); X(1)`, RunError: fmt.Errorf("syntax error")}, 114 } 115 testlib.Run(t, tests, &testlib.Options{EnvSetupFunc: &testCoreEnvSetupFunc}) 116 } 117 118 func TestAnk(t *testing.T) { 119 os.Setenv("ANKO_DEBUG", "") 120 var testEnvSetupFunc = func(t *testing.T, env corelib.Env) { 121 e := env.(*vm.Env) 122 Import(e) 123 packages.DefineImport(e) 124 } 125 tests := []testlib.Test{ 126 {Script: `load('testdata/testing.ank'); load('testdata/let.ank')`}, 127 {Script: `load('testdata/testing.ank'); load('testdata/toString.ank')`}, 128 {Script: `load('testdata/testing.ank'); load('testdata/op.ank')`}, 129 {Script: `load('testdata/testing.ank'); load('testdata/func.ank')`}, 130 {Script: `load('testdata/testing.ank'); load('testdata/len.ank')`}, 131 {Script: `load('testdata/testing.ank'); load('testdata/for.ank')`}, 132 {Script: `load('testdata/testing.ank'); load('testdata/switch.ank')`}, 133 {Script: `load('testdata/testing.ank'); load('testdata/if.ank')`}, 134 {Script: `load('testdata/testing.ank'); load('testdata/toBytes.ank')`}, 135 {Script: `load('testdata/testing.ank'); load('testdata/toRunes.ank')`}, 136 {Script: `load('testdata/testing.ank'); load('testdata/chan.ank')`}, 137 } 138 testlib.Run(t, tests, &testlib.Options{EnvSetupFunc: &testEnvSetupFunc}) 139 } 140 141 func TestDefined(t *testing.T) { 142 os.Setenv("ANKO_DEBUG", "") 143 tests := []testlib.Test{ 144 {Script: `var a = 1; defined("a")`, RunOutput: true}, 145 {Script: `defined("a")`, RunOutput: false}, 146 {Script: `func(){ var a = 1 }(); defined("a")`, RunOutput: false}, 147 } 148 testlib.Run(t, tests, &testlib.Options{EnvSetupFunc: &testCoreEnvSetupFunc}) 149 }