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");