// Copyright (c) 2014, 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 handle_error_test;

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

isomain1(replyPort) {
  RawReceivePort port = new RawReceivePort();
  port.handler = (v) {
    switch (v) {
      case 0:
        replyPort.send(42);
        break;
      case 1:
        throw new ArgumentError("whoops");
      case 2:
        throw new RangeError.value(37);
      case 3:
        port.close();
    }
  };
  replyPort.send(port.sendPort);
}

main() {
  asyncStart();
  RawReceivePort reply = new RawReceivePort(null);
  // Start paused so we have time to set up the error handler.
  Isolate.spawn(isomain1, reply.sendPort, paused: true).then((Isolate isolate) {
    isolate.setErrorsFatal(false);
    Stream errors = isolate.errors; // Broadcast stream, never a done message.
    late SendPort sendPort;
    late StreamSubscription subscription;
    int state = 0;
    reply.handler = (port) {
      sendPort = port;
      port.send(state);
      reply.handler = (v) {
        Expect.equals(0, state);
        Expect.equals(42, v);
        state++;
        sendPort.send(state);
      };
    };
    subscription = errors.listen(null, onError: (error, stack) {
      switch (state) {
        case 1:
          Expect.equals(new ArgumentError("whoops").toString(), "$error");
          state++;
          sendPort.send(state);
          break;
        case 2:
          Expect.equals(new RangeError.value(37).toString(), "$error");
          state++;
          sendPort.send(state);
          reply.close();
          subscription.cancel();
          asyncEnd();
          break;
        default:
          throw "Bad state for error: $state: $error";
      }
    });
    isolate.resume(isolate.pauseCapability!);
  });
}
