// Copyright (c) 2024, 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:math'; import 'dart:typed_data' show ByteData, Uint16List; import 'package:test/test.dart'; import 'package:vm_service/src/_stream_helpers.dart'; /// Writes the UTF-16 representation of [value] to [writeStream]. void _writeUtf16( WriteStream writeStream, String value, ) { final codeUnits = value.codeUnits; final bytesOfUtf16String = Uint16List.fromList(codeUnits).buffer.asUint8List(); writeStream.writeInteger(codeUnits.length); for (final byte in bytesOfUtf16String) { writeStream.writeByte(byte); } } void main() { test('byte', () { final write = WriteStream(); write.writeByte(11); write.writeByte(12); final read = ReadStream(write.chunks); expect(read.readByte(), 11); expect(read.readByte(), 12); }); test('float64', () { final write = WriteStream(); write.writeFloat64(-1.0); write.writeFloat64(pi); write.writeFloat64(10000000000); write.writeFloat64(-10000000000); final read = ReadStream(write.chunks); expect(read.readFloat64(), -1.0); expect(read.readFloat64(), pi); expect(read.readFloat64(), 10000000000); expect(read.readFloat64(), -10000000000); }); test('utf8', () { final write = WriteStream(chunkSizeBytes: 2); write.writeUtf8(''); write.writeUtf8('hello!'); write.writeUtf8('привет!'); write.writeUtf8('8026221482988239'); final read = ReadStream(write.chunks); expect(read.readUtf8(), ''); expect(read.readUtf8(), 'hello!'); expect(read.readUtf8(), 'привет!'); expect(read.readUtf8(), '8026221482988239'); }); test('utf16', () { // We previously had an alignment error involving the mishandling of // [ByteData.offsetInBytes], so we want this test to act as a regression // test against that. To accomplish this, we write two padding integers at // the start of each [WriteStream]. We later trim the first padding integer // away using [ByteData.sublistView] whenever we create a [ReadStream], and // we read the second padding integer using the created [ReadStream]. // Performing these operations puts the created [ReadStream] into a state // in which the regression we want to avoid used to manifest. final padding = 123; WriteStream write = WriteStream(chunkSizeBytes: 32); write.writeInteger(padding); write.writeInteger(padding); _writeUtf16(write, 'hello!'); ReadStream read = ReadStream([ByteData.sublistView(write.chunks.first, 1)]); expect(read.readInteger(), padding); expect(read.readUtf16(), 'hello!'); write = WriteStream(chunkSizeBytes: 32); write.writeInteger(padding); write.writeInteger(padding); _writeUtf16(write, 'привет!'); read = ReadStream([ByteData.sublistView(write.chunks.first, 1)]); expect(read.readInteger(), padding); expect(read.readUtf16(), 'привет!'); write = WriteStream(chunkSizeBytes: 64); write.writeInteger(padding); write.writeInteger(padding); _writeUtf16(write, '8026221482988239'); read = ReadStream([ByteData.sublistView(write.chunks.first, 1)]); expect(read.readInteger(), padding); expect(read.readUtf16(), '8026221482988239'); }); test('integer', () { const int maxValue = -1 >>> 1; const int minValue = -maxValue - 1; final write = WriteStream(chunkSizeBytes: 1); write.writeInteger(-1000000000); write.writeInteger(-1); write.writeInteger(0); write.writeInteger(1); write.writeInteger(10000000000); write.writeInteger(20000000000); write.writeInteger(1683218); write.writeInteger(maxValue); write.writeInteger(minValue); final read = ReadStream(write.chunks); expect(read.readInteger(), -1000000000); expect(read.readInteger(), -1); expect(read.readInteger(), 0); expect(read.readInteger(), 1); expect(read.readInteger(), 10000000000); expect(read.readInteger(), 20000000000); expect(read.readInteger(), 1683218); expect(read.readInteger(), maxValue); expect(read.readInteger(), minValue); }); }