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