Skip to content

Commit

Permalink
tests
Browse files Browse the repository at this point in the history
  • Loading branch information
tilucasoli committed Nov 29, 2024
1 parent 4b3744b commit d96a5b2
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ mixin HandlePress on WidgetStateHandler {
int _pressCount = 0;
Timer? _timer;

void pressCallback();
void returnToStartState();

void handlePress({required bool value, required Duration delay}) {
controller.pressed = value;
Expand All @@ -29,7 +29,7 @@ mixin HandlePress on WidgetStateHandler {
void unpressCallback() {
if (controller.pressed && _pressCount == initialPressCount) {
controller.pressed = false;
pressCallback();
returnToStartState();
}
}

Expand Down Expand Up @@ -202,6 +202,7 @@ class _GestureMixStateWidgetState

void _onTapCancel() {
controller.longPressed = false;
returnToStartState();
widget.onTapCancel?.call();
}

Expand All @@ -219,7 +220,7 @@ class _GestureMixStateWidgetState
}

@override
void pressCallback() {
void returnToStartState() {
setState(() {
_event = PressEvent.idle;
});
Expand Down
1 change: 0 additions & 1 deletion packages/mix/lib/src/variants/widget_state_variant.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import 'package:flutter/widgets.dart';

import '../core/factory/style_mix.dart';
import '../core/variant.dart';
import '../core/widget_state/internal/gesture_mix_state.dart';
import '../core/widget_state/internal/mouse_region_mix_state.dart';
import '../core/widget_state/press_event_mix_state.dart';
import '../core/widget_state/widget_state_controller.dart';
Expand Down
89 changes: 70 additions & 19 deletions packages/mix/test/src/core/mix_state/press_states_test.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mix/mix.dart';
import 'package:mix/src/core/widget_state/internal/gesture_mix_state.dart';

import '../../../helpers/context_finder.dart';
import '../../../helpers/testing_utils.dart';
Expand All @@ -12,36 +11,88 @@ extension _WidgetTesterX on WidgetTester {
}
}

class _Counter {
int value = 0;

void increment() {
value++;
}
}

Future<TestGesture> _setupPressableWidgetWithInitialTests(
WidgetTester tester, _Counter counter) async {
await tester.pumpMaterialApp(
PressableBox(
onPress: counter.increment,
onLongPress: () {},
child: Text('$counter'),
),
);

// Initial state should be idle
expect(tester.findPressEventWidget().event, PressEvent.idle);

// Press down on the PressableBox
final gesture = await tester.press(find.byType(PressableBox));

await tester.pumpAndSettle();
expect(tester.findPressEventWidget().event, PressEvent.onTapDown);

return gesture;
}

void main() {
testWidgets(
'Pressable should transition through (onTapDown and onTapUp) states correctly',
(tester) async {
int counter = 0;
await tester.pumpMaterialApp(
PressableBox(
onPress: () {
counter++;
},
child: Text('$counter'),
),
);

// Initial state should be idle
expect(tester.findPressEventWidget().event, PressEvent.idle);

// Press down on the PressableBox
final gesture = await tester.press(find.byType(PressableBox));
await tester.pumpAndSettle();
expect(tester.findPressEventWidget().event, PressEvent.onTapDown);
final counter = _Counter();
final gesture =
await _setupPressableWidgetWithInitialTests(tester, counter);

// Release the press
await gesture.up();
await tester.pumpAndSettle();
expect(tester.findPressEventWidget().event, PressEvent.onTapUp);

expect(counter, equals(1));
expect(counter.value, equals(1));

await tester.pump(const Duration(milliseconds: 300));
expect(tester.findPressEventWidget().event, PressEvent.idle);
});

testWidgets(
'Pressable should transition through (onTapDown and cancel) states correctly',
(tester) async {
final counter = _Counter();
final gesture =
await _setupPressableWidgetWithInitialTests(tester, counter);

// Cancel the press
await gesture.cancel();
await tester.pumpAndSettle();

await tester.pump(const Duration(milliseconds: 300));
expect(tester.findPressEventWidget().event, PressEvent.idle);

expect(counter.value, equals(0));
});

testWidgets(
'Pressable should handle long press state transitions and maintain correct state',
(tester) async {
final counter = _Counter();
final _ = await _setupPressableWidgetWithInitialTests(tester, counter);

// Long press on the PressableBox
await tester.longPress(find.byType(PressableBox));
await tester.pumpAndSettle();

expect(tester.findPressEventWidget().event, PressEvent.idle);

BuildContext context = tester.element(find.byType(Text));
final isLongPressed = $on.longPress.when(context);

expect(isLongPressed, isTrue);
expect(counter.value, equals(0));
});
}

0 comments on commit d96a5b2

Please sign in to comment.