From 09351affed8eccc4b14612adc5325e0b96eec612 Mon Sep 17 00:00:00 2001 From: Matan Lurey Date: Wed, 11 Sep 2024 17:00:08 -0700 Subject: [PATCH 01/11] Migrate dart/observatory to package:test. --- testing/dart/observatory/shader_reload_test.dart | 2 +- testing/dart/observatory/skp_test.dart | 2 +- testing/dart/observatory/tracing_test.dart | 2 +- testing/dart/observatory/vmservice_methods_test.dart | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/testing/dart/observatory/shader_reload_test.dart b/testing/dart/observatory/shader_reload_test.dart index 734b36f559ea1..bcd70818fe7ab 100644 --- a/testing/dart/observatory/shader_reload_test.dart +++ b/testing/dart/observatory/shader_reload_test.dart @@ -5,7 +5,7 @@ import 'dart:developer' as developer; import 'dart:ui'; -import 'package:litetest/litetest.dart'; +import 'package:test/test.dart'; import 'package:vm_service/vm_service.dart' as vms; import 'package:vm_service/vm_service_io.dart'; diff --git a/testing/dart/observatory/skp_test.dart b/testing/dart/observatory/skp_test.dart index 6c2a1460f9f21..b63d46e21ccbd 100644 --- a/testing/dart/observatory/skp_test.dart +++ b/testing/dart/observatory/skp_test.dart @@ -8,7 +8,7 @@ import 'dart:developer' as developer; import 'dart:typed_data'; import 'dart:ui'; -import 'package:litetest/litetest.dart'; +import 'package:test/test.dart'; import 'package:vm_service/vm_service.dart' as vms; import 'package:vm_service/vm_service_io.dart'; diff --git a/testing/dart/observatory/tracing_test.dart b/testing/dart/observatory/tracing_test.dart index e62c0fce1e89d..8ad5f578138c4 100644 --- a/testing/dart/observatory/tracing_test.dart +++ b/testing/dart/observatory/tracing_test.dart @@ -7,7 +7,7 @@ import 'dart:convert' show base64Decode; import 'dart:developer' as developer; import 'dart:ui'; -import 'package:litetest/litetest.dart'; +import 'package:test/test.dart'; import 'package:vm_service/vm_service.dart' as vms; import 'package:vm_service/vm_service_io.dart'; import 'package:vm_service_protos/vm_service_protos.dart'; diff --git a/testing/dart/observatory/vmservice_methods_test.dart b/testing/dart/observatory/vmservice_methods_test.dart index 14fd20d2afcb1..34d2f3c9232ca 100644 --- a/testing/dart/observatory/vmservice_methods_test.dart +++ b/testing/dart/observatory/vmservice_methods_test.dart @@ -8,7 +8,7 @@ import 'dart:developer' as developer; import 'dart:typed_data'; import 'dart:ui' as ui; -import 'package:litetest/litetest.dart'; +import 'package:test/test.dart'; import 'package:vm_service/vm_service.dart' as vms; import 'package:vm_service/vm_service_io.dart'; From 857c13b1130b8321708977b9c0a0d9eed4cde13d Mon Sep 17 00:00:00 2001 From: Matan Lurey Date: Wed, 11 Sep 2024 17:33:23 -0700 Subject: [PATCH 02/11] Migrate more tests. --- testing/dart/canvas_test.dart | 166 ++++++++++----------- testing/dart/color_test.dart | 34 ++--- testing/dart/image_shader_test.dart | 44 ++---- testing/dart/observatory/tracing_test.dart | 7 +- testing/dart/serialized_test_suite.dart | 27 ---- testing/dart/spawn_test.dart | 7 +- testing/dart/task_order_test.dart | 2 +- 7 files changed, 109 insertions(+), 178 deletions(-) delete mode 100644 testing/dart/serialized_test_suite.dart diff --git a/testing/dart/canvas_test.dart b/testing/dart/canvas_test.dart index 8bc207a477988..53f7095513dba 100644 --- a/testing/dart/canvas_test.dart +++ b/testing/dart/canvas_test.dart @@ -8,8 +8,8 @@ import 'dart:math'; import 'dart:typed_data'; import 'dart:ui'; -import 'package:litetest/litetest.dart'; import 'package:path/path.dart' as path; +import 'package:test/test.dart'; import 'package:vector_math/vector_math_64.dart'; import 'goldens.dart'; @@ -189,7 +189,10 @@ void main() async { canvas.drawRawAtlas(image, Float32List(0), Float32List(0), Int32List(0), BlendMode.src, null, paint); canvas.drawRawAtlas(image, Float32List(0), Float32List(0), null, null, rect, paint); - expectAssertion(() => canvas.drawAtlas(image, [transform], [rect], [color], null, rect, paint)); + expect( + () => canvas.drawAtlas(image, [transform], [rect], [color], null, rect, paint), + throwsA(isA()), + ); }); test('Data lengths must match for drawAtlas methods', () async { @@ -208,15 +211,15 @@ void main() async { canvas.drawRawAtlas(image, Float32List(4), Float32List(4), Int32List(1), BlendMode.src, rect, paint); canvas.drawRawAtlas(image, Float32List(4), Float32List(4), null, null, rect, paint); - expectArgumentError(() => canvas.drawAtlas(image, [transform], [], [color], BlendMode.src, rect, paint)); - expectArgumentError(() => canvas.drawAtlas(image, [], [rect], [color], BlendMode.src, rect, paint)); - expectArgumentError(() => canvas.drawAtlas(image, [transform], [rect], [color, color], BlendMode.src, rect, paint)); - expectArgumentError(() => canvas.drawAtlas(image, [transform], [rect, rect], [color], BlendMode.src, rect, paint)); - expectArgumentError(() => canvas.drawAtlas(image, [transform, transform], [rect], [color], BlendMode.src, rect, paint)); - expectArgumentError(() => canvas.drawRawAtlas(image, Float32List(3), Float32List(3), null, null, rect, paint)); - expectArgumentError(() => canvas.drawRawAtlas(image, Float32List(4), Float32List(0), null, null, rect, paint)); - expectArgumentError(() => canvas.drawRawAtlas(image, Float32List(0), Float32List(4), null, null, rect, paint)); - expectArgumentError(() => canvas.drawRawAtlas(image, Float32List(4), Float32List(4), Int32List(2), BlendMode.src, rect, paint)); + expect(() => canvas.drawAtlas(image, [transform], [], [color], BlendMode.src, rect, paint), throwsArgumentError); + expect(() => canvas.drawAtlas(image, [], [rect], [color], BlendMode.src, rect, paint), throwsArgumentError); + expect(() => canvas.drawAtlas(image, [transform], [rect], [color, color], BlendMode.src, rect, paint), throwsArgumentError); + expect(() => canvas.drawAtlas(image, [transform], [rect, rect], [color], BlendMode.src, rect, paint), throwsArgumentError); + expect(() => canvas.drawAtlas(image, [transform, transform], [rect], [color], BlendMode.src, rect, paint), throwsArgumentError); + expect(() => canvas.drawRawAtlas(image, Float32List(3), Float32List(3), null, null, rect, paint), throwsArgumentError); + expect(() => canvas.drawRawAtlas(image, Float32List(4), Float32List(0), null, null, rect, paint), throwsArgumentError); + expect(() => canvas.drawRawAtlas(image, Float32List(0), Float32List(4), null, null, rect, paint), throwsArgumentError); + expect(() => canvas.drawRawAtlas(image, Float32List(4), Float32List(4), Int32List(2), BlendMode.src, rect, paint), throwsArgumentError); }); test('Canvas preserves perspective data in Matrix4', () async { @@ -489,7 +492,7 @@ void main() async { final ByteData dataSync = await drawOnCanvas(toImageImage); final ByteData data = await drawOnCanvas(toImageSyncImage); - expect(data, listEquals(dataSync)); + expect(data.buffer.asUint8List(), equals(dataSync.buffer.asUint8List())); }); test('Canvas.drawParagraph throws when Paragraph.layout was not called', () async { @@ -646,39 +649,6 @@ void main() async { await comparer.addGoldenImage(image, 'render_unordered_rects.png'); }); - Matcher closeToTransform(Float64List expected) => (dynamic v) { - Expect.type(v); - final Float64List value = v as Float64List; - expect(expected.length, equals(16)); - expect(value.length, equals(16)); - for (int r = 0; r < 4; r++) { - for (int c = 0; c < 4; c++) { - final double vActual = value[r*4 + c]; - final double vExpected = expected[r*4 + c]; - if ((vActual - vExpected).abs() > 1e-10) { - Expect.fail('matrix mismatch at $r, $c, $vActual not close to $vExpected'); - } - } - } - }; - - Matcher notCloseToTransform(Float64List expected) => (dynamic v) { - Expect.type(v); - final Float64List value = v as Float64List; - expect(expected.length, equals(16)); - expect(value.length, equals(16)); - for (int r = 0; r < 4; r++) { - for (int c = 0; c < 4; c++) { - final double vActual = value[r*4 + c]; - final double vExpected = expected[r*4 + c]; - if ((vActual - vExpected).abs() > 1e-10) { - return; - } - } - } - Expect.fail('$value is too close to $expected'); - }; - test('Canvas.translate affects canvas.getTransform', () async { final PictureRecorder recorder = PictureRecorder(); final Canvas canvas = Canvas(recorder); @@ -688,7 +658,7 @@ void main() async { expect(curMatrix, closeToTransform(matrix)); canvas.translate(10, 10); final Float64List newCurMatrix = canvas.getTransform(); - expect(newCurMatrix, notCloseToTransform(matrix)); + expect(newCurMatrix, isNot(closeToTransform(matrix))); expect(curMatrix, closeToTransform(matrix)); }); @@ -701,7 +671,7 @@ void main() async { expect(curMatrix, closeToTransform(matrix)); canvas.scale(10, 10); final Float64List newCurMatrix = canvas.getTransform(); - expect(newCurMatrix, notCloseToTransform(matrix)); + expect(newCurMatrix, isNot(closeToTransform(matrix))); expect(curMatrix, closeToTransform(matrix)); }); @@ -714,7 +684,7 @@ void main() async { expect(curMatrix, closeToTransform(matrix)); canvas.rotate(pi / 2); final Float64List newCurMatrix = canvas.getTransform(); - expect(newCurMatrix, notCloseToTransform(matrix)); + expect(newCurMatrix, isNot(closeToTransform(matrix))); expect(curMatrix, closeToTransform(matrix)); }); @@ -727,7 +697,7 @@ void main() async { expect(curMatrix, closeToTransform(matrix)); canvas.skew(10, 10); final Float64List newCurMatrix = canvas.getTransform(); - expect(newCurMatrix, notCloseToTransform(matrix)); + expect(newCurMatrix, isNot(closeToTransform(matrix))); expect(curMatrix, closeToTransform(matrix)); }); @@ -740,31 +710,10 @@ void main() async { expect(curMatrix, closeToTransform(matrix)); canvas.translate(10, 10); final Float64List newCurMatrix = canvas.getTransform(); - expect(newCurMatrix, notCloseToTransform(matrix)); + expect(newCurMatrix, isNot(closeToTransform(matrix))); expect(curMatrix, closeToTransform(matrix)); }); - Matcher closeToRect(Rect expected) => (dynamic v) { - Expect.type(v); - final Rect value = v as Rect; - expect(value.left, closeTo(expected.left, 1e-6)); - expect(value.top, closeTo(expected.top, 1e-6)); - expect(value.right, closeTo(expected.right, 1e-6)); - expect(value.bottom, closeTo(expected.bottom, 1e-6)); - }; - - Matcher notCloseToRect(Rect expected) => (dynamic v) { - Expect.type(v); - final Rect value = v as Rect; - if ((value.left - expected.left).abs() > 1e-6 || - (value.top - expected.top).abs() > 1e-6 || - (value.right - expected.right).abs() > 1e-6 || - (value.bottom - expected.bottom).abs() > 1e-6) { - return; - } - Expect.fail('$value is too close to $expected'); - }; - test('Canvas.clipRect affects canvas.getClipBounds', () async { void testRect(Rect clipRect, bool doAA) { final PictureRecorder recorder = PictureRecorder(); @@ -798,8 +747,8 @@ void main() async { canvas.save(); canvas.clipRect(const Rect.fromLTRB(0, 0, 15, 15)); // Both clip bounds have changed - expect(canvas.getLocalClipBounds(), notCloseToRect(clipExpandedBounds)); - expect(canvas.getDestinationClipBounds(), notCloseToRect(clipExpandedBounds)); + expect(canvas.getLocalClipBounds(), isNot(closeToRect(clipExpandedBounds))); + expect(canvas.getDestinationClipBounds(), isNot(closeToRect(clipExpandedBounds))); // Previous return values have not changed expect(initialLocalBounds, closeToRect(clipExpandedBounds)); expect(initialDestinationBounds, closeToRect(clipExpandedBounds)); @@ -881,8 +830,8 @@ void main() async { canvas.save(); canvas.clipRect(const Rect.fromLTRB(0, 0, 15, 15)); // Both clip bounds have changed - expect(canvas.getLocalClipBounds(), notCloseToRect(clipExpandedBounds)); - expect(canvas.getDestinationClipBounds(), notCloseToRect(clipExpandedBounds)); + expect(canvas.getLocalClipBounds(), isNot(closeToRect(clipExpandedBounds))); + expect(canvas.getDestinationClipBounds(), isNot(closeToRect(clipExpandedBounds))); // Previous return values have not changed expect(initialLocalBounds, closeToRect(clipExpandedBounds)); expect(initialDestinationBounds, closeToRect(clipExpandedBounds)); @@ -921,8 +870,8 @@ void main() async { canvas.save(); canvas.clipRect(const Rect.fromLTRB(0, 0, 15, 15), doAntiAlias: false); // Both clip bounds have changed - expect(canvas.getLocalClipBounds(), notCloseToRect(clipBounds)); - expect(canvas.getDestinationClipBounds(), notCloseToRect(clipBounds)); + expect(canvas.getLocalClipBounds(), isNot(closeToRect(clipBounds))); + expect(canvas.getDestinationClipBounds(), isNot(closeToRect(clipBounds))); // Previous return values have not changed expect(initialLocalBounds, closeToRect(clipBounds)); expect(initialDestinationBounds, closeToRect(clipBounds)); @@ -985,8 +934,8 @@ void main() async { canvas.save(); canvas.clipRect(const Rect.fromLTRB(0, 0, 15, 15)); // Both clip bounds have changed - expect(canvas.getLocalClipBounds(), notCloseToRect(clipExpandedBounds)); - expect(canvas.getDestinationClipBounds(), notCloseToRect(clipExpandedBounds)); + expect(canvas.getLocalClipBounds(), isNot(closeToRect(clipExpandedBounds))); + expect(canvas.getDestinationClipBounds(), isNot(closeToRect(clipExpandedBounds))); // Previous return values have not changed expect(initialLocalBounds, closeToRect(clipExpandedBounds)); expect(initialDestinationBounds, closeToRect(clipExpandedBounds)); @@ -1025,8 +974,8 @@ void main() async { canvas.save(); canvas.clipRect(const Rect.fromLTRB(0, 0, 15, 15), doAntiAlias: false); // Both clip bounds have changed - expect(canvas.getLocalClipBounds(), notCloseToRect(clipBounds)); - expect(canvas.getDestinationClipBounds(), notCloseToRect(clipBounds)); + expect(canvas.getLocalClipBounds(), isNot(closeToRect(clipBounds))); + expect(canvas.getDestinationClipBounds(), isNot(closeToRect(clipBounds))); // Previous return values have not changed expect(initialLocalBounds, closeToRect(clipBounds)); expect(initialDestinationBounds, closeToRect(clipBounds)); @@ -1300,7 +1249,6 @@ void main() async { final ByteData? data = await resultImage.toByteData(); if (data == null) { fail('Expected non-null byte data'); - return; } final int rgba = data.buffer.asUint32List()[0]; expect(rgba, 0xFF0000FF); @@ -1315,11 +1263,51 @@ Future createTestImage() async { return picture.toImage(1, 1); } -Matcher listEquals(ByteData expected) => (dynamic v) { - Expect.type(v); - final ByteData value = v as ByteData; - expect(value.lengthInBytes, expected.lengthInBytes); - for (int i = 0; i < value.lengthInBytes; i++) { - expect(value.getUint8(i), expected.getUint8(i)); +Matcher closeToRect(Rect rect) => _CloseToRectMatcher(rect); +final class _CloseToRectMatcher extends Matcher { + const _CloseToRectMatcher(this._expectedRect); + final Rect _expectedRect; + + @override + bool matches(Object? item, Map matchState) { + if (item is! Rect) { + return false; + } + return (item.left - _expectedRect.left).abs() < 1e-6 && + (item.top - _expectedRect.top).abs() < 1e-6 && + (item.right - _expectedRect.right).abs() < 1e-6 && + (item.bottom - _expectedRect.bottom).abs() < 1e-6; + } + + @override + Description describe(Description description) { + return description.add('Rect is close to $_expectedRect'); + } +} + +Matcher closeToTransform(Float64List expected) => _CloseToTransformMatcher(expected); +final class _CloseToTransformMatcher extends Matcher { + _CloseToTransformMatcher(this._expected); + final Float64List _expected; + + @override + bool matches(Object? item, Map matchState) { + if (item is! Float64List) { + return false; + } + if (item.length != 16 || _expected.length != 16) { + return false; + } + for (int i = 0; i < 16; i++) { + if ((item[i] - _expected[i]).abs() > 1e-10) { + return false; + } + } + return true; } -}; + + @override + Description describe(Description description) { + return description.add('Transform is close to $_expected'); + } +} diff --git a/testing/dart/color_test.dart b/testing/dart/color_test.dart index 56e8766f103b2..763339ae00b90 100644 --- a/testing/dart/color_test.dart +++ b/testing/dart/color_test.dart @@ -4,16 +4,12 @@ import 'dart:ui'; -import 'package:litetest/litetest.dart'; +import 'package:test/test.dart'; class NotAColor extends Color { const NotAColor(super.value); } -Matcher approxEquals(dynamic o) => (v) { - Expect.approxEquals(o as num, v as num); -}; - void main() { test('color accessors should work', () { const Color foo = Color(0x12345678); @@ -45,9 +41,9 @@ void main() { test('two colors are only == if they have the same runtime type', () { expect(const Color(0x12345678), equals(const Color(0x12345678))); expect(const Color(0x12345678), equals(Color(0x12345678))); // ignore: prefer_const_constructors - expect(const Color(0x12345678), notEquals(const Color(0x87654321))); - expect(const Color(0x12345678), notEquals(const NotAColor(0x12345678))); - expect(const NotAColor(0x12345678), notEquals(const Color(0x12345678))); + expect(const Color(0x12345678), isNot(const Color(0x87654321))); + expect(const Color(0x12345678), isNot(const NotAColor(0x12345678))); + expect(const NotAColor(0x12345678), isNot(const Color(0x12345678))); expect(const NotAColor(0x12345678), equals(const NotAColor(0x12345678))); }); @@ -244,9 +240,9 @@ void main() { alpha: 1, red: 1, green: 0, blue: 0, colorSpace: ColorSpace.displayP3); final Color srgb = p3.withValues(colorSpace: ColorSpace.extendedSRGB); expect(srgb.a, equals(1.0)); - expect(srgb.r, approxEquals(1.0931)); - expect(srgb.g, approxEquals(-0.22684034705162098)); - expect(srgb.b, approxEquals(-0.15007957816123998)); + expect(srgb.r, closeTo(1.0931, 1e-4)); + expect(srgb.g, closeTo(-0.22684034705162098, 1e-4)); + expect(srgb.b, closeTo(-0.15007957816123998, 1e-4)); expect(srgb.colorSpace, equals(ColorSpace.extendedSRGB)); }); @@ -255,9 +251,9 @@ void main() { alpha: 1, red: 1, green: 0, blue: 0, colorSpace: ColorSpace.displayP3); final Color srgb = p3.withValues(colorSpace: ColorSpace.sRGB); expect(srgb.a, equals(1.0)); - expect(srgb.r, approxEquals(1)); - expect(srgb.g, approxEquals(0)); - expect(srgb.b, approxEquals(0)); + expect(srgb.r, closeTo(1, 1e-4)); + expect(srgb.g, closeTo(0, 1e-4)); + expect(srgb.b, closeTo(0, 1e-4)); expect(srgb.colorSpace, equals(ColorSpace.sRGB)); }); @@ -270,9 +266,9 @@ void main() { colorSpace: ColorSpace.extendedSRGB); final Color p3 = srgb.withValues(colorSpace: ColorSpace.displayP3); expect(p3.a, equals(1.0)); - expect(p3.r, approxEquals(1)); - expect(p3.g, approxEquals(0)); - expect(p3.b, approxEquals(0)); + expect(p3.r, closeTo(1, 1e-4)); + expect(p3.g, closeTo(0, 1e-4)); + expect(p3.b, closeTo(0, 1e-4)); expect(p3.colorSpace, equals(ColorSpace.displayP3)); }); @@ -298,7 +294,7 @@ void main() { alpha: 1, red: 1, green: 0, blue: 0); const Color p3 = Color.from( alpha: 1, red: 1, green: 0, blue: 0, colorSpace: ColorSpace.displayP3); - expect(srgb.hashCode, notEquals(p3.hashCode)); + expect(srgb.hashCode, isNot(p3.hashCode)); }); test('equality considers colorspace', () { @@ -306,7 +302,7 @@ void main() { alpha: 1, red: 1, green: 0, blue: 0); const Color p3 = Color.from( alpha: 1, red: 1, green: 0, blue: 0, colorSpace: ColorSpace.displayP3); - expect(srgb, notEquals(p3)); + expect(srgb, isNot(p3)); }); // Regression test for https://github.com/flutter/flutter/issues/41257 diff --git a/testing/dart/image_shader_test.dart b/testing/dart/image_shader_test.dart index 6124e5746d5ab..27e9eb0d27d0d 100644 --- a/testing/dart/image_shader_test.dart +++ b/testing/dart/image_shader_test.dart @@ -5,16 +5,11 @@ import 'dart:typed_data'; import 'dart:ui'; -import 'package:litetest/litetest.dart'; +import 'package:test/test.dart'; + import 'canvas_test.dart' show createImage, testCanvas; void main() { - bool assertsEnabled = false; - assert(() { - assertsEnabled = true; - return true; - }()); - test('Construct an ImageShader', () async { final Image image = await createImage(50, 50); final ImageShader shader = ImageShader(image, TileMode.clamp, TileMode.clamp, Float64List(16)); @@ -22,13 +17,9 @@ void main() { const Rect rect = Rect.fromLTRB(0, 0, 100, 100); testCanvas((Canvas canvas) => canvas.drawRect(rect, paint)); - if (assertsEnabled) { - expect(shader.debugDisposed, false); - } + expect(shader.debugDisposed, false); shader.dispose(); - if (assertsEnabled) { - expect(shader.debugDisposed, true); - } + expect(shader.debugDisposed, true); image.dispose(); }); @@ -37,11 +28,10 @@ void main() { final Image image = await createImage(50, 50); image.dispose(); - if (assertsEnabled) { - expectAssertion(() => ImageShader(image, TileMode.clamp, TileMode.clamp, Float64List(16))); - } else { - throwsException(() => ImageShader(image, TileMode.clamp, TileMode.clamp, Float64List(16))); - } + expect( + () => ImageShader(image, TileMode.clamp, TileMode.clamp, Float64List(16)), + throwsA(isA()), + ); }); test('Disposed image shader in a paint', () async { @@ -49,15 +39,7 @@ void main() { final ImageShader shader = ImageShader(image, TileMode.clamp, TileMode.clamp, Float64List(16)); shader.dispose(); - if (assertsEnabled) { - expectAssertion(() => Paint()..shader = shader); - return; - } - final Paint paint = Paint()..shader = shader; - const Rect rect = Rect.fromLTRB(0, 0, 100, 100); - testCanvas((Canvas canvas) => canvas.drawRect(rect, paint)); - image.dispose(); - + expect(() => Paint()..shader = shader, throwsA(isA())); }); test('Construct an ImageShader - GPU image', () async { @@ -73,13 +55,9 @@ void main() { const Rect rect = Rect.fromLTRB(0, 0, 100, 100); testCanvas((Canvas canvas) => canvas.drawRect(rect, paint)); - if (assertsEnabled) { - expect(shader.debugDisposed, false); - } + expect(shader.debugDisposed, false); shader.dispose(); - if (assertsEnabled) { - expect(shader.debugDisposed, true); - } + expect(shader.debugDisposed, true); image.dispose(); }); diff --git a/testing/dart/observatory/tracing_test.dart b/testing/dart/observatory/tracing_test.dart index 8ad5f578138c4..4fe5751024c02 100644 --- a/testing/dart/observatory/tracing_test.dart +++ b/testing/dart/observatory/tracing_test.dart @@ -13,7 +13,6 @@ import 'package:vm_service/vm_service_io.dart'; import 'package:vm_service_protos/vm_service_protos.dart'; import '../impeller_enabled.dart'; -import '../serialized_test_suite.dart'; Future _testChromeFormatTrace(vms.VmService vmService) async { final vms.Timeline timeline = await vmService.getVMTimeline(); @@ -70,9 +69,7 @@ Future _testPerfettoFormatTrace(vms.VmService vmService) async { } void main() { - final SerializedTestSuite suite = SerializedTestSuite(); - - suite.test('Canvas.saveLayer emits tracing', () async { + test('Canvas.saveLayer emits tracing', () async { final developer.ServiceProtocolInfo info = await developer.Service.getInfo(); if (info.serverUri == null) { @@ -116,7 +113,7 @@ void main() { await vmService.dispose(); }); - suite.test('Frame request pending begin/end pairs are matched', () async { + test('Frame request pending begin/end pairs are matched', () async { final developer.ServiceProtocolInfo info = await developer.Service.getInfo(); if (info.serverUri == null) { diff --git a/testing/dart/serialized_test_suite.dart b/testing/dart/serialized_test_suite.dart deleted file mode 100644 index 416f599dfd532..0000000000000 --- a/testing/dart/serialized_test_suite.dart +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2013 The Flutter Authors. 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:async'; - -import 'package:litetest/litetest.dart' as litetest; - -// A group of tests that must be run without concurrency. -// This is useful for tests that modify global state. -class SerializedTestSuite { - Completer? _previousTestCompleter; - - void test(String name, Future Function() body) { - final Completer? lastTestCompleter = _previousTestCompleter; - final Completer currentTestCompleter = Completer(); - _previousTestCompleter = currentTestCompleter; - Future wrappedBody() async { - if (lastTestCompleter != null) { - await lastTestCompleter.future; - } - await body(); - currentTestCompleter.complete(); - } - litetest.test(name, wrappedBody); - } -} diff --git a/testing/dart/spawn_test.dart b/testing/dart/spawn_test.dart index a3f87b2a979b5..548cfe60aad95 100644 --- a/testing/dart/spawn_test.dart +++ b/testing/dart/spawn_test.dart @@ -7,7 +7,7 @@ import 'dart:isolate'; import 'dart:ui'; import 'package:ffi/ffi.dart'; -import 'package:litetest/litetest.dart'; +import 'package:test/test.dart'; // This import is used in a test, but not in a way that the analyzer can understand. // ignore: unused_import @@ -43,8 +43,7 @@ const String kTestEntrypointRouteName = 'testEntrypoint'; @pragma('vm:entry-point') void testEntrypoint() { - expect(PlatformDispatcher.instance.defaultRouteName, kTestEntrypointRouteName); - IsolateNameServer.lookupPortByName(kTestEntrypointRouteName)!.send(null); + IsolateNameServer.lookupPortByName(kTestEntrypointRouteName)!.send(PlatformDispatcher.instance.defaultRouteName); } void main() { @@ -54,7 +53,7 @@ void main() { test('Spawn a different entrypoint with a special route name', () async { final ReceivePort port = ReceivePort(); spawn(port: port.sendPort, entrypoint: 'testEntrypoint', route: kTestEntrypointRouteName); - expect(await port.first, isNull); + expect(await port.first, kTestEntrypointRouteName); port.close(); }); diff --git a/testing/dart/task_order_test.dart b/testing/dart/task_order_test.dart index 018c2bee857f4..b4fe2e090a442 100644 --- a/testing/dart/task_order_test.dart +++ b/testing/dart/task_order_test.dart @@ -4,7 +4,7 @@ import 'dart:async'; -import 'package:litetest/litetest.dart'; +import 'package:test/test.dart'; void main() { test('Message loop flushes microtasks between iterations', () async { From 1c2e46a504a7d6a3e207460fa399a4f1d111a5ae Mon Sep 17 00:00:00 2001 From: Matan Lurey Date: Wed, 11 Sep 2024 17:34:13 -0700 Subject: [PATCH 03/11] Moar tests. --- testing/dart/image_filter_test.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/testing/dart/image_filter_test.dart b/testing/dart/image_filter_test.dart index 0200d6f2d45cd..4ad33c0aa70f1 100644 --- a/testing/dart/image_filter_test.dart +++ b/testing/dart/image_filter_test.dart @@ -6,7 +6,7 @@ import 'dart:async'; import 'dart:typed_data'; import 'dart:ui'; -import 'package:litetest/litetest.dart'; +import 'package:test/test.dart'; import 'goldens.dart'; import 'impeller_enabled.dart'; @@ -133,9 +133,9 @@ void main() async { expect(a[i].hashCode, equals(b[j].hashCode)); expect(a[i].toString(), equals(b[j].toString())); } else { - expect(a[i], notEquals(b[j])); + expect(a[i], isNot(b[j])); // No expectations on hashCode if objects are not equal - expect(a[i].toString(), notEquals(b[j].toString())); + expect(a[i].toString(), isNot(b[j].toString())); } } } @@ -301,7 +301,7 @@ void main() async { }); // Tests that FilterQuality. produces the expected golden file. - group('ImageFilter|FilterQuality', () async { + group('ImageFilter|FilterQuality', () { /// Draw a red-green checkerboard pattern with 1x1 squares (pixels). Future drawCheckerboard({ int width = 100, From 0dc3d8e96f35d996afb8c650c7549d6e602b34aa Mon Sep 17 00:00:00 2001 From: Matan Lurey Date: Wed, 11 Sep 2024 17:42:24 -0700 Subject: [PATCH 04/11] ++ --- flutter_frontend_server/test/to_string_test.dart | 4 ++-- testing/dart/fragment_shader_test.dart | 2 +- testing/run_tests.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/flutter_frontend_server/test/to_string_test.dart b/flutter_frontend_server/test/to_string_test.dart index 92a0a2a554584..ca1f14c90adf9 100644 --- a/flutter_frontend_server/test/to_string_test.dart +++ b/flutter_frontend_server/test/to_string_test.dart @@ -10,10 +10,10 @@ import 'package:test/test.dart'; void main() { final engine = Engine.findWithin(); - final manualBuildDir = io.Platform.environment['ENGINE_BUILD_DIR']; + final manualBuildDir = io.Platform.environment['FLUTTER_BUILD_DIRECTORY']; final buildDir = manualBuildDir ?? engine.latestOutput()?.path.path; if (buildDir == null) { - fail('No build directory found. Set ENGINE_BUILD_DIR'); + fail('No build directory found. Set FLUTTER_BUILD_DIRECTORY'); } final frontendServer = path.join( buildDir, diff --git a/testing/dart/fragment_shader_test.dart b/testing/dart/fragment_shader_test.dart index 4d339029ce301..354dfccd7e355 100644 --- a/testing/dart/fragment_shader_test.dart +++ b/testing/dart/fragment_shader_test.dart @@ -9,8 +9,8 @@ import 'dart:io'; import 'dart:typed_data'; import 'dart:ui'; -import 'package:litetest/litetest.dart'; import 'package:path/path.dart' as path; +import 'package:test/test.dart'; import 'impeller_enabled.dart'; import 'shader_test_file_utils.dart'; diff --git a/testing/run_tests.py b/testing/run_tests.py index f70a72c66fce1..99bb5776ef674 100755 --- a/testing/run_tests.py +++ b/testing/run_tests.py @@ -978,7 +978,7 @@ def uses_package_test_runner(package): def build_dart_host_test_list(build_dir): dart_host_tests = [ (os.path.join('flutter', 'ci'), []), - (os.path.join('flutter', 'flutter_frontend_server'), {'ENGINE_BUILD_DIR': build_dir}), + (os.path.join('flutter', 'flutter_frontend_server'), []), (os.path.join('flutter', 'testing', 'litetest'), []), (os.path.join('flutter', 'testing', 'skia_gold_client'), []), (os.path.join('flutter', 'testing', 'scenario_app'), []), From f2727b7b233b000b1eeb74e3be298f5ab826aa10 Mon Sep 17 00:00:00 2001 From: Matan Lurey Date: Wed, 11 Sep 2024 17:55:42 -0700 Subject: [PATCH 05/11] ++ --- testing/dart/fragment_shader_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing/dart/fragment_shader_test.dart b/testing/dart/fragment_shader_test.dart index 354dfccd7e355..4d339029ce301 100644 --- a/testing/dart/fragment_shader_test.dart +++ b/testing/dart/fragment_shader_test.dart @@ -9,8 +9,8 @@ import 'dart:io'; import 'dart:typed_data'; import 'dart:ui'; +import 'package:litetest/litetest.dart'; import 'package:path/path.dart' as path; -import 'package:test/test.dart'; import 'impeller_enabled.dart'; import 'shader_test_file_utils.dart'; From 3507544d7acceebd4f980a595d4bc111ffe6c462 Mon Sep 17 00:00:00 2001 From: Matan Lurey Date: Wed, 11 Sep 2024 17:58:28 -0700 Subject: [PATCH 06/11] ++ --- testing/dart/canvas_test.dart | 2 +- testing/dart/image_shader_test.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/testing/dart/canvas_test.dart b/testing/dart/canvas_test.dart index 53f7095513dba..727c669cb1848 100644 --- a/testing/dart/canvas_test.dart +++ b/testing/dart/canvas_test.dart @@ -191,7 +191,7 @@ void main() async { expect( () => canvas.drawAtlas(image, [transform], [rect], [color], null, rect, paint), - throwsA(isA()), + throwsA(isA()), ); }); diff --git a/testing/dart/image_shader_test.dart b/testing/dart/image_shader_test.dart index 27e9eb0d27d0d..1394edfae10f0 100644 --- a/testing/dart/image_shader_test.dart +++ b/testing/dart/image_shader_test.dart @@ -29,7 +29,7 @@ void main() { image.dispose(); expect( - () => ImageShader(image, TileMode.clamp, TileMode.clamp, Float64List(16)), + () => ImageShader(image, TileMode.clamp, TileMode.clamp, Float64List(16)), throwsA(isA()), ); }); From 0f593a47e507364461000261b129dd9569a10e13 Mon Sep 17 00:00:00 2001 From: Matan Lurey Date: Wed, 11 Sep 2024 21:58:54 -0700 Subject: [PATCH 07/11] Migrate platform_isolate_test. --- testing/dart/platform_isolate_test.dart | 63 +++++++++++++++---------- 1 file changed, 39 insertions(+), 24 deletions(-) diff --git a/testing/dart/platform_isolate_test.dart b/testing/dart/platform_isolate_test.dart index e6046beb557ef..646f6925ed541 100644 --- a/testing/dart/platform_isolate_test.dart +++ b/testing/dart/platform_isolate_test.dart @@ -6,7 +6,7 @@ import 'dart:async'; import 'dart:isolate'; import 'dart:ui'; -import 'package:litetest/litetest.dart'; +import 'package:test/test.dart'; int counter = 0; @@ -62,34 +62,47 @@ void main() { expect(await future3, 3); }); - test('PlatformIsolate runOnPlatformThread, send and receive messages', - () async { - // Send numbers 1 to 10 to the platform isolate. The platform isolate - // multiplies them by 100 and sends them back. - int sum = 0; - final RawReceivePort recvPort = RawReceivePort((Object message) { - if (message is SendPort) { - for (int i = 1; i <= 10; ++i) { - message.send(i); - } - } else { - sum += message as int; + test('PlatformIsolate runOnPlatformThread, send/receive messages', () async { + late SendPort toPlatformThread; + var sumOfReceivedMessages = 0; + var countofReceivedMessages = 0; + final recvPort = RawReceivePort((Object message) { + switch (message) { + case final SendPort sendPort: + toPlatformThread = sendPort; + for (int i = 1; i <= 10; i++) { + sendPort.send(i); + } + case final int value: + sumOfReceivedMessages += value; + countofReceivedMessages++; + if (countofReceivedMessages == 10) { + toPlatformThread.send(true); + } + default: + fail('Unexpected message: $message'); } }); - final SendPort sendPort = recvPort.sendPort; + + final sendPort = recvPort.sendPort; await runOnPlatformThread(() async { - final Completer completer = Completer(); - final RawReceivePort recvPort = RawReceivePort((Object message) { - sendPort.send((message as int) * 100); - if (message == 10) { - completer.complete(); + final completer = Completer(); + final recvPort = RawReceivePort((Object message) { + switch (message) { + case final int value: + sendPort.send(value * 100); + case true: + completer.complete(); + default: + fail('Unexpected message: $message'); } }); sendPort.send(recvPort.sendPort); await completer.future; recvPort.close(); }); - expect(sum, 5500); // sum(1 to 10) * 100 + + expect(sumOfReceivedMessages, 5500); recvPort.close(); }); @@ -122,9 +135,11 @@ void main() { test('PlatformIsolate runOnPlatformThread, disabled on helper isolates', () async { - await Isolate.run(() { - expect(() => runOnPlatformThread(() => print('Unreachable')), throws); - }); + await expectLater(() async { + await Isolate.run(() { + return runOnPlatformThread(() => print('Unreachable')); + }); + }, throws); }); test('PlatformIsolate runOnPlatformThread, on platform isolate', () async { @@ -134,7 +149,7 @@ void main() { }); test('PlatformIsolate runOnPlatformThread, exit disabled', () async { - await runOnPlatformThread(() => expect(() => Isolate.exit(), throws)); + await expectLater(runOnPlatformThread(() => Isolate.exit()), throws); }); test('PlatformIsolate runOnPlatformThread, unsendable object', () async { From 83994ac235beadc7f3a857d702ca720d32cae91b Mon Sep 17 00:00:00 2001 From: Matan Lurey Date: Wed, 11 Sep 2024 22:00:48 -0700 Subject: [PATCH 08/11] Migrate fragment_shader_test.dart --- testing/dart/fragment_shader_test.dart | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/testing/dart/fragment_shader_test.dart b/testing/dart/fragment_shader_test.dart index 4d339029ce301..ad7bb21ca6b81 100644 --- a/testing/dart/fragment_shader_test.dart +++ b/testing/dart/fragment_shader_test.dart @@ -9,8 +9,8 @@ import 'dart:io'; import 'dart:typed_data'; import 'dart:ui'; -import 'package:litetest/litetest.dart'; import 'package:path/path.dart' as path; +import 'package:test/test.dart'; import 'impeller_enabled.dart'; import 'shader_test_file_utils.dart'; @@ -402,7 +402,6 @@ void main() async { path.join('supported_glsl_op_shaders', 'iplr'), '.iplr', ); - expect(iplrSupportedGLSLOpShaders.isNotEmpty, true); _expectFragmentShadersRenderGreen(iplrSupportedGLSLOpShaders); // Test all supported instructions. See lib/spirv/lib/src/constants.dart @@ -410,7 +409,6 @@ void main() async { path.join('supported_op_shaders', 'iplr'), '.iplr', ); - expect(iplrSupportedOpShaders.isNotEmpty, true); _expectFragmentShadersRenderGreen(iplrSupportedOpShaders); } @@ -418,6 +416,9 @@ void main() async { // Keeping the outer loop of the test synchronous allows for easy printing // of the file name within the test case. void _expectFragmentShadersRenderGreen(Map programs) { + if (programs.isEmpty) { + print('No shaders found.'); + } for (final String key in programs.keys) { test('FragmentProgram $key renders green', () async { final FragmentProgram program = programs[key]!; From 8e4895ae50f474a2d067f614e802a0a4259ff339 Mon Sep 17 00:00:00 2001 From: Matan Lurey Date: Wed, 11 Sep 2024 22:10:25 -0700 Subject: [PATCH 09/11] ++ --- testing/dart/pubspec.yaml | 1 - tools/clangd_check/pubspec.yaml | 5 +---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/testing/dart/pubspec.yaml b/testing/dart/pubspec.yaml index ab4fe966f6192..00920cf6c4be0 100644 --- a/testing/dart/pubspec.yaml +++ b/testing/dart/pubspec.yaml @@ -14,7 +14,6 @@ resolution: workspace dependencies: ffi: any - litetest: any path: any skia_gold_client: any sky_engine: any diff --git a/tools/clangd_check/pubspec.yaml b/tools/clangd_check/pubspec.yaml index 40d647a0f6d74..54fe7e7db938c 100644 --- a/tools/clangd_check/pubspec.yaml +++ b/tools/clangd_check/pubspec.yaml @@ -19,8 +19,5 @@ dependencies: source_span: any dev_dependencies: - async_helper: any - expect: any - litetest: any process_fakes: any - smith: any + From 73a45282c83f9da2c6f9fbd0a4db6715b337a912 Mon Sep 17 00:00:00 2001 From: Matan Lurey Date: Thu, 12 Sep 2024 10:24:15 -0700 Subject: [PATCH 10/11] ++ --- testing/dart/fragment_shader_test.dart | 2 +- testing/dart/platform_isolate_test.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/testing/dart/fragment_shader_test.dart b/testing/dart/fragment_shader_test.dart index ad7bb21ca6b81..ca9050ecacea1 100644 --- a/testing/dart/fragment_shader_test.dart +++ b/testing/dart/fragment_shader_test.dart @@ -417,7 +417,7 @@ void main() async { // of the file name within the test case. void _expectFragmentShadersRenderGreen(Map programs) { if (programs.isEmpty) { - print('No shaders found.'); + fail('No shaders found.'); } for (final String key in programs.keys) { test('FragmentProgram $key renders green', () async { diff --git a/testing/dart/platform_isolate_test.dart b/testing/dart/platform_isolate_test.dart index 646f6925ed541..8ffba9f5d9bc5 100644 --- a/testing/dart/platform_isolate_test.dart +++ b/testing/dart/platform_isolate_test.dart @@ -102,7 +102,7 @@ void main() { recvPort.close(); }); - expect(sumOfReceivedMessages, 5500); + expect(sumOfReceivedMessages, 5500); // sum(1 to 10) * 100 recvPort.close(); }); From 82b92d017891bea6fde5cff22e9e48374a88ccdd Mon Sep 17 00:00:00 2001 From: Matan Lurey Date: Thu, 12 Sep 2024 10:38:01 -0700 Subject: [PATCH 11/11] Add nits. --- testing/dart/canvas_test.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testing/dart/canvas_test.dart b/testing/dart/canvas_test.dart index 727c669cb1848..79dd77716677e 100644 --- a/testing/dart/canvas_test.dart +++ b/testing/dart/canvas_test.dart @@ -1281,7 +1281,7 @@ final class _CloseToRectMatcher extends Matcher { @override Description describe(Description description) { - return description.add('Rect is close to $_expectedRect'); + return description.add('Rect is close (within 1e-6) to $_expectedRect'); } } @@ -1308,6 +1308,6 @@ final class _CloseToTransformMatcher extends Matcher { @override Description describe(Description description) { - return description.add('Transform is close to $_expected'); + return description.add('Transform is close (within 1e-10) to $_expected'); } }