diet-guard/app/test/ui/theme_motion_test.dart
Krzysztof kuhy Rudnicki 97af520fdd
Some checks are pending
dependency freshness / dependencies on newest stable (push) Waiting to run
file-length / file length <= 250 lines (push) Waiting to run
md-naming / markdown naming convention (push) Waiting to run
pre-commit / pre-commit (${{ matrix.group }}) (mypy, mypy, ) (push) Waiting to run
pre-commit / pre-commit (${{ matrix.group }}) (pylint, pylint, ) (push) Waiting to run
pre-commit / pre-commit (${{ matrix.group }}) (rest, , mypy,pylint) (push) Waiting to run
Tests / test (push) Waiting to run
release-apk / release (APK) (push) Waiting to run
repo-contract / repo contract (push) Waiting to run
Add log sound cue and progress card motion
- lightImpact + 160 ms confirm cue on a validated log (audioplayers,
  no audio focus); device-local opt-out switch in Settings, on by default
- post-log card: confirmation line (slot + the meal's kcal), entrance and
  kcal/streak count-up on motion tokens transcribed into ui/theme.dart;
  durations collapse to zero under disableAnimations
- test/flutter_test_config.dart mutes the cue suite-wide

Todo: 8e66c1b9
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WzxdWVHMLzeojNP4AaPoEj
2026-11-02 21:12:46 +01:00

48 lines
1.4 KiB
Dart

import 'package:diet_guard_app/ui/theme.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
test('durations follow the shared motion scale', () {
expect(AppDuration.instant, Duration.zero);
expect(AppDuration.fast, const Duration(milliseconds: 120));
expect(AppDuration.base, const Duration(milliseconds: 200));
expect(AppDuration.slow, const Duration(milliseconds: 320));
});
test('curves carry the shared control points', () {
expect(AppCurve.standard, const Cubic(0.2, 0, 0, 1));
expect(AppCurve.decelerate, const Cubic(0, 0, 0, 1));
expect(AppCurve.accelerate, const Cubic(0.3, 0, 1, 1));
});
Future<Duration> resolved(
WidgetTester tester, {
required bool reduced,
}) async {
late Duration out;
await tester.pumpWidget(
MediaQuery(
data: MediaQueryData(disableAnimations: reduced),
child: Builder(
builder: (context) {
out = AppDuration.resolve(context, AppDuration.slow);
return const SizedBox();
},
),
),
);
return out;
}
testWidgets('resolve collapses to zero under disableAnimations', (
tester,
) async {
expect(await resolved(tester, reduced: true), Duration.zero);
});
testWidgets('resolve returns the token otherwise', (tester) async {
expect(await resolved(tester, reduced: false), AppDuration.slow);
});
}