Update Saqel Platform: 2026-09-12 13:38:49
This commit is contained in:
@@ -0,0 +1,170 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:student_app/data/repositories/curriculum_question_bank.dart';
|
||||
import 'package:student_app/presentation/screens/curriculum/lesson_homework_sheet.dart';
|
||||
import 'package:student_app/presentation/screens/exams/adaptive_exam_screen.dart';
|
||||
|
||||
void main() {
|
||||
TestWidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
group('CurriculumQuestionBank Subject Isolation & Decoupling', () {
|
||||
test('Islamic Studies question bank contains ZERO math equations', () {
|
||||
final exam = CurriculumQuestionBank.getUnitExam(
|
||||
subjectId: 'islamic_10',
|
||||
unitKey: 'unit_01',
|
||||
);
|
||||
|
||||
expect(exam.title, contains('القرآن الكريم'));
|
||||
expect(exam.questions.isNotEmpty, isTrue);
|
||||
|
||||
for (final q in exam.questions) {
|
||||
// Assert zero math contamination
|
||||
expect(q.questionText.contains('x²'), isFalse, reason: 'Math leaked into Islamic exam: ${q.questionText}');
|
||||
expect(q.questionText.contains('معادلة'), isFalse, reason: 'Math leaked into Islamic exam: ${q.questionText}');
|
||||
expect(q.questionText.contains('مشتق'), isFalse, reason: 'Calculus leaked into Islamic exam: ${q.questionText}');
|
||||
// Assert Islamic topic relevance
|
||||
expect(
|
||||
q.topicTag.contains('قرآن') ||
|
||||
q.topicTag.contains('بيع') ||
|
||||
q.topicTag.contains('معاملات') ||
|
||||
q.topicTag.contains('فقه') ||
|
||||
q.topicTag.contains('سيرة') ||
|
||||
q.topicTag.contains('إسلام') ||
|
||||
q.topicTag.contains('حديث') ||
|
||||
q.topicTag.contains('آداب'),
|
||||
isTrue,
|
||||
reason: 'Non-Islamic topic tag in Islamic exam: ${q.topicTag}',
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
test('Physics question bank contains authentic physics concepts', () {
|
||||
final examU1 = CurriculumQuestionBank.getUnitExam(
|
||||
subjectId: 'physics_10',
|
||||
unitKey: 'unit_01',
|
||||
);
|
||||
expect(examU1.title, contains('المتجهات'));
|
||||
expect(examU1.questions.any((q) => q.questionText.contains('متجه')), isTrue);
|
||||
|
||||
final examU2 = CurriculumQuestionBank.getUnitExam(
|
||||
subjectId: 'physics_10',
|
||||
unitKey: 'unit_02',
|
||||
);
|
||||
expect(examU2.title, contains('المقذوفات'));
|
||||
expect(examU2.questions.any((q) => q.questionText.contains('أقصى ارتفاع')), isTrue);
|
||||
});
|
||||
|
||||
test('Arabic question bank contains authentic grammar and literature', () {
|
||||
final exam = CurriculumQuestionBank.getUnitExam(
|
||||
subjectId: 'arabic_10',
|
||||
unitKey: 'unit_01',
|
||||
);
|
||||
expect(exam.title, contains('الشرط'));
|
||||
expect(exam.questions.any((q) => q.topicTag.contains('الشرط')), isTrue);
|
||||
});
|
||||
|
||||
test('Lesson homework returns 3 focused questions with explanations', () {
|
||||
final hw = CurriculumQuestionBank.getLessonHomework(
|
||||
subjectId: 'islamic_10',
|
||||
lessonId: 'lesson_01',
|
||||
lessonTitle: 'واجب المسلم تجاه القرآن الكريم',
|
||||
);
|
||||
|
||||
expect(hw.questions.length, greaterThanOrEqualTo(3));
|
||||
for (final q in hw.questions) {
|
||||
expect(q.questionText.isNotEmpty, isTrue);
|
||||
expect(q.options.length, 4);
|
||||
expect(q.explanation.isNotEmpty, isTrue);
|
||||
expect(q.correctIndex >= 0 && q.correctIndex < 4, isTrue);
|
||||
}
|
||||
});
|
||||
|
||||
test('Subject worksheets are populated and isolated per subject', () {
|
||||
final islamicSheets = CurriculumQuestionBank.getSubjectWorksheets(
|
||||
subjectId: 'islamic_10',
|
||||
subjectTitle: 'التربية الإسلامية',
|
||||
);
|
||||
expect(islamicSheets.isNotEmpty, isTrue);
|
||||
expect(islamicSheets.any((s) => s.title.contains('القرآن')), isTrue);
|
||||
|
||||
final physicsSheets = CurriculumQuestionBank.getSubjectWorksheets(
|
||||
subjectId: 'physics_10',
|
||||
subjectTitle: 'الفيزياء',
|
||||
);
|
||||
expect(physicsSheets.isNotEmpty, isTrue);
|
||||
expect(physicsSheets.any((s) => s.title.contains('المتجهات')), isTrue);
|
||||
});
|
||||
});
|
||||
|
||||
group('LessonHomeworkSheet UI Test', () {
|
||||
testWidgets('renders homework questions and verifies answer', (tester) async {
|
||||
await tester.pumpWidget(
|
||||
const MaterialApp(
|
||||
home: Scaffold(
|
||||
body: LessonHomeworkSheet(
|
||||
subjectId: 'islamic_10',
|
||||
subjectTitle: 'التربية الإسلامية',
|
||||
lessonId: 'lesson_01',
|
||||
lessonTitle: 'واجب المسلم تجاه القرآن الكريم',
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.textContaining('واجب الدرس'), findsOneWidget);
|
||||
expect(find.textContaining('التمرين 1'), findsOneWidget);
|
||||
expect(find.text('تحقق من الإجابة 🚀'), findsOneWidget);
|
||||
|
||||
// Tap first option
|
||||
await tester.tap(find.textContaining('استحباب تلاوة القرآن'));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
// Tap check answer
|
||||
await tester.tap(find.text('تحقق من الإجابة 🚀'));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
// Check explanation shows up
|
||||
expect(find.textContaining('الشرح التوضيحي'), findsOneWidget);
|
||||
});
|
||||
});
|
||||
|
||||
group('AdaptiveExamScreen Subject Decoupling UI Test', () {
|
||||
testWidgets('opening Islamic exam does NOT show math equations', (tester) async {
|
||||
final initialExam = CurriculumQuestionBank.getUnitExam(
|
||||
subjectId: 'islamic_10',
|
||||
unitKey: 'unit_01',
|
||||
);
|
||||
|
||||
await tester.pumpWidget(
|
||||
MaterialApp(
|
||||
home: Scaffold(
|
||||
body: AdaptiveExamScreen(
|
||||
examId: 9999,
|
||||
title: 'اختبار الفهم التكيفي: القرآن الكريم',
|
||||
subjectTitle: 'التربية الإسلامية',
|
||||
subjectCode: 'islamic_10',
|
||||
unitKey: 'unit_01',
|
||||
initialExam: initialExam,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
await tester.pump();
|
||||
await tester.pump(const Duration(milliseconds: 100));
|
||||
|
||||
// Verify header
|
||||
expect(find.text('التربية الإسلامية'), findsOneWidget);
|
||||
expect(find.text('اختبار الفهم التكيفي: القرآن الكريم'), findsOneWidget);
|
||||
|
||||
// Verify that math equations never appear
|
||||
expect(find.textContaining('x³'), findsNothing);
|
||||
expect(find.textContaining('معادلة تربيعية'), findsNothing);
|
||||
|
||||
// Unmount to cancel BlocProvider and ExamCubit countdown timer cleanly
|
||||
await tester.pumpWidget(const SizedBox());
|
||||
});
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user