2f86800724
* 1. adding more methods to enum module 2. added ModuleMap.AddMap() 3. added bytes iterator * add builtin functions 'is_enumerable' and 'is_array_like' * builtin function 'is_iterable' * first iteration on 'enum' module * fix 'is_iterable' builtin function
142 lines
9.3 KiB
Go
142 lines
9.3 KiB
Go
package runtime_test
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/d5/tengo/objects"
|
|
"github.com/d5/tengo/stdlib"
|
|
)
|
|
|
|
func TestSourceModules(t *testing.T) {
|
|
testEnumModule(t, `out = enum.key(0, 20)`, 0)
|
|
testEnumModule(t, `out = enum.key(10, 20)`, 10)
|
|
testEnumModule(t, `out = enum.value(0, 0)`, 0)
|
|
testEnumModule(t, `out = enum.value(10, 20)`, 20)
|
|
|
|
testEnumModule(t, `out = enum.all([], enum.value)`, true)
|
|
testEnumModule(t, `out = enum.all([1], enum.value)`, true)
|
|
testEnumModule(t, `out = enum.all([true, 1], enum.value)`, true)
|
|
testEnumModule(t, `out = enum.all([true, 0], enum.value)`, false)
|
|
testEnumModule(t, `out = enum.all([true, 0, 1], enum.value)`, false)
|
|
testEnumModule(t, `out = enum.all(immutable([true, 0, 1]), enum.value)`, false) // immutable-array
|
|
testEnumModule(t, `out = enum.all({}, enum.value)`, true)
|
|
testEnumModule(t, `out = enum.all({a:1}, enum.value)`, true)
|
|
testEnumModule(t, `out = enum.all({a:true, b:1}, enum.value)`, true)
|
|
testEnumModule(t, `out = enum.all(immutable({a:true, b:1}), enum.value)`, true) // immutable-map
|
|
testEnumModule(t, `out = enum.all({a:true, b:0}, enum.value)`, false)
|
|
testEnumModule(t, `out = enum.all({a:true, b:0, c:1}, enum.value)`, false)
|
|
testEnumModule(t, `out = enum.all(0, enum.value)`, objects.UndefinedValue) // non-enumerable: undefined
|
|
testEnumModule(t, `out = enum.all("123", enum.value)`, objects.UndefinedValue) // non-enumerable: undefined
|
|
|
|
testEnumModule(t, `out = enum.any([], enum.value)`, false)
|
|
testEnumModule(t, `out = enum.any([1], enum.value)`, true)
|
|
testEnumModule(t, `out = enum.any([true, 1], enum.value)`, true)
|
|
testEnumModule(t, `out = enum.any([true, 0], enum.value)`, true)
|
|
testEnumModule(t, `out = enum.any([true, 0, 1], enum.value)`, true)
|
|
testEnumModule(t, `out = enum.any(immutable([true, 0, 1]), enum.value)`, true) // immutable-array
|
|
testEnumModule(t, `out = enum.any([false], enum.value)`, false)
|
|
testEnumModule(t, `out = enum.any([false, 0], enum.value)`, false)
|
|
testEnumModule(t, `out = enum.any({}, enum.value)`, false)
|
|
testEnumModule(t, `out = enum.any({a:1}, enum.value)`, true)
|
|
testEnumModule(t, `out = enum.any({a:true, b:1}, enum.value)`, true)
|
|
testEnumModule(t, `out = enum.any({a:true, b:0}, enum.value)`, true)
|
|
testEnumModule(t, `out = enum.any({a:true, b:0, c:1}, enum.value)`, true)
|
|
testEnumModule(t, `out = enum.any(immutable({a:true, b:0, c:1}), enum.value)`, true) // immutable-map
|
|
testEnumModule(t, `out = enum.any({a:false}, enum.value)`, false)
|
|
testEnumModule(t, `out = enum.any({a:false, b:0}, enum.value)`, false)
|
|
testEnumModule(t, `out = enum.any(0, enum.value)`, objects.UndefinedValue) // non-enumerable: undefined
|
|
testEnumModule(t, `out = enum.any("123", enum.value)`, objects.UndefinedValue) // non-enumerable: undefined
|
|
|
|
testEnumModule(t, `out = enum.chunk([], 1)`, ARR{})
|
|
testEnumModule(t, `out = enum.chunk([1], 1)`, ARR{ARR{1}})
|
|
testEnumModule(t, `out = enum.chunk([1,2,3], 1)`, ARR{ARR{1}, ARR{2}, ARR{3}})
|
|
testEnumModule(t, `out = enum.chunk([1,2,3], 2)`, ARR{ARR{1, 2}, ARR{3}})
|
|
testEnumModule(t, `out = enum.chunk([1,2,3], 3)`, ARR{ARR{1, 2, 3}})
|
|
testEnumModule(t, `out = enum.chunk([1,2,3], 4)`, ARR{ARR{1, 2, 3}})
|
|
testEnumModule(t, `out = enum.chunk([1,2,3,4], 3)`, ARR{ARR{1, 2, 3}, ARR{4}})
|
|
testEnumModule(t, `out = enum.chunk([], 0)`, objects.UndefinedValue) // size=0: undefined
|
|
testEnumModule(t, `out = enum.chunk([1], 0)`, objects.UndefinedValue) // size=0: undefined
|
|
testEnumModule(t, `out = enum.chunk([1,2,3], 0)`, objects.UndefinedValue) // size=0: undefined
|
|
testEnumModule(t, `out = enum.chunk({a:1,b:2,c:3}, 1)`, objects.UndefinedValue) // map: undefined
|
|
testEnumModule(t, `out = enum.chunk(0, 1)`, objects.UndefinedValue) // non-enumerable: undefined
|
|
testEnumModule(t, `out = enum.chunk("123", 1)`, objects.UndefinedValue) // non-enumerable: undefined
|
|
|
|
testEnumModule(t, `out = enum.at([], 0)`, objects.UndefinedValue)
|
|
testEnumModule(t, `out = enum.at([], 1)`, objects.UndefinedValue)
|
|
testEnumModule(t, `out = enum.at([], -1)`, objects.UndefinedValue)
|
|
testEnumModule(t, `out = enum.at(["one"], 0)`, "one")
|
|
testEnumModule(t, `out = enum.at(["one"], 1)`, objects.UndefinedValue)
|
|
testEnumModule(t, `out = enum.at(["one"], -1)`, objects.UndefinedValue)
|
|
testEnumModule(t, `out = enum.at(["one","two","three"], 0)`, "one")
|
|
testEnumModule(t, `out = enum.at(["one","two","three"], 1)`, "two")
|
|
testEnumModule(t, `out = enum.at(["one","two","three"], 2)`, "three")
|
|
testEnumModule(t, `out = enum.at(["one","two","three"], -1)`, objects.UndefinedValue)
|
|
testEnumModule(t, `out = enum.at(["one","two","three"], 3)`, objects.UndefinedValue)
|
|
testEnumModule(t, `out = enum.at(["one","two","three"], "1")`, objects.UndefinedValue) // non-int index: undefined
|
|
testEnumModule(t, `out = enum.at({}, "a")`, objects.UndefinedValue)
|
|
testEnumModule(t, `out = enum.at({a:"one"}, "a")`, "one")
|
|
testEnumModule(t, `out = enum.at({a:"one"}, "b")`, objects.UndefinedValue)
|
|
testEnumModule(t, `out = enum.at({a:"one",b:"two",c:"three"}, "a")`, "one")
|
|
testEnumModule(t, `out = enum.at({a:"one",b:"two",c:"three"}, "b")`, "two")
|
|
testEnumModule(t, `out = enum.at({a:"one",b:"two",c:"three"}, "c")`, "three")
|
|
testEnumModule(t, `out = enum.at({a:"one",b:"two",c:"three"}, "d")`, objects.UndefinedValue)
|
|
testEnumModule(t, `out = enum.at({a:"one",b:"two",c:"three"}, 'a')`, objects.UndefinedValue) // non-string index: undefined
|
|
testEnumModule(t, `out = enum.at(0, 1)`, objects.UndefinedValue) // non-enumerable: undefined
|
|
testEnumModule(t, `out = enum.at("abc", 1)`, objects.UndefinedValue) // non-enumerable: undefined
|
|
|
|
testEnumModule(t, `out=0; enum.each([],func(k,v){out+=v})`, 0)
|
|
testEnumModule(t, `out=0; enum.each([1,2,3],func(k,v){out+=v})`, 6)
|
|
testEnumModule(t, `out=0; enum.each([1,2,3],func(k,v){out+=k})`, 3)
|
|
testEnumModule(t, `out=0; enum.each({a:1,b:2,c:3},func(k,v){out+=v})`, 6)
|
|
testEnumModule(t, `out=""; enum.each({a:1,b:2,c:3},func(k,v){out+=k}); out=len(out)`, 3)
|
|
testEnumModule(t, `out=0; enum.each(5,func(k,v){out+=v})`, 0) // non-enumerable: no iteration
|
|
testEnumModule(t, `out=0; enum.each("123",func(k,v){out+=v})`, 0) // non-enumerable: no iteration
|
|
|
|
testEnumModule(t, `out = enum.filter([], enum.value)`, ARR{})
|
|
testEnumModule(t, `out = enum.filter([false,1,2], enum.value)`, ARR{1, 2})
|
|
testEnumModule(t, `out = enum.filter([false,1,0,2], enum.value)`, ARR{1, 2})
|
|
testEnumModule(t, `out = enum.filter({}, enum.value)`, objects.UndefinedValue) // non-array: undefined
|
|
testEnumModule(t, `out = enum.filter(0, enum.value)`, objects.UndefinedValue) // non-array: undefined
|
|
testEnumModule(t, `out = enum.filter("123", enum.value)`, objects.UndefinedValue) // non-array: undefined
|
|
|
|
testEnumModule(t, `out = enum.find([], enum.value)`, objects.UndefinedValue)
|
|
testEnumModule(t, `out = enum.find([0], enum.value)`, objects.UndefinedValue)
|
|
testEnumModule(t, `out = enum.find([1], enum.value)`, 1)
|
|
testEnumModule(t, `out = enum.find([false,0,undefined,1], enum.value)`, 1)
|
|
testEnumModule(t, `out = enum.find([1,2,3], enum.value)`, 1)
|
|
testEnumModule(t, `out = enum.find({}, enum.value)`, objects.UndefinedValue)
|
|
testEnumModule(t, `out = enum.find({a:0}, enum.value)`, objects.UndefinedValue)
|
|
testEnumModule(t, `out = enum.find({a:1}, enum.value)`, 1)
|
|
testEnumModule(t, `out = enum.find({a:false,b:0,c:undefined,d:1}, enum.value)`, 1)
|
|
//testEnumModule(t, `out = enum.find({a:1,b:2,c:3}, enum.value)`, 1)
|
|
testEnumModule(t, `out = enum.find(0, enum.value)`, objects.UndefinedValue) // non-enumerable: undefined
|
|
testEnumModule(t, `out = enum.find("123", enum.value)`, objects.UndefinedValue) // non-enumerable: undefined
|
|
|
|
testEnumModule(t, `out = enum.find_key([], enum.value)`, objects.UndefinedValue)
|
|
testEnumModule(t, `out = enum.find_key([0], enum.value)`, objects.UndefinedValue)
|
|
testEnumModule(t, `out = enum.find_key([1], enum.value)`, 0)
|
|
testEnumModule(t, `out = enum.find_key([false,0,undefined,1], enum.value)`, 3)
|
|
testEnumModule(t, `out = enum.find_key([1,2,3], enum.value)`, 0)
|
|
testEnumModule(t, `out = enum.find_key({}, enum.value)`, objects.UndefinedValue)
|
|
testEnumModule(t, `out = enum.find_key({a:0}, enum.value)`, objects.UndefinedValue)
|
|
testEnumModule(t, `out = enum.find_key({a:1}, enum.value)`, "a")
|
|
testEnumModule(t, `out = enum.find_key({a:false,b:0,c:undefined,d:1}, enum.value)`, "d")
|
|
//testEnumModule(t, `out = enum.find_key({a:1,b:2,c:3}, enum.value)`, "a")
|
|
testEnumModule(t, `out = enum.find_key(0, enum.value)`, objects.UndefinedValue) // non-enumerable: undefined
|
|
testEnumModule(t, `out = enum.find_key("123", enum.value)`, objects.UndefinedValue) // non-enumerable: undefined
|
|
|
|
testEnumModule(t, `out = enum.map([], enum.value)`, ARR{})
|
|
testEnumModule(t, `out = enum.map([1,2,3], enum.value)`, ARR{1, 2, 3})
|
|
testEnumModule(t, `out = enum.map([1,2,3], enum.key)`, ARR{0, 1, 2})
|
|
testEnumModule(t, `out = enum.map([1,2,3], func(k,v) { return v*2 })`, ARR{2, 4, 6})
|
|
testEnumModule(t, `out = enum.map({}, enum.value)`, ARR{})
|
|
testEnumModule(t, `out = enum.map({a:1}, func(k,v) { return v*2 })`, ARR{2})
|
|
testEnumModule(t, `out = enum.map(0, enum.value)`, objects.UndefinedValue) // non-enumerable: undefined
|
|
testEnumModule(t, `out = enum.map("123", enum.value)`, objects.UndefinedValue) // non-enumerable: undefined
|
|
}
|
|
|
|
func testEnumModule(t *testing.T, input string, expected interface{}) {
|
|
expect(t, `enum := import("enum"); `+input,
|
|
Opts().Module("enum", stdlib.SourceModules["enum"]),
|
|
expected)
|
|
}
|