86 lines
4.2 KiB
JavaScript
86 lines
4.2 KiB
JavaScript
var findTypeForExpression = $vm.findTypeForExpression;
|
|
|
|
load("./driver/driver.js");
|
|
|
|
let changeFoo;
|
|
let tdzError;
|
|
let scoping;
|
|
let scoping2;
|
|
function noop(){}
|
|
function arr() {
|
|
return [1, 1.5, "hello", {}];
|
|
}
|
|
|
|
function wrapper() {
|
|
|
|
let foo=20;
|
|
changeFoo = function(arg) { foo = arg; }
|
|
|
|
scoping = function ()
|
|
{
|
|
let x = "hello";
|
|
if (true) {
|
|
let x = 20;
|
|
const y = true;
|
|
x = "h"
|
|
}
|
|
noop(x);
|
|
}
|
|
|
|
scoping2 = function()
|
|
{
|
|
for (const item of arr()) {
|
|
noop(item);
|
|
}
|
|
}
|
|
|
|
}
|
|
wrapper();
|
|
|
|
// ====== End test cases ======
|
|
|
|
var types = findTypeForExpression(wrapper, "foo=20;");
|
|
assert(types.instructionTypeSet.primitiveTypeNames.indexOf(T.Integer) !== -1, "Primitive type names should contain 'Integer'");
|
|
assert(types.globalTypeSet.primitiveTypeNames.indexOf(T.Integer) !== -1, "Primitive type names should contain 'Integer'");
|
|
assert(types.globalTypeSet.primitiveTypeNames.length === 1, "Primitive type names should contain exactly only one item globally");
|
|
assert(types.instructionTypeSet.primitiveTypeNames.length === 1, "Primitive type names should contain exactly only one item on the instruction");
|
|
assert(types.globalTypeSet.displayTypeName === T.Integer, "global display name should be Integer");
|
|
assert(types.instructionTypeSet.displayTypeName === T.Integer, "instruction display name should be Integer");
|
|
|
|
changeFoo(20.5);
|
|
types = findTypeForExpression(wrapper, "foo=20;");
|
|
assert(types.instructionTypeSet.primitiveTypeNames.indexOf(T.Integer) !== -1, "Primitive type names should contain 'Integer'");
|
|
assert(types.instructionTypeSet.primitiveTypeNames.length === 1, "Primitive type names should contain STILL only contain exactly one item on the instruction");
|
|
assert(types.globalTypeSet.primitiveTypeNames.indexOf(T.Integer) !== -1, "Global primitive type names should now still contain 'Integer'");
|
|
assert(types.globalTypeSet.primitiveTypeNames.indexOf(T.Number) !== -1, "Global primitive type names should now contain 'Number'");
|
|
assert(types.globalTypeSet.primitiveTypeNames.length === 2, "Global primitive type names should contain exactly two items globally");
|
|
assert(types.globalTypeSet.displayTypeName === T.Number, "global display name should be Number");
|
|
|
|
|
|
scoping();
|
|
types = findTypeForExpression(scoping, "x = 20");
|
|
assert(types.instructionTypeSet.primitiveTypeNames.indexOf(T.Integer) !== -1, "Primitive type names should contain 'Integer'");
|
|
assert(types.instructionTypeSet.primitiveTypeNames.length === 1, "Primitive type names should contain only one item on the instruction");
|
|
assert(types.globalTypeSet.primitiveTypeNames.indexOf(T.Integer) !== -1, "Primitive type names should contain 'Integer'");
|
|
assert(types.globalTypeSet.primitiveTypeNames.length === 2, "Primitive type names should contain two items: [String, Integer]");
|
|
|
|
types = findTypeForExpression(scoping, "x)");
|
|
assert(types.globalTypeSet.primitiveTypeNames.indexOf(T.String) !== -1, "Global primitive type names should have string.");
|
|
assert(types.instructionTypeSet.primitiveTypeNames.indexOf(T.String) !== -1, "Global primitive type names should have string.");
|
|
|
|
types = findTypeForExpression(scoping, "y = true");
|
|
assert(types.globalTypeSet.primitiveTypeNames.indexOf(T.Boolean) !== -1, "Global primitive type names should have boolean.");
|
|
assert(types.globalTypeSet.primitiveTypeNames.length === 1, "type only have one item.");
|
|
assert(types.instructionTypeSet.primitiveTypeNames.indexOf(T.Boolean) !== -1, "Global primitive type names should have boolean.");
|
|
assert(types.instructionTypeSet.primitiveTypeNames.length === 1, "type only have one item.");
|
|
|
|
|
|
scoping2();
|
|
types = findTypeForExpression(scoping2, "item)");
|
|
assert(types.instructionTypeSet.primitiveTypeNames.indexOf(T.Integer) !== -1, "Primitive type names should contain 'Integer'");
|
|
assert(types.instructionTypeSet.primitiveTypeNames.indexOf(T.Number) !== -1, "Primitive type names should contain 'Number'");
|
|
assert(types.instructionTypeSet.primitiveTypeNames.indexOf(T.String) !== -1, "Primitive type names should contain 'String'");
|
|
assert(types.instructionTypeSet.structures.length === 1, "should have one structure");
|
|
assert(types.instructionTypeSet.structures[0].constructorName === "Object", "Should be object");
|
|
assert(types.instructionTypeSet.structures[0].fields.length === 0, "Should have no fields");
|