// Copyright (c) 2014, 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.

library vm_references_test;

import 'dart:mirrors';
import 'package:observatory_2/service_io.dart';
import 'package:test/test.dart';
import 'test_helper.dart';

class Foo {}

class Bar {}

var expando;
var key;
var value;
var weak_property;

void script() {
  expando = new Expando('some debug name');
  key = new Foo();
  value = new Bar();
  expando[key] = value;

  InstanceMirror expandoMirror = reflect(expando);
  LibraryMirror libcore = expandoMirror.type.owner;

  var entries = expandoMirror
      .getField(MirrorSystem.getSymbol('_data', libcore))
      .reflectee;
  weak_property = entries.singleWhere((e) => e != null);
  print(weak_property);
}

var tests = <IsolateTest>[
  (Isolate isolate) async {
    Library lib = await isolate.rootLibrary.load();
    Field keyField = lib.variables.singleWhere((v) => v.name == 'key');
    await keyField.load();
    Instance key = keyField.staticValue;
    Field valueField = lib.variables.singleWhere((v) => v.name == 'value');
    await valueField.load();
    Instance value = valueField.staticValue;
    Field propField =
        lib.variables.singleWhere((v) => v.name == 'weak_property');
    await propField.load();
    Instance prop = propField.staticValue;

    expect(key.isWeakProperty, isFalse);
    expect(value.isWeakProperty, isFalse);
    expect(prop.isWeakProperty, isTrue);
    expect(prop.key, isNull);
    expect(prop.value, isNull);
    Instance loadedProp = await prop.load();
    // Object ids are not canonicalized, so we rely on the key and value
    // being the sole instances of their classes to test we got the objects
    // we expect.
    expect(loadedProp.key, isNotNull);
    expect(loadedProp.key.clazz, equals(key.clazz));
    expect(loadedProp.value, isNotNull);
    expect(loadedProp.value.clazz, equals(value.clazz));
  },
];

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