// Copyright (c) 2013, 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 isolate_class_test;

import 'dart:async';
import 'test_helper.dart';
import 'package:expect/expect.dart';

class MethodTest extends VmServiceRequestHelper {
  MethodTest(port, id, functionId) :
      super('http://127.0.0.1:$port/isolates/$id/functions/$functionId');
  onRequestCompleted(Map reply) {
    Expect.equals('Function', reply['type']);
    Expect.equals('C.c', reply['name']);
    Expect.equals(false, reply['is_static']);
  }
}

class FunctionTest extends VmServiceRequestHelper {
  FunctionTest(port, id, functionId) :
      super('http://127.0.0.1:$port/isolates/$id/functions/$functionId');

  onRequestCompleted(Map reply) {
    Expect.equals('Function', reply['type']);
    Expect.equals('a', reply['name']);
    Expect.equals(true, reply['is_static']);
  }
}

class StackTraceTest extends VmServiceRequestHelper {
  StackTraceTest(port, id) :
      super('http://127.0.0.1:$port/isolates/$id/stacktrace');

  int _aId;
  int _cId;
  onRequestCompleted(Map reply) {
    Expect.equals('StackTrace', reply['type']);
    List members = reply['members'];
    Expect.equals('a', members[0]['name']);
    _aId = members[0]['function']['id'];
    Expect.equals('c', members[2]['name']);
    _cId = members[2]['function']['id'];
  }
}

class IsolateListTest extends VmServiceRequestHelper {
  IsolateListTest(port) : super('http://127.0.0.1:$port/isolates');

  int _isolateId;
  onRequestCompleted(Map reply) {
    IsolateListTester tester = new IsolateListTester(reply);
    tester.checkIsolateCount(2);
    tester.checkIsolateNameContains('isolate_stacktrace_command_script.dart');
    _isolateId = tester.checkIsolateNameContains('myIsolateName');
  }
}

main() {
  var process = new TestLauncher('isolate_stacktrace_command_script.dart');
  process.launch().then((port) {
    var test = new IsolateListTest(port);
    test.makeRequest().then((_) {
      var stackTraceTest =
          new StackTraceTest(port, test._isolateId);
      stackTraceTest.makeRequest().then((_) {
        var functionTest = new FunctionTest(port, test._isolateId,
                                            stackTraceTest._aId);
        functionTest.makeRequest().then((_) {
          var methodTest = new MethodTest(port, test._isolateId,
                                          stackTraceTest._cId);
          methodTest.makeRequest().then((_) {
            process.requestExit();
          });
        });
      });
    });
  });
}
