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

library implicit_getter_setter_test;

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

class A {
  double field = 0.0;
}

script() {
  for (int i = 0; i < 10; i++) {
    new A();
  }
}

testGetter(Isolate isolate) async {
  Library rootLibrary = await isolate.rootLibrary.load();
  expect(rootLibrary.classes.length, equals(1));
  Class classA = await rootLibrary.classes[0].load();
  expect(classA.name, equals('A'));
  // Find getter.
  ServiceFunction getterFunc;
  for (ServiceFunction function in classA.functions) {
    if (function.name == 'field') {
      getterFunc = function;
      break;
    }
  }
  expect(getterFunc, isNotNull);
  await getterFunc.load();
  Field field = await getterFunc.field.load();
  expect(field, isNotNull);
  expect(field.name, equals('field'));
  Class classDouble = await field.guardClass.load();
  expect(classDouble.name, equals('_Double'));
}


testSetter(Isolate isolate) async {
  Library rootLibrary = await isolate.rootLibrary.load();
  expect(rootLibrary.classes.length, equals(1));
  Class classA = await rootLibrary.classes[0].load();
  expect(classA.name, equals('A'));
  // Find setter.
  ServiceFunction setterFunc;
  for (ServiceFunction function in classA.functions) {
    if (function.name == 'field=') {
      setterFunc = function;
      break;
    }
  }
  expect(setterFunc, isNotNull);
  await setterFunc.load();
  Field field = await setterFunc.field.load();
  expect(field, isNotNull);
  expect(field.name, equals('field'));
  Class classDouble = await field.guardClass.load();
  expect(classDouble.name, equals('_Double'));
}


var tests = [testGetter, testSetter];

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