timetable performance optimization

This commit is contained in:
2026-09-25 22:27:10 +02:00
parent ef7d17033d
commit ed8e52f475
13 changed files with 391 additions and 137 deletions
+9
View File
@@ -86,6 +86,15 @@ void main() {
final d = DateTime(2026, 5, 18, 13, 45);
expect(d.subtractDays(5), d.addDays(-5));
});
test('dateOnly drops the time of day', () {
expect(DateTime(2026, 9, 24, 13, 45).dateOnly, DateTime(2026, 9, 24));
});
test('mondayOfWeek returns Monday midnight for any weekday', () {
expect(DateTime(2026, 9, 21).mondayOfWeek, DateTime(2026, 9, 21));
expect(DateTime(2026, 9, 27, 23, 59).mondayOfWeek, DateTime(2026, 9, 21));
});
});
group('DateTimeFormatting', () {
+74
View File
@@ -0,0 +1,74 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:marianum_mobile/api/marianumconnect/queries/timetable_get_week/timetable_get_week_response.dart';
import 'package:marianum_mobile/extensions/date_time.dart';
import 'package:marianum_mobile/state/app/modules/timetable/bloc/week_cache.dart';
TimetableGetWeekResponse _week(DateTime monday, {String room = 'A101'}) =>
TimetableGetWeekResponse(
from: monday,
until: monday.addDays(4),
entries: [
McTimetableEntry(
id: 1,
date: monday,
startTime: DateTime(1970, 1, 1, 8),
endTime: DateTime(1970, 1, 1, 9),
subjects: const ['ma'],
teachers: const [],
rooms: [room],
classNames: const [],
lessonType: 'LESSON',
status: 'REGULAR',
substitutionText: null,
lessonText: null,
infoText: null,
),
],
);
void main() {
final monday = DateTime(2026, 9, 21);
test('returns null when the stored week has identical content', () {
final cache = {monday.weekKey(): _week(monday)};
final result = mergeWeekIntoCache(
cache,
monday,
_week(monday),
viewedWeekStart: monday,
now: monday,
);
expect(result, isNull);
});
test('stores changed content', () {
final cache = {monday.weekKey(): _week(monday)};
final changed = _week(monday, room: 'B202');
final result = mergeWeekIntoCache(
cache,
monday,
changed,
viewedWeekStart: monday,
now: monday,
);
expect(result![monday.weekKey()], same(changed));
});
test('drops weeks far from both the viewed week and today', () {
final far = monday.addDays(7 * (kWeekCacheRadius + 3));
final nearToday = monday.addDays(-7 * kWeekCacheRadius);
final viewed = monday.addDays(7 * (kWeekCacheRadius * 3));
final cache = {
far.weekKey(): _week(far),
nearToday.weekKey(): _week(nearToday),
};
final result = mergeWeekIntoCache(
cache,
viewed,
_week(viewed),
viewedWeekStart: viewed,
now: monday.addDays(2),
);
expect(result!.keys, {nearToday.weekKey(), viewed.weekKey()});
});
}