var SimpleObject = $vm.SimpleObject;
var setHiddenValue = $vm.setHiddenValue;

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

function excludeStructure(edges) {
    return edges.filter((x) => x.to.className !== "Structure");
}

let simpleObject1NodeId;
let simpleObject2NodeId;

let simpleObject1 = new SimpleObject;
let simpleObject2 = new SimpleObject;

(function() {
    let snapshot = createCheapHeapSnapshot();
    let nodes = snapshot.nodesWithClassName("SimpleObject");
    assert(nodes.length === 2, "Snapshot should contain 2 'SimpleObject' instances");
    let simpleObject1Node = nodes[0].outgoingEdges.length === 2 ? nodes[0] : nodes[1];
    let simpleObject2Node = nodes[0].outgoingEdges.length === 1 ? nodes[0] : nodes[1];
    assert(simpleObject1Node.outgoingEdges.length === 1, "'simpleObject1' should reference only its structure");
    assert(simpleObject2Node.outgoingEdges.length === 1, "'simpleObject2' should reference only its structure");
})();

setHiddenValue(simpleObject1, simpleObject2);

(function() {
    let snapshot = createCheapHeapSnapshot();
    let nodes = snapshot.nodesWithClassName("SimpleObject");
    assert(nodes.length === 2, "Snapshot should contain 2 'SimpleObject' instances");
    let simpleObject1Node = nodes[0].outgoingEdges.length === 2 ? nodes[0] : nodes[1];
    let simpleObject2Node = nodes[0].outgoingEdges.length === 1 ? nodes[0] : nodes[1];
    assert(simpleObject1Node.outgoingEdges.length === 2, "'simpleObject1' should reference its structure and hidden value");
    assert(simpleObject2Node.outgoingEdges.length === 1, "'simpleObject2' should reference only its structure");
    assert(excludeStructure(simpleObject1Node.outgoingEdges)[0].to.id === simpleObject2Node.id, "'simpleObject1' should reference 'simpleObject2'");
    simpleObject1NodeId = simpleObject1Node.id;
    simpleObject2NodeId = simpleObject2Node.id;
})();

simpleObject2 = null;

(function() {
    let snapshot = createCheapHeapSnapshot();
    let nodes = snapshot.nodesWithClassName("SimpleObject");
    assert(nodes.length === 2, "Snapshot should contain 2 'SimpleObject' instances");
    let simpleObject1Node = nodes[0].id === simpleObject1NodeId ? nodes[0] : nodes[1];
    let simpleObject2Node = nodes[0].id === simpleObject2NodeId ? nodes[0] : nodes[1];
    assert(simpleObject1Node.id === simpleObject1NodeId && simpleObject2Node.id === simpleObject2NodeId, "node identifiers were maintained");
    assert(simpleObject1Node.outgoingEdges.length === 2, "'simpleObject1' should reference its structure and hidden value");
    assert(simpleObject2Node.outgoingEdges.length === 1, "'simpleObject2' should reference only its structure");
    assert(excludeStructure(simpleObject1Node.outgoingEdges)[0].to.id === simpleObject2NodeId, "'simpleObject1' should reference 'simpleObject2'");
})();

simpleObject1 = null;

(function() {
    let snapshot = createCheapHeapSnapshot();
    let nodes = snapshot.nodesWithClassName("SimpleObject");
    assert(nodes.length === 0, "Snapshot should not contain a 'SimpleObject' instance");
})();
