From 77579ba74050a01e7ae47653ce7c6087d304ba77 Mon Sep 17 00:00:00 2001
From: Kate Lovett <katelovett@google.com>
Date: Thu, 14 Dec 2023 09:03:50 -0600
Subject: [PATCH] [two_dimensional_scrollables] Post 3.16 stable tech debt
 clean up (#5671)

Fixes https://github.com/flutter/flutter/issues/136933
Fixes https://github.com/flutter/flutter/issues/132782

This cleans up some TODOs in the TableView and its tests after the stable release
- removes an assertion on the builder delegate bounds now that the super class handles the assertions
- refactors all of the golden file tests using PaintPattern, removing all of the golden files and enabling web testing
---
 .../dart_test.yaml                            |   3 -
 .../lib/src/table_view/table_delegate.dart    |   4 -
 .../goldens/reversed.pinned.painting.png      | Bin 4867 -> 0 bytes
 .../single-reversed.pinned.painting.png       | Bin 4868 -> 0 bytes
 .../tableSpanDecoration.defaultMainAxis.png   | Bin 9516 -> 0 bytes
 ...tableSpanDecoration.horizontalMainAxis.png | Bin 4499 -> 0 bytes
 .../test/table_view/table_test.dart           | 337 +++++++++++++-----
 7 files changed, 240 insertions(+), 104 deletions(-)
 delete mode 100644 packages/two_dimensional_scrollables/dart_test.yaml
 delete mode 100644 packages/two_dimensional_scrollables/test/table_view/goldens/reversed.pinned.painting.png
 delete mode 100644 packages/two_dimensional_scrollables/test/table_view/goldens/single-reversed.pinned.painting.png
 delete mode 100644 packages/two_dimensional_scrollables/test/table_view/goldens/tableSpanDecoration.defaultMainAxis.png
 delete mode 100644 packages/two_dimensional_scrollables/test/table_view/goldens/tableSpanDecoration.horizontalMainAxis.png

diff --git a/packages/two_dimensional_scrollables/dart_test.yaml b/packages/two_dimensional_scrollables/dart_test.yaml
deleted file mode 100644
index 5ea7fe8ae5..0000000000
--- a/packages/two_dimensional_scrollables/dart_test.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-# TODO(Piinks): Web cannot support temp golden files, re-enable once mock_canvas
-# makes it to stable. See
-test_on: vm
diff --git a/packages/two_dimensional_scrollables/lib/src/table_view/table_delegate.dart b/packages/two_dimensional_scrollables/lib/src/table_view/table_delegate.dart
index 5215413945..275bfb5bae 100644
--- a/packages/two_dimensional_scrollables/lib/src/table_view/table_delegate.dart
+++ b/packages/two_dimensional_scrollables/lib/src/table_view/table_delegate.dart
@@ -150,8 +150,6 @@ class TableCellBuilderDelegate extends TwoDimensionalChildBuilderDelegate
   int get columnCount => maxXIndex! + 1;
   set columnCount(int value) {
     assert(pinnedColumnCount <= value);
-    // TODO(Piinks): remove once this assertion is added in the super class
-    assert(value >= -1);
     maxXIndex = value - 1;
   }
 
@@ -180,8 +178,6 @@ class TableCellBuilderDelegate extends TwoDimensionalChildBuilderDelegate
   int get rowCount => maxYIndex! + 1;
   set rowCount(int value) {
     assert(pinnedRowCount <= value);
-    // TODO(Piinks): remove once this assertion is added in the super class
-    assert(value >= -1);
     maxYIndex = value - 1;
   }
 
diff --git a/packages/two_dimensional_scrollables/test/table_view/goldens/reversed.pinned.painting.png b/packages/two_dimensional_scrollables/test/table_view/goldens/reversed.pinned.painting.png
deleted file mode 100644
index f3355f07dfe1273ec94ac3d82fe9f3b3c4246ed1..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 4867
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
CdbYm+

diff --git a/packages/two_dimensional_scrollables/test/table_view/goldens/single-reversed.pinned.painting.png b/packages/two_dimensional_scrollables/test/table_view/goldens/single-reversed.pinned.painting.png
deleted file mode 100644
index a89a27353c148f83a667094f6a545146ef5116f6..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 4868
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

diff --git a/packages/two_dimensional_scrollables/test/table_view/goldens/tableSpanDecoration.defaultMainAxis.png b/packages/two_dimensional_scrollables/test/table_view/goldens/tableSpanDecoration.defaultMainAxis.png
deleted file mode 100644
index 47c77cd4b1324e729866df80681079a79a1c2300..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 9516
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

diff --git a/packages/two_dimensional_scrollables/test/table_view/goldens/tableSpanDecoration.horizontalMainAxis.png b/packages/two_dimensional_scrollables/test/table_view/goldens/tableSpanDecoration.horizontalMainAxis.png
deleted file mode 100644
index 6a04b91e480abaaf9913680bb49e30c53750d904..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 4499
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
TnYWjxb?AG{|7ewWMEbu04;=1=

diff --git a/packages/two_dimensional_scrollables/test/table_view/table_test.dart b/packages/two_dimensional_scrollables/test/table_view/table_test.dart
index d910b772bc..670caf00b6 100644
--- a/packages/two_dimensional_scrollables/test/table_view/table_test.dart
+++ b/packages/two_dimensional_scrollables/test/table_view/table_test.dart
@@ -2,8 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import 'dart:io' show Platform;
-
 import 'package:flutter/gestures.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/rendering.dart';
@@ -40,14 +38,6 @@ TableSpan getMouseTrackingSpan(
   );
 }
 
-final bool masterChannel = !Platform.environment.containsKey('CHANNEL') ||
-    Platform.environment['CHANNEL'] == 'master';
-
-// TODO(Piinks): Remove once painting can be validated by mock_canvas in
-//  flutter_test, and re-enable web tests in https://github.com/flutter/flutter/issues/132782
-// Regenerate goldens on a Mac computer by running `flutter test --update-goldens`
-final bool runGoldens = Platform.isMacOS && masterChannel;
-
 void main() {
   group('TableView.builder', () {
     test('creates correct delegate', () {
@@ -1253,11 +1243,6 @@ void main() {
 
     testWidgets('paints decorations in correct order',
         (WidgetTester tester) async {
-      // TODO(Piinks): Rewrite this to remove golden files from this repo when
-      //  mock_canvas is public - https://github.com/flutter/flutter/pull/131631
-      //  * foreground, background, and precedence per mainAxis
-      //  * Break out a separate test for padding and radius decorations to
-      //    validate paint rect calls
       TableView tableView = TableView.builder(
         rowCount: 2,
         columnCount: 2,
@@ -1304,17 +1289,123 @@ void main() {
             height: 200,
             width: 200,
             color: Colors.grey.withOpacity(0.5),
-            child: const Center(child: FlutterLogo()),
           );
         },
       );
 
       await tester.pumpWidget(MaterialApp(home: tableView));
       await tester.pumpAndSettle();
-      await expectLater(
-        find.byType(TableView),
-        matchesGoldenFile('goldens/tableSpanDecoration.defaultMainAxis.png'),
-        skip: !runGoldens,
+      expect(
+        find.byType(TableViewport),
+        paints
+          // background row
+          ..rrect(
+            rrect: RRect.fromRectAndRadius(
+              const Rect.fromLTRB(0.0, 210.0, 410.0, 410.0),
+              const Radius.circular(30.0),
+            ),
+            color: const Color(0xff2196f3),
+          )
+          // background column
+          ..rrect(
+            rrect: RRect.fromRectAndRadius(
+              const Rect.fromLTRB(0.0, 0.0, 210.0, 410.0),
+              const Radius.circular(30.0),
+            ),
+            color: const Color(0xfff44336),
+          )
+          // child at 0,0
+          ..rect(
+            rect: const Rect.fromLTRB(0.0, 0.0, 200.0, 200.0),
+            color: const Color(0x809e9e9e),
+          )
+          // child at 0,1
+          ..rect(
+            rect: const Rect.fromLTRB(0.0, 210.0, 200.0, 410.0),
+            color: const Color(0x809e9e9e),
+          )
+          // child at 1,0
+          ..rect(
+            rect: const Rect.fromLTRB(210.0, 0.0, 410.0, 200.0),
+            color: const Color(0x809e9e9e),
+          )
+          // child at 1,1
+          ..rect(
+            rect: const Rect.fromLTRB(210.0, 210.0, 410.0, 410.0),
+            color: const Color(0x809e9e9e),
+          )
+          // foreground row border (1)
+          ..drrect(
+            outer: RRect.fromRectAndRadius(
+              const Rect.fromLTRB(0.0, 0.0, 410.0, 200.0),
+              const Radius.circular(30.0),
+            ),
+            inner: RRect.fromLTRBAndCorners(
+              0.0,
+              3.0,
+              410.0,
+              200.0,
+              topLeft: const Radius.elliptical(30.0, 27.0),
+              topRight: const Radius.elliptical(30.0, 27.0),
+              bottomRight: const Radius.circular(30.0),
+              bottomLeft: const Radius.circular(30.0),
+            ),
+            color: const Color(0xff4caf50),
+          )
+          // foreground row border (2)
+          ..drrect(
+            outer: RRect.fromRectAndRadius(
+              const Rect.fromLTRB(0.0, 200.0, 410.0, 410.0),
+              const Radius.circular(30.0),
+            ),
+            inner: RRect.fromLTRBAndCorners(
+              0.0,
+              203.0,
+              410.0,
+              410.0,
+              topLeft: const Radius.elliptical(30.0, 27.0),
+              topRight: const Radius.elliptical(30.0, 27.0),
+              bottomRight: const Radius.circular(30.0),
+              bottomLeft: const Radius.circular(30.0),
+            ),
+            color: const Color(0xff4caf50),
+          )
+          // foreground column border (1)
+          ..drrect(
+            outer: RRect.fromRectAndRadius(
+              const Rect.fromLTRB(0.0, 0.0, 200.0, 410.0),
+              const Radius.circular(10.0),
+            ),
+            inner: RRect.fromLTRBAndCorners(
+              0.0,
+              0.0,
+              197.0,
+              410.0,
+              topLeft: const Radius.circular(10.0),
+              topRight: const Radius.elliptical(7.0, 10.0),
+              bottomRight: const Radius.elliptical(7.0, 10.0),
+              bottomLeft: const Radius.circular(10.0),
+            ),
+            color: const Color(0xffff9800),
+          )
+          // foreground column border (2)
+          ..drrect(
+            outer: RRect.fromRectAndRadius(
+              const Rect.fromLTRB(210.0, 0.0, 410.0, 410.0),
+              const Radius.circular(10.0),
+            ),
+            inner: RRect.fromLTRBAndCorners(
+              210.0,
+              0.0,
+              407.0,
+              410.0,
+              topLeft: const Radius.circular(10.0),
+              topRight: const Radius.elliptical(7.0, 10.0),
+              bottomRight: const Radius.elliptical(7.0, 10.0),
+              bottomLeft: const Radius.circular(10.0),
+            ),
+            color: const Color(0xffff9800),
+          ),
       );
 
       // Switch main axis
@@ -1351,27 +1442,90 @@ void main() {
           ),
         ),
         cellBuilder: (_, TableVicinity vicinity) {
-          return const SizedBox.square(
-            dimension: 200,
-            child: Center(child: FlutterLogo()),
+          return Container(
+            height: 200,
+            width: 200,
+            color: Colors.grey.withOpacity(0.5),
           );
         },
       );
 
       await tester.pumpWidget(MaterialApp(home: tableView));
       await tester.pumpAndSettle();
-      await expectLater(
-        find.byType(TableView),
-        matchesGoldenFile('goldens/tableSpanDecoration.horizontalMainAxis.png'),
-        skip: !runGoldens,
+      expect(
+        find.byType(TableViewport),
+        paints
+          // background column goes first this time
+          ..rect(
+            rect: const Rect.fromLTRB(0.0, 0.0, 200.0, 400.0),
+            color: const Color(0xfff44336),
+          )
+          // background row
+          ..rect(
+            rect: const Rect.fromLTRB(0.0, 200.0, 400.0, 400.0),
+            color: const Color(0xff2196f3),
+          )
+          // child at 0,0
+          ..rect(
+            rect: const Rect.fromLTRB(0.0, 0.0, 200.0, 200.0),
+            color: const Color(0x809e9e9e),
+          )
+          // child at 1,0
+          ..rect(
+            rect: const Rect.fromLTRB(0.0, 200.0, 200.0, 400.0),
+            color: const Color(0x809e9e9e),
+          )
+          // child at 0,1
+          ..rect(
+            rect: const Rect.fromLTRB(200.0, 0.0, 400.0, 200.0),
+            color: const Color(0x809e9e9e),
+          )
+          // child at 1,1
+          ..rect(
+            rect: const Rect.fromLTRB(200.0, 200.0, 400.0, 400.0),
+            color: const Color(0x809e9e9e),
+          )
+          // foreground column border (1)
+          ..path(
+            includes: <Offset>[
+              const Offset(200.0, 0.0),
+              const Offset(200.0, 200.0),
+              const Offset(200.0, 400.0),
+            ],
+            color: const Color(0xffff9800),
+          )
+          // foreground column border (2)
+          ..path(
+            includes: <Offset>[
+              const Offset(400.0, 0.0),
+              const Offset(400.0, 200.0),
+              const Offset(400.0, 400.0),
+            ],
+            color: const Color(0xffff9800),
+          )
+          // foreground row border
+          ..path(
+            includes: <Offset>[
+              Offset.zero,
+              const Offset(200.0, 0.0),
+              const Offset(400.0, 0.0),
+            ],
+            color: const Color(0xff4caf50),
+          )
+          // foreground row border(2)
+          ..path(
+            includes: <Offset>[
+              const Offset(0.0, 200.0),
+              const Offset(200.0, 200.0),
+              const Offset(400.0, 200.0),
+            ],
+            color: const Color(0xff4caf50),
+          ),
       );
     });
 
-    testWidgets('paint rects are correct when reversed and pinned',
+    testWidgets('child paint rects are correct when reversed and pinned',
         (WidgetTester tester) async {
-      // TODO(Piinks): Rewrite this to remove golden files from this repo when
-      //  mock_canvas is public - https://github.com/flutter/flutter/pull/131631
-      //  * foreground, background, and precedence per mainAxis
       // Both reversed - Regression test for https://github.com/flutter/flutter/issues/135386
       TableView tableView = TableView.builder(
         verticalDetails: const ScrollableDetails.vertical(reverse: true),
@@ -1380,48 +1534,43 @@ void main() {
         pinnedRowCount: 1,
         columnCount: 2,
         pinnedColumnCount: 1,
-        columnBuilder: (int index) => TableSpan(
-          extent: const FixedTableSpanExtent(200.0),
-          foregroundDecoration: const TableSpanDecoration(
-            border: TableSpanBorder(
-              trailing: BorderSide(
-                color: Colors.orange,
-                width: 3,
-              ),
-            ),
-          ),
-          backgroundDecoration: TableSpanDecoration(
-            color: index.isEven ? Colors.red : null,
-          ),
+        columnBuilder: (int index) => const TableSpan(
+          extent: FixedTableSpanExtent(200.0),
         ),
-        rowBuilder: (int index) => TableSpan(
-          extent: const FixedTableSpanExtent(200.0),
-          foregroundDecoration: const TableSpanDecoration(
-            border: TableSpanBorder(
-              leading: BorderSide(
-                color: Colors.green,
-                width: 3,
-              ),
-            ),
-          ),
-          backgroundDecoration: TableSpanDecoration(
-            color: index.isOdd ? Colors.blue : null,
-          ),
+        rowBuilder: (int index) => const TableSpan(
+          extent: FixedTableSpanExtent(200.0),
         ),
         cellBuilder: (_, TableVicinity vicinity) {
-          return const SizedBox.square(
-            dimension: 200,
-            child: Center(child: FlutterLogo()),
+          return Container(
+            height: 200,
+            width: 200,
+            color: Colors.grey.withOpacity(0.5),
           );
         },
       );
 
       await tester.pumpWidget(MaterialApp(home: tableView));
       await tester.pumpAndSettle();
-      await expectLater(
-        find.byType(TableView),
-        matchesGoldenFile('goldens/reversed.pinned.painting.png'),
-        skip: !runGoldens,
+      // All children are painted in the right place
+      expect(
+        find.byType(TableViewport),
+        paints
+          ..rect(
+            rect: const Rect.fromLTRB(400.0, 200.0, 600.0, 400.0),
+            color: const Color(0x809e9e9e),
+          )
+          ..rect(
+            rect: const Rect.fromLTRB(600.0, 200.0, 800.0, 400.0),
+            color: const Color(0x809e9e9e),
+          )
+          ..rect(
+            rect: const Rect.fromLTRB(400.0, 400.0, 600.0, 600.0),
+            color: const Color(0x809e9e9e),
+          )
+          ..rect(
+            rect: const Rect.fromLTRB(600.0, 400.0, 800.0, 600.0),
+            color: const Color(0x809e9e9e),
+          ),
       );
 
       // Only one axis reversed - Regression test for https://github.com/flutter/flutter/issues/136897
@@ -1431,48 +1580,42 @@ void main() {
         pinnedRowCount: 1,
         columnCount: 2,
         pinnedColumnCount: 1,
-        columnBuilder: (int index) => TableSpan(
-          extent: const FixedTableSpanExtent(200.0),
-          foregroundDecoration: const TableSpanDecoration(
-            border: TableSpanBorder(
-              trailing: BorderSide(
-                color: Colors.orange,
-                width: 3,
-              ),
-            ),
-          ),
-          backgroundDecoration: TableSpanDecoration(
-            color: index.isEven ? Colors.red : null,
-          ),
+        columnBuilder: (int index) => const TableSpan(
+          extent: FixedTableSpanExtent(200.0),
         ),
-        rowBuilder: (int index) => TableSpan(
-          extent: const FixedTableSpanExtent(200.0),
-          foregroundDecoration: const TableSpanDecoration(
-            border: TableSpanBorder(
-              leading: BorderSide(
-                color: Colors.green,
-                width: 3,
-              ),
-            ),
-          ),
-          backgroundDecoration: TableSpanDecoration(
-            color: index.isOdd ? Colors.blue : null,
-          ),
+        rowBuilder: (int index) => const TableSpan(
+          extent: FixedTableSpanExtent(200.0),
         ),
         cellBuilder: (_, TableVicinity vicinity) {
-          return const SizedBox.square(
-            dimension: 200,
-            child: Center(child: FlutterLogo()),
+          return Container(
+            height: 200,
+            width: 200,
+            color: Colors.grey.withOpacity(0.5),
           );
         },
       );
 
       await tester.pumpWidget(MaterialApp(home: tableView));
       await tester.pumpAndSettle();
-      await expectLater(
-        find.byType(TableView),
-        matchesGoldenFile('goldens/single-reversed.pinned.painting.png'),
-        skip: !runGoldens,
+      expect(
+        find.byType(TableViewport),
+        paints
+          ..rect(
+            rect: const Rect.fromLTRB(400.0, 200.0, 600.0, 400.0),
+            color: const Color(0x809e9e9e),
+          )
+          ..rect(
+            rect: const Rect.fromLTRB(600.0, 200.0, 800.0, 400.0),
+            color: const Color(0x809e9e9e),
+          )
+          ..rect(
+            rect: const Rect.fromLTRB(400.0, 0.0, 600.0, 200.0),
+            color: const Color(0x809e9e9e),
+          )
+          ..rect(
+            rect: const Rect.fromLTRB(600.0, 0.0, 800.0, 200.0),
+            color: const Color(0x809e9e9e),
+          ),
       );
     });