Skip to content

Commit d710fad

Browse files
test: add tests for unprotected behavior
Co-authored-by: nilsreichardt <24459435+nilsreichardt@users.noreply.github.com>
1 parent 3be59dc commit d710fad

4 files changed

Lines changed: 299 additions & 0 deletions

File tree

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import 'package:clock/clock.dart';
2+
import 'package:flutter_test/flutter_test.dart';
3+
import 'package:hausaufgabenheft_logik/src/shared/models/date.dart';
4+
5+
void main() {
6+
group('Date Tests', () {
7+
test('Date.now() uses clock', () {
8+
withClock(Clock.fixed(DateTime(2023, 10, 15, 12, 30)), () {
9+
final date = Date.now();
10+
expect(date.year, 2023);
11+
expect(date.month, 10);
12+
expect(date.day, 15);
13+
});
14+
});
15+
16+
test('addDays correctly wraps months and years', () {
17+
final date = const Date(day: 31, month: 12, year: 2023);
18+
final nextDay = date.addDays(1);
19+
20+
expect(nextDay.day, 1);
21+
expect(nextDay.month, 1);
22+
expect(nextDay.year, 2024);
23+
});
24+
25+
test('compareTo orders dates correctly', () {
26+
final earlier = const Date(day: 14, month: 10, year: 2023);
27+
final laterDay = const Date(day: 15, month: 10, year: 2023);
28+
final laterMonth = const Date(day: 14, month: 11, year: 2023);
29+
final laterYear = const Date(day: 14, month: 10, year: 2024);
30+
31+
expect(earlier.compareTo(laterDay), lessThan(0));
32+
expect(earlier.compareTo(laterMonth), lessThan(0));
33+
expect(earlier.compareTo(laterYear), lessThan(0));
34+
35+
expect(laterDay.compareTo(earlier), greaterThan(0));
36+
expect(earlier.compareTo(earlier), equals(0));
37+
});
38+
39+
test('Operators > and < work correctly', () {
40+
final earlier = const Date(day: 1, month: 1, year: 2023);
41+
final later = const Date(day: 2, month: 1, year: 2023);
42+
43+
expect(later > earlier, isTrue);
44+
expect(earlier < later, isTrue);
45+
expect(earlier > later, isFalse);
46+
expect(later < earlier, isFalse);
47+
});
48+
});
49+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import 'package:flutter_test/flutter_test.dart';
2+
import 'package:common_domain_models/common_domain_models.dart';
3+
import 'package:hausaufgabenheft_logik/src/shared/models/homework.dart';
4+
import 'package:hausaufgabenheft_logik/src/shared/models/date.dart';
5+
import 'package:hausaufgabenheft_logik/src/shared/models/subject.dart';
6+
import 'package:hausaufgabenheft_logik/src/shared/models/title.dart';
7+
import 'package:hausaufgabenheft_logik/src/shared/color.dart';
8+
9+
class _TestHomework extends BaseHomeworkReadModel {
10+
const _TestHomework({
11+
required super.id,
12+
required super.title,
13+
required super.subject,
14+
required super.courseId,
15+
required super.withSubmissions,
16+
required super.todoDate,
17+
});
18+
}
19+
20+
void main() {
21+
group('BaseHomeworkReadModel', () {
22+
final today = Date(year: 2023, month: 10, day: 15);
23+
final subject = Subject(
24+
'Math',
25+
abbreviation: 'M',
26+
color: const Color(0xFF000000),
27+
);
28+
final title = Title('Homework 1');
29+
30+
test('isOverdueRelativeTo returns true if todoDate is before today', () {
31+
final pastDate = DateTime(2023, 10, 14);
32+
final homework = _TestHomework(
33+
id: HomeworkId('hw-1'),
34+
title: title,
35+
subject: subject,
36+
courseId: CourseId('course-1'),
37+
withSubmissions: false,
38+
todoDate: pastDate,
39+
);
40+
41+
expect(homework.isOverdueRelativeTo(today), isTrue);
42+
});
43+
44+
test('isOverdueRelativeTo returns false if todoDate is exactly today', () {
45+
final currentDate = DateTime(2023, 10, 15, 12, 0); // time shouldn't matter
46+
final homework = _TestHomework(
47+
id: HomeworkId('hw-1'),
48+
title: title,
49+
subject: subject,
50+
courseId: CourseId('course-1'),
51+
withSubmissions: false,
52+
todoDate: currentDate,
53+
);
54+
55+
expect(homework.isOverdueRelativeTo(today), isFalse);
56+
});
57+
58+
test('isOverdueRelativeTo returns false if todoDate is after today', () {
59+
final futureDate = DateTime(2023, 10, 16);
60+
final homework = _TestHomework(
61+
id: HomeworkId('hw-1'),
62+
title: title,
63+
subject: subject,
64+
courseId: CourseId('course-1'),
65+
withSubmissions: false,
66+
todoDate: futureDate,
67+
);
68+
69+
expect(homework.isOverdueRelativeTo(today), isFalse);
70+
});
71+
});
72+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import 'package:flutter_test/flutter_test.dart';
2+
import 'package:hausaufgabenheft_logik/src/shared/models/subject.dart';
3+
import 'package:hausaufgabenheft_logik/src/shared/color.dart';
4+
5+
void main() {
6+
group('Subject Tests', () {
7+
test('Subject throws ArgumentError if name is empty', () {
8+
expect(
9+
() => Subject('', abbreviation: 'M', color: const Color(0xFF000000)),
10+
throwsArgumentError,
11+
);
12+
});
13+
14+
test('Subject instantiates correctly with valid name', () {
15+
final subject = Subject('Math', abbreviation: 'M', color: const Color(0xFF000000));
16+
expect(subject.name, 'Math');
17+
expect(subject.abbreviation, 'M');
18+
expect(subject.color, const Color(0xFF000000));
19+
});
20+
});
21+
}
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
import 'package:fast_immutable_collections/fast_immutable_collections.dart';
2+
import 'package:flutter_test/flutter_test.dart';
3+
import 'package:common_domain_models/common_domain_models.dart';
4+
import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart';
5+
import 'package:hausaufgabenheft_logik/src/shared/models/homework.dart';
6+
import 'package:hausaufgabenheft_logik/src/shared/color.dart';
7+
import 'package:hausaufgabenheft_logik/src/shared/sort_and_subcategorizer.dart';
8+
import 'package:hausaufgabenheft_logik/src/shared/homework_section_view.dart';
9+
10+
class _TestHomework extends BaseHomeworkReadModel {
11+
const _TestHomework({
12+
required super.id,
13+
required super.title,
14+
required super.subject,
15+
required super.courseId,
16+
required super.withSubmissions,
17+
required super.todoDate,
18+
});
19+
}
20+
21+
void main() {
22+
group('HomeworkSortAndSubcategorizer', () {
23+
late HomeworkSortAndSubcategorizer subcategorizer;
24+
final today = Date(year: 2023, month: 10, day: 15); // A Sunday
25+
26+
setUp(() {
27+
subcategorizer = HomeworkSortAndSubcategorizer(
28+
getCurrentDate: () => today,
29+
);
30+
});
31+
32+
final mathSubject = Subject('Math', abbreviation: 'M', color: const Color(0xFF000000));
33+
final englishSubject = Subject('English', abbreviation: 'E', color: const Color(0xFF000000));
34+
35+
final overdueHomework = _TestHomework(
36+
id: HomeworkId('hw-overdue'),
37+
title: Title('Overdue HW'),
38+
subject: mathSubject,
39+
courseId: CourseId('c-1'),
40+
withSubmissions: false,
41+
todoDate: DateTime(2023, 10, 14), // Yesterday
42+
);
43+
44+
final todayHomework = _TestHomework(
45+
id: HomeworkId('hw-today'),
46+
title: Title('Today HW'),
47+
subject: englishSubject,
48+
courseId: CourseId('c-1'),
49+
withSubmissions: false,
50+
todoDate: DateTime(2023, 10, 15), // Today
51+
);
52+
53+
final tomorrowHomework = _TestHomework(
54+
id: HomeworkId('hw-tomorrow'),
55+
title: Title('Tomorrow HW'),
56+
subject: mathSubject,
57+
courseId: CourseId('c-1'),
58+
withSubmissions: false,
59+
todoDate: DateTime(2023, 10, 16), // Tomorrow
60+
);
61+
62+
final in2DaysHomework = _TestHomework(
63+
id: HomeworkId('hw-in2days'),
64+
title: Title('In 2 Days HW'),
65+
subject: englishSubject,
66+
courseId: CourseId('c-1'),
67+
withSubmissions: false,
68+
todoDate: DateTime(2023, 10, 17), // In 2 days
69+
);
70+
71+
final futureHomework = _TestHomework(
72+
id: HomeworkId('hw-future'),
73+
title: Title('Future HW'),
74+
subject: mathSubject,
75+
courseId: CourseId('c-1'),
76+
withSubmissions: false,
77+
todoDate: DateTime(2023, 10, 18), // Future
78+
);
79+
80+
final homeworks = <BaseHomeworkReadModel>[
81+
futureHomework,
82+
tomorrowHomework,
83+
todayHomework,
84+
overdueHomework,
85+
in2DaysHomework,
86+
].toIList();
87+
88+
test('sortAndSubcategorize SmallestDateSubjectAndTitleSort', () {
89+
final result = subcategorizer.sortAndSubcategorize(
90+
homeworks,
91+
SmallestDateSubjectAndTitleSort(),
92+
);
93+
94+
expect(result.length, 5);
95+
96+
expect(result[0].dateSection, equals(HomeworkDateSection.overdue));
97+
expect(result[0].homeworks.single, overdueHomework);
98+
99+
expect(result[1].dateSection, equals(HomeworkDateSection.today));
100+
expect(result[1].homeworks.single, todayHomework);
101+
102+
expect(result[2].dateSection, equals(HomeworkDateSection.tomorrow));
103+
expect(result[2].homeworks.single, tomorrowHomework);
104+
105+
expect(result[3].dateSection, equals(HomeworkDateSection.dayAfterTomorrow));
106+
expect(result[3].homeworks.single, in2DaysHomework);
107+
108+
expect(result[4].dateSection, equals(HomeworkDateSection.later));
109+
expect(result[4].homeworks.single, futureHomework);
110+
});
111+
112+
test('sortAndSubcategorize SubjectSmallestDateAndTitleSort', () {
113+
final result = subcategorizer.sortAndSubcategorize(
114+
homeworks,
115+
SubjectSmallestDateAndTitleSort(),
116+
);
117+
118+
expect(result.length, 2); // Math and English
119+
120+
final englishSection = result.firstWhere((s) => s.title == 'English');
121+
expect(englishSection.homeworks.length, 2);
122+
expect(englishSection.homeworks.contains(todayHomework), isTrue);
123+
expect(englishSection.homeworks.contains(in2DaysHomework), isTrue);
124+
125+
final mathSection = result.firstWhere((s) => s.title == 'Math');
126+
expect(mathSection.homeworks.length, 3);
127+
expect(mathSection.homeworks.contains(overdueHomework), isTrue);
128+
expect(mathSection.homeworks.contains(tomorrowHomework), isTrue);
129+
expect(mathSection.homeworks.contains(futureHomework), isTrue);
130+
});
131+
132+
test('sortAndSubcategorize WeekdayDateSubjectAndTitleSort', () {
133+
final result = subcategorizer.sortAndSubcategorize(
134+
homeworks,
135+
WeekdayDateSubjectAndTitleSort(),
136+
);
137+
138+
// 14th = Sat (6), 15th = Sun (7), 16th = Mon (1), 17th = Tue (2), 18th = Wed (3)
139+
expect(result.length, 5);
140+
141+
final mondaySection = result.firstWhere((s) => s.weekday == 1);
142+
expect(mondaySection.homeworks.single, tomorrowHomework); // 16th
143+
144+
final tuesdaySection = result.firstWhere((s) => s.weekday == 2);
145+
expect(tuesdaySection.homeworks.single, in2DaysHomework); // 17th
146+
147+
final wednesdaySection = result.firstWhere((s) => s.weekday == 3);
148+
expect(wednesdaySection.homeworks.single, futureHomework); // 18th
149+
150+
final saturdaySection = result.firstWhere((s) => s.weekday == 6);
151+
expect(saturdaySection.homeworks.single, overdueHomework); // 14th
152+
153+
final sundaySection = result.firstWhere((s) => s.weekday == 7);
154+
expect(sundaySection.homeworks.single, todayHomework); // 15th
155+
});
156+
});
157+
}

0 commit comments

Comments
 (0)