module TestGrading; import TestTaking.AnsweredTest; import TestTaking.AnsweredSection; import TestTaking.AnsweredQuestion; import TestTaking.MultipleChoiceAnswer; import TestTaking.MatchingAnswer; import TestTaking.FreeResponseAnswer; import TestTaking.CodeAnswer; export GradedTest, GradedSection, GradedQuestion; (* OBJECTS *) object GradedTest extends AnsweredTest components: gs:GradedSection*, grade:integer; description: (* This is a complete graded test that which contains the student's answers, the assigned score, and comments added by the grader. By inheriting AnsweredTest a GradedTest already contains the correct answers specified by the author of the test/question as well as a the student's answers given during testing. *); end GradedTest; object GradedSection extends AnsweredSection components: gq:GradedQuestion*, grade:integer; description: (* contains the list of GradedQuestions forming this section of the AnsweredTest as well as any Section attributes inherited from AnsweredSection *); end AnsweredSection; object GradedQuestion extends AnsweredQuestion components: MultipleChoiceGraded or MatchingGraded or FreeResponseGraded or CodeGraded; description: (* Contains a graded question *); end AnsweredQuestion; object MultipleChoiceGraded extends MultipleChoiceAnswer components: grade:integer, comment:string; description: (* Adds a grade and comment to an answered multiple choice question which includes single answer, multiple answer and true/false questions. *); end MultipleChoiceGraded; object MatchingGraded extends MatchingAnswer components: grade:integer, comment:string; description: (* Adds a grade and comment to an answered matching question. *); end MatchingGraded; object FreeResponseGraded extends FreeResponseAnswer components: grade:integer, comment:string; description: (* adds a grade and comment to an answered free response question which includes essay questions, short answer questions and fill-in-the-blank questions. *) ; end FreeResponseGraded; object CodeGraded extends CodeAnswer components: grade:integer, comment:string; description: (* adds a grade and comment to an answered code question which include both full programming questions and short line fill code questions. *); end CodeGraded; (* OPERATIONS *) operation GradeTest inputs: AnsweredTest*; outputs: GradedTest*; description: (* Autogrades a batch of AnsweredTests creating a GradedTest out of each. This means that it will assign a score to every question that does not require manual entry of a score (i.e. - multiple choice and matching questions. It will also hightlight keywords in free response questions and execute analysis with output comparison for grading programming questions. *); end GradeTest; operation AcceptGrade inputs: gq:GradedQuestion, gs:GradedSection, gt:GradedTest; outputs: gq':GradedQuestion, gs':GradedSection, gt':GradedTest; postcondition: forall (gq'':GradedQuestion) (gq'' in gs'.gq) iff ((gq'' = gq') or ((gq'' != gq) and (gq'' in gs.gq))); description: (* Updates a GradedQuestion object with the current score and comments. *); end AcceptGrade; operation percentGrade inputs: points:AnsweredQuestion.points, percent:integer; outputs: score:integer; precondition: percent >= 0; description: (* Changes the point value awarded for an answer based on the percent value entered by the grader. *); end percentGrade; end TestGrading;