// 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/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 as LibraryMirror;

  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() as Library;
    Field keyField = lib.variables.singleWhere((v) => v.name == 'key');
    await keyField.load();
    Instance key = keyField.staticValue as Instance;
    Field valueField = lib.variables.singleWhere((v) => v.name == 'value');
    await valueField.load();
    Instance value = valueField.staticValue as Instance;
    Field propField =
        lib.variables.singleWhere((v) => v.name == 'weak_property');
    await propField.load();
    Instance prop = propField.staticValue as Instance;

    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() as Instance;
    // 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);
