var findTypeForExpression = $vm.findTypeForExpression;

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

let changeFoo;
let tdzError;
let scoping;
let scoping2;
function noop(){}

function wrapper() {
    class Animal {
        constructor() { }
        methodA() {}
    }
    class Dog extends Animal {
        constructor() { super() }
        methodB() {}
    }

    let dogInstance = new Dog;
    const animalInstance = new Animal;
}
wrapper();

// ====== End test cases ======

var types = findTypeForExpression(wrapper, "dogInstance =");
assert(types.globalTypeSet.displayTypeName === "Dog", "Should show constructor name");
assert(types.globalTypeSet.structures[0].constructorName === "Dog", "Should be Dog");
assert(types.globalTypeSet.structures[0].proto.fields.length === 2, "should have two fields");
assert(types.globalTypeSet.structures[0].proto.fields.indexOf("constructor") !== -1, "should have constructor");
assert(types.globalTypeSet.structures[0].proto.fields.indexOf("methodB") !== -1, "should have methodB");

types = findTypeForExpression(wrapper, "animalInstance =");
assert(types.globalTypeSet.displayTypeName === "Animal", "Should show constructor name");
assert(types.globalTypeSet.structures.length === 1, "should have one structure");
assert(types.globalTypeSet.structures[0].constructorName === "Animal", "Should be Animal");
assert(types.globalTypeSet.structures[0].proto.fields.length === 2, "should have two fields");
assert(types.globalTypeSet.structures[0].proto.fields.indexOf("constructor") !== -1, "should have constructor");
assert(types.globalTypeSet.structures[0].proto.fields.indexOf("methodA") !== -1, "should have methodA");
