// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// VMOptions=--error_on_bad_type --error_on_bad_override
// VMOptions=--use_compactor

import 'package:observatory/heap_snapshot.dart';
import 'package:observatory/models.dart' as M;
import 'package:observatory/service_io.dart';
import 'package:unittest/unittest.dart';
import 'test_helper.dart';

// small example from [Lenguaer & Tarjan 1979]
class R {
  var x;
  var y;
  var z;
}

class A {
  var x;
}

class B {
  var x;
  var y;
  var z;
}

class C {
  var x;
  var y;
}

class D {
  var x;
}

class E {
  var x;
}

class F {
  var x;
}

class G {
  var x;
  var y;
}

class H {
  var x;
  var y;
}

class I {
  var x;
}

class J {
  var x;
}

class K {
  var x;
  var y;
}

class L {
  var x;
}

var r;

buildGraph() {
  r = new R();
  var a = new A();
  var b = new B();
  var c = new C();
  var d = new D();
  var e = new E();
  var f = new F();
  var g = new G();
  var h = new H();
  var i = new I();
  var j = new J();
  var k = new K();
  var l = new L();

  r.x = a;
  r.y = b;
  r.z = c;
  a.x = d;
  b.x = a;
  b.y = d;
  b.z = e;
  c.x = f;
  c.y = g;
  d.x = l;
  e.x = h;
  f.x = i;
  g.x = i;
  g.y = j;
  h.x = e;
  h.y = k;
  i.x = k;
  j.x = i;
  k.x = i;
  k.y = r;
  l.x = h;
}

var tests = <IsolateTest>[
  (Isolate isolate) async {
    final Library rootLib = await isolate.rootLibrary.load();
    final raw =
        await isolate.fetchHeapSnapshot(M.HeapSnapshotRoots.user, false).last;
    final snapshot = new HeapSnapshot();
    await snapshot.loadProgress(isolate, raw).last;

    node(String className) {
      var cls = rootLib.classes.singleWhere((cls) => cls.name == className);
      return snapshot.graph.vertices.singleWhere((v) => v.vmCid == cls.vmCid);
    }

    expect(node('I').dominator, equals(node('R')));
    expect(node('K').dominator, equals(node('R')));
    expect(node('C').dominator, equals(node('R')));
    expect(node('H').dominator, equals(node('R')));
    expect(node('E').dominator, equals(node('R')));
    expect(node('A').dominator, equals(node('R')));
    expect(node('D').dominator, equals(node('R')));
    expect(node('B').dominator, equals(node('R')));

    expect(node('F').dominator, equals(node('C')));
    expect(node('G').dominator, equals(node('C')));
    expect(node('J').dominator, equals(node('G')));
    expect(node('L').dominator, equals(node('D')));

    expect(node('R'), isNotNull); // The field.
  },
];

main(args) => runIsolateTests(args, tests, testeeBefore: buildGraph);
