blob: 6528029859441422597345ac103ada44f5fdbfc2 [file] [log] [blame]
// 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);
});
}