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

// VMOptions=--no-enable-fast-object-copy
// VMOptions=--enable-fast-object-copy

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]}");
    }
  });
}
