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.
decky/packages/practice_engine/test/attempt_result_test.dart

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));
});
});
}

Powered by TurnKey Linux.