import 'dart:io'; import 'package:flutter_test/flutter_test.dart'; import 'package:hepan_everyday/features/school/undergraduate/exam_adapter.dart'; import 'package:hepan_everyday/data/exam_file_import.dart'; import 'package:hepan_everyday/domain/school_identity.dart'; import 'package:hepan_everyday/domain/school_term.dart'; import 'package:hepan_everyday/domain/undergraduate_exam_query.dart'; import 'package:hepan_everyday/domain/exam_schedule.dart'; void main() { String fixture() => File('test/fixtures/school/undergraduate-exams.html').readAsStringSync(); final term = SchoolTerm(503, school: SupportedSchool.uestcUndergraduate); test('actual exam result term wins over the outer default', () { final schedule = UndergraduateExamAdapter.extract(fixture()); expect(schedule.termId, '503'); expect(schedule.records, hasLength(4)); expect(schedule.requestedExamTypes, {1}); expect(schedule.records.first.date, '2026-06-22'); expect(schedule.records.first.time, contains('14:00-16:00')); expect(ExamFileImport.parse(fixture()).termId, '503'); expect(ExamSchedule.fromJson(schedule.toJson()).records.first.status, '正常'); expect( () => UndergraduateExamAdapter.extract( fixture(), expectedTerm: SchoolTerm( 523, school: SupportedSchool.uestcUndergraduate, ), ), throwsFormatException, ); }); test( 'multi type merge preserves both exams for the same course and is complete', () { final finalExam = UndergraduateExamAdapter.extract(fixture()); final mid = UndergraduateExamAdapter.extract( fixture() .replaceAll('examType.id=1', 'examType.id=2') .replaceAll( 'name="examType.id" value="1"', 'name="examType.id" value="2"', ) .replaceAll('期末考试', '期中考试'), ); final query = UndergraduateExamQuery( term: term, types: {UndergraduateExamType.finalExam, UndergraduateExamType.midterm}, ); expect( UndergraduateExamAdapter.merge(query, [finalExam, mid]).records, hasLength(8), ); expect( () => UndergraduateExamAdapter.merge(query, [finalExam]), throwsFormatException, ); expect( () => UndergraduateExamAdapter.extract( fixture(), expectedType: UndergraduateExamType.midterm, ), throwsFormatException, ); }, ); test('only recognized explicit empty exam tables are empty success', () { final empty = '
| $s | ').join()}||||||||
| 暂无考试安排 | ||||||||