103 lines
3.7 KiB
Dart
103 lines
3.7 KiB
Dart
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 =
|
|
'<form id="stdExamTableForm"><input name="semester.id" value="503"><input name="examType.id" value="1"></form><table><tr>${[
|
|
'课程序号',
|
|
'课程名称',
|
|
'考试日期',
|
|
'考试安排',
|
|
'考试地点',
|
|
'座位号',
|
|
'考试情况',
|
|
'考试类型',
|
|
'其它说明',
|
|
].map((s) => '<td>$s</td>').join()}</tr><tr><td colspan="9">暂无考试安排</td></tr></table>';
|
|
expect(UndergraduateExamAdapter.extract(empty).records, isEmpty);
|
|
expect(
|
|
() => UndergraduateExamAdapter.extract(empty.replaceAll('暂无考试安排', '')),
|
|
throwsFormatException,
|
|
);
|
|
expect(
|
|
() => UndergraduateExamAdapter.extract('<html>登录</html>'),
|
|
throwsFormatException,
|
|
);
|
|
});
|
|
final original = Platform.environment['UESTC_UNDERGRADUATE_EXAM_FIXTURE'];
|
|
if (original != null) {
|
|
test('actual supplied exam export belongs to 503', () {
|
|
final result = UndergraduateExamAdapter.extract(
|
|
File(original).readAsStringSync(),
|
|
);
|
|
expect(result.records, hasLength(4));
|
|
expect(result.termId, '503');
|
|
});
|
|
}
|
|
}
|