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: &notFoundRunErrorFunc},
   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  }