// Copyright (c) 2012, 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

// VMOptions=--enable-isolate-groups --experimental-enable-isolate-groups-jit
// VMOptions=--no-enable-isolate-groups

library CountTest;

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

void countMessages(replyTo) {
  int count = 0;
  var port = new ReceivePort();
  replyTo.send(["init", port.sendPort]);
  port.listen((_message) {
    int message = _message;
    if (message == -1) {
      Expect.equals(count, 10);
      replyTo.send(["done"]);
      port.close();
      return;
    }
    count++;
    Expect.equals(message, count);
    replyTo.send(["count", message * 2]);
  });
}

void main([args, port]) {
  //testRemote(main, port);
  ReceivePort local = new ReceivePort();
  Isolate.spawn(countMessages, local.sendPort);
  SendPort remote;
  int count = 0;
  asyncStart();
  local.listen((msg) {
    switch (msg[0]) {
      case "init":
        Expect.equals(remote, null);
        remote = msg[1];
        remote.send(++count);
        break;
      case "count":
        Expect.equals(msg[1], count * 2);
        if (count == 10) {
          remote.send(-1);
        } else {
          remote.send(++count);
        }
        break;
      case "done":
        Expect.equals(count, 10);
        local.close();
        asyncEnd();
        break;
      default:
        Expect.fail("unreachable: ${msg[0]}");
    }
  });
}
