use of teammates.common.datatransfer.questions.FeedbackMsqQuestionDetails in project teammates by TEAMMATES.
the class FeedbackResponseDetailsTest method testCreateResponseDetails.
@Test
public void testCreateResponseDetails() {
______TS("TEXT Response");
FeedbackTextQuestionDetails textQuestionDetails = new FeedbackTextQuestionDetails();
HashMap<String, String[]> requestParameters = new HashMap<>();
requestParameters.put("questiontype-1", new String[] { "TEXT" });
requestParameters.put("responsetext-1-0", new String[] { "text answer" });
FeedbackResponseDetails responseDetails = FeedbackResponseDetails.createResponseDetails(new String[] { "text answer" }, FeedbackQuestionType.TEXT, textQuestionDetails, requestParameters, 1, 0);
assertEquals(responseDetails.questionType, FeedbackQuestionType.TEXT);
assertTrue(responseDetails instanceof FeedbackTextResponseDetails);
assertEquals("text answer", responseDetails.getAnswerString());
requestParameters.clear();
______TS("MCQ Response: other disabled");
FeedbackMcqQuestionDetails mcqQuestionDetails = new FeedbackMcqQuestionDetails();
requestParameters.put("questiontype-2", new String[] { "MCQ" });
requestParameters.put("responsetext-2-0", new String[] { "mcq option" });
responseDetails = FeedbackResponseDetails.createResponseDetails(new String[] { "mcq option" }, FeedbackQuestionType.MCQ, mcqQuestionDetails, requestParameters, 2, 0);
assertEquals(responseDetails.questionType, FeedbackQuestionType.MCQ);
assertTrue(responseDetails instanceof FeedbackMcqResponseDetails);
assertEquals("mcq option", responseDetails.getAnswerString());
requestParameters.clear();
______TS("MCQ Response: other enabled, other option not selected");
FeedbackMcqQuestionDetails mcqQuestionDetailsWithOtherOptionOtherNotSelected = new FeedbackMcqQuestionDetails();
requestParameters.put("questiontype-3", new String[] { "MCQ" });
requestParameters.put("responsetext-3-0", new String[] { "an answer" });
requestParameters.put("mcqIsOtherOptionAnswer-3-0", new String[] { "0" });
responseDetails = FeedbackResponseDetails.createResponseDetails(new String[] { "an answer" }, FeedbackQuestionType.MCQ, mcqQuestionDetailsWithOtherOptionOtherNotSelected, requestParameters, 3, 0);
assertEquals(responseDetails.questionType, FeedbackQuestionType.MCQ);
assertTrue(responseDetails instanceof FeedbackMcqResponseDetails);
assertEquals("an answer", responseDetails.getAnswerString());
assertFalse(((FeedbackMcqResponseDetails) responseDetails).isOtherOptionAnswer());
requestParameters.clear();
______TS("MCQ Response: other enabled, other option selected");
FeedbackMcqQuestionDetails mcqQuestionDetailsWithOtherOptionOtherSelected = new FeedbackMcqQuestionDetails();
requestParameters.put("questiontype-4", new String[] { "MCQ" });
requestParameters.put("responsetext-4-0", new String[] { "my answer" });
requestParameters.put("mcqIsOtherOptionAnswer-4-0", new String[] { "1" });
responseDetails = FeedbackResponseDetails.createResponseDetails(new String[] { "my answer" }, FeedbackQuestionType.MCQ, mcqQuestionDetailsWithOtherOptionOtherSelected, requestParameters, 4, 0);
assertEquals(responseDetails.questionType, FeedbackQuestionType.MCQ);
assertTrue(responseDetails instanceof FeedbackMcqResponseDetails);
assertEquals("my answer", responseDetails.getAnswerString());
assertTrue(((FeedbackMcqResponseDetails) responseDetails).isOtherOptionAnswer());
requestParameters.clear();
______TS("MSQ Response: other disabled");
FeedbackMsqQuestionDetails msqQuestionDetails = new FeedbackMsqQuestionDetails();
requestParameters.put("questiontype-5", new String[] { "MSQ" });
requestParameters.put("responsetext-5-0", new String[] { "msq option 1", "msq option 2", "msq option 3" });
responseDetails = FeedbackResponseDetails.createResponseDetails(new String[] { "msq option 1", "msq option 2", "msq option 3" }, FeedbackQuestionType.MSQ, msqQuestionDetails, requestParameters, 5, 0);
assertEquals(responseDetails.questionType, FeedbackQuestionType.MSQ);
assertTrue(responseDetails instanceof FeedbackMsqResponseDetails);
assertEquals("msq option 1, msq option 2, msq option 3", responseDetails.getAnswerString());
requestParameters.clear();
______TS("MSQ Response: other disabled, other option not selected");
msqQuestionDetails = new FeedbackMsqQuestionDetails();
requestParameters.put("questiontype-6", new String[] { "MSQ" });
requestParameters.put("responsetext-6-0", new String[] { "msq option 1", "msq option 2", "msq option 3" });
requestParameters.put("msqIsOtherOptionAnswer-6-0", new String[] { "0" });
responseDetails = FeedbackResponseDetails.createResponseDetails(new String[] { "msq option 1", "msq option 2", "msq option 3" }, FeedbackQuestionType.MSQ, msqQuestionDetails, requestParameters, 6, 0);
assertEquals(responseDetails.questionType, FeedbackQuestionType.MSQ);
assertTrue(responseDetails instanceof FeedbackMsqResponseDetails);
assertEquals("msq option 1, msq option 2, msq option 3", responseDetails.getAnswerString());
assertFalse(((FeedbackMsqResponseDetails) responseDetails).isOtherOptionAnswer());
requestParameters.clear();
______TS("MSQ Response: other disabled, other option selected");
msqQuestionDetails = new FeedbackMsqQuestionDetails();
requestParameters.put("questiontype-7", new String[] { "MSQ" });
requestParameters.put("responsetext-7-0", new String[] { "msq option 1", "msq option 2", "msq option 3", "other answer" });
requestParameters.put("msqIsOtherOptionAnswer-7-0", new String[] { "1" });
responseDetails = FeedbackResponseDetails.createResponseDetails(new String[] { "msq option 1", "msq option 2", "msq option 3", "other answer" }, FeedbackQuestionType.MSQ, msqQuestionDetails, requestParameters, 7, 0);
assertEquals(responseDetails.questionType, FeedbackQuestionType.MSQ);
assertTrue(responseDetails instanceof FeedbackMsqResponseDetails);
assertEquals("msq option 1, msq option 2, msq option 3, other answer", responseDetails.getAnswerString());
assertTrue(((FeedbackMsqResponseDetails) responseDetails).isOtherOptionAnswer());
assertEquals("other answer", ((FeedbackMsqResponseDetails) responseDetails).getOtherFieldContent());
requestParameters.clear();
______TS("NUMSCALE Response: typical case");
FeedbackNumericalScaleQuestionDetails numericalScaleQuestionDetails = new FeedbackNumericalScaleQuestionDetails();
numericalScaleQuestionDetails.setMaxScale(5);
numericalScaleQuestionDetails.setMinScale(-5);
requestParameters.put("questiontype-6", new String[] { "NUMSCALE" });
requestParameters.put("responsetext-6-0", new String[] { "-3.5" });
requestParameters.put("numscalemin-6-0", new String[] { "-5" });
requestParameters.put("numscalemax-6-0", new String[] { "5" });
responseDetails = FeedbackResponseDetails.createResponseDetails(new String[] { "-3.5" }, FeedbackQuestionType.NUMSCALE, numericalScaleQuestionDetails, requestParameters, 6, 0);
assertEquals(responseDetails.questionType, FeedbackQuestionType.NUMSCALE);
assertTrue(responseDetails instanceof FeedbackNumericalScaleResponseDetails);
assertEquals("-3.5", responseDetails.getAnswerString());
requestParameters.clear();
______TS("NUMSCALE Response: wrong format");
requestParameters.put("questiontype-6", new String[] { "NUMSCALE" });
requestParameters.put("responsetext-6-0", new String[] { "-0.5.3" });
responseDetails = FeedbackResponseDetails.createResponseDetails(new String[] { "-0.5.3" }, FeedbackQuestionType.NUMSCALE, numericalScaleQuestionDetails, requestParameters, 6, 0);
assertNull(responseDetails);
requestParameters.clear();
______TS("CONSTSUM Response: typical case");
String questionText = "question text";
List<String> constSumOptions = new ArrayList<>();
constSumOptions.add("Option 1");
constSumOptions.add("Option 2");
boolean isPointsPerOption = false;
int points = 100;
boolean shouldForceUnevenDistribution = false;
FeedbackConstantSumQuestionDetails constantSumQuestionDetails = new FeedbackConstantSumQuestionDetails(questionText, constSumOptions, isPointsPerOption, points, shouldForceUnevenDistribution);
requestParameters.put("questiontype-7", new String[] { "CONSTSUM" });
requestParameters.put("responsetext-7-0", new String[] { "20", "80" });
responseDetails = FeedbackResponseDetails.createResponseDetails(new String[] { "20", "80" }, FeedbackQuestionType.CONSTSUM, constantSumQuestionDetails, requestParameters, 7, 0);
assertEquals(responseDetails.questionType, FeedbackQuestionType.CONSTSUM);
assertTrue(responseDetails instanceof FeedbackConstantSumResponseDetails);
assertEquals("20, 80", responseDetails.getAnswerString());
requestParameters.clear();
______TS("CONTRIB Response: typical case");
questionText = "question text";
FeedbackContributionQuestionDetails contribQuestionDetails = new FeedbackContributionQuestionDetails(questionText);
requestParameters.put("questiontype-8", new String[] { "CONTRIB" });
requestParameters.put("responsetext-8-0", new String[] { "100" });
responseDetails = FeedbackResponseDetails.createResponseDetails(new String[] { "100" }, FeedbackQuestionType.CONTRIB, contribQuestionDetails, requestParameters, 8, 0);
assertEquals(responseDetails.questionType, FeedbackQuestionType.CONTRIB);
assertTrue(responseDetails instanceof FeedbackContributionResponseDetails);
assertEquals("100", responseDetails.getAnswerString());
requestParameters.clear();
______TS("RUBRIC Response: invalid indexes in response");
questionText = "question text";
FeedbackRubricQuestionDetails rubricQuestionDetails = new FeedbackRubricQuestionDetails(questionText);
requestParameters.put("questiontype-9", new String[] { "RUBRIC" });
requestParameters.put("responsetext-9-0", new String[] { "0-0,1-0" });
responseDetails = FeedbackResponseDetails.createResponseDetails(new String[] { "0-0,1-0" }, FeedbackQuestionType.RUBRIC, rubricQuestionDetails, requestParameters, 9, 0);
assertEquals(responseDetails.questionType, FeedbackQuestionType.RUBRIC);
assertTrue(responseDetails instanceof FeedbackRubricResponseDetails);
assertEquals("[]", responseDetails.getAnswerString());
requestParameters.clear();
______TS("RUBRIC Response: typical case");
rubricQuestionDetails.setNumOfRubricChoices(rubricQuestionDetails.getNumOfRubricChoices() + 1);
rubricQuestionDetails.getRubricChoices().add("choice1");
rubricQuestionDetails.setNumOfRubricSubQuestions(rubricQuestionDetails.getNumOfRubricSubQuestions() + 1);
rubricQuestionDetails.getRubricSubQuestions().add("sub-qn1");
rubricQuestionDetails.setNumOfRubricSubQuestions(rubricQuestionDetails.getNumOfRubricSubQuestions() + 1);
rubricQuestionDetails.getRubricSubQuestions().add("sub-qn2");
requestParameters.put("questiontype-9", new String[] { "RUBRIC" });
requestParameters.put("responsetext-9-0", new String[] { "0-0,1-0" });
responseDetails = FeedbackResponseDetails.createResponseDetails(new String[] { "0-0,1-0" }, FeedbackQuestionType.RUBRIC, rubricQuestionDetails, requestParameters, 9, 0);
assertEquals(responseDetails.questionType, FeedbackQuestionType.RUBRIC);
assertTrue(responseDetails instanceof FeedbackRubricResponseDetails);
assertEquals("[0, 0]", responseDetails.getAnswerString());
requestParameters.clear();
}
use of teammates.common.datatransfer.questions.FeedbackMsqQuestionDetails in project teammates by TEAMMATES.
the class InstructorFeedbackQuestionEditActionTest method testExecuteAndPostProcessMsq.
@Test
public void testExecuteAndPostProcessMsq() {
DataBundle dataBundle = loadDataBundle("/FeedbackSessionQuestionTypeTest.json");
removeAndRestoreDataBundle(dataBundle);
InstructorAttributes instructor1ofCourse1 = dataBundle.instructors.get("instructor1OfCourse1");
gaeSimulation.loginAsInstructor(instructor1ofCourse1.googleId);
FeedbackSessionAttributes fs = dataBundle.feedbackSessions.get("msqSession");
FeedbackQuestionAttributes fq = FeedbackQuestionsLogic.inst().getFeedbackQuestion(fs.getFeedbackSessionName(), fs.getCourseId(), 1);
FeedbackMsqQuestionDetails msqDetails = (FeedbackMsqQuestionDetails) fq.getQuestionDetails();
FeedbackResponsesDb frDb = new FeedbackResponsesDb();
______TS("Edit text");
// There is already responses for this question
assertFalse(frDb.getFeedbackResponsesForQuestion(fq.getId()).isEmpty());
String[] editTextParams = { Const.ParamsNames.COURSE_ID, fs.getCourseId(), Const.ParamsNames.FEEDBACK_SESSION_NAME, fs.getFeedbackSessionName(), Const.ParamsNames.FEEDBACK_QUESTION_GIVERTYPE, fq.giverType.toString(), Const.ParamsNames.FEEDBACK_QUESTION_RECIPIENTTYPE, fq.recipientType.toString(), Const.ParamsNames.FEEDBACK_QUESTION_NUMBER, Integer.toString(fq.questionNumber), Const.ParamsNames.FEEDBACK_QUESTION_TYPE, "MSQ", Const.ParamsNames.FEEDBACK_QUESTION_TEXT, "What do you like best about the class?", Const.ParamsNames.FEEDBACK_QUESTION_DESCRIPTION, "more details", Const.ParamsNames.FEEDBACK_QUESTION_NUMBEROFCHOICECREATED, Integer.toString(msqDetails.getNumOfMsqChoices()), Const.ParamsNames.FEEDBACK_QUESTION_MSQCHOICE + "-0", msqDetails.getMsqChoices().get(0), Const.ParamsNames.FEEDBACK_QUESTION_MSQCHOICE + "-1", msqDetails.getMsqChoices().get(1), Const.ParamsNames.FEEDBACK_QUESTION_NUMBEROFENTITIESTYPE, "max", Const.ParamsNames.FEEDBACK_QUESTION_SHOWRESPONSESTO, FeedbackParticipantType.INSTRUCTORS.toString(), Const.ParamsNames.FEEDBACK_QUESTION_SHOWGIVERTO, FeedbackParticipantType.INSTRUCTORS.toString(), Const.ParamsNames.FEEDBACK_QUESTION_SHOWRECIPIENTTO, FeedbackParticipantType.INSTRUCTORS.toString(), Const.ParamsNames.FEEDBACK_QUESTION_EDITTYPE, "edit", Const.ParamsNames.FEEDBACK_QUESTION_ID, fq.getId(), Const.ParamsNames.FEEDBACK_QUESTION_MSQ_GENERATED_OPTIONS, FeedbackParticipantType.NONE.toString() };
InstructorFeedbackQuestionEditAction a = getAction(editTextParams);
RedirectResult r = getRedirectResult(a);
assertEquals(getPageResultDestination(Const.ActionURIs.INSTRUCTOR_FEEDBACK_EDIT_PAGE, "FSQTT.idOfTypicalCourse1", "MSQ+Session", "FSQTT.idOfInstructor1OfCourse1", false), r.getDestinationWithParams());
assertEquals(Const.StatusMessages.FEEDBACK_QUESTION_EDITED, r.getStatusMessage());
assertFalse(r.isError);
// All existing response should remain
assertFalse(frDb.getFeedbackResponsesForQuestion(fq.getId()).isEmpty());
______TS("Edit options");
// There should already be responses for this question
assertFalse(frDb.getFeedbackResponsesForQuestion(fq.getId()).isEmpty());
String[] editOptionParams = { Const.ParamsNames.COURSE_ID, fs.getCourseId(), Const.ParamsNames.FEEDBACK_SESSION_NAME, fs.getFeedbackSessionName(), Const.ParamsNames.FEEDBACK_QUESTION_GIVERTYPE, fq.giverType.toString(), Const.ParamsNames.FEEDBACK_QUESTION_RECIPIENTTYPE, fq.recipientType.toString(), Const.ParamsNames.FEEDBACK_QUESTION_NUMBER, Integer.toString(fq.questionNumber), Const.ParamsNames.FEEDBACK_QUESTION_TYPE, "MSQ", Const.ParamsNames.FEEDBACK_QUESTION_TEXT, "What do you like best about the class?", Const.ParamsNames.FEEDBACK_QUESTION_DESCRIPTION, "more details", Const.ParamsNames.FEEDBACK_QUESTION_NUMBEROFCHOICECREATED, "5", Const.ParamsNames.FEEDBACK_QUESTION_MSQCHOICE + "-0", "The Content", // empty option
Const.ParamsNames.FEEDBACK_QUESTION_MSQCHOICE + "-2", // empty option
"", // empty option with extra whitespace
Const.ParamsNames.FEEDBACK_QUESTION_MSQCHOICE + "-3", " ", Const.ParamsNames.FEEDBACK_QUESTION_MSQCHOICE + "-4", "The Atmosphere", Const.ParamsNames.FEEDBACK_QUESTION_NUMBEROFENTITIESTYPE, "max", Const.ParamsNames.FEEDBACK_QUESTION_SHOWRESPONSESTO, FeedbackParticipantType.INSTRUCTORS.toString(), Const.ParamsNames.FEEDBACK_QUESTION_SHOWGIVERTO, FeedbackParticipantType.INSTRUCTORS.toString(), Const.ParamsNames.FEEDBACK_QUESTION_SHOWRECIPIENTTO, FeedbackParticipantType.INSTRUCTORS.toString(), Const.ParamsNames.FEEDBACK_QUESTION_EDITTYPE, "edit", Const.ParamsNames.FEEDBACK_QUESTION_ID, fq.getId(), Const.ParamsNames.FEEDBACK_QUESTION_MSQ_GENERATED_OPTIONS, FeedbackParticipantType.NONE.toString() };
a = getAction(editOptionParams);
r = getRedirectResult(a);
assertEquals(getPageResultDestination(Const.ActionURIs.INSTRUCTOR_FEEDBACK_EDIT_PAGE, "FSQTT.idOfTypicalCourse1", "MSQ+Session", "FSQTT.idOfInstructor1OfCourse1", false), r.getDestinationWithParams());
assertEquals(Const.StatusMessages.FEEDBACK_QUESTION_EDITED, r.getStatusMessage());
assertFalse(r.isError);
// All existing response should be deleted as option is edited
assertTrue(frDb.getFeedbackResponsesForQuestion(fq.getId()).isEmpty());
______TS("Edit to generated options");
String[] editToGeneratedOptionParams = { Const.ParamsNames.COURSE_ID, fs.getCourseId(), Const.ParamsNames.FEEDBACK_SESSION_NAME, fs.getFeedbackSessionName(), Const.ParamsNames.FEEDBACK_QUESTION_GIVERTYPE, fq.giverType.toString(), Const.ParamsNames.FEEDBACK_QUESTION_RECIPIENTTYPE, fq.recipientType.toString(), Const.ParamsNames.FEEDBACK_QUESTION_NUMBER, Integer.toString(fq.questionNumber), Const.ParamsNames.FEEDBACK_QUESTION_TYPE, "MSQ", Const.ParamsNames.FEEDBACK_QUESTION_TEXT, "What do you like best about the class?", Const.ParamsNames.FEEDBACK_QUESTION_DESCRIPTION, "more details", Const.ParamsNames.FEEDBACK_QUESTION_NUMBEROFCHOICECREATED, "4", Const.ParamsNames.FEEDBACK_QUESTION_MSQCHOICE + "-0", "The Content", // empty option
Const.ParamsNames.FEEDBACK_QUESTION_MSQCHOICE + "-1", // empty option
"", // empty option with extra whitespace
Const.ParamsNames.FEEDBACK_QUESTION_MSQCHOICE + "-2", " ", Const.ParamsNames.FEEDBACK_QUESTION_MSQCHOICE + "-3", "The Atmosphere", Const.ParamsNames.FEEDBACK_QUESTION_NUMBEROFENTITIESTYPE, "max", Const.ParamsNames.FEEDBACK_QUESTION_SHOWRESPONSESTO, FeedbackParticipantType.INSTRUCTORS.toString(), Const.ParamsNames.FEEDBACK_QUESTION_SHOWGIVERTO, FeedbackParticipantType.INSTRUCTORS.toString(), Const.ParamsNames.FEEDBACK_QUESTION_SHOWRECIPIENTTO, FeedbackParticipantType.INSTRUCTORS.toString(), Const.ParamsNames.FEEDBACK_QUESTION_EDITTYPE, "edit", Const.ParamsNames.FEEDBACK_QUESTION_ID, fq.getId(), Const.ParamsNames.FEEDBACK_QUESTION_MSQ_GENERATED_OPTIONS, FeedbackParticipantType.STUDENTS.toString() };
a = getAction(editToGeneratedOptionParams);
r = getRedirectResult(a);
assertEquals(getPageResultDestination(Const.ActionURIs.INSTRUCTOR_FEEDBACK_EDIT_PAGE, "FSQTT.idOfTypicalCourse1", "MSQ+Session", "FSQTT.idOfInstructor1OfCourse1", false), r.getDestinationWithParams());
assertEquals(Const.StatusMessages.FEEDBACK_QUESTION_EDITED, r.getStatusMessage());
assertFalse(r.isError);
______TS("Delete Feedback");
String[] deleteParams = { Const.ParamsNames.COURSE_ID, fs.getCourseId(), Const.ParamsNames.FEEDBACK_SESSION_NAME, fs.getFeedbackSessionName(), Const.ParamsNames.FEEDBACK_QUESTION_GIVERTYPE, fq.giverType.toString(), Const.ParamsNames.FEEDBACK_QUESTION_RECIPIENTTYPE, fq.recipientType.toString(), Const.ParamsNames.FEEDBACK_QUESTION_NUMBER, Integer.toString(fq.questionNumber), Const.ParamsNames.FEEDBACK_QUESTION_TYPE, "MSQ", Const.ParamsNames.FEEDBACK_QUESTION_TEXT, "What do you like best about the class?", Const.ParamsNames.FEEDBACK_QUESTION_NUMBEROFCHOICECREATED, "4", Const.ParamsNames.FEEDBACK_QUESTION_MSQCHOICE + "-0", "The Content", // empty option
Const.ParamsNames.FEEDBACK_QUESTION_MSQCHOICE + "-1", // empty option
"", // empty option with extra whitespace
Const.ParamsNames.FEEDBACK_QUESTION_MSQCHOICE + "-2", " ", Const.ParamsNames.FEEDBACK_QUESTION_MSQCHOICE + "-3", "The Atmosphere", Const.ParamsNames.FEEDBACK_QUESTION_NUMBEROFENTITIESTYPE, "max", Const.ParamsNames.FEEDBACK_QUESTION_SHOWRESPONSESTO, FeedbackParticipantType.INSTRUCTORS.toString(), Const.ParamsNames.FEEDBACK_QUESTION_SHOWGIVERTO, FeedbackParticipantType.INSTRUCTORS.toString(), Const.ParamsNames.FEEDBACK_QUESTION_SHOWRECIPIENTTO, FeedbackParticipantType.INSTRUCTORS.toString(), Const.ParamsNames.FEEDBACK_QUESTION_EDITTYPE, "delete", Const.ParamsNames.FEEDBACK_QUESTION_ID, fq.getId(), Const.ParamsNames.FEEDBACK_QUESTION_MSQ_GENERATED_OPTIONS, FeedbackParticipantType.STUDENTS.toString() };
a = getAction(deleteParams);
r = getRedirectResult(a);
assertEquals(getPageResultDestination(Const.ActionURIs.INSTRUCTOR_FEEDBACK_EDIT_PAGE, "FSQTT.idOfTypicalCourse1", "MSQ+Session", "FSQTT.idOfInstructor1OfCourse1", false), r.getDestinationWithParams());
assertEquals(Const.StatusMessages.FEEDBACK_QUESTION_DELETED, r.getStatusMessage());
assertFalse(r.isError);
}
Aggregations