// 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

import 'package:observatory/service_io.dart';
import 'package:unittest/unittest.dart';
import 'test_helper.dart';

class Pair {
  var x, y;
}

var p1;
var p2;

buildGraph() {
  p1 = new Pair();
  p2 = new Pair();

  // Adds to both reachable and retained size.
  p1.x = new List();
  p2.x = new List();

  // Adds to reachable size only.
  p1.y = p2.y = new List();
}

getReachableSize(ServiceObject obj) {
  return obj.isolate.getReachableSize(obj).then((Instance obj) {
    return int.parse(obj.valueAsString);
  });
}

getRetainedSize(ServiceObject obj) {
  return obj.isolate.getRetainedSize(obj).then((Instance obj) {
    return int.parse(obj.valueAsString);
  });
}

var tests = [
(Isolate isolate) async {
  Instance p1 = await rootLibraryFieldValue(isolate, "p1");
  Instance p2 = await rootLibraryFieldValue(isolate, "p2");

  // In general, shallow <= retained <= reachable. In this program,
  // 0 < shallow < retained < reachable.

  int p1_shallow = p1.size;
  int p1_retained = await getRetainedSize(p1);
  int p1_reachable = await getReachableSize(p1);

  expect(0, lessThan(p1_shallow));
  expect(p1_shallow, lessThan(p1_retained));
  expect(p1_retained, lessThan(p1_reachable));

  int p2_shallow = p2.size;
  int p2_retained = await getRetainedSize(p2);
  int p2_reachable = await getReachableSize(p2);

  expect(0, lessThan(p2_shallow));
  expect(p2_shallow, lessThan(p2_retained));
  expect(p2_retained, lessThan(p2_reachable));

  expect(p1_shallow, equals(p2_shallow));
  expect(p1_retained, equals(p2_retained));
  expect(p1_reachable, equals(p2_reachable));
},
];

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