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

import 'dart:html';
import 'dart:typed_data';

import 'package:expect/minitest.dart';

const _FLOATING_POINT_ERROR = 0.0000000001;
floatEquals(value) => closeTo(value, _FLOATING_POINT_ERROR);

class MyFloat32x4 {
  num x = 0.0;
  num y = 0.0;
  num z = 0.0;
  num w = 0.0;
}

main() {
  // Only perform tests if ArrayBuffer is supported.
  if (!Platform.supportsTypedData) {
    return;
  }

  test('test Float32x4', () {
      if (Platform.supportsSimd) {
	final val = new Float32x4(1.0, 2.0, 3.0, 4.0);
	expect(val.x, floatEquals(1.0));
	expect(val.y, floatEquals(2.0));
	expect(val.z, floatEquals(3.0));
	expect(val.w, floatEquals(4.0));
	final val2 = val + val;
	expect(val2.x, floatEquals(2.0));
	expect(val2.y, floatEquals(4.0));
	expect(val2.z, floatEquals(6.0));
	expect(val2.w, floatEquals(8.0));
      }
  });

  test('test Float32x4List', () {
      var counter;
      final list = new Float32List(12);
      for (int i = 0; i < list.length; ++i) {
	list[i] = i * 1.0;
      }
      if (Platform.supportsSimd) {
	counter = new Float32x4.zero();
	final simdlist = new Float32x4List.view(list.buffer);
	for (int i = 0; i < simdlist.length; ++i) {
	  counter += simdlist[i];
	}
      }	else {
	counter = new MyFloat32x4();
	for (int i = 0; i < list.length; i += 4) {
	  counter.x += list[i];
	  counter.y += list[i+1];
	  counter.z += list[i+2];
	  counter.w += list[i+3];
	}
      }
      expect(counter.x, floatEquals(12.0));
      expect(counter.y, floatEquals(15.0));
      expect(counter.z, floatEquals(18.0));
      expect(counter.w, floatEquals(21.0));
  });

  test('test Int32x4', () {
      if (Platform.supportsSimd) {
	final val = new Int32x4(1, 2, 3, 4);
	expect(val.x, equals(1));
	expect(val.y, equals(2));
	expect(val.z, equals(3));
	expect(val.w, equals(4));
	final val2 = val ^ val;
	expect(val2.x, equals(0));
	expect(val2.y, equals(0));
	expect(val2.z, equals(0));
	expect(val2.w, equals(0));
      }
  });
}
