| var findTypeForExpression = $vm.findTypeForExpression; |
| |
| load("./driver/driver.js"); |
| |
| var func; |
| function wrapper() { |
| |
| func = function(arg){}; |
| |
| } |
| wrapper(); |
| |
| // ====== End test cases ====== |
| |
| var obj = {x:20, y:50}; |
| |
| func(obj); |
| var types = findTypeForExpression(wrapper, "arg"); |
| assert(types.instructionTypeSet.structures.length === 1, "arg should have one structure"); |
| assert(types.instructionTypeSet.structures[0].fields.length === 2, "arg should have two fields"); |
| assert(types.instructionTypeSet.structures[0].fields.indexOf("x") !== -1, "arg should have field: 'x'"); |
| assert(types.instructionTypeSet.structures[0].fields.indexOf("y") !== -1, "arg should have field: 'y'"); |
| assert(types.instructionTypeSet.structures[0].optionalFields.length === 0, "arg should have zero optional fields"); |
| |
| obj.z = 40; |
| func(obj); |
| types = findTypeForExpression(wrapper, "arg"); |
| assert(types.instructionTypeSet.structures[0].fields.length === 2, "arg should still have two fields"); |
| assert(types.instructionTypeSet.structures[0].fields.indexOf("x") !== -1, "arg should have field: 'x'"); |
| assert(types.instructionTypeSet.structures[0].fields.indexOf("y") !== -1, "arg should have field: 'y'"); |
| assert(types.instructionTypeSet.structures[0].optionalFields.length === 1, "arg should have one optional field"); |
| assert(types.instructionTypeSet.structures[0].optionalFields.indexOf("z") !== -1, "arg should have optional field: 'z'"); |
| |
| obj["foo"] = "type"; |
| obj["baz"] = "profiler"; |
| func(obj); |
| types = findTypeForExpression(wrapper, "arg"); |
| assert(types.instructionTypeSet.structures[0].fields.length === 2, "arg should still have two fields"); |
| assert(types.instructionTypeSet.structures[0].fields.indexOf("x") !== -1, "arg should have field: 'x'"); |
| assert(types.instructionTypeSet.structures[0].fields.indexOf("y") !== -1, "arg should have field: 'y'"); |
| assert(types.instructionTypeSet.structures[0].optionalFields.length === 3, "arg should have three optional field"); |
| assert(types.instructionTypeSet.structures[0].optionalFields.indexOf("z") !== -1, "arg should have optional field: 'z'"); |
| assert(types.instructionTypeSet.structures[0].optionalFields.indexOf("foo") !== -1, "arg should have optional field: 'foo'"); |
| assert(types.instructionTypeSet.structures[0].optionalFields.indexOf("baz") !== -1, "arg should have optional field: 'baz'"); |
| |
| func({}); |
| types = findTypeForExpression(wrapper, "arg"); |
| assert(types.instructionTypeSet.structures[0].fields.length === 0, "arg should have no common fields"); |
| assert(types.instructionTypeSet.structures[0].optionalFields.length === 5, "arg should have five optional field"); |
| assert(types.instructionTypeSet.structures[0].optionalFields.indexOf("x") !== -1, "arg should have optional field: 'x'"); |
| assert(types.instructionTypeSet.structures[0].optionalFields.indexOf("y") !== -1, "arg should have optional field: 'y'"); |
| assert(types.instructionTypeSet.structures[0].optionalFields.indexOf("z") !== -1, "arg should have optional field: 'z'"); |
| assert(types.instructionTypeSet.structures[0].optionalFields.indexOf("foo") !== -1, "arg should have optional field: 'foo'"); |
| assert(types.instructionTypeSet.structures[0].optionalFields.indexOf("baz") !== -1, "arg should have optional field: 'baz'"); |