You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
3.9 KiB
145 lines
3.9 KiB
import 'package:test/test.dart';
|
|
import 'package:practice_engine/models/question.dart';
|
|
import 'package:practice_engine/models/attempt_result.dart';
|
|
|
|
void main() {
|
|
group('AttemptResult', () {
|
|
test('fromAnswers calculates correct percentage', () {
|
|
final question = Question(
|
|
id: 'q1',
|
|
prompt: 'Test',
|
|
answers: ['A', 'B'],
|
|
correctAnswerIndices: [0],
|
|
);
|
|
|
|
final results = [
|
|
AnswerResult(
|
|
question: question,
|
|
userAnswerIndices: [0],
|
|
isCorrect: true,
|
|
statusChange: QuestionStatusChange.unchanged,
|
|
),
|
|
AnswerResult(
|
|
question: question,
|
|
userAnswerIndices: [1],
|
|
isCorrect: false,
|
|
statusChange: QuestionStatusChange.unchanged,
|
|
),
|
|
AnswerResult(
|
|
question: question,
|
|
userAnswerIndices: [0],
|
|
isCorrect: true,
|
|
statusChange: QuestionStatusChange.unchanged,
|
|
),
|
|
];
|
|
|
|
final attemptResult = AttemptResult.fromAnswers(
|
|
results: results,
|
|
timeSpent: 1000,
|
|
);
|
|
|
|
expect(attemptResult.totalQuestions, equals(3));
|
|
expect(attemptResult.correctCount, equals(2));
|
|
expect(attemptResult.percentageCorrect, closeTo(66.67, 0.01));
|
|
});
|
|
|
|
test('fromAnswers handles empty results', () {
|
|
final attemptResult = AttemptResult.fromAnswers(
|
|
results: [],
|
|
timeSpent: 0,
|
|
);
|
|
|
|
expect(attemptResult.totalQuestions, equals(0));
|
|
expect(attemptResult.correctCount, equals(0));
|
|
expect(attemptResult.percentageCorrect, equals(0.0));
|
|
});
|
|
|
|
test('fromAnswers filters incorrect questions', () {
|
|
final question = Question(
|
|
id: 'q1',
|
|
prompt: 'Test',
|
|
answers: ['A', 'B'],
|
|
correctAnswerIndices: [0],
|
|
);
|
|
|
|
final results = [
|
|
AnswerResult(
|
|
question: question,
|
|
userAnswerIndices: [0],
|
|
isCorrect: true,
|
|
statusChange: QuestionStatusChange.unchanged,
|
|
),
|
|
AnswerResult(
|
|
question: question,
|
|
userAnswerIndices: [1],
|
|
isCorrect: false,
|
|
statusChange: QuestionStatusChange.unchanged,
|
|
),
|
|
AnswerResult(
|
|
question: question,
|
|
userAnswerIndices: [1],
|
|
isCorrect: false,
|
|
statusChange: QuestionStatusChange.unchanged,
|
|
),
|
|
];
|
|
|
|
final attemptResult = AttemptResult.fromAnswers(
|
|
results: results,
|
|
timeSpent: 1000,
|
|
);
|
|
|
|
expect(attemptResult.incorrectQuestions.length, equals(2));
|
|
});
|
|
|
|
test('fromAnswers includes all results', () {
|
|
final question = Question(
|
|
id: 'q1',
|
|
prompt: 'Test',
|
|
answers: ['A', 'B'],
|
|
correctAnswerIndices: [0],
|
|
);
|
|
|
|
final results = List.generate(5, (i) {
|
|
return AnswerResult(
|
|
question: question,
|
|
userAnswerIndices: [i % 2],
|
|
isCorrect: i % 2 == 0,
|
|
statusChange: QuestionStatusChange.unchanged,
|
|
);
|
|
});
|
|
|
|
final attemptResult = AttemptResult.fromAnswers(
|
|
results: results,
|
|
timeSpent: 2000,
|
|
);
|
|
|
|
expect(attemptResult.allResults.length, equals(5));
|
|
expect(attemptResult.timeSpent, equals(2000));
|
|
});
|
|
});
|
|
|
|
group('AnswerResult', () {
|
|
test('contains question and answer information', () {
|
|
final question = Question(
|
|
id: 'q1',
|
|
prompt: 'What is 2+2?',
|
|
answers: ['3', '4', '5'],
|
|
correctAnswerIndices: [1],
|
|
);
|
|
|
|
final result = AnswerResult(
|
|
question: question,
|
|
userAnswerIndices: [1],
|
|
isCorrect: true,
|
|
statusChange: QuestionStatusChange.improved,
|
|
);
|
|
|
|
expect(result.question, equals(question));
|
|
expect(result.userAnswerIndices, equals([1]));
|
|
expect(result.isCorrect, equals(true));
|
|
expect(result.statusChange, equals(QuestionStatusChange.improved));
|
|
});
|
|
});
|
|
}
|
|
|