Improve slider's value indicator display test (#139198)
The previous test for #128137 does not effectively regress and verify #123313 because the issue is specific to desktop platforms.
This commit is contained in:
parent
72aafe8619
commit
4252aa0fff
@ -11,7 +11,7 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:flutter/gestures.dart' show kPrimaryButton;
|
import 'package:flutter/gestures.dart' show PointerDeviceKind, kPrimaryButton;
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/scheduler.dart';
|
import 'package:flutter/scheduler.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
@ -137,13 +137,18 @@ class _LiveWidgetController extends LiveWidgetController {
|
|||||||
return finder;
|
return finder;
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
Future<void> tap(FinderBase<Element> finder, { int? pointer, int buttons = kPrimaryButton, bool warnIfMissed = true }) async {
|
|
||||||
await super.tap(await _waitForElement(finder), pointer: pointer, buttons: buttons, warnIfMissed: warnIfMissed);
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> scrollIntoView(FinderBase<Element> finder, {required double alignment}) async {
|
Future<void> scrollIntoView(FinderBase<Element> finder, {required double alignment}) async {
|
||||||
final FinderBase<Element> target = await _waitForElement(finder);
|
final FinderBase<Element> target = await _waitForElement(finder);
|
||||||
await Scrollable.ensureVisible(target.evaluate().single, duration: const Duration(milliseconds: 100), alignment: alignment);
|
await Scrollable.ensureVisible(target.evaluate().single, duration: const Duration(milliseconds: 100), alignment: alignment);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<void> tap(FinderBase<Element> finder, {
|
||||||
|
int? pointer,
|
||||||
|
int buttons = kPrimaryButton,
|
||||||
|
bool warnIfMissed = true,
|
||||||
|
PointerDeviceKind kind = PointerDeviceKind.touch,
|
||||||
|
}) async {
|
||||||
|
await super.tap(await _waitForElement(finder), pointer: pointer, buttons: buttons, warnIfMissed: warnIfMissed, kind: kind);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -3432,7 +3432,7 @@ void main() {
|
|||||||
await gesture.up();
|
await gesture.up();
|
||||||
await tester.pumpAndSettle();
|
await tester.pumpAndSettle();
|
||||||
expect(value, isNot(equals(0.5)));
|
expect(value, isNot(equals(0.5)));
|
||||||
// The slider does not have have focus after the value is changed.
|
// The slider does not have focus after the value is changed.
|
||||||
expect(focusNode.hasFocus, false);
|
expect(focusNode.hasFocus, false);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -3618,8 +3618,8 @@ void main() {
|
|||||||
);
|
);
|
||||||
}, variant: TargetPlatformVariant.desktop());
|
}, variant: TargetPlatformVariant.desktop());
|
||||||
|
|
||||||
testWidgetsWithLeakTracking('Value indicator disappears after adjusting the slider', (WidgetTester tester) async {
|
// Regression test for https://github.com/flutter/flutter/issues/123313, which only occurs on desktop platforms.
|
||||||
// This is a regression test for https://github.com/flutter/flutter/issues/123313.
|
testWidgetsWithLeakTracking('Value indicator disappears after adjusting the slider on desktop', (WidgetTester tester) async {
|
||||||
final ThemeData theme = ThemeData(useMaterial3: true);
|
final ThemeData theme = ThemeData(useMaterial3: true);
|
||||||
const double currentValue = 0.5;
|
const double currentValue = 0.5;
|
||||||
await tester.pumpWidget(MaterialApp(
|
await tester.pumpWidget(MaterialApp(
|
||||||
@ -3630,7 +3630,7 @@ void main() {
|
|||||||
value: currentValue,
|
value: currentValue,
|
||||||
divisions: 5,
|
divisions: 5,
|
||||||
label: currentValue.toStringAsFixed(1),
|
label: currentValue.toStringAsFixed(1),
|
||||||
onChanged: (double value) {},
|
onChanged: (_) {},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -3647,8 +3647,8 @@ void main() {
|
|||||||
final Offset sliderCenter = tester.getCenter(find.byType(Slider));
|
final Offset sliderCenter = tester.getCenter(find.byType(Slider));
|
||||||
final Offset tapLocation = Offset(sliderCenter.dx + 50, sliderCenter.dy);
|
final Offset tapLocation = Offset(sliderCenter.dx + 50, sliderCenter.dy);
|
||||||
|
|
||||||
// Tap the slider to bring up the value indicator.
|
// Tap the slider by mouse to bring up the value indicator.
|
||||||
await tester.tapAt(tapLocation);
|
await tester.tapAt(tapLocation, kind: PointerDeviceKind.mouse);
|
||||||
await tester.pumpAndSettle();
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
// Value indicator is visible.
|
// Value indicator is visible.
|
||||||
@ -3666,7 +3666,7 @@ void main() {
|
|||||||
valueIndicatorBox,
|
valueIndicatorBox,
|
||||||
isNot(paints..scale()..path(color: theme.colorScheme.primary)),
|
isNot(paints..scale()..path(color: theme.colorScheme.primary)),
|
||||||
);
|
);
|
||||||
});
|
}, variant: TargetPlatformVariant.desktop());
|
||||||
|
|
||||||
testWidgetsWithLeakTracking('Value indicator remains when Slider is in focus on desktop', (WidgetTester tester) async {
|
testWidgetsWithLeakTracking('Value indicator remains when Slider is in focus on desktop', (WidgetTester tester) async {
|
||||||
double value = 0.5;
|
double value = 0.5;
|
||||||
|
@ -987,14 +987,25 @@ abstract class WidgetController {
|
|||||||
/// For example, a test that verifies that tapping a disabled button does not
|
/// For example, a test that verifies that tapping a disabled button does not
|
||||||
/// trigger the button would set `warnIfMissed` to false, because the button
|
/// trigger the button would set `warnIfMissed` to false, because the button
|
||||||
/// would ignore the tap.
|
/// would ignore the tap.
|
||||||
Future<void> tap(finders.FinderBase<Element> finder, {int? pointer, int buttons = kPrimaryButton, bool warnIfMissed = true}) {
|
Future<void> tap(
|
||||||
return tapAt(getCenter(finder, warnIfMissed: warnIfMissed, callee: 'tap'), pointer: pointer, buttons: buttons);
|
finders.FinderBase<Element> finder, {
|
||||||
|
int? pointer,
|
||||||
|
int buttons = kPrimaryButton,
|
||||||
|
bool warnIfMissed = true,
|
||||||
|
PointerDeviceKind kind = PointerDeviceKind.touch,
|
||||||
|
}) {
|
||||||
|
return tapAt(getCenter(finder, warnIfMissed: warnIfMissed, callee: 'tap'), pointer: pointer, buttons: buttons, kind: kind);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Dispatch a pointer down / pointer up sequence at the given location.
|
/// Dispatch a pointer down / pointer up sequence at the given location.
|
||||||
Future<void> tapAt(Offset location, {int? pointer, int buttons = kPrimaryButton}) {
|
Future<void> tapAt(
|
||||||
|
Offset location, {
|
||||||
|
int? pointer,
|
||||||
|
int buttons = kPrimaryButton,
|
||||||
|
PointerDeviceKind kind = PointerDeviceKind.touch,
|
||||||
|
}) {
|
||||||
return TestAsyncUtils.guard<void>(() async {
|
return TestAsyncUtils.guard<void>(() async {
|
||||||
final TestGesture gesture = await startGesture(location, pointer: pointer, buttons: buttons);
|
final TestGesture gesture = await startGesture(location, pointer: pointer, buttons: buttons, kind: kind);
|
||||||
await gesture.up();
|
await gesture.up();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -1012,9 +1023,20 @@ abstract class WidgetController {
|
|||||||
/// * [tap], which presses and releases a pointer at the given location.
|
/// * [tap], which presses and releases a pointer at the given location.
|
||||||
/// * [longPress], which presses and releases a pointer with a gap in
|
/// * [longPress], which presses and releases a pointer with a gap in
|
||||||
/// between long enough to trigger the long-press gesture.
|
/// between long enough to trigger the long-press gesture.
|
||||||
Future<TestGesture> press(finders.FinderBase<Element> finder, {int? pointer, int buttons = kPrimaryButton, bool warnIfMissed = true}) {
|
Future<TestGesture> press(
|
||||||
|
finders.FinderBase<Element> finder, {
|
||||||
|
int? pointer,
|
||||||
|
int buttons = kPrimaryButton,
|
||||||
|
bool warnIfMissed = true,
|
||||||
|
PointerDeviceKind kind = PointerDeviceKind.touch,
|
||||||
|
}) {
|
||||||
return TestAsyncUtils.guard<TestGesture>(() {
|
return TestAsyncUtils.guard<TestGesture>(() {
|
||||||
return startGesture(getCenter(finder, warnIfMissed: warnIfMissed, callee: 'press'), pointer: pointer, buttons: buttons);
|
return startGesture(
|
||||||
|
getCenter(finder, warnIfMissed: warnIfMissed, callee: 'press'),
|
||||||
|
pointer: pointer,
|
||||||
|
buttons: buttons,
|
||||||
|
kind: kind,
|
||||||
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1030,15 +1052,31 @@ abstract class WidgetController {
|
|||||||
/// later verify that long-pressing the same location (using the same finder)
|
/// later verify that long-pressing the same location (using the same finder)
|
||||||
/// has no effect (since the widget is now obscured), setting `warnIfMissed`
|
/// has no effect (since the widget is now obscured), setting `warnIfMissed`
|
||||||
/// to false on that second call.
|
/// to false on that second call.
|
||||||
Future<void> longPress(finders.FinderBase<Element> finder, {int? pointer, int buttons = kPrimaryButton, bool warnIfMissed = true}) {
|
Future<void> longPress(
|
||||||
return longPressAt(getCenter(finder, warnIfMissed: warnIfMissed, callee: 'longPress'), pointer: pointer, buttons: buttons);
|
finders.FinderBase<Element> finder, {
|
||||||
|
int? pointer,
|
||||||
|
int buttons = kPrimaryButton,
|
||||||
|
bool warnIfMissed = true,
|
||||||
|
PointerDeviceKind kind = PointerDeviceKind.touch,
|
||||||
|
}) {
|
||||||
|
return longPressAt(
|
||||||
|
getCenter(finder, warnIfMissed: warnIfMissed, callee: 'longPress'),
|
||||||
|
pointer: pointer,
|
||||||
|
buttons: buttons,
|
||||||
|
kind: kind,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Dispatch a pointer down / pointer up sequence at the given location with
|
/// Dispatch a pointer down / pointer up sequence at the given location with
|
||||||
/// a delay of [kLongPressTimeout] + [kPressTimeout] between the two events.
|
/// a delay of [kLongPressTimeout] + [kPressTimeout] between the two events.
|
||||||
Future<void> longPressAt(Offset location, {int? pointer, int buttons = kPrimaryButton}) {
|
Future<void> longPressAt(
|
||||||
|
Offset location, {
|
||||||
|
int? pointer,
|
||||||
|
int buttons = kPrimaryButton,
|
||||||
|
PointerDeviceKind kind = PointerDeviceKind.touch,
|
||||||
|
}) {
|
||||||
return TestAsyncUtils.guard<void>(() async {
|
return TestAsyncUtils.guard<void>(() async {
|
||||||
final TestGesture gesture = await startGesture(location, pointer: pointer, buttons: buttons);
|
final TestGesture gesture = await startGesture(location, pointer: pointer, buttons: buttons, kind: kind);
|
||||||
await pump(kLongPressTimeout + kPressTimeout);
|
await pump(kLongPressTimeout + kPressTimeout);
|
||||||
await gesture.up();
|
await gesture.up();
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user