From 29324a470e24c121d3f3586e3b923c3ba996ae58 Mon Sep 17 00:00:00 2001 From: Burak Karahan Date: Thu, 25 Jun 2026 15:36:21 +0300 Subject: [PATCH 1/3] test: use local material semantics tester imports --- .../checkbox_test.dart | 5 +- .../radio_test.dart | 5 +- .../range_slider_test.dart | 5 +- .../slider_test.dart | 365 +++++++++--------- .../toggle_buttons_test.dart | 5 +- 5 files changed, 188 insertions(+), 197 deletions(-) rename packages/material_ui/{temporarily_disabled_tests => test}/checkbox_test.dart (99%) rename packages/material_ui/{temporarily_disabled_tests => test}/radio_test.dart (99%) rename packages/material_ui/{temporarily_disabled_tests => test}/range_slider_test.dart (99%) rename packages/material_ui/{temporarily_disabled_tests => test}/slider_test.dart (96%) rename packages/material_ui/{temporarily_disabled_tests => test}/toggle_buttons_test.dart (99%) diff --git a/packages/material_ui/temporarily_disabled_tests/checkbox_test.dart b/packages/material_ui/test/checkbox_test.dart similarity index 99% rename from packages/material_ui/temporarily_disabled_tests/checkbox_test.dart rename to packages/material_ui/test/checkbox_test.dart index 5d10e7094db2..e8ac3e086fd3 100644 --- a/packages/material_ui/temporarily_disabled_tests/checkbox_test.dart +++ b/packages/material_ui/test/checkbox_test.dart @@ -2,9 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -@Skip( - 'This file is skipped due to a cross-import that needs to be fixed. Tracked in https://github.com/flutter/flutter/issues/177028.', -) import 'dart:ui'; import 'package:cupertino_ui/cupertino_ui.dart'; @@ -15,7 +12,7 @@ import 'package:flutter/services.dart'; import 'package:flutter/src/gestures/constants.dart'; import 'package:flutter_test/flutter_test.dart'; -import '../widgets/semantics_tester.dart'; +import 'semantics_tester.dart'; void main() { final theme = ThemeData(); diff --git a/packages/material_ui/temporarily_disabled_tests/radio_test.dart b/packages/material_ui/test/radio_test.dart similarity index 99% rename from packages/material_ui/temporarily_disabled_tests/radio_test.dart rename to packages/material_ui/test/radio_test.dart index a9523a5e524c..36f8974d1f08 100644 --- a/packages/material_ui/temporarily_disabled_tests/radio_test.dart +++ b/packages/material_ui/test/radio_test.dart @@ -2,9 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -@Skip( - 'This file is skipped due to a cross-import that needs to be fixed. Tracked in https://github.com/flutter/flutter/issues/177028.', -) // This file is run as part of a reduced test set in CI on Mac and Windows // machines. @Tags(['reduced-test-set']) @@ -20,7 +17,7 @@ import 'package:flutter/services.dart'; import 'package:flutter/src/gestures/constants.dart'; import 'package:flutter_test/flutter_test.dart'; -import '../widgets/semantics_tester.dart'; +import 'semantics_tester.dart'; void main() { final theme = ThemeData(); diff --git a/packages/material_ui/temporarily_disabled_tests/range_slider_test.dart b/packages/material_ui/test/range_slider_test.dart similarity index 99% rename from packages/material_ui/temporarily_disabled_tests/range_slider_test.dart rename to packages/material_ui/test/range_slider_test.dart index ee787eb7f789..77a50394b3c4 100644 --- a/packages/material_ui/temporarily_disabled_tests/range_slider_test.dart +++ b/packages/material_ui/test/range_slider_test.dart @@ -2,9 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -@Skip( - 'This file is skipped due to a cross-import that needs to be fixed. Tracked in https://github.com/flutter/flutter/issues/177028.', -) import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; import 'package:material_ui/material_ui.dart'; @@ -13,7 +10,7 @@ import 'package:flutter/services.dart'; import 'package:flutter/src/physics/utils.dart' show nearEqual; import 'package:flutter_test/flutter_test.dart'; -import '../widgets/semantics_tester.dart'; +import 'semantics_tester.dart'; void main() { // Regression test for https://github.com/flutter/flutter/issues/105833 diff --git a/packages/material_ui/temporarily_disabled_tests/slider_test.dart b/packages/material_ui/test/slider_test.dart similarity index 96% rename from packages/material_ui/temporarily_disabled_tests/slider_test.dart rename to packages/material_ui/test/slider_test.dart index 8d6eff62fcf4..461ffb05d824 100644 --- a/packages/material_ui/temporarily_disabled_tests/slider_test.dart +++ b/packages/material_ui/test/slider_test.dart @@ -2,9 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -@Skip( - 'This file is skipped due to a cross-import that needs to be fixed. Tracked in https://github.com/flutter/flutter/issues/177028.', -) import 'dart:ui'; import 'package:cupertino_ui/cupertino_ui.dart'; @@ -17,7 +14,7 @@ import 'package:flutter/services.dart'; import 'package:flutter/src/physics/utils.dart' show nearEqual; import 'package:flutter_test/flutter_test.dart'; -import '../widgets/semantics_tester.dart'; +import 'semantics_tester.dart'; /// A [RoundedRectSliderTrackShape] that logs its paint. class LoggingRoundedRectSliderTrackShape extends RoundedRectSliderTrackShape { @@ -4074,70 +4071,72 @@ void main() { ); }); - testWidgets('Overlay appear only when hovered on the thumb on desktop', ( - WidgetTester tester, - ) async { - var value = 0.5; - const overlayColor = Color(0xffff0000); + testWidgets( + 'Overlay appears only when hovered on the thumb on desktop', + (WidgetTester tester) async { + var value = 0.5; + const overlayColor = Color(0xffff0000); - Widget buildApp({bool enabled = true}) { - return MaterialApp( - home: Material( - child: Center( - child: StatefulBuilder( - builder: (BuildContext context, StateSetter setState) { - return Slider( - value: value, - overlayColor: const MaterialStatePropertyAll(overlayColor), - onChanged: enabled - ? (double newValue) { - setState(() { - value = newValue; - }); - } - : null, - ); - }, + Widget buildApp({bool enabled = true}) { + return MaterialApp( + home: Material( + child: Center( + child: StatefulBuilder( + builder: (BuildContext context, StateSetter setState) { + return Slider( + value: value, + overlayColor: const MaterialStatePropertyAll(overlayColor), + onChanged: enabled + ? (double newValue) { + setState(() { + value = newValue; + }); + } + : null, + ); + }, + ), ), ), - ), - ); - } + ); + } - await tester.pumpWidget(buildApp()); + await tester.pumpWidget(buildApp()); - // Slider does not have overlay when enabled and not hovered. - await tester.pumpAndSettle(); - expect( - Material.of(tester.element(find.byType(Slider))), - isNot(paints..circle(color: overlayColor)), - ); + // Slider does not have overlay when enabled and not hovered. + await tester.pumpAndSettle(); + expect( + Material.of(tester.element(find.byType(Slider))), + isNot(paints..circle(color: overlayColor)), + ); - // Hover on the slider but outside the thumb. - final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse); - await gesture.addPointer(); - await gesture.moveTo(tester.getTopLeft(find.byType(Slider))); + // Hover on the slider but outside the thumb. + final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse); + await gesture.addPointer(); + await gesture.moveTo(tester.getTopLeft(find.byType(Slider))); - await tester.pumpWidget(buildApp()); - await tester.pumpAndSettle(); - expect( - Material.of(tester.element(find.byType(Slider))), - isNot(paints..circle(color: overlayColor)), - ); + await tester.pumpWidget(buildApp()); + await tester.pumpAndSettle(); + expect( + Material.of(tester.element(find.byType(Slider))), + isNot(paints..circle(color: overlayColor)), + ); - // Hover on the thumb. - await gesture.moveTo(tester.getCenter(find.byType(Slider))); - await tester.pumpAndSettle(); - expect(Material.of(tester.element(find.byType(Slider))), paints..circle(color: overlayColor)); + // Hover on the thumb. + await gesture.moveTo(tester.getCenter(find.byType(Slider))); + await tester.pumpAndSettle(); + expect(Material.of(tester.element(find.byType(Slider))), paints..circle(color: overlayColor)); - // Hover on the slider but outside the thumb. - await gesture.moveTo(tester.getBottomRight(find.byType(Slider))); - await tester.pumpAndSettle(); - expect( - Material.of(tester.element(find.byType(Slider))), - isNot(paints..circle(color: overlayColor)), - ); - }, variant: TargetPlatformVariant.desktop()); + // Hover on the slider but outside the thumb. + await gesture.moveTo(tester.getBottomRight(find.byType(Slider))); + await tester.pumpAndSettle(); + expect( + Material.of(tester.element(find.byType(Slider))), + isNot(paints..circle(color: overlayColor)), + ); + }, + variant: TargetPlatformVariant.desktop(), + ); testWidgets('Overlay remains when Slider is in focus on desktop', (WidgetTester tester) async { var value = 0.5; @@ -4206,151 +4205,155 @@ void main() { }, variant: TargetPlatformVariant.desktop()); // Regression test for https://github.com/flutter/flutter/issues/123313, which only occurs on desktop platforms. - testWidgets('Value indicator disappears after adjusting the slider on desktop', ( - WidgetTester tester, - ) async { - final theme = ThemeData(); - const currentValue = 0.5; - await tester.pumpWidget( - MaterialApp( - theme: theme, - home: Material( - child: Center( - child: Slider( - value: currentValue, - divisions: 5, - label: currentValue.toStringAsFixed(1), - onChanged: (_) {}, + testWidgets( + 'Value indicator disappears after adjusting the slider on desktop', + (WidgetTester tester) async { + final theme = ThemeData(); + const currentValue = 0.5; + await tester.pumpWidget( + MaterialApp( + theme: theme, + home: Material( + child: Center( + child: Slider( + value: currentValue, + divisions: 5, + label: currentValue.toStringAsFixed(1), + onChanged: (_) {}, + ), ), ), ), - ), - ); - - // Slider does not show value indicator initially. - await tester.pumpAndSettle(); - RenderBox valueIndicatorBox = tester.renderObject(find.byType(Overlay)); - expect( - valueIndicatorBox, - isNot( - paints - ..scale() - ..path(color: theme.colorScheme.primary), - ), - ); - - final Offset sliderCenter = tester.getCenter(find.byType(Slider)); - final tapLocation = Offset(sliderCenter.dx + 50, sliderCenter.dy); + ); - // Tap the slider by mouse to bring up the value indicator. - await tester.tapAt(tapLocation, kind: PointerDeviceKind.mouse); - await tester.pumpAndSettle(); + // Slider does not show value indicator initially. + await tester.pumpAndSettle(); + RenderBox valueIndicatorBox = tester.renderObject(find.byType(Overlay)); + expect( + valueIndicatorBox, + isNot( + paints + ..scale() + ..path(color: theme.colorScheme.primary), + ), + ); - // Value indicator is visible. - valueIndicatorBox = tester.renderObject(find.byType(Overlay)); - expect( - valueIndicatorBox, - paints - ..scale() - ..path(color: theme.colorScheme.primary), - ); + final Offset sliderCenter = tester.getCenter(find.byType(Slider)); + final tapLocation = Offset(sliderCenter.dx + 50, sliderCenter.dy); - // Wait for the value indicator to disappear. - await tester.pumpAndSettle(const Duration(seconds: 2)); + // Tap the slider by mouse to bring up the value indicator. + await tester.tapAt(tapLocation, kind: PointerDeviceKind.mouse); + await tester.pumpAndSettle(); - // Value indicator is no longer visible. - expect( - valueIndicatorBox, - isNot( + // Value indicator is visible. + valueIndicatorBox = tester.renderObject(find.byType(Overlay)); + expect( + valueIndicatorBox, paints ..scale() ..path(color: theme.colorScheme.primary), - ), - ); - }, variant: TargetPlatformVariant.desktop()); + ); - testWidgets('Value indicator remains when Slider is in focus on desktop', ( - WidgetTester tester, - ) async { - var value = 0.5; - final focusNode = FocusNode(); - addTearDown(focusNode.dispose); + // Wait for the value indicator to disappear. + await tester.pumpAndSettle(const Duration(seconds: 2)); - Widget buildApp({bool enabled = true}) { - return MaterialApp( - theme: ThemeData( - sliderTheme: const SliderThemeData(showValueIndicator: ShowValueIndicator.always), + // Value indicator is no longer visible. + expect( + valueIndicatorBox, + isNot( + paints + ..scale() + ..path(color: theme.colorScheme.primary), ), - home: Material( - child: Center( - child: StatefulBuilder( - builder: (BuildContext context, StateSetter setState) { - return Slider( - value: value, - focusNode: focusNode, - divisions: 5, - label: value.toStringAsFixed(1), - onChanged: enabled - ? (double newValue) { - setState(() { - value = newValue; - }); - } - : null, - ); - }, + ); + }, + variant: TargetPlatformVariant.desktop(), + ); + + testWidgets( + 'Value indicator remains when Slider is in focus on desktop', + (WidgetTester tester) async { + var value = 0.5; + final focusNode = FocusNode(); + addTearDown(focusNode.dispose); + + Widget buildApp({bool enabled = true}) { + return MaterialApp( + theme: ThemeData( + sliderTheme: const SliderThemeData(showValueIndicator: ShowValueIndicator.always), + ), + home: Material( + child: Center( + child: StatefulBuilder( + builder: (BuildContext context, StateSetter setState) { + return Slider( + value: value, + focusNode: focusNode, + divisions: 5, + label: value.toStringAsFixed(1), + onChanged: enabled + ? (double newValue) { + setState(() { + value = newValue; + }); + } + : null, + ); + }, + ), ), ), + ); + } + + await tester.pumpWidget(buildApp()); + + // Slider does not show value indicator without focus. + await tester.pumpAndSettle(); + expect(focusNode.hasFocus, false); + RenderBox valueIndicatorBox = tester.renderObject(find.byType(Overlay)); + expect( + valueIndicatorBox, + isNot( + paints + ..path(color: const Color(0xff000000)) + ..paragraph(), ), ); - } - await tester.pumpWidget(buildApp()); + final Offset sliderCenter = tester.getCenter(find.byType(Slider)); + final tapLocation = Offset(sliderCenter.dx + 50, sliderCenter.dy); - // Slider does not show value indicator without focus. - await tester.pumpAndSettle(); - expect(focusNode.hasFocus, false); - RenderBox valueIndicatorBox = tester.renderObject(find.byType(Overlay)); - expect( - valueIndicatorBox, - isNot( + // Tap somewhere to bring value indicator. + final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse); + await gesture.addPointer(); + await gesture.down(tapLocation); + await gesture.up(); + focusNode.requestFocus(); + await tester.pumpAndSettle(); + expect(focusNode.hasFocus, true); + valueIndicatorBox = tester.renderObject(find.byType(Overlay)); + expect( + valueIndicatorBox, paints ..path(color: const Color(0xff000000)) ..paragraph(), - ), - ); - - final Offset sliderCenter = tester.getCenter(find.byType(Slider)); - final tapLocation = Offset(sliderCenter.dx + 50, sliderCenter.dy); - - // Tap somewhere to bring value indicator. - final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse); - await gesture.addPointer(); - await gesture.down(tapLocation); - await gesture.up(); - focusNode.requestFocus(); - await tester.pumpAndSettle(); - expect(focusNode.hasFocus, true); - valueIndicatorBox = tester.renderObject(find.byType(Overlay)); - expect( - valueIndicatorBox, - paints - ..path(color: const Color(0xff000000)) - ..paragraph(), - ); + ); - focusNode.unfocus(); - await tester.pumpAndSettle(); - expect(focusNode.hasFocus, false); - expect( - valueIndicatorBox, - isNot( - paints - ..path(color: const Color(0xff000000)) - ..paragraph(), - ), - ); - }, variant: TargetPlatformVariant.desktop()); + focusNode.unfocus(); + await tester.pumpAndSettle(); + expect(focusNode.hasFocus, false); + expect( + valueIndicatorBox, + isNot( + paints + ..path(color: const Color(0xff000000)) + ..paragraph(), + ), + ); + }, + variant: TargetPlatformVariant.desktop(), + ); testWidgets('showValueIndicator takes priority over theme', (WidgetTester tester) async { Widget buildApp({ diff --git a/packages/material_ui/temporarily_disabled_tests/toggle_buttons_test.dart b/packages/material_ui/test/toggle_buttons_test.dart similarity index 99% rename from packages/material_ui/temporarily_disabled_tests/toggle_buttons_test.dart rename to packages/material_ui/test/toggle_buttons_test.dart index 7a0bb324c9e4..99828a2a80b5 100644 --- a/packages/material_ui/temporarily_disabled_tests/toggle_buttons_test.dart +++ b/packages/material_ui/test/toggle_buttons_test.dart @@ -2,9 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -@Skip( - 'This file is skipped due to a cross-import that needs to be fixed. Tracked in https://github.com/flutter/flutter/issues/177028.', -) // This file is run as part of a reduced test set in CI on Mac and Windows // machines. @Tags(['reduced-test-set']) @@ -16,7 +13,7 @@ import 'package:material_ui/material_ui.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter_test/flutter_test.dart'; -import '../widgets/semantics_tester.dart'; +import 'semantics_tester.dart'; const double _defaultBorderWidth = 1.0; From ac8073ea4d5c4bc806779cdc1a85c3bea4eba583 Mon Sep 17 00:00:00 2001 From: Burak Karahan Date: Thu, 25 Jun 2026 19:22:33 +0300 Subject: [PATCH 2/3] test: drop already-ported material slider test move --- .../slider_test.dart | 365 +++++++++--------- 1 file changed, 181 insertions(+), 184 deletions(-) rename packages/material_ui/{test => temporarily_disabled_tests}/slider_test.dart (96%) diff --git a/packages/material_ui/test/slider_test.dart b/packages/material_ui/temporarily_disabled_tests/slider_test.dart similarity index 96% rename from packages/material_ui/test/slider_test.dart rename to packages/material_ui/temporarily_disabled_tests/slider_test.dart index 461ffb05d824..8d6eff62fcf4 100644 --- a/packages/material_ui/test/slider_test.dart +++ b/packages/material_ui/temporarily_disabled_tests/slider_test.dart @@ -2,6 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +@Skip( + 'This file is skipped due to a cross-import that needs to be fixed. Tracked in https://github.com/flutter/flutter/issues/177028.', +) import 'dart:ui'; import 'package:cupertino_ui/cupertino_ui.dart'; @@ -14,7 +17,7 @@ import 'package:flutter/services.dart'; import 'package:flutter/src/physics/utils.dart' show nearEqual; import 'package:flutter_test/flutter_test.dart'; -import 'semantics_tester.dart'; +import '../widgets/semantics_tester.dart'; /// A [RoundedRectSliderTrackShape] that logs its paint. class LoggingRoundedRectSliderTrackShape extends RoundedRectSliderTrackShape { @@ -4071,72 +4074,70 @@ void main() { ); }); - testWidgets( - 'Overlay appears only when hovered on the thumb on desktop', - (WidgetTester tester) async { - var value = 0.5; - const overlayColor = Color(0xffff0000); + testWidgets('Overlay appear only when hovered on the thumb on desktop', ( + WidgetTester tester, + ) async { + var value = 0.5; + const overlayColor = Color(0xffff0000); - Widget buildApp({bool enabled = true}) { - return MaterialApp( - home: Material( - child: Center( - child: StatefulBuilder( - builder: (BuildContext context, StateSetter setState) { - return Slider( - value: value, - overlayColor: const MaterialStatePropertyAll(overlayColor), - onChanged: enabled - ? (double newValue) { - setState(() { - value = newValue; - }); - } - : null, - ); - }, - ), + Widget buildApp({bool enabled = true}) { + return MaterialApp( + home: Material( + child: Center( + child: StatefulBuilder( + builder: (BuildContext context, StateSetter setState) { + return Slider( + value: value, + overlayColor: const MaterialStatePropertyAll(overlayColor), + onChanged: enabled + ? (double newValue) { + setState(() { + value = newValue; + }); + } + : null, + ); + }, ), ), - ); - } + ), + ); + } - await tester.pumpWidget(buildApp()); + await tester.pumpWidget(buildApp()); - // Slider does not have overlay when enabled and not hovered. - await tester.pumpAndSettle(); - expect( - Material.of(tester.element(find.byType(Slider))), - isNot(paints..circle(color: overlayColor)), - ); + // Slider does not have overlay when enabled and not hovered. + await tester.pumpAndSettle(); + expect( + Material.of(tester.element(find.byType(Slider))), + isNot(paints..circle(color: overlayColor)), + ); - // Hover on the slider but outside the thumb. - final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse); - await gesture.addPointer(); - await gesture.moveTo(tester.getTopLeft(find.byType(Slider))); + // Hover on the slider but outside the thumb. + final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse); + await gesture.addPointer(); + await gesture.moveTo(tester.getTopLeft(find.byType(Slider))); - await tester.pumpWidget(buildApp()); - await tester.pumpAndSettle(); - expect( - Material.of(tester.element(find.byType(Slider))), - isNot(paints..circle(color: overlayColor)), - ); + await tester.pumpWidget(buildApp()); + await tester.pumpAndSettle(); + expect( + Material.of(tester.element(find.byType(Slider))), + isNot(paints..circle(color: overlayColor)), + ); - // Hover on the thumb. - await gesture.moveTo(tester.getCenter(find.byType(Slider))); - await tester.pumpAndSettle(); - expect(Material.of(tester.element(find.byType(Slider))), paints..circle(color: overlayColor)); + // Hover on the thumb. + await gesture.moveTo(tester.getCenter(find.byType(Slider))); + await tester.pumpAndSettle(); + expect(Material.of(tester.element(find.byType(Slider))), paints..circle(color: overlayColor)); - // Hover on the slider but outside the thumb. - await gesture.moveTo(tester.getBottomRight(find.byType(Slider))); - await tester.pumpAndSettle(); - expect( - Material.of(tester.element(find.byType(Slider))), - isNot(paints..circle(color: overlayColor)), - ); - }, - variant: TargetPlatformVariant.desktop(), - ); + // Hover on the slider but outside the thumb. + await gesture.moveTo(tester.getBottomRight(find.byType(Slider))); + await tester.pumpAndSettle(); + expect( + Material.of(tester.element(find.byType(Slider))), + isNot(paints..circle(color: overlayColor)), + ); + }, variant: TargetPlatformVariant.desktop()); testWidgets('Overlay remains when Slider is in focus on desktop', (WidgetTester tester) async { var value = 0.5; @@ -4205,155 +4206,151 @@ void main() { }, variant: TargetPlatformVariant.desktop()); // Regression test for https://github.com/flutter/flutter/issues/123313, which only occurs on desktop platforms. - testWidgets( - 'Value indicator disappears after adjusting the slider on desktop', - (WidgetTester tester) async { - final theme = ThemeData(); - const currentValue = 0.5; - await tester.pumpWidget( - MaterialApp( - theme: theme, - home: Material( - child: Center( - child: Slider( - value: currentValue, - divisions: 5, - label: currentValue.toStringAsFixed(1), - onChanged: (_) {}, - ), + testWidgets('Value indicator disappears after adjusting the slider on desktop', ( + WidgetTester tester, + ) async { + final theme = ThemeData(); + const currentValue = 0.5; + await tester.pumpWidget( + MaterialApp( + theme: theme, + home: Material( + child: Center( + child: Slider( + value: currentValue, + divisions: 5, + label: currentValue.toStringAsFixed(1), + onChanged: (_) {}, ), ), ), - ); + ), + ); - // Slider does not show value indicator initially. - await tester.pumpAndSettle(); - RenderBox valueIndicatorBox = tester.renderObject(find.byType(Overlay)); - expect( - valueIndicatorBox, - isNot( - paints - ..scale() - ..path(color: theme.colorScheme.primary), - ), - ); + // Slider does not show value indicator initially. + await tester.pumpAndSettle(); + RenderBox valueIndicatorBox = tester.renderObject(find.byType(Overlay)); + expect( + valueIndicatorBox, + isNot( + paints + ..scale() + ..path(color: theme.colorScheme.primary), + ), + ); - final Offset sliderCenter = tester.getCenter(find.byType(Slider)); - final tapLocation = Offset(sliderCenter.dx + 50, sliderCenter.dy); + final Offset sliderCenter = tester.getCenter(find.byType(Slider)); + final tapLocation = Offset(sliderCenter.dx + 50, sliderCenter.dy); - // Tap the slider by mouse to bring up the value indicator. - await tester.tapAt(tapLocation, kind: PointerDeviceKind.mouse); - await tester.pumpAndSettle(); + // Tap the slider by mouse to bring up the value indicator. + await tester.tapAt(tapLocation, kind: PointerDeviceKind.mouse); + await tester.pumpAndSettle(); - // Value indicator is visible. - valueIndicatorBox = tester.renderObject(find.byType(Overlay)); - expect( - valueIndicatorBox, + // Value indicator is visible. + valueIndicatorBox = tester.renderObject(find.byType(Overlay)); + expect( + valueIndicatorBox, + paints + ..scale() + ..path(color: theme.colorScheme.primary), + ); + + // Wait for the value indicator to disappear. + await tester.pumpAndSettle(const Duration(seconds: 2)); + + // Value indicator is no longer visible. + expect( + valueIndicatorBox, + isNot( paints ..scale() ..path(color: theme.colorScheme.primary), - ); + ), + ); + }, variant: TargetPlatformVariant.desktop()); - // Wait for the value indicator to disappear. - await tester.pumpAndSettle(const Duration(seconds: 2)); + testWidgets('Value indicator remains when Slider is in focus on desktop', ( + WidgetTester tester, + ) async { + var value = 0.5; + final focusNode = FocusNode(); + addTearDown(focusNode.dispose); - // Value indicator is no longer visible. - expect( - valueIndicatorBox, - isNot( - paints - ..scale() - ..path(color: theme.colorScheme.primary), + Widget buildApp({bool enabled = true}) { + return MaterialApp( + theme: ThemeData( + sliderTheme: const SliderThemeData(showValueIndicator: ShowValueIndicator.always), ), - ); - }, - variant: TargetPlatformVariant.desktop(), - ); - - testWidgets( - 'Value indicator remains when Slider is in focus on desktop', - (WidgetTester tester) async { - var value = 0.5; - final focusNode = FocusNode(); - addTearDown(focusNode.dispose); - - Widget buildApp({bool enabled = true}) { - return MaterialApp( - theme: ThemeData( - sliderTheme: const SliderThemeData(showValueIndicator: ShowValueIndicator.always), - ), - home: Material( - child: Center( - child: StatefulBuilder( - builder: (BuildContext context, StateSetter setState) { - return Slider( - value: value, - focusNode: focusNode, - divisions: 5, - label: value.toStringAsFixed(1), - onChanged: enabled - ? (double newValue) { - setState(() { - value = newValue; - }); - } - : null, - ); - }, - ), + home: Material( + child: Center( + child: StatefulBuilder( + builder: (BuildContext context, StateSetter setState) { + return Slider( + value: value, + focusNode: focusNode, + divisions: 5, + label: value.toStringAsFixed(1), + onChanged: enabled + ? (double newValue) { + setState(() { + value = newValue; + }); + } + : null, + ); + }, ), ), - ); - } - - await tester.pumpWidget(buildApp()); - - // Slider does not show value indicator without focus. - await tester.pumpAndSettle(); - expect(focusNode.hasFocus, false); - RenderBox valueIndicatorBox = tester.renderObject(find.byType(Overlay)); - expect( - valueIndicatorBox, - isNot( - paints - ..path(color: const Color(0xff000000)) - ..paragraph(), ), ); + } - final Offset sliderCenter = tester.getCenter(find.byType(Slider)); - final tapLocation = Offset(sliderCenter.dx + 50, sliderCenter.dy); + await tester.pumpWidget(buildApp()); - // Tap somewhere to bring value indicator. - final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse); - await gesture.addPointer(); - await gesture.down(tapLocation); - await gesture.up(); - focusNode.requestFocus(); - await tester.pumpAndSettle(); - expect(focusNode.hasFocus, true); - valueIndicatorBox = tester.renderObject(find.byType(Overlay)); - expect( - valueIndicatorBox, + // Slider does not show value indicator without focus. + await tester.pumpAndSettle(); + expect(focusNode.hasFocus, false); + RenderBox valueIndicatorBox = tester.renderObject(find.byType(Overlay)); + expect( + valueIndicatorBox, + isNot( paints ..path(color: const Color(0xff000000)) ..paragraph(), - ); + ), + ); - focusNode.unfocus(); - await tester.pumpAndSettle(); - expect(focusNode.hasFocus, false); - expect( - valueIndicatorBox, - isNot( - paints - ..path(color: const Color(0xff000000)) - ..paragraph(), - ), - ); - }, - variant: TargetPlatformVariant.desktop(), - ); + final Offset sliderCenter = tester.getCenter(find.byType(Slider)); + final tapLocation = Offset(sliderCenter.dx + 50, sliderCenter.dy); + + // Tap somewhere to bring value indicator. + final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse); + await gesture.addPointer(); + await gesture.down(tapLocation); + await gesture.up(); + focusNode.requestFocus(); + await tester.pumpAndSettle(); + expect(focusNode.hasFocus, true); + valueIndicatorBox = tester.renderObject(find.byType(Overlay)); + expect( + valueIndicatorBox, + paints + ..path(color: const Color(0xff000000)) + ..paragraph(), + ); + + focusNode.unfocus(); + await tester.pumpAndSettle(); + expect(focusNode.hasFocus, false); + expect( + valueIndicatorBox, + isNot( + paints + ..path(color: const Color(0xff000000)) + ..paragraph(), + ), + ); + }, variant: TargetPlatformVariant.desktop()); testWidgets('showValueIndicator takes priority over theme', (WidgetTester tester) async { Widget buildApp({ From 6c54de724ce1195545953536d729b926ad15e09d Mon Sep 17 00:00:00 2001 From: Burak Karahan Date: Thu, 25 Jun 2026 23:13:11 +0300 Subject: [PATCH 3/3] fix(material_ui): sort selection test imports --- packages/material_ui/test/checkbox_test.dart | 2 +- packages/material_ui/test/radio_test.dart | 2 +- packages/material_ui/test/range_slider_test.dart | 2 +- packages/material_ui/test/toggle_buttons_test.dart | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/material_ui/test/checkbox_test.dart b/packages/material_ui/test/checkbox_test.dart index e8ac3e086fd3..3e19060c1887 100644 --- a/packages/material_ui/test/checkbox_test.dart +++ b/packages/material_ui/test/checkbox_test.dart @@ -6,11 +6,11 @@ import 'dart:ui'; import 'package:cupertino_ui/cupertino_ui.dart'; import 'package:flutter/foundation.dart'; -import 'package:material_ui/material_ui.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:flutter/src/gestures/constants.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:material_ui/material_ui.dart'; import 'semantics_tester.dart'; diff --git a/packages/material_ui/test/radio_test.dart b/packages/material_ui/test/radio_test.dart index 36f8974d1f08..e04305792972 100644 --- a/packages/material_ui/test/radio_test.dart +++ b/packages/material_ui/test/radio_test.dart @@ -11,11 +11,11 @@ import 'dart:ui'; import 'package:cupertino_ui/cupertino_ui.dart'; import 'package:flutter/foundation.dart'; -import 'package:material_ui/material_ui.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:flutter/src/gestures/constants.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:material_ui/material_ui.dart'; import 'semantics_tester.dart'; diff --git a/packages/material_ui/test/range_slider_test.dart b/packages/material_ui/test/range_slider_test.dart index 77a50394b3c4..bce8581e9088 100644 --- a/packages/material_ui/test/range_slider_test.dart +++ b/packages/material_ui/test/range_slider_test.dart @@ -4,11 +4,11 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; -import 'package:material_ui/material_ui.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:flutter/src/physics/utils.dart' show nearEqual; import 'package:flutter_test/flutter_test.dart'; +import 'package:material_ui/material_ui.dart'; import 'semantics_tester.dart'; diff --git a/packages/material_ui/test/toggle_buttons_test.dart b/packages/material_ui/test/toggle_buttons_test.dart index 99828a2a80b5..f2230a2e05b2 100644 --- a/packages/material_ui/test/toggle_buttons_test.dart +++ b/packages/material_ui/test/toggle_buttons_test.dart @@ -9,9 +9,9 @@ library; import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; -import 'package:material_ui/material_ui.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:material_ui/material_ui.dart'; import 'semantics_tester.dart';