The studyset's four tabs become three parts, as Vaia has them, chosen with a switch in the header that ticks as the navigation bar does: below expanded windows in a line of its own under the title, above the path and Topics; from there on at the end of the path's line, which the topics leave free there. - Material: the flashcards, notes and files one below the other, the first three of each with Show all; Browse, the tag filter (where all cards show, or while they are narrowed) and Reorder in each section's header; an outlined box where a section is empty. - Progress, once anything in the studyset was studied (a card rated, a path finished): how much is learnt (mature cards), how many studied cards are due today, and how long it was studied this week on this device, with a line of the seven days (StudysetActivityCubit, from the reviews' durations). - Study plan: a ring of the paths finished, Next up (study the cards due, go on with the first path not finished), then the paths. It opens on the part it was left on; a tab kept before counts as its part. Opened for the first time, it opens on the study plan while a path is unfinished, else on the material. Material added lands in its part. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
63 lines
2.4 KiB
Dart
63 lines
2.4 KiB
Dart
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:halkyon_learn_flutter/src/app/person_app.dart';
|
|
import 'package:halkyon_learn_flutter/src/core/dependencies/dependencies.dart';
|
|
import 'package:halkyon_learn_flutter/src/core/dependencies/dependencies_scope.dart';
|
|
import 'package:halkyon_learn_flutter/src/core/router/route_paths.dart';
|
|
import 'package:halkyon_learn_flutter/src/feature/auth/widget/session_gate.dart';
|
|
import 'package:halkyon_learn_flutter/src/feature/studyset/bloc/content_tab_cubit.dart';
|
|
import 'package:halkyon_learn_flutter/src/feature/studyset/widget/studyset_parts.dart';
|
|
import 'package:material_ui/material_ui.dart';
|
|
|
|
/// Pumps the whole app as a person starts it, on [dependencies] (usually
|
|
/// `testDependencies(...)`): signed in, anonymously unless the auth fake says
|
|
/// otherwise, and opened at [location]. Settles, so that the person's data is
|
|
/// open and the first screen shows; the app's spinner animates without end,
|
|
/// so settling needs the fakes to have answered.
|
|
///
|
|
/// Every person's app opens at [location], also after a change of person.
|
|
Future<void> pumpApp(
|
|
WidgetTester tester,
|
|
Dependencies dependencies, {
|
|
String location = RoutePaths.home,
|
|
}) async {
|
|
await tester.pumpWidget(
|
|
DependenciesScope(
|
|
dependencies: dependencies,
|
|
child: SessionGate(
|
|
app: (person) => PersonApp(person: person, initialLocation: location),
|
|
),
|
|
),
|
|
);
|
|
await tester.pumpAndSettle();
|
|
}
|
|
|
|
/// The tab labelled [label] in the app's navigation, rail or bar. Its label
|
|
/// alone could also be a screen's title.
|
|
Finder tab(String label) => find.descendant(
|
|
of: find.byWidgetPredicate(
|
|
(widget) => widget is NavigationRail || widget is NavigationBar,
|
|
),
|
|
matching: find.text(label),
|
|
);
|
|
|
|
/// Chooses the tab labelled [label] and settles.
|
|
Future<void> openTab(WidgetTester tester, String label) async {
|
|
await tester.tap(tab(label));
|
|
await tester.pumpAndSettle();
|
|
}
|
|
|
|
/// The part of the studyset screen shown.
|
|
StudysetPart shownPart(WidgetTester tester) =>
|
|
tester.widget<StudysetPartSwitch>(find.byType(StudysetPartSwitch)).current;
|
|
|
|
/// Shows the studyset screen's part [label] ("Material", "Study plan") and
|
|
/// settles.
|
|
Future<void> openPart(WidgetTester tester, String label) async {
|
|
await tester.tap(
|
|
find.descendant(
|
|
of: find.byType(StudysetPartSwitch),
|
|
matching: find.text(label),
|
|
),
|
|
);
|
|
await tester.pumpAndSettle();
|
|
}
|