// Copyright (c) 2021, 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 "test_helper.dart";

bool gotError = false;

var tests = <IsolateTest>[
  (Isolate isolate) async {
    Future<void> getInstancesAndExecuteExpression(Map member) async {
      final Map params = {
        "objectId": member["class"]["id"],
        "includeSubclasses": false,
        "includeImplementors": false,
      };
      final result = await isolate.invokeRpc("_getInstancesAsArray", params);
      // This has previously caused an exception like
      // "ServerRpcException(evaluate: Unexpected exception:
      // FormatException: Unexpected character (at offset 329)"
      final evalResult = await isolate.eval(result, "this");
      if (evalResult.isError) {
        gotError = true;
        final DartError error = evalResult as DartError;
        if (error.message
                ?.contains("Cannot evaluate against a VM-internal object") !=
            true) {
          throw "Got error $error but expected another message.";
        }
      }
    }

    final params = {};
    final result =
        await isolate.invokeRpcNoUpgrade('_getAllocationProfile', params);
    final List members = result['members'];
    for (var member in members) {
      final name = member["class"]["name"];
      if (name == "Library") {
        await getInstancesAndExecuteExpression(member);
      }
    }
    if (!gotError) {
      throw "Didn't get expected error!";
    }
  },
];

main(args) async => runIsolateTests(args, tests);
