// 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_2/service_io.dart';
import 'package:test/test.dart';

import 'test_helper.dart';

class _TestClass {
  _TestClass(this.x, this.y);
  // Make sure these fields are not removed by the tree shaker.
  @pragma("vm:entry-point")
  var x;
  @pragma("vm:entry-point")
  var y;
}

var global;

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

@pragma("vm:entry-point")
getGlobal() => global;

invoke(Isolate isolate, String selector) async {
  Map params = {
    'targetId': isolate.rootLibrary.id,
    'selector': selector,
    'argumentIds': <String>[],
  };
  return await isolate.invokeRpcNoUpgrade('invoke', params);
}

var tests = <IsolateTest>[
  (Isolate isolate) async {
    var obj = await invoke(isolate, 'getGlobal');
    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);
