package admin;

import java.util.Collection;
import create.Test;

/**
  * In Class test
  */
abstract class InClass {
  boolean closedBook;
}

/**
  * Practice test class
  */
abstract class Practice {
  boolean closedBook;
  int numTries;
}

/**
  * Time class for take home test
  */
abstract class Time {
    int hour;
    int min;
    boolean am;
}

/**
 * Take Home test
 */
abstract class TakeHome {
  Time startTime;
  Time endTime;
  boolean closedBook;
  int numTries;
}

/**
  * Release Test screen
  */
abstract class AdminReleaseTest {
  Collection<Test> tests;

  /**
    //
    // Use In Class class to save settings to selected test
    //
    pre:
      //
      // There is at least one test in the test database to be released as an
      // in-class test.
      //
      !tests.isEmpty() // This makes no sense:  && tests.contains(test_other);
    post:
      //
      // A test is in the output data if and only if it is the new test to be
      // added or it is in the input data.
      //
      forall(Test test_other ;
        (tests'.contains(test_other)) iff
          test_other.equals(test) || data.contains(test_other));
		        //  ^^^^ not defined anywhere

  *
  */
  abstract void isInClass();
  /* SPEST ISSUE:

     Extra error messages after undefined id is correctly identified:

   Invalid id: test at line: 63  at character: 28
   Invalid invocation: equals(antlr.TestGenerator$arguments_return@2d7d4b2e) at line: 63  at character: 21
   Invalid id: data at line: 63  at character: 37
   found: .  expecting: <UP> at line: 63 at character: 42

  */

  /**
    //
    // Use Practice class to save settings to selected test
    //
    pre:
      //
      // There is at least one test in the test database to be released as an
      // in-class test.
      //
      !tests.isEmpty() && tests.contains(test_other);
    post:
      //
      // A test is in the output data if and only if it is the new test to be
      // added or it is in the input data.
      //
      forall(Test test_other ;
        (data'.contains(test_other)) iff
          test_other.equals(test) || data.contains(test_other));
  *
  */
  abstract void isPractice();

  /**
    //
    // Use TakeHome class to save settings to selected test
    //
    pre:
      //
      // There is at least one test in the test database to be released as an
      // in-class test.
      //
      !tests.isEmpty() && tests.contains(test_other);
    post:
      //
      // A test is in the output data if and only if it is the new test to be
      // added or it is in the input data.
      //
      forall(Test test_other ;
        (data'.contains(test_other)) iff
          test_other.equals(test) || data.contains(test_other));
  *
  */
  abstract void isTakeHome();

  //abstract void releaseTest(Test test);
}