// 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 test program for testing native typed arrays, int64 and uint64 only.

// Library tag to be able to run in html test framework.
library TypedArray;
import "package:expect/expect.dart";
import 'package:async_helper/async_helper.dart';
import 'dart:async';
import 'dart:isolate';
import 'dart:typed_data';

main() {
  test(int64_receiver);
  test(uint64_receiver);
}

test(f) {
  asyncStart();
  return f().whenComplete(asyncEnd);
}

// Int64 array.
Int64List initInt64() {
  var int64 = new Int64List(2);
  int64[0] = 10000000;
  int64[1] = 100000000;
  return int64;
}
Int64List int64 = initInt64();

int64_receiver() {
  var response = new ReceivePort();
  var remote = Isolate.spawn(int64_sender, [int64.length, response.sendPort]);
  asyncStart();
  return response.first.then((a) {
    Expect.equals(int64.length, a.length);
    for (int i = 0; i < a.length; i++) {
      Expect.equals(int64[i], a[i]);
    }
    print("int64_receiver");
    asyncEnd();
  });
}

int64_sender(message) {
  var len = message[0];
  var r = message[1];
  Expect.equals(int64.length, len);
  var a = new Int64List(len);
  for (int i = 0; i < len; i++) {
    a[i] = int64[i];
  }
  r.send(a);
}


// Uint64 array.
Uint64List initUint64() {
  var uint64 = new Uint64List(2);
  uint64[0] = 0xffffffffffffffff;
  uint64[1] = 0x7fffffffffffffff;
  return uint64;
}
Uint64List uint64 = initUint64();

uint64_receiver() {
  var response = new ReceivePort();
  var remote = Isolate.spawn(uint64_sender, [uint64.length, response.sendPort]);
  asyncStart();
  return response.first.then((a) {
    Expect.equals(uint64.length, a.length);
    for (int i = 0; i < a.length; i++) {
      Expect.equals(uint64[i], a[i]);
    }
    print("uint64_receiver");
    asyncEnd();
  });
}

uint64_sender(message) {
  var len = message[0];
  var r = message[1];
  Expect.equals(uint64.length, len);
  var a = new Uint64List(len);
  for (int i = 0; i < len; i++) {
    a[i] = uint64[i];
  }
  r.send(a);
}
