/*
 * 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.
 */
/**
 * @assertion Float32x4 scale(double s)
 * Returns a copy of this each lane being scaled by s. Equivalent to
 * this * new Float32x4.splat(s).
 *
 * Returns a copy of [this] each lane being scaled by [s].
 * @description Checks that the returned value contains corresponding lanes of
 * [this] scaled by [s].
 * @author msyabro
 */

import "dart:typed_data";
import "../../../Utils/expect.dart";

check(x, y, z, w, s) {
  var obj = new Float32x4(x,y,z,w);
  var res = obj.scale(s);
  Expect.approxEquals(obj.x * s, res.x, (res.x / 1e7).abs());
  Expect.approxEquals(obj.y * s, res.y, (res.y / 1e7).abs());
  Expect.approxEquals(obj.z * s, res.z, (res.z / 1e7).abs());
  Expect.approxEquals(obj.w * s, res.w, (res.w / 1e7).abs());
}

main() {
  check(1.0, 1.0, 1.0, 1.0, .0);
  check(1.0, 1.0, 1.0, 1.0, 1.0);
  check(2.0, 2.0, 2.0, 2.0, .5);
  check(0.5, 0.2, 10.5, 0.13, 1.12e-3);
  check(1e-10, 2.43e-14, 0.23e3, 9.31e18, 0.97e3);
}
