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

// @dart = 2.9

import 'dart:isolate';
import "package:expect/expect.dart";
import "package:async_helper/async_helper.dart";

// Test that StackTrace objects can be sent between isolates spawned from
// the same isolate using Isolate.spawn.

void main() {
  asyncStart();
  ReceivePort reply = new ReceivePort();
  Isolate.spawn(runTest, reply.sendPort);
  reply.first.then((pair) {
    StackTrace stack = pair[0];
    String stackString = pair[1];
    if (stack == null) {
      print("Failed to send stack-trace");
      print(stackString);
      Expect.fail("Sending stack-trace");
    }
    Expect.equals(stackString, "!$stack");
    print(stack);
    asyncEnd();
  });
}

runTest(SendPort sendport) {
  try {
    throw 'sorry';
  } catch (e, stack) {
    try {
      sendport.send([stack, "$stack"]);
      print("Stacktrace sent");
    } catch (e, s) {
      print("Stacktrace not sent");
      sendport.send([null, "$e\n$s"]);
    }
  }
}
