// Copyright (c) 2013, 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
// VMOptions=--no-enable-isolate-groups
//
// Dart test program for testing typed data.

// Library tag to be able to run in html test framework.
library TypedDataIsolateTest;

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

second(message) {
  var data = message[0];
  var replyTo = message[1];
  try {
    print('got data');
    var rdata = new File(Platform.script.toFilePath()).readAsBytesSync();
    Expect.equals(data.length, rdata.length);
    for (int i = 0; i < data.length; i++) {
      Expect.equals(data[i], rdata[i]);
    }
    print('validated received data');
    replyTo.send('OK');
  } catch (e) {
    replyTo.send('Not OK');
  }
}

main() {
  var result = true;
  asyncStart();
  new File(Platform.script.toFilePath()).readAsBytes().then((List<int> data) {
    var response = new ReceivePort();
    var remote = Isolate.spawn(second, [data, response.sendPort]);
    response.first.then((reply) {
      print('got reply');
      result = (reply == 'OK');
      asyncEnd();
      Expect.isTrue(result);
    });
  });
}
