| // 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 typed data. |
| |
| // @dart = 2.9 |
| |
| // VMOptions=--optimization_counter_threshold=10 --no-background_compilation |
| |
| // Library tag to be able to run in html test framework. |
| library TypedDataTest; |
| |
| import "package:expect/expect.dart"; |
| import 'dart:typed_data'; |
| |
| void testCreateUint8TypedData() { |
| Uint8List typed_data; |
| |
| typed_data = new Uint8List(0); |
| Expect.isTrue(typed_data is Uint8List); |
| Expect.isFalse(typed_data is Uint8ClampedList); |
| Expect.equals(0, typed_data.length); |
| |
| typed_data = new Uint8List(10); |
| Expect.equals(10, typed_data.length); |
| for (int i = 0; i < 10; i++) { |
| Expect.equals(0, typed_data[i]); |
| } |
| } |
| |
| void testCreateClampedUint8TypedData() { |
| Uint8ClampedList typed_data; |
| |
| typed_data = new Uint8ClampedList(0); |
| Expect.isTrue(typed_data is Uint8ClampedList); |
| Expect.isFalse(typed_data is Uint8List); |
| Expect.equals(0, typed_data.length); |
| Expect.equals(0, typed_data.lengthInBytes); |
| |
| typed_data = new Uint8ClampedList(10); |
| Expect.equals(10, typed_data.length); |
| for (int i = 0; i < 10; i++) { |
| Expect.equals(0, typed_data[i]); |
| } |
| } |
| |
| void testTypedDataRange(bool check_throws) { |
| Int8List typed_data; |
| typed_data = new Int8List(10); |
| typed_data[1] = 0; |
| Expect.equals(0, typed_data[1]); |
| typed_data[2] = -128; |
| Expect.equals(-128, typed_data[2]); |
| typed_data[3] = 127; |
| Expect.equals(127, typed_data[3]); |
| // This should eventually throw. |
| typed_data[0] = 128; |
| typed_data[4] = -129; |
| Expect.throws(() => typed_data[-1]); |
| Expect.throws(() => typed_data[100]); |
| } |
| |
| void testUnsignedTypedDataRange(bool check_throws) { |
| Uint8List typed_data; |
| typed_data = new Uint8List(10); |
| |
| typed_data[1] = 255; |
| Expect.equals(255, typed_data[1]); |
| typed_data[1] = 0; |
| Expect.equals(0, typed_data[1]); |
| |
| for (int i = 0; i < typed_data.length; i++) { |
| typed_data[i] = i; |
| } |
| for (int i = 0; i < typed_data.length; i++) { |
| Expect.equals(i, typed_data[i]); |
| } |
| |
| // These should eventually throw. |
| typed_data[1] = 256; |
| typed_data[1] = -1; |
| typed_data[2] = -129; |
| Expect.throws(() => typed_data[-1]); |
| Expect.throws(() => typed_data[100]); |
| } |
| |
| void testClampedUnsignedTypedDataRangeHelper( |
| Uint8ClampedList typed_data, bool check_throws) { |
| Uint8ClampedList typed_data; |
| typed_data = new Uint8ClampedList(10); |
| |
| typed_data[1] = 255; |
| Expect.equals(255, typed_data[1]); |
| typed_data[1] = 0; |
| Expect.equals(0, typed_data[1]); |
| for (int i = 0; i < typed_data.length; i++) { |
| typed_data[i] = i; |
| } |
| for (int i = 0; i < typed_data.length; i++) { |
| Expect.equals(i, typed_data[i]); |
| } |
| |
| // These should eventually throw. |
| typed_data[1] = 256; |
| typed_data[2] = -129; |
| Expect.equals(255, typed_data[1]); |
| Expect.equals(0, typed_data[2]); |
| } |
| |
| void testClampedUnsignedTypedDataRange(bool check_throws) { |
| testClampedUnsignedTypedDataRangeHelper( |
| new Uint8ClampedList(10), check_throws); |
| } |
| |
| void testSetRangeHelper(typed_data) { |
| List<int> list = [10, 11, 12]; |
| typed_data.setRange(0, 3, list); |
| for (int i = 0; i < 3; i++) { |
| Expect.equals(10 + i, typed_data[i]); |
| } |
| |
| typed_data[0] = 20; |
| typed_data[1] = 21; |
| typed_data[2] = 22; |
| list.setRange(0, 3, typed_data); |
| for (int i = 0; i < 3; i++) { |
| Expect.equals(20 + i, list[i]); |
| } |
| |
| typed_data.setRange(1, 3, const [8, 9]); |
| Expect.equals(20, typed_data[0]); |
| Expect.equals(8, typed_data[1]); |
| Expect.equals(9, typed_data[2]); |
| } |
| |
| void testSetRange() { |
| testSetRangeHelper(new Uint8List(3)); |
| testSetRangeHelper(new Uint8ClampedList(3)); |
| testSetRangeHelper(new Uint16List(3)); |
| testSetRangeHelper(new Int16List(3)); |
| |
| var list; |
| list = new Uint8List(4); |
| list.setRange(0, 4, "abcd".codeUnits, 0); |
| Expect.listEquals(list, "abcd".codeUnits); |
| list = new Uint16List(4); |
| list.setRange(0, 4, "abcd".codeUnits, 0); |
| Expect.listEquals(list, "abcd".codeUnits); |
| list.setRange(0, 4, "\xff\u0100\uffff\x00".codeUnits, 0); |
| Expect.listEquals(list, "\xff\u0100\uffff\x00".codeUnits); |
| list = new Int16List(4); |
| list.setRange(0, 4, "abcd".codeUnits, 0); |
| Expect.listEquals(list, "abcd".codeUnits); |
| list.setRange(0, 4, "\xff\u0100\u7fff\x00".codeUnits, 0); |
| Expect.listEquals(list, "\xff\u0100\u7fff\x00".codeUnits); |
| } |
| |
| class C { |
| final x; |
| C(this.x); |
| operator <(o) => false; |
| operator >=(o) => false; |
| operator *(o) => x; |
| } |
| |
| void testIndexOutOfRangeHelper(typed_data, value) { |
| List<int> list = new List<int>(typed_data.length + 1); |
| for (int i = 0; i < list.length; i++) list[i] = i; |
| |
| Expect.throws(() { |
| typed_data.setRange(0, 4, list); |
| }); |
| |
| Expect.throws(() { |
| typed_data.setRange(3, 4, list); |
| }); |
| |
| Expect.throws(() { |
| typed_data[new C(-4000000)] = value; |
| }); |
| |
| Expect.throws(() { |
| var size = typed_data.elementSizeInBytes; |
| var i = (typed_data.length - 1) * size + 1; |
| typed_data[new C(i)] = value; |
| }); |
| |
| Expect.throws(() { |
| typed_data[new C(-1)] = value; |
| }); |
| } |
| |
| void testIndexOutOfRange() { |
| testIndexOutOfRangeHelper(new Int8List(3), 0); |
| testIndexOutOfRangeHelper(new Uint8List(3), 0); |
| testIndexOutOfRangeHelper(new Uint8ClampedList(3), 0); |
| testIndexOutOfRangeHelper(new Int16List(3), 0); |
| testIndexOutOfRangeHelper(new Uint16List(3), 0); |
| testIndexOutOfRangeHelper(new Int32List(3), 0); |
| testIndexOutOfRangeHelper(new Uint32List(3), 0); |
| testIndexOutOfRangeHelper(new Int64List(3), 0); |
| testIndexOutOfRangeHelper(new Uint64List(3), 0); |
| testIndexOutOfRangeHelper(new Float32List(3), 0.0); |
| testIndexOutOfRangeHelper(new Float64List(3), 0.0); |
| testIndexOutOfRangeHelper(new Int64List(3), 0); |
| testIndexOutOfRangeHelper(new Uint64List(3), 0); |
| } |
| |
| void testNoNullValueLoopSetter(list, value) { |
| for (int i = 0; i < list.length; i++) { |
| list[i] = value; |
| } |
| } |
| |
| void testNoNullValueDirectSetter(list, value) { |
| list[0] = value; |
| list[1] = value; |
| list[2] = value; |
| } |
| |
| void testNoNullValueHelper(list, value) { |
| testNoNullValueLoopSetter(list, value + 1); |
| for (int i = 0; i < list.length; i++) { |
| Expect.equals(value + 1, list[i]); |
| } |
| testNoNullValueDirectSetter(list, value + 2); |
| for (int i = 0; i < list.length; i++) { |
| Expect.equals(value + 2, list[i]); |
| } |
| |
| Expect.throws(() { |
| testNoNullValueLoopSetter(list, null); |
| }); |
| |
| Expect.throws(() { |
| testNoNullValueDirectSetter(list, null); |
| }); |
| } |
| |
| void testNoNullValue() { |
| testNoNullValueHelper(new Int8List(3), 1); |
| testNoNullValueHelper(new Uint8List(3), 1); |
| testNoNullValueHelper(new Uint8ClampedList(3), 1); |
| testNoNullValueHelper(new Int16List(3), 1); |
| testNoNullValueHelper(new Uint16List(3), 1); |
| testNoNullValueHelper(new Int32List(3), 1); |
| testNoNullValueHelper(new Uint32List(3), 1); |
| testNoNullValueHelper(new Int64List(3), 1); |
| testNoNullValueHelper(new Uint64List(3), 1); |
| testNoNullValueHelper(new Float32List(3), 1.0); |
| testNoNullValueHelper(new Float64List(3), 1.0); |
| testNoNullValueHelper(new Int64List(3), 1); |
| testNoNullValueHelper(new Uint64List(3), 1); |
| } |
| |
| void testIndexOfHelper(list) { |
| for (int i = 0; i < list.length; i++) { |
| list[i] = i + 10; |
| } |
| Expect.equals(0, list.indexOf(10)); |
| Expect.equals(5, list.indexOf(15)); |
| Expect.equals(9, list.indexOf(19)); |
| Expect.equals(-1, list.indexOf(20)); |
| |
| 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 testIndexOf() { |
| testIndexOfHelper(new Uint8List(10)); |
| testIndexOfHelper(new Uint8ClampedList(10)); |
| } |
| |
| void testGetAtIndex(TypedData list, num initial_value) { |
| var bdata = new ByteData.view(list.buffer); |
| for (int i = 0; i < bdata.lengthInBytes; i++) { |
| Expect.equals(42, bdata.getUint8(i)); |
| Expect.equals(42, bdata.getInt8(i)); |
| } |
| for (int i = 0; i < bdata.lengthInBytes - 1; i += 2) { |
| Expect.equals(10794, bdata.getUint16(i, Endian.little)); |
| Expect.equals(10794, bdata.getInt16(i, Endian.little)); |
| } |
| for (int i = 0; i < bdata.lengthInBytes - 3; i += 4) { |
| Expect.equals(707406378, bdata.getUint32(i, Endian.little)); |
| Expect.equals(707406378, bdata.getInt32(i, Endian.little)); |
| Expect.equals(1.511366173271439e-13, bdata.getFloat32(i, Endian.little)); |
| } |
| for (int i = 0; i < bdata.lengthInBytes - 7; i += 8) { |
| Expect.equals(3038287259199220266, bdata.getUint64(i, Endian.little)); |
| Expect.equals(3038287259199220266, bdata.getInt64(i, Endian.little)); |
| Expect.equals(1.4260258159703532e-105, bdata.getFloat64(i, Endian.little)); |
| } |
| } |
| |
| void testSetAtIndex(List list, num initial_value, [bool use_double = false]) { |
| void validate([reinit = true]) { |
| for (int i = 0; i < list.length; i++) { |
| Expect.equals(initial_value, list[i]); |
| if (reinit) list[i] = use_double ? 0.0 : 0; |
| } |
| } |
| |
| var bdata = new ByteData.view((list as TypedData).buffer); |
| for (int i = 0; i < bdata.lengthInBytes; i++) { |
| bdata.setUint8(i, 42); |
| } |
| validate(); |
| for (int i = 0; i < bdata.lengthInBytes; i++) { |
| bdata.setInt8(i, 42); |
| } |
| validate(); |
| for (int i = 0; i < bdata.lengthInBytes - 1; i += 2) { |
| bdata.setUint16(i, 10794, Endian.little); |
| } |
| validate(); |
| for (int i = 0; i < bdata.lengthInBytes - 1; i += 2) { |
| bdata.setInt16(i, 10794, Endian.little); |
| } |
| validate(); |
| for (int i = 0; i < bdata.lengthInBytes - 3; i += 4) { |
| bdata.setUint32(i, 707406378, Endian.little); |
| } |
| validate(); |
| for (int i = 0; i < bdata.lengthInBytes - 3; i += 4) { |
| bdata.setInt32(i, 707406378, Endian.little); |
| } |
| validate(); |
| for (int i = 0; i < bdata.lengthInBytes - 3; i += 4) { |
| bdata.setFloat32(i, 1.511366173271439e-13, Endian.little); |
| } |
| validate(); |
| for (int i = 0; i < bdata.lengthInBytes - 7; i += 8) { |
| bdata.setUint64(i, 3038287259199220266, Endian.little); |
| } |
| validate(); |
| for (int i = 0; i < bdata.lengthInBytes - 7; i += 8) { |
| bdata.setInt64(i, 3038287259199220266, Endian.little); |
| } |
| validate(); |
| for (int i = 0; i < bdata.lengthInBytes - 7; i += 8) { |
| bdata.setFloat64(i, 1.4260258159703532e-105, Endian.little); |
| } |
| validate(false); |
| } |
| |
| testViewCreation() { |
| var bytes = new Uint8List(1024).buffer; |
| var view; |
| view = new ByteData.view(bytes, 24); |
| Expect.equals(1000, view.lengthInBytes); |
| view = new Uint8List.view(bytes, 24); |
| Expect.equals(1000, view.lengthInBytes); |
| view = new Int8List.view(bytes, 24); |
| Expect.equals(1000, view.lengthInBytes); |
| view = new Uint8ClampedList.view(bytes, 24); |
| Expect.equals(1000, view.lengthInBytes); |
| view = new Uint16List.view(bytes, 24); |
| Expect.equals(1000, view.lengthInBytes); |
| view = new Int16List.view(bytes, 24); |
| Expect.equals(1000, view.lengthInBytes); |
| view = new Uint32List.view(bytes, 24); |
| Expect.equals(1000, view.lengthInBytes); |
| view = new Int32List.view(bytes, 24); |
| Expect.equals(1000, view.lengthInBytes); |
| view = new Uint64List.view(bytes, 24); |
| Expect.equals(1000, view.lengthInBytes); |
| view = new Int64List.view(bytes, 24); |
| Expect.equals(1000, view.lengthInBytes); |
| view = new Float32List.view(bytes, 24); |
| Expect.equals(1000, view.lengthInBytes); |
| view = new Float64List.view(bytes, 24); |
| Expect.equals(1000, view.lengthInBytes); |
| view = new Int32x4List.view(bytes, 16); |
| Expect.equals(1008, view.lengthInBytes); // Must be 16-byte aligned. |
| view = new Float32x4List.view(bytes, 16); |
| Expect.equals(1008, view.lengthInBytes); |
| view = new Float64x2List.view(bytes, 16); |
| Expect.equals(1008, view.lengthInBytes); |
| |
| view = bytes.asByteData(24); |
| Expect.equals(1000, view.lengthInBytes); |
| view = bytes.asUint8List(24); |
| Expect.equals(1000, view.lengthInBytes); |
| view = bytes.asInt8List(24); |
| Expect.equals(1000, view.lengthInBytes); |
| view = bytes.asUint8ClampedList(24); |
| Expect.equals(1000, view.lengthInBytes); |
| view = bytes.asUint16List(24); |
| Expect.equals(1000, view.lengthInBytes); |
| view = bytes.asInt16List(24); |
| Expect.equals(1000, view.lengthInBytes); |
| view = bytes.asUint32List(24); |
| Expect.equals(1000, view.lengthInBytes); |
| view = bytes.asInt32List(24); |
| Expect.equals(1000, view.lengthInBytes); |
| view = bytes.asUint64List(24); |
| Expect.equals(1000, view.lengthInBytes); |
| view = bytes.asInt64List(24); |
| Expect.equals(1000, view.lengthInBytes); |
| view = bytes.asFloat32List(24); |
| Expect.equals(1000, view.lengthInBytes); |
| view = bytes.asFloat64List(24); |
| Expect.equals(1000, view.lengthInBytes); |
| view = bytes.asInt32x4List(16); |
| Expect.equals(1008, view.lengthInBytes); |
| view = bytes.asFloat32x4List(16); |
| Expect.equals(1008, view.lengthInBytes); |
| view = bytes.asFloat64x2List(16); |
| Expect.equals(1008, view.lengthInBytes); |
| |
| view = bytes.asByteData(24, 800); |
| Expect.equals(800, view.lengthInBytes); |
| view = bytes.asUint8List(24, 800); |
| Expect.equals(800, view.lengthInBytes); |
| view = bytes.asInt8List(24, 800); |
| Expect.equals(800, view.lengthInBytes); |
| view = bytes.asUint8ClampedList(24, 800); |
| Expect.equals(800, view.lengthInBytes); |
| view = bytes.asUint16List(24, 400); |
| Expect.equals(800, view.lengthInBytes); |
| view = bytes.asInt16List(24, 400); |
| Expect.equals(800, view.lengthInBytes); |
| view = bytes.asUint32List(24, 200); |
| Expect.equals(800, view.lengthInBytes); |
| view = bytes.asInt32List(24, 200); |
| Expect.equals(800, view.lengthInBytes); |
| view = bytes.asUint64List(24, 100); |
| Expect.equals(800, view.lengthInBytes); |
| view = bytes.asInt64List(24, 100); |
| Expect.equals(800, view.lengthInBytes); |
| view = bytes.asFloat32List(24, 200); |
| Expect.equals(800, view.lengthInBytes); |
| view = bytes.asFloat64List(24, 100); |
| Expect.equals(800, view.lengthInBytes); |
| view = bytes.asInt32x4List(32, 50); |
| Expect.equals(800, view.lengthInBytes); |
| view = bytes.asFloat32x4List(32, 50); |
| Expect.equals(800, view.lengthInBytes); |
| view = bytes.asFloat64x2List(32, 50); |
| Expect.equals(800, view.lengthInBytes); |
| } |
| |
| testWhere() { |
| var bytes = new Uint8List(13); |
| bytes.setRange(0, 5, [1, 1, 1, 1, 1]); |
| Expect.equals(5, bytes.where((v) => v > 0).length); |
| } |
| |
| testCreationFromList() { |
| var intList = [ |
| -1000000000000000000, |
| -255, |
| -127, |
| 0, |
| 128, |
| 256, |
| 1000000000000000000 |
| ]; |
| var intLists = []; |
| intLists.add(new Int8List.fromList(intList)); |
| intLists.add(new Int16List.fromList(intList)); |
| intLists.add(new Int32List.fromList(intList)); |
| intLists.add(new Int64List.fromList(intList)); |
| intLists.add(new Uint8List.fromList(intList)); |
| intLists.add(new Uint16List.fromList(intList)); |
| intLists.add(new Uint32List.fromList(intList)); |
| intLists.add(new Uint64List.fromList(intList)); |
| var doubleList = [ |
| -123123123123.123123123123, |
| -123.0, |
| 0.0, |
| 123.0, |
| 123123123123.123123123 |
| ]; |
| var doubleLists = []; |
| doubleLists.add(new Float32List.fromList(doubleList)); |
| doubleLists.add(new Float64List.fromList(doubleList)); |
| for (var ints in intLists) { |
| for (var doubles in doubleLists) { |
| Expect.throws(() => ints[0] = doubles[0]); |
| Expect.throws(() => doubles[0] = ints[0]); |
| } |
| } |
| } |
| |
| void testStrings() { |
| test(List<int> list) { |
| Uint16List uints = new Uint16List(list.length)..setAll(0, list); |
| String string = new String.fromCharCodes(list); |
| for (int i = 0; i < string.length; i++) { |
| for (int j = i; j < string.length; j++) { |
| int length = j - i; |
| { |
| Uint16List copy = new Uint16List(length); |
| copy.setRange(0, length, string.codeUnits, i); |
| Expect.listEquals(uints.sublist(i, j), copy); |
| } |
| { |
| Uint8List buffer = new Uint8List(length * 2 + 8); |
| Uint16List copy = new Uint16List.view(buffer.buffer, 4, length); |
| copy.setRange(0, length, string.codeUnits, i); |
| Expect.listEquals(uints.sublist(i, j), copy); |
| } |
| { |
| String copy = new String.fromCharCodes(uints, i, j); |
| Expect.equals(string.substring(i, j), copy); |
| } |
| } |
| } |
| } |
| |
| test([]); |
| test([0x00, 0x7f, 0xff]); |
| test([0x00, 0xdfff, 0xffff]); |
| test([0xd800, 0xdc00, 0x20, 0xdbff, 0xdfff]); |
| } |
| |
| main() { |
| for (int i = 0; i < 20; i++) { |
| testCreateUint8TypedData(); |
| testCreateClampedUint8TypedData(); |
| testTypedDataRange(false); |
| testUnsignedTypedDataRange(false); |
| testClampedUnsignedTypedDataRange(false); |
| testSetRange(); |
| testIndexOutOfRange(); |
| testNoNullValue(); |
| testIndexOf(); |
| |
| var int8list = new Int8List(128); |
| testSetAtIndex(int8list, 42); |
| testGetAtIndex(int8list, 42); |
| |
| var uint8list = new Uint8List(128); |
| testSetAtIndex(uint8list, 42); |
| testGetAtIndex(uint8list, 42); |
| |
| var int16list = new Int16List(64); |
| testSetAtIndex(int16list, 10794); |
| testGetAtIndex(int16list, 10794); |
| |
| var uint16list = new Uint16List(64); |
| testSetAtIndex(uint16list, 10794); |
| testGetAtIndex(uint16list, 10794); |
| |
| var int32list = new Int32List(32); |
| testSetAtIndex(int32list, 707406378); |
| testGetAtIndex(int32list, 707406378); |
| |
| var uint32list = new Uint32List(32); |
| testSetAtIndex(uint32list, 707406378); |
| testGetAtIndex(uint32list, 707406378); |
| |
| var int64list = new Int64List(16); |
| testSetAtIndex(int64list, 3038287259199220266); |
| testGetAtIndex(int64list, 3038287259199220266); |
| |
| var uint64list = new Uint64List(16); |
| testSetAtIndex(uint64list, 3038287259199220266); |
| testGetAtIndex(uint64list, 3038287259199220266); |
| |
| var float32list = new Float32List(32); |
| testSetAtIndex(float32list, 1.511366173271439e-13, true); |
| testGetAtIndex(float32list, 1.511366173271439e-13); |
| |
| var float64list = new Float64List(16); |
| testSetAtIndex(float64list, 1.4260258159703532e-105, true); |
| testGetAtIndex(float64list, 1.4260258159703532e-105); |
| } |
| testTypedDataRange(true); |
| testUnsignedTypedDataRange(true); |
| testViewCreation(); |
| testWhere(); |
| testCreationFromList(); |
| testStrings(); |
| testSetRange(); |
| } |