
// @dart = 2.9
library IsolatesTest;

import 'package:async_helper/async_minitest.dart';
import 'dart:async';
import 'dart:html';
import 'dart:convert';
import 'dart:isolate' as isolate;

String responseFor(message) => 'response for $message';

void isolateEntry(isolate.SendPort initialReplyTo) {
  var port = new isolate.ReceivePort();
  initialReplyTo.send(port.sendPort);

  bool wasThrown = false;
  try {
    window.alert('Test');
  } catch (e) {
    wasThrown = true;
  }
  // If wasn't thrown, do not listen to messages to make test fail.
  if (!wasThrown) {
    return;
  }

  // Check that convert library was loaded to isolate.
  json.encode([1, 2, 3]);

  port.listen((message) {
    var data = message[0];
    var replyTo = message[1];
    replyTo.send(responseFor(data));
  });
}

Future sendReceive(isolate.SendPort port, msg) {
  var response = new isolate.ReceivePort();
  port.send([msg, response.sendPort]);
  return response.first;
}

main() {
  test('IsolateSpawn', () {
    var port = new isolate.ReceivePort();
    isolate.Isolate.spawn(isolateEntry, port.sendPort);
    port.close();
  });
  test('NonDOMIsolates', () {
    var callback = expectAsync(() {});
    var response = new isolate.ReceivePort();
    var remote = isolate.Isolate.spawn(isolateEntry, response.sendPort);
    response.first.then((port) {
      final msg1 = 'foo';
      final msg2 = 'bar';
      sendReceive(port, msg1).then((response) {
        expect(response, equals(responseFor(msg1)));
        sendReceive(port, msg2).then((response) {
          expect(response, equals(responseFor(msg2)));
          callback();
        });
      });
    });
  });
}
