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

// @dart = 2.9

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.
    SendPort sendPort;
    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);
  });
}
