|  | // 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. | 
|  | // | 
|  | // Dart test program for testing native float arrays. | 
|  |  | 
|  | // VMOptions=--optimization_counter_threshold=10 --no-background_compilation | 
|  |  | 
|  | // Library tag to be able to run in html test framework. | 
|  | library FloatArrayTest; | 
|  |  | 
|  | import "package:expect/expect.dart"; | 
|  | import 'dart:typed_data'; | 
|  |  | 
|  | void testCreateFloat32Array() { | 
|  | Float32List floatArray; | 
|  |  | 
|  | floatArray = new Float32List(0); | 
|  | Expect.equals(0, floatArray.length); | 
|  |  | 
|  | floatArray = new Float32List(10); | 
|  | Expect.equals(10, floatArray.length); | 
|  | for (int i = 0; i < 10; i++) { | 
|  | Expect.equals(0.0, floatArray[i]); | 
|  | } | 
|  | } | 
|  |  | 
|  | void testSetRange32() { | 
|  | Float32List floatArray = new Float32List(3); | 
|  |  | 
|  | List<double> list = [10.0, 11.0, 12.0]; | 
|  | floatArray.setRange(0, 3, list); | 
|  | for (int i = 0; i < 3; i++) { | 
|  | Expect.equals(10 + i, floatArray[i]); | 
|  | } | 
|  |  | 
|  | floatArray[0] = 20.0; | 
|  | floatArray[1] = 21.0; | 
|  | floatArray[2] = 22.0; | 
|  | list.setRange(0, 3, floatArray); | 
|  | for (int i = 0; i < 3; i++) { | 
|  | Expect.equals(20 + i, list[i]); | 
|  | } | 
|  |  | 
|  | // 4.0e40 is larger than the largest representable float. | 
|  | floatArray.setRange(1, 3, const [8.0, 4.0e40]); | 
|  | Expect.equals(20, floatArray[0]); | 
|  | Expect.equals(8, floatArray[1]); | 
|  | Expect.equals(double.infinity, floatArray[2]); | 
|  | } | 
|  |  | 
|  | void testIndexOutOfRange32() { | 
|  | Float32List floatArray = new Float32List(3); | 
|  | List<double> list = const [0.0, 1.0, 2.0, 3.0]; | 
|  |  | 
|  | Expect.throws(() { | 
|  | floatArray[5] = 2.0; | 
|  | }); | 
|  | Expect.throws(() { | 
|  | floatArray.setRange(0, 4, list); | 
|  | }); | 
|  |  | 
|  | Expect.throws(() { | 
|  | floatArray.setRange(3, 4, list); | 
|  | }); | 
|  | } | 
|  |  | 
|  | void testIndexOf32() { | 
|  | var list = new Float32List(10); | 
|  | for (int i = 0; i < list.length; i++) { | 
|  | list[i] = i + 10.0; | 
|  | } | 
|  | Expect.equals(0, list.indexOf(10.0)); | 
|  | Expect.equals(5, list.indexOf(15.0)); | 
|  | Expect.equals(9, list.indexOf(19.0)); | 
|  | Expect.equals(-1, list.indexOf(20.0)); | 
|  | } | 
|  |  | 
|  | void testCreateFloat64Array() { | 
|  | Float64List floatArray; | 
|  |  | 
|  | floatArray = new Float64List(0); | 
|  | Expect.equals(0, floatArray.length); | 
|  |  | 
|  | floatArray = new Float64List(10); | 
|  | Expect.equals(10, floatArray.length); | 
|  | for (int i = 0; i < 10; i++) { | 
|  | Expect.equals(0.0, floatArray[i]); | 
|  | } | 
|  | } | 
|  |  | 
|  | void testSetRange64() { | 
|  | Float64List floatArray = new Float64List(3); | 
|  |  | 
|  | List<double> list = [10.0, 11.0, 12.0]; | 
|  | floatArray.setRange(0, 3, list); | 
|  | for (int i = 0; i < 3; i++) { | 
|  | Expect.equals(10 + i, floatArray[i]); | 
|  | } | 
|  |  | 
|  | floatArray[0] = 20.0; | 
|  | floatArray[1] = 21.0; | 
|  | floatArray[2] = 22.0; | 
|  | list.setRange(0, 3, floatArray); | 
|  | for (int i = 0; i < 3; i++) { | 
|  | Expect.equals(20 + i, list[i]); | 
|  | } | 
|  |  | 
|  | // Unlike Float32Array we can properly represent 4.0e40 | 
|  | floatArray.setRange(1, 3, const [8.0, 4.0e40]); | 
|  | Expect.equals(20, floatArray[0]); | 
|  | Expect.equals(8, floatArray[1]); | 
|  | Expect.equals(4.0e40, floatArray[2]); | 
|  | } | 
|  |  | 
|  | void testIndexOutOfRange64() { | 
|  | Float64List floatArray = new Float64List(3); | 
|  | List<double> list = const [0.0, 1.0, 2.0, 3.0]; | 
|  |  | 
|  | Expect.throws(() { | 
|  | floatArray[5] = 2.0; | 
|  | }); | 
|  | Expect.throws(() { | 
|  | floatArray.setRange(0, 4, list); | 
|  | }); | 
|  |  | 
|  | Expect.throws(() { | 
|  | floatArray.setRange(3, 4, list); | 
|  | }); | 
|  | } | 
|  |  | 
|  | void testIndexOf64() { | 
|  | var list = new Float64List(10); | 
|  | for (int i = 0; i < list.length; i++) { | 
|  | list[i] = i + 10.0; | 
|  | } | 
|  | Expect.equals(0, list.indexOf(10.0)); | 
|  | Expect.equals(5, list.indexOf(15.0)); | 
|  | Expect.equals(9, list.indexOf(19.0)); | 
|  | Expect.equals(-1, list.indexOf(20.0)); | 
|  | } | 
|  |  | 
|  | storeIt32(Float32List a, int index, value) { | 
|  | a[index] = value; | 
|  | } | 
|  |  | 
|  | storeIt64(Float64List a, int index, value) { | 
|  | a[index] = value; | 
|  | } | 
|  |  | 
|  | testPolymorphicLoad(var list) { | 
|  | return list[0]; | 
|  | } | 
|  |  | 
|  | main() { | 
|  | var a32 = new Float32List(5); | 
|  | for (int i = 0; i < 20; i++) { | 
|  | testCreateFloat32Array(); | 
|  | testSetRange32(); | 
|  | testIndexOutOfRange32(); | 
|  | testIndexOf32(); | 
|  | storeIt32(a32, 1, 2.0); | 
|  | testPolymorphicLoad(a32); | 
|  | } | 
|  | var a64 = new Float64List(5); | 
|  | for (int i = 0; i < 20; i++) { | 
|  | testCreateFloat64Array(); | 
|  | testSetRange64(); | 
|  | testIndexOutOfRange64(); | 
|  | testIndexOf64(); | 
|  | storeIt64(a64, 1, 2.0); | 
|  | testPolymorphicLoad(a64); | 
|  | } | 
|  | var f32x4 = new Float32x4List(5); | 
|  | for (int i = 0; i < 20; i++) { | 
|  | testPolymorphicLoad(f32x4); | 
|  | } | 
|  |  | 
|  | // Check optimized (inlined) version of []= | 
|  | Expect.throws(() { | 
|  | storeIt32(a32, 1, 2); | 
|  | }); | 
|  | Expect.throws(() { | 
|  | storeIt64(a64, 1, 2); | 
|  | }); | 
|  | } |