@test
operation emptyToEmpty() {
  transform();
  assertEqualModels("Graph", "GraphExpected");
}

@test
operation oneNodeToRoot() {
  var t = newRoot('A');
  var g = new GraphExpected!Graph;
  g.newNode('A');
  transform();
  assertEqualModels("Graph", "GraphExpected");
}

@test
operation twoLevels() {
  var root = newRoot('A');
  root.newChild('B');
  root.newChild('C');

  var g = new GraphExpected!Graph;
  var gMain = g.newNode('A');
  gMain.newChild('B');
  gMain.newChild('C');

  transform();
  assertEqualModels("Graph", "GraphExpected");
}

operation newRoot(label : String) : Tree!Tree {
  var t = new Tree!Tree;
  t.label = label;
  return t;
}

operation Tree!Tree newChild(label : String) : Tree!Tree {
  var child = new Tree!Tree;
  child.label = label;
  child.parent = self;
  return child;
}

operation GraphExpected!Graph newNode(name : String) : GraphExpected!Node {
  var node = new GraphExpected!Node;
  node.name = name;
  self.nodes.add(node);
  return node;
}

operation GraphExpected!Node linkTo(target : GraphExpected!Node) : GraphExpected!Edge {
  var edge = new GraphExpected!Edge;
  edge.source = self;
  edge.target = target;
  return edge;
}

operation GraphExpected!Node newChild(label : String) : GraphExpected!Node {
  var node = self.eContainer.newNode(label);
  self.linkTo(node);
  return node;
}