gt:         submissionParams = new String[]{
context: package teammates.test.cases.action;
  
  import java.util.ArrayList;
  import java.util.List;
  
  import org.testng.annotations.AfterClass;
  import org.testng.annotations.BeforeClass;
  import org.testng.annotations.Test;
  
  import teammates.common.datatransfer.DataBundle;
  import teammates.common.datatransfer.attributes.FeedbackQuestionAttributes;
  import teammates.common.datatransfer.attributes.FeedbackResponseAttributes;
  import teammates.common.datatransfer.attributes.FeedbackSessionAttributes;
  import teammates.common.datatransfer.attributes.StudentAttributes;
  import teammates.common.datatransfer.questions.FeedbackNumericalScaleQuestionDetails;
  import teammates.common.datatransfer.questions.FeedbackQuestionType;
  import teammates.common.exception.NullPostParameterException;
  import teammates.common.util.Const;
  import teammates.common.util.EmailType;
  import teammates.common.util.EmailWrapper;
  import teammates.common.util.StringHelper;
  import teammates.common.util.TimeHelper;
  import teammates.logic.core.CoursesLogic;
  import teammates.logic.core.StudentsLogic;
  import teammates.storage.api.FeedbackQuestionsDb;
  import teammates.storage.api.FeedbackResponsesDb;
  import teammates.storage.api.FeedbackSessionsDb;
  import teammates.ui.controller.RedirectResult;
  import teammates.ui.controller.StudentFeedbackSubmissionEditSaveAction;
  
  /**
   * SUT: {@link StudentFeedbackSubmissionEditSaveAction}.
   */
  public class StudentFeedbackSubmissionEditSaveActionTest extends BaseActionTest {
      private final CoursesLogic coursesLogic = CoursesLogic.inst();
  
      @BeforeClass
      public void classSetup() throws Exception {
          addUnregStudentToCourse1();
      }
  
      @AfterClass
      public void classTearDown() {
          StudentsLogic.inst().deleteStudentCascade("idOfTypicalCourse1", "student6InCourse1@gmail.tmt");
      }
  
      @Override
      protected String getActionUri() {
          return Const.ActionURIs.STUDENT_FEEDBACK_SUBMISSION_EDIT_SAVE;
      }
  
      @Override
      @Test
      public void testExecuteAndPostProcess() throws Exception {
          ______TS("edit existing answer");
  
          FeedbackQuestionsDb fqDb = new FeedbackQuestionsDb();
          FeedbackQuestionAttributes fq = fqDb.getFeedbackQuestion("First feedback session", "idOfTypicalCourse1", 1);
          assertNotNull("Feedback question not found in database", fq);
  
          FeedbackResponsesDb frDb = new FeedbackResponsesDb();
          FeedbackResponseAttributes fr = dataBundle.feedbackResponses.get("response1ForQ1S1C1");
          // necessary to get the correct responseId
          fr = frDb.getFeedbackResponse(fq.getId(), fr.giver, fr.recipient);
          assertNotNull("Feedback response not found in database", fr);
  
          StudentAttributes student1InCourse1 = dataBundle.students.get("student1InCourse1");
          gaeSimulation.loginAsStudent(student1InCourse1.googleId);
  
          String[] submissionParams = new String[]{
                  Const.ParamsNames.FEEDBACK_QUESTION_RESPONSETOTAL + "-1", "1",
                  Const.ParamsNames.FEEDBACK_RESPONSE_ID + "-1-0", fr.getId(),
                  Const.ParamsNames.FEEDBACK_SESSION_NAME, fr.feedbackSessionName,
                  Const.ParamsNames.COURSE_ID, fr.courseId,
                  Const.ParamsNames.FEEDBACK_QUESTION_ID + "-1", fr.feedbackQuestionId,
                  Const.ParamsNames.FEEDBACK_RESPONSE_RECIPIENT + "-1-0", fr.recipient,
                  Const.ParamsNames.FEEDBACK_QUESTION_TYPE + "-1", fr.feedbackQuestionType.toString(),
                  Const.ParamsNames.FEEDBACK_RESPONSE_TEXT + "-1-0", "Edited" + fr.getResponseDetails().getAnswerString()
          };
  
          StudentFeedbackSubmissionEditSaveAction a = getAction(submissionParams);
          RedirectResult r = getRedirectResult(a);
  
          assertFalse(r.isError);
          assertEquals(Const.StatusMessages.FEEDBACK_RESPONSES_SAVED, r.getStatusMessage());
          assertEquals(
                  getPageResultDestination(
                          Const.ActionURIs.STUDENT_FEEDBACK_SUBMISSION_EDIT_PAGE,
                          r.isError,
                          "student1InCourse1",
                          "idOfTypicalCourse1",
                          "First+feedback+session"),
                  r.getDestinationWithParams());
          assertNotNull(frDb.getFeedbackResponse(fq.getId(), fr.giver, fr.recipient));
  
          ______TS("deleted response");
  
          submissionParams = new String[]{
                  Const.ParamsNames.FEEDBACK_QUESTION_RESPONSETOTAL + "-1", "1",
                  Const.ParamsNames.FEEDBACK_RESPONSE_ID + "-1-0", fr.getId(),
                  Const.ParamsNames.FEEDBACK_SESSION_NAME, fr.feedbackSessionName,
                  Const.ParamsNames.COURSE_ID, fr.courseId,
                  Const.ParamsNames.FEEDBACK_QUESTION_ID + "-1", fr.feedbackQuestionId,
                  Const.ParamsNames.FEEDBACK_RESPONSE_RECIPIENT + "-1-0", fr.recipient,
                  Const.ParamsNames.FEEDBACK_QUESTION_TYPE + "-1", fr.feedbackQuestionType.toString(),
                  Const.ParamsNames.FEEDBACK_RESPONSE_TEXT + "-1-0", ""
          };
  
          a = getAction(submissionParams);
          r = getRedirectResult(a);
  
          assertFalse(r.isError);
          assertEquals(Const.StatusMessages.FEEDBACK_RESPONSES_SAVED, r.getStatusMessage());
          assertEquals(
                  getPageResultDestination(
                          Const.ActionURIs.STUDENT_FEEDBACK_SUBMISSION_EDIT_PAGE,
                          r.isError,
                          "student1InCourse1",
                          "idOfTypicalCourse1",
                          "First+feedback+session"),
                  r.getDestinationWithParams());
          assertNull(frDb.getFeedbackResponse(fq.getId(), fr.giver, fr.recipient));
  
          ______TS("skipped question");
  
          submissionParams = new String[]{
                  Const.ParamsNames.FEEDBACK_QUESTION_RESPONSETOTAL + "-1", "1",
                  Const.ParamsNames.FEEDBACK_SESSION_NAME, fr.feedbackSessionName,
                  Const.ParamsNames.COURSE_ID, fr.courseId,
                  Const.ParamsNames.FEEDBACK_QUESTION_ID + "-1", fr.feedbackQuestionId,
                  Const.ParamsNames.FEEDBACK_RESPONSE_RECIPIENT + "-1-0", fr.recipient,
                  Const.ParamsNames.FEEDBACK_QUESTION_TYPE + "-1", fr.feedbackQuestionType.toString(),
                  Const.ParamsNames.FEEDBACK_RESPONSE_TEXT + "-1-0", ""
          };
  
          a = getAction(submissionParams);
          r = getRedirectResult(a);
  
          assertFalse(r.isError);
          assertEquals(Const.StatusMessages.FEEDBACK_RESPONSES_SAVED, r.getStatusMessage());
          assertEquals(
                  getPageResultDestination(
                          Const.ActionURIs.STUDENT_FEEDBACK_SUBMISSION_EDIT_PAGE,
                          r.isError,
                          "student1InCourse1",
                          "idOfTypicalCourse1",
                          "First+feedback+session"),
                  r.getDestinationWithParams());
          assertNull(frDb.getFeedbackResponse(fq.getId(), fr.giver, fr.recipient));
  
          // submission confirmation email not sent if parameter does not exist
          verifyNoEmailsSent(a);
  
          ______TS("new response");
  
          submissionParams = new String[]{
                  Const.ParamsNames.FEEDBACK_QUESTION_RESPONSETOTAL + "-1", "1",
                  Const.ParamsNames.FEEDBACK_SESSION_NAME, fr.feedbackSessionName,
                  Const.ParamsNames.COURSE_ID, fr.courseId,
                  Const.ParamsNames.FEEDBACK_QUESTION_ID + "-1", fr.feedbackQuestionId,
                  Const.ParamsNames.FEEDBACK_RESPONSE_RECIPIENT + "-1-0", fr.recipient,
                  Const.ParamsNames.FEEDBACK_QUESTION_TYPE + "-1", fr.feedbackQuestionType.toString(),
                  Const.ParamsNames.FEEDBACK_RESPONSE_TEXT + "-1-0", "New " + fr.getResponseDetails().getAnswerString(),
                  Const.ParamsNames.SEND_SUBMISSION_EMAIL, "on"
          };
  
          a = getAction(submissionParams);
          r = getRedirectResult(a);
  
          assertFalse(r.isError);
          assertEquals(Const.StatusMessages.FEEDBACK_RESPONSES_SAVED, r.getStatusMessage());
          assertEquals(
                  getPageResultDestination(
                          Const.ActionURIs.STUDENT_FEEDBACK_SUBMISSION_EDIT_PAGE,
                          r.isError,
                          "student1InCourse1",
                          "idOfTypicalCourse1",
                          "First+feedback+session"),
                  r.getDestinationWithParams());
          assertNotNull(frDb.getFeedbackResponse(fq.getId(), fr.giver, fr.recipient));
  
          // submission confirmation email sent
          verifyNumberOfEmailsSent(a, 1);
  
          EmailWrapper email = getEmailsSent(a).get(0);
          String courseName = coursesLogic.getCourse(fr.courseId).getName();
          assertEquals(String.format(EmailType.FEEDBACK_SUBMISSION_CONFIRMATION.getSubject(), courseName,
                                     fr.feedbackSessionName),
                       email.getSubject());
          assertEquals(student1InCourse1.email, email.getRecipient());
  
          ______TS("edit response, did not specify recipient");
  
          fq = fqDb.getFeedbackQuestion("First feedback session", "idOfTypicalCourse1", 2);
          assertNotNull("Feedback question not found in database", fq);
  
          fr = dataBundle.feedbackResponses.get("response2ForQ2S1C1");
          // necessary to get the correct responseId
          fr = frDb.getFeedbackResponse(fq.getId(), fr.giver, fr.recipient);
          assertNotNull("Feedback response not found in database", fr);
  
          submissionParams = new String[]{
                  Const.ParamsNames.FEEDBACK_QUESTION_RESPONSETOTAL + "-2", "1",
                  Const.ParamsNames.FEEDBACK_RESPONSE_ID + "-2-0", fr.getId(),
                  Const.ParamsNames.FEEDBACK_SESSION_NAME, fr.feedbackSessionName,
                  Const.ParamsNames.COURSE_ID, fr.courseId,
                  Const.ParamsNames.FEEDBACK_QUESTION_ID + "-2", fr.feedbackQuestionId,
                  Const.ParamsNames.FEEDBACK_RESPONSE_RECIPIENT + "-2-0", "",
                  Const.ParamsNames.FEEDBACK_QUESTION_TYPE + "-2", fr.feedbackQuestionType.toString(),
                  Const.ParamsNames.FEEDBACK_RESPONSE_TEXT + "-2-0", "Edited" + fr.getResponseDetails().getAnswerString(),
                  Const.ParamsNames.SEND_SUBMISSION_EMAIL, "on"
          };
  
          a = getAction(submissionParams);
          r = getRedirectResult(a);
  
          assertTrue(r.isError);
          assertEquals("You did not specify a recipient for your response in question 2.", r.getStatusMessage());
          assertEquals(
                  getPageResultDestination(
                          Const.ActionURIs.STUDENT_FEEDBACK_SUBMISSION_EDIT_PAGE,
                          r.isError,
                          "student1InCourse1",
                          "idOfTypicalCourse1",
                          "First+feedback+session"),
                  r.getDestinationWithParams());
  
          // submission confirmation email not sent if the action is an error, even with submission parameter "on"
          verifyNoEmailsSent(a);
  
          ______TS("edit response, empty answer");
  
          submissionParams = new String[]{
                  Const.ParamsNames.FEEDBACK_QUESTION_RESPONSETOTAL + "-2", "1",
                  Const.ParamsNames.FEEDBACK_RESPONSE_ID + "-2-0", fr.getId(),
                  Const.ParamsNames.FEEDBACK_SESSION_NAME, fr.feedbackSessionName,
                  Const.ParamsNames.COURSE_ID, fr.courseId,
                  Const.ParamsNames.FEEDBACK_QUESTION_ID + "-2", fr.feedbackQuestionId,
                  Const.ParamsNames.FEEDBACK_RESPONSE_RECIPIENT + "-2-0", fr.recipient,
                  Const.ParamsNames.FEEDBACK_QUESTION_TYPE + "-2", fr.feedbackQuestionType.toString(),
                  Const.ParamsNames.FEEDBACK_RESPONSE_TEXT + "-2-0", "",
                  Const.ParamsNames.SEND_SUBMISSION_EMAIL, "off"
          };
  
          a = getAction(submissionParams);
          r = getRedirectResult(a);
  
          assertFalse(r.isError);
          assertEquals(Const.StatusMessages.FEEDBACK_RESPONSES_SAVED, r.getStatusMessage());
          assertEquals(
                  getPageResultDestination(
                          Const.ActionURIs.STUDENT_FEEDBACK_SUBMISSION_EDIT_PAGE,
                          r.isError,
                          "student1InCourse1",
                          "idOfTypicalCourse1",
                          "First+feedback+session"),
                  r.getDestinationWithParams());
          assertNull(frDb.getFeedbackResponse(fq.getId(), fr.giver, fr.recipient));
  
          // submission confirmation email not sent if parameter is not "on"
          verifyNoEmailsSent(a);
  
          ______TS("new response, did not specify recipient");
  
          submissionParams = new String[]{
                  Const.ParamsNames.FEEDBACK_QUESTION_RESPONSETOTAL + "-2", "1",
                  Const.ParamsNames.FEEDBACK_SESSION_NAME, fr.feedbackSessionName,
                  Const.ParamsNames.COURSE_ID, fr.courseId,
                  Const.ParamsNames.FEEDBACK_QUESTION_ID + "-2", fr.feedbackQuestionId,
                  Const.ParamsNames.FEEDBACK_RESPONSE_RECIPIENT + "-2-0", "",
                  Const.ParamsNames.FEEDBACK_QUESTION_TYPE + "-2", fr.feedbackQuestionType.toString(),
                  Const.ParamsNames.FEEDBACK_RESPONSE_TEXT + "-2-0", "Edited" + fr.getResponseDetails().getAnswerString(),
          };
  
          a = getAction(submissionParams);
          r = getRedirectResult(a);
  
          assertTrue(r.isError);
          assertEquals("You did not specify a recipient for your response in question 2.", r.getStatusMessage());
          assertEquals(
                  getPageResultDestination(
                          Const.ActionURIs.STUDENT_FEEDBACK_SUBMISSION_EDIT_PAGE,
                          r.isError,
                          "student1InCourse1",
                          "idOfTypicalCourse1",
                          "First+feedback+session"),
                  r.getDestinationWithParams());
          assertNull(frDb.getFeedbackResponse(fq.getId(), fr.giver, fr.recipient));
  
          ______TS("mcq");
  
          DataBundle dataBundle = loadDataBundle("/FeedbackSessionQuestionTypeTest.json");
          removeAndRestoreDataBundle(dataBundle);
  
          fq = fqDb.getFeedbackQuestion("MCQ Session", "FSQTT.idOfTypicalCourse1", 1);
          assertNotNull("Feedback question not found in database", fq);
  
          fr = dataBundle.feedbackResponses.get("response1ForQ1S1C1");
          // necessary to get the correct responseId
          fr = frDb.getFeedbackResponse(fq.getId(), fr.giver, fr.recipient);
          assertNotNull("Feedback response not found in database", fr);
  
          student1InCourse1 = dataBundle.students.get("student1InCourse1");
          gaeSimulation.loginAsStudent(student1InCourse1.googleId);
  
          submissionParams = new String[]{
                  Const.ParamsNames.FEEDBACK_QUESTION_RESPONSETOTAL + "-1", "1",
                  Const.ParamsNames.FEEDBACK_RESPONSE_ID + "-1-0", fr.getId(),
                  Const.ParamsNames.FEEDBACK_SESSION_NAME, fr.feedbackSessionName,
                  Const.ParamsNames.COURSE_ID, fr.courseId,
                  Const.ParamsNames.FEEDBACK_QUESTION_ID + "-1", fr.feedbackQuestionId,
                  Const.ParamsNames.FEEDBACK_RESPONSE_RECIPIENT + "-1-0", fr.recipient,
                  Const.ParamsNames.FEEDBACK_QUESTION_TYPE + "-1", fr.feedbackQuestionType.toString(),
                  Const.ParamsNames.FEEDBACK_RESPONSE_TEXT + "-1-0", "It's perfect"
          };
  
          a = getAction(submissionParams);
          r = getRedirectResult(a);
  
          assertFalse(r.isError);
          assertEquals(Const.StatusMessages.FEEDBACK_RESPONSES_SAVED, r.getStatusMessage());
          assertEquals(
                  getPageResultDestination(
                          Const.ActionURIs.STUDENT_FEEDBACK_SUBMISSION_EDIT_PAGE,
                          r.isError,
                          "FSQTT.student1InCourse1",
                          "FSQTT.idOfTypicalCourse1",
                          "MCQ+Session"),
                  r.getDestinationWithParams());
          assertNotNull(frDb.getFeedbackResponse(fq.getId(), fr.giver, fr.recipient));
  
          ______TS("mcq, question skipped");
  
          submissionParams = new String[]{
                  Const.ParamsNames.FEEDBACK_QUESTION_RESPONSETOTAL + "-1", "1",
                  Const.ParamsNames.FEEDBACK_RESPONSE_ID + "-1-0", fr.getId(),
                  Const.ParamsNames.FEEDBACK_SESSION_NAME, fr.feedbackSessionName,
                  Const.ParamsNames.COURSE_ID, fr.courseId,
                  Const.ParamsNames.FEEDBACK_QUESTION_ID + "-1", fr.feedbackQuestionId,
                  Const.ParamsNames.FEEDBACK_RESPONSE_RECIPIENT + "-1-0", fr.recipient,
                  Const.ParamsNames.FEEDBACK_QUESTION_TYPE + "-1", fr.feedbackQuestionType.toString()
          };
  
          a = getAction(submissionParams);
          r = getRedirectResult(a);
  
          assertFalse(r.isError);
          assertEquals(Const.StatusMessages.FEEDBACK_RESPONSES_SAVED, r.getStatusMessage());
          assertEquals(
                  getPageResultDestination(
                          Const.ActionURIs.STUDENT_FEEDBACK_SUBMISSION_EDIT_PAGE,
                          r.isError,
                          "FSQTT.student1InCourse1",
                          "FSQTT.idOfTypicalCourse1",
                          "MCQ+Session"),
                  r.getDestinationWithParams());
          assertNull(frDb.getFeedbackResponse(fq.getId(), fr.giver, fr.recipient));
  
          ______TS("mcq with other option enabled");
  
          fq = fqDb.getFeedbackQuestion("MCQ Session", "FSQTT.idOfTypicalCourse1", 3);
          assertNotNull("Feedback question not found in database", fq);
  
          fr = dataBundle.feedbackResponses.get("response1ForQ3S1C1");
          fr = frDb.getFeedbackResponse(fq.getId(), fr.giver, fr.recipient); // necessary to get the correct responseId
          assertNotNull("Feedback response not found in database", fr);
  
          submissionParams = new String[]{
                  Const.ParamsNames.FEEDBACK_QUESTION_RESPONSETOTAL + "-2", "1",
                  Const.ParamsNames.FEEDBACK_RESPONSE_ID + "-2-0", fr.getId(),
                  Const.ParamsNames.FEEDBACK_SESSION_NAME, fr.feedbackSessionName,
                  Const.ParamsNames.COURSE_ID, fr.courseId,
                  Const.ParamsNames.FEEDBACK_QUESTION_ID + "-2", fr.feedbackQuestionId,
                  Const.ParamsNames.FEEDBACK_RESPONSE_RECIPIENT + "-2-0", fr.recipient,
                  Const.ParamsNames.FEEDBACK_QUESTION_TYPE + "-2", fr.feedbackQuestionType.toString(),
                  Const.ParamsNames.FEEDBACK_RESPONSE_TEXT + "-2-0", "Tutorial",
                  Const.ParamsNames.FEEDBACK_QUESTION_MCQ_ISOTHEROPTIONANSWER + "-2-0", "1"
          };
  
          a = getAction(submissionParams);
          r = getRedirectResult(a);
  
          assertFalse(r.isError);
          assertEquals(Const.StatusMessages.FEEDBACK_RESPONSES_SAVED, r.getStatusMessage());
          assertEquals(
                  getPageResultDestination(
                          Const.ActionURIs.STUDENT_FEEDBACK_SUBMISSION_EDIT_PAGE,
                          r.isError,
                          "FSQTT.student1InCourse1",
                          "FSQTT.idOfTypicalCourse1",
                          "MCQ+Session"),
                  r.getDestinationWithParams());
          FeedbackResponseAttributes finalFr = frDb.getFeedbackResponse(fq.getId(), fr.giver, fr.recipient);
          assertNotNull(finalFr);
          assertEquals("Tutorial", finalFr.getResponseDetails().getAnswerString());
  
          ______TS("msq");
  
          fq = fqDb.getFeedbackQuestion("MSQ Session", "FSQTT.idOfTypicalCourse1", 1);
          assertNotNull("Feedback question not found in database", fq);
  
          fr = dataBundle.feedbackResponses.get("response1ForQ1S2C1");
          // necessary to get the correct responseId
          fr = frDb.getFeedbackResponse(fq.getId(), fr.giver, fr.recipient);
          assertNotNull("Feedback response not found in database", fr);
  
          student1InCourse1 = dataBundle.students.get("student1InCourse1");
          gaeSimulation.loginAsStudent(student1InCourse1.googleId);
  
          submissionParams = new String[]{
                  Const.ParamsNames.FEEDBACK_QUESTION_RESPONSETOTAL + "-1", "1",
                  Const.ParamsNames.FEEDBACK_RESPONSE_ID + "-1-0", fr.getId(),
                  Const.ParamsNames.FEEDBACK_SESSION_NAME, fr.feedbackSessionName,
                  Const.ParamsNames.COURSE_ID, fr.courseId,
                  Const.ParamsNames.FEEDBACK_QUESTION_ID + "-1", fr.feedbackQuestionId,
                  Const.ParamsNames.FEEDBACK_RESPONSE_RECIPIENT + "-1-0", fr.recipient,
                  Const.ParamsNames.FEEDBACK_QUESTION_TYPE + "-1", fr.feedbackQuestionType.toString(),
                  Const.ParamsNames.FEEDBACK_RESPONSE_TEXT + "-1-0", "It's perfect"
          };
  
          a = getAction(submissionParams);
          r = getRedirectResult(a);
  
          assertFalse(r.isError);
          assertEquals(Const.StatusMessages.FEEDBACK_RESPONSES_SAVED, r.getStatusMessage());
          assertEquals(
                  getPageResultDestination(
                          Const.ActionURIs.STUDENT_FEEDBACK_SUBMISSION_EDIT_PAGE,
                          r.isError,
                          "FSQTT.student1InCourse1",
                          "FSQTT.idOfTypicalCourse1",
                          "MSQ+Session"),
                  r.getDestinationWithParams());
          assertNotNull(frDb.getFeedbackResponse(fq.getId(), fr.giver, fr.recipient));
  
          ______TS("msq, question skipped");
  
          submissionParams = new String[]{
                  Const.ParamsNames.FEEDBACK_QUESTION_RESPONSETOTAL + "-1", "1",
                  Const.ParamsNames.FEEDBACK_RESPONSE_ID + "-1-0", fr.getId(),
                  Const.ParamsNames.FEEDBACK_SESSION_NAME, fr.feedbackSessionName,
                  Const.ParamsNames.COURSE_ID, fr.courseId,
                  Const.ParamsNames.FEEDBACK_QUESTION_ID + "-1", fr.feedbackQuestionId,
                  Const.ParamsNames.FEEDBACK_RESPONSE_RECIPIENT + "-1-0", fr.recipient,
                  Const.ParamsNames.FEEDBACK_QUESTION_TYPE + "-1", fr.feedbackQuestionType.toString()
          };
  
          a = getAction(submissionParams);
          r = getRedirectResult(a);
  
          assertFalse(r.isError);
          assertEquals(Const.StatusMessages.FEEDBACK_RESPONSES_SAVED, r.getStatusMessage());
          assertEquals(
                  getPageResultDestination(
                          Const.ActionURIs.STUDENT_FEEDBACK_SUBMISSION_EDIT_PAGE,
                          r.isError,
                          "FSQTT.student1InCourse1",
                          "FSQTT.idOfTypicalCourse1",
                          "MSQ+Session"),
                  r.getDestinationWithParams());
          assertNull(frDb.getFeedbackResponse(fq.getId(), fr.giver, fr.recipient));
  
          ______TS("msq with other option enabled, student selects predefined options and other option");
  
          fq = fqDb.getFeedbackQuestion("MSQ Session", "FSQTT.idOfTypicalCourse1", 3);
          assertNotNull("Feedback question not found in database", fq);
  
          fr = dataBundle.feedbackResponses.get("response1ForQ3S2C1");
          fr = frDb.getFeedbackResponse(fq.getId(), fr.giver, fr.recipient); // necessary to get the correct responseId
          assertNotNull("Feedback response not found in database", fr);
  
          submissionParams = new String[]{
                  Const.ParamsNames.FEEDBACK_QUESTION_RESPONSETOTAL + "-3", "1",
                  Const.ParamsNames.FEEDBACK_RESPONSE_ID + "-3-0", fr.getId(),
                  Const.ParamsNames.FEEDBACK_SESSION_NAME, fr.feedbackSessionName,
                  Const.ParamsNames.COURSE_ID, fr.courseId,
                  Const.ParamsNames.FEEDBACK_QUESTION_ID + "-3", fr.feedbackQuestionId,
                  Const.ParamsNames.FEEDBACK_RESPONSE_RECIPIENT + "-3-0", fr.recipient,
                  Const.ParamsNames.FEEDBACK_QUESTION_TYPE + "-3", fr.feedbackQuestionType.toString(),
                  Const.ParamsNames.FEEDBACK_RESPONSE_TEXT + "-3-0", "Pizza, Pasta, Chicken rice, Hotdog",
                  Const.ParamsNames.FEEDBACK_QUESTION_MSQ_ISOTHEROPTIONANSWER + "-3-0", "1"
          };
  
          a = getAction(submissionParams);
          r = getRedirectResult(a);
  
          assertFalse(r.isError);
          assertEquals(Const.StatusMessages.FEEDBACK_RESPONSES_SAVED, r.getStatusMessage());
          assertEquals(
                  getPageResultDestination(
                          Const.ActionURIs.STUDENT_FEEDBACK_SUBMISSION_EDIT_PAGE,
                          r.isError,
                          "FSQTT.student1InCourse1",
                          "FSQTT.idOfTypicalCourse1",
                          "MSQ+Session"),
                  r.getDestinationWithParams());
          finalFr = frDb.getFeedbackResponse(fq.getId(), fr.giver, fr.recipient);
          assertNotNull(finalFr);
          assertEquals("Pizza, Pasta, Chicken rice, Hotdog", finalFr.getResponseDetails().getAnswerString());
  
          ______TS("msq with other option enabled, student selects predefined options only, not other option");
  
          fr = dataBundle.feedbackResponses.get("response2ForQ3S2C1");
          fr = frDb.getFeedbackResponse(fq.getId(), fr.giver, fr.recipient); // necessary to get the correct responseId
          assertNotNull("Feedback response not found in database", fr);
  
          submissionParams = new String[]{
                  Const.ParamsNames.FEEDBACK_QUESTION_RESPONSETOTAL + "-3", "1",
                  Const.ParamsNames.FEEDBACK_RESPONSE_ID + "-3-1", fr.getId(),
                  Const.ParamsNames.FEEDBACK_SESSION_NAME, fr.feedbackSessionName,
                  Const.ParamsNames.COURSE_ID, fr.courseId,
                  Const.ParamsNames.FEEDBACK_QUESTION_ID + "-3", fr.feedbackQuestionId,
                  Const.ParamsNames.FEEDBACK_RESPONSE_RECIPIENT + "-3-1", fr.recipient,
                  Const.ParamsNames.FEEDBACK_QUESTION_TYPE + "-3", fr.feedbackQuestionType.toString(),
                  Const.ParamsNames.FEEDBACK_RESPONSE_TEXT + "-3-1", "Pasta",
                  Const.ParamsNames.FEEDBACK_QUESTION_MSQ_ISOTHEROPTIONANSWER + "-3-1", "0"
          };
  
          a = getAction(submissionParams);
          r = getRedirectResult(a);
  
          assertFalse(r.isError);
          assertEquals(Const.StatusMessages.FEEDBACK_RESPONSES_SAVED, r.getStatusMessage());
          assertEquals(
                  getPageResultDestination(
                          Const.ActionURIs.STUDENT_FEEDBACK_SUBMISSION_EDIT_PAGE,
                          r.isError,
                          "FSQTT.student1InCourse1",
                          "FSQTT.idOfTypicalCourse1",
                          "MSQ+Session"),
                  r.getDestinationWithParams());
          finalFr = frDb.getFeedbackResponse(fq.getId(), fr.giver, fr.recipient);
          assertNotNull(finalFr);
          assertEquals("Pasta", finalFr.getResponseDetails().getAnswerString());
  
          ______TS("msq with other option enabled, student selects other option only, not any predefined option");
  
          fr = dataBundle.feedbackResponses.get("response3ForQ3S2C1");
          fr = frDb.getFeedbackResponse(fq.getId(), fr.giver, fr.recipient); // necessary to get the correct responseId
          assertNotNull("Feedback response not found in database", fr);
  
  