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

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

import 'test_helper.dart';

class _TestClass {
  _TestClass(this.x, this.y);
  var x;
  var y;
}

var global;

void warmup() {
  global = new _TestClass(new _TestClass(1, 2), null);
}

eval(Isolate isolate, String expression) async {
  Map params = {
    'targetId': isolate.rootLibrary.id,
    'expression': expression,
  };
  return await isolate.invokeRpcNoUpgrade('evaluate', params);
}

var tests = <IsolateTest>[
  (Isolate isolate) async {
    var obj = await eval(isolate, 'global');
    var params = {
      'objectId': obj['class']['id'],
      'limit': 4,
    };
    var result = await isolate.invokeRpcNoUpgrade('getInstances', params);
    expect(result['type'], equals('InstanceSet'));
    expect(result['totalCount'], equals(2));
    expect(result['instances'].length, equals(2));
    expect(result['instances'][0]['type'], equals('@Instance'));

    // Limit is respected.
    params = {
      'objectId': obj['class']['id'],
      'limit': 1,
    };
    result = await isolate.invokeRpcNoUpgrade('getInstances', params);
    expect(result['type'], equals('InstanceSet'));
    expect(result['totalCount'], equals(2));
    expect(result['instances'].length, equals(1));
    expect(result['instances'][0]['type'], equals('@Instance'));

    // Try an object ID that isn't a class ID
    params = {
      'objectId': isolate.rootLibrary.id,
      'limit': 1,
    };
    try {
      await isolate.invokeRpcNoUpgrade('getInstances', params);
    } on ServerRpcException catch (_) {
      // Success.
    } catch (e) {
      fail('Failed with exception: $e');
    }
  },
];

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