Skip to content

Commit f83d997

Browse files
committed
✨ Add tests to LoadSwitch for unchanged value handling in executeWithLoading and onToggle callbacks, ensuring onChanged is not called when the value remains the same.
1 parent 082ce2f commit f83d997

1 file changed

Lines changed: 56 additions & 2 deletions

File tree

test/load_switch_test.dart

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,23 @@ void main() {
6161
expect(controller.value, isFalse);
6262
});
6363

64+
test('executeWithLoading does not call onChanged when value is unchanged',
65+
() async {
66+
final controller = LoadSwitchController(initialValue: true);
67+
final events = <String>[];
68+
69+
await controller.executeWithLoading(
70+
() async => true, // returns the same value as current
71+
onChanged: (value) {
72+
events.add('changed:$value');
73+
},
74+
);
75+
76+
expect(controller.value, isTrue);
77+
expect(events, isEmpty,
78+
reason: 'onChanged must not fire when the value did not change');
79+
});
80+
6481
test('toggle respects active and loading state', () {
6582
final controller = LoadSwitchController(initialValue: false);
6683

@@ -108,7 +125,8 @@ void main() {
108125
expect(value, isTrue);
109126
});
110127

111-
testWidgets('inactive managed switch blocks interaction', (
128+
testWidgets(
129+
'inactive managed switch fires onTap but blocks toggle and onChanged', (
112130
WidgetTester tester,
113131
) async {
114132
var tapCount = 0;
@@ -132,7 +150,9 @@ void main() {
132150
await tester.tap(find.byType(LoadSwitch));
133151
await tester.pump();
134152

135-
expect(tapCount, 0);
153+
// onTap fires so callers can show feedback (tooltip, snackbar, etc.)
154+
// explaining why the switch is disabled.
155+
expect(tapCount, 1);
136156
expect(toggleCount, 0);
137157
});
138158

@@ -608,6 +628,40 @@ void main() {
608628
semantics.dispose();
609629
});
610630

631+
testWidgets(
632+
'onChanged is not called when onToggle returns the current value', (
633+
WidgetTester tester,
634+
) async {
635+
bool value = false;
636+
final events = <String>[];
637+
638+
await tester.pumpWidget(
639+
_wrapWithApp(
640+
StatefulBuilder(
641+
builder: (context, setState) {
642+
return LoadSwitch.managed(
643+
value: value,
644+
onToggle: () async => false, // returns same value as current
645+
onChanged: (nextValue) {
646+
events.add('changed:$nextValue');
647+
setState(() {
648+
value = nextValue;
649+
});
650+
},
651+
);
652+
},
653+
),
654+
),
655+
);
656+
657+
await tester.tap(find.byType(LoadSwitch));
658+
await tester.pumpAndSettle();
659+
660+
expect(value, isFalse);
661+
expect(events, isEmpty,
662+
reason: 'onChanged must not fire when value did not change');
663+
});
664+
611665
testWidgets('keyboard activation toggles the switch', (
612666
WidgetTester tester,
613667
) async {

0 commit comments

Comments
 (0)