var findTypeForExpression = $vm.findTypeForExpression;

load("./driver/driver.js");

function tierUpToDFG(func, arg) 
{
    for (var i = 0; i < 1000; i++)
        func(arg);
}

var types = [T.Boolean, T.Integer, T.Null, T.Number, T.String, T.Undefined];
var values = [true, 1, null, 1.1, "hello", undefined];
var funcs = [function(x) { return x; }, function(x) { return x; }, function(x) { return x; }, 
    function(x) { return x; }, function(x) { return x; }, function(x) { return x; }]

assert(types.length === values.length && values.length === funcs.length);

// Make sure baseline DFG type check optimizations work.
// Tier up each function on a different type, then call it with all other primitive types to make sure they're recorded.
for (var i = 0; i < types.length; i++) {
    var func = funcs[i];
    var type = types[i];
    var value = values[i];
    noInline(func);
    tierUpToDFG(func, value);
    var typeInfo = findTypeForExpression(func, "x"); 
    assert(typeInfo.instructionTypeSet.primitiveTypeNames.length === 1, "Only one primitive type should have been seen so far.");
    assert(typeInfo.instructionTypeSet.primitiveTypeNames.indexOf(type) !== -1, "Should have been optimized on type: " + type);
    for (var j = 0; j < types.length; j++) {
        if (type === T.Number && types[j] === T.Integer) {
            // If we optimize on type Number, but we pass in an Integer, our typecheck will still pass, so we wont directly get
            // type Integer because T.Integer is implied to be contained in T.Number.
            continue; 
        }

        func(values[j]);
        typeInfo = findTypeForExpression(func, "x");
        assert(typeInfo.instructionTypeSet.primitiveTypeNames.indexOf(types[j]) !== -1, "Should have seen type: " + types[j] + " " + i + "," + j);
    }
}

function testStrucure(obj) { return obj; }
var obj = {x: 20};
tierUpToDFG(testStrucure, obj);
var types = findTypeForExpression(testStrucure, "obj");
assert(types.instructionTypeSet.structures.length === 1, "variable 'test' should have exactly structure");
assert(types.instructionTypeSet.structures[0].fields.length === 1, "variable 'test' should have exactly ONE field");
assert(types.instructionTypeSet.structures[0].fields.indexOf("x") !== -1, "variable 'test' should have field 'x'");

testStrucure({x:20, y: 40})
types = findTypeForExpression(testStrucure, "obj");
assert(types.instructionTypeSet.structures.length === 1, "variable 'test' should have still have exactly one structure");
assert(types.instructionTypeSet.structures[0].fields.indexOf("x") !== -1, "variable 'test' should have field 'x'");
assert(types.instructionTypeSet.structures[0].optionalFields.indexOf("y") !== -1, "variable 'test' should have field optional field 'y'");
