object Time is string;

object Test is Name, TotalTime, TotalPoints, NumberQuestions, Question*, TStatus;

object TStatus is string;

op previewTest is
    inputs: n:Name;
    outputs: t:Test;
    pre: (* There exists a test with a name *);
    postcondition:( t.Name=n );
    description: (* The selected test name will show the test in a new window *);
end previewTest;

op selectClass 
    inputs: cn:ClassName;
    outputs: c:Class;
    pre: (* There is a Class*);
    post:(* Roster loaded in view window *);
    description: (* The program will show the class roster in the class window *);
end selectTest;

op beginTest is
    inputs: n:Name*;
    outputs: Test*;
    pre: Test.TStatus = "unbegun";
    post: Test.TStatus = "In Progress";
    description: (* The selected test will begin *);
end beginTest;

op endTest is
    inputs: t:Test*;
    outputs: AnsweredTest*;
    pre: (* Test.TStatus = unbegun *);
    post:(* Test.TStatus = False *);
    description: (* The selected test will be collected *);
end endTest;

op gradeTest is
    inputs: AnsweredTest*;
    outputs: GradedTest*;
    pre: (* Test answered and finished *);
    post: ;
    description: (* The selected test will be collected *);
end gradeTest;

op loadTime is
    inputs: tm:Time;
    outputs: tm;
    pre: (* TotalTime needs to be changed *);
    post:( tm'=tm+nt );
    description: (* The Timer will display adjusted time *);
end changeTime;

op addOneMin is
    inputs: tm:Time;
    outputs: tm';
    pre: (* TotalTime needs to be changed *);
    post:( tm'=tm+1 );
    description: (* The Timer will display adjusted time *);
end addOneMin;

op addFiveMin is
    inputs: tm:Time;
    outputs: tm';
    pre: (* TotalTime needs to be changed *);
    post:( tm'=tm+5 );
    description: (* The Timer will display adjusted time *);
end addFiveMin;


op addTenMin is
    inputs: tm:Time;
    outputs: tm';
    pre: (* TotalTime needs to be changed *);
    post:( tm'=tm+10 );
    description: (* The Timer will display adjusted time *);
end addTenMin;

op lessOneMin is
    inputs: tm:Time;
    outputs: tm';
    pre: (* TotalTime needs to be changed *);
    post:( tm'=tm-1 );
    description: (* The Timer will display adjusted time *);
end lessOneMin;

op lessFiveMin is
    inputs: tm:Time;
    outputs: tm';
    pre: (* TotalTime needs to be changed *);
    post:( tm'=tm-5 );
    description: (* The Timer will display adjusted time *);
end lessFiveMin;


op lessTenMin is
    inputs: tm:Time;
    outputs: tm';
    pre: (* TotalTime needs to be changed *);
    post:( tm'=tm-10 );
    description: (* The Timer will display adjusted time *);
end lessTenMin;


op freezeTest is
    inputs: TestName*;
    outputs: TestInProgress'*;
    pre: (* InProgress = false *);
    post:(* InProgress = true *);
    description: (* The selected test will not be editable *);
end freezeTest;

op unFreezeTest is
    inputs: TestName*;
    outputs: TestInProgress'*;
    pre: (* InProgress = true *);
    post:(* InProgress = false *);
    description: (* The selected test will be editable (unfrozen) *);
end unFreezeTest;



object GradedTest inherits from AnsweredTest
    components: TotalGrade;
end GradedTest;

object TotalGrade is integer;

object GradedQuestion inherits from AnsweredQuestion
    components: Grade, Comment;
end GradedQuestion;

object Grade is integer;
object Comment is string;