From e928853ba07c565da3659204b92fb36fbb1da66d Mon Sep 17 00:00:00 2001 From: acanas Date: Thu, 26 Mar 2020 21:39:44 +0100 Subject: [PATCH] Version19.155.2 --- swad_changelog.h | 3 +- swad_parameter.c | 7 +- swad_parameter.h | 3 +- swad_test.c | 399 ++++++++++++++++++++++----------------------- swad_test.h | 22 ++- swad_test_import.c | 18 +- 6 files changed, 221 insertions(+), 231 deletions(-) diff --git a/swad_changelog.h b/swad_changelog.h index 69544494..7c1c245d 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -497,7 +497,7 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - * En OpenSWAD: ps2pdf source.ps destination.pdf */ -#define Log_PLATFORM_VERSION "SWAD 19.155 (2020-03-26)" +#define Log_PLATFORM_VERSION "SWAD 19.155.2 (2020-03-26)" #define CSS_FILE "swad19.146.css" #define JS_FILE "swad19.153.js" /* @@ -526,6 +526,7 @@ Param // TODO: URGENT: Fix bug while playing match. + Version 19.155.2 Mar 25, 2020 Code refactoring in tests. (284414 lines) Version 19.155.1 Mar 25, 2020 Code refactoring in tests. (284430 lines) Version 19.155: Mar 25, 2020 Big code refactoring in pass to parameters of functions. (284446 lines) Version 19.154: Mar 25, 2020 Code refactoring in tests. (283385 lines) diff --git a/swad_parameter.c b/swad_parameter.c index 85b644bd..4237a228 100644 --- a/swad_parameter.c +++ b/swad_parameter.c @@ -1088,11 +1088,14 @@ void Par_PutHiddenParamChar (const char *ParamName,char Value) /************************ Put a string hidden parameter **********************/ /*****************************************************************************/ -void Par_PutHiddenParamString (const char *Id,const char *ParamName,const char *Value) +void Par_PutHiddenParamString (const char *Id,const char *ParamName, + const char *Value) { HTM_Txt ("",ParamName,Value); + HTM_TxtF (" name=\"%s\" value=\"%s\" />", + ParamName,Value ? Value : + ""); } diff --git a/swad_parameter.h b/swad_parameter.h index 08cdf8c1..a0261e86 100644 --- a/swad_parameter.h +++ b/swad_parameter.h @@ -93,6 +93,7 @@ void Par_PutHiddenParamUnsigned (const char *Id,const char *ParamName,unsigned V void Par_PutHiddenParamUnsignedDisabled (const char *Id,const char *ParamName,unsigned Value); void Par_PutHiddenParamLong (const char *Id,const char *ParamName,long Value); void Par_PutHiddenParamChar (const char *ParamName,char Value); -void Par_PutHiddenParamString (const char *Id,const char *ParamName,const char *Value); +void Par_PutHiddenParamString (const char *Id,const char *ParamName, + const char *Value); #endif diff --git a/swad_test.c b/swad_test.c index baf4a03f..a7dca1b6 100644 --- a/swad_test.c +++ b/swad_test.c @@ -118,14 +118,14 @@ extern struct Globals Gbl; /************************* Private global variables **************************/ /*****************************************************************************/ -struct Tst_Test Tst_ParamGblTest; // Used to pass parameters to functions - /*****************************************************************************/ /***************************** Private prototypes ****************************/ /*****************************************************************************/ -static void Tst_ResetTest (struct Tst_Test *Test); +static void Tst_TstConstructor (struct Tst_Test *Test); +static void Tst_TstDestructor (struct Tst_Test *Test); static void Tst_ResetTags (struct Tst_Tags *Tags); +static void Tst_FreeTagsList (struct Tst_Tags *Tags); static void Tst_ShowFormRequestTest (struct Tst_Test *Test); @@ -152,7 +152,7 @@ static void Tst_UpdateLastAccTst (unsigned NumQsts); static void Tst_ShowFormRequestEditTests (struct Tst_Test *Test); static void Tst_ShowFormRequestSelectTestsForGame (struct Tst_Test *Test); static bool Tst_CheckIfICanEditTests (void); -static void Tst_PutIconsTests (void *Args); +static void Tst_PutIconsTests (void *TestPtr); static void Tst_PutButtonToAddQuestion (void); static long Tst_GetParamTagCode (void); @@ -173,20 +173,16 @@ static void Tst_PutInputFieldNumQst (const char *Field,const char *Label, static void Tst_ShowFormAnswerTypes (const struct Tst_AnswerTypes *AnswerTypes); static void Tst_GetQuestions (struct Tst_Test *Test,MYSQL_RES **mysql_res); static void Tst_GetQuestionsForTest (struct Tst_Test *Test,MYSQL_RES **mysql_res); -static void Tst_ListOneQstToEdit (struct Tst_Test *Test, - struct Tst_Question *Question); -static void Tst_ListOneOrMoreQuestionsForEdition (const struct Tst_Test *Test, +static void Tst_ListOneQstToEdit (struct Tst_Test *Test); +static void Tst_ListOneOrMoreQuestionsForEdition (struct Tst_Test *Test, MYSQL_RES *mysql_res); static void Tst_WriteHeadingRowQuestionsForEdition (const struct Tst_Test *Test); -static void Tst_WriteQuestionRowForEdition (const struct Tst_Test *Test, - unsigned NumQst, - struct Tst_Question *Question); +static void Tst_WriteQuestionRowForEdition (struct Tst_Test *Test, + unsigned NumQst); static void Tst_ListOneOrMoreQuestionsForSelection (unsigned NumQsts, MYSQL_RES *mysql_res); static void Tst_WriteQuestionRowForSelection (unsigned NumQst,long QstCod); -static void Tst_ResetParamGblTest (void); - static void Tst_WriteAnswersTestToAnswer (unsigned NumQst, struct Tst_Question *Question, bool Shuffle); @@ -261,8 +257,6 @@ static unsigned Tst_GetParamNumQsts (void); static unsigned Tst_CountNumTagsInList (const struct Tst_Tags *Tags); static int Tst_CountNumAnswerTypesInList (const struct Tst_AnswerTypes *AnswerTypes); -static void Tst_FreeTagsList (struct Tst_Tags *Tags); - static void Tst_PutFormEditOneQst (const struct Tst_Question *Question, char Stem[Cns_MAX_BYTES_TEXT + 1], char Feedback[Cns_MAX_BYTES_TEXT + 1]); @@ -294,10 +288,10 @@ static long Tst_GetTagCodFromTagTxt (const char *TagTxt); static long Tst_CreateNewTag (long CrsCod,const char *TagTxt); static void Tst_EnableOrDisableTag (long TagCod,bool TagHidden); -static void Tst_PutParamsRemoveSelectedQsts (void *Args); +static void Tst_PutParamsRemoveSelectedQsts (void *TestPtr); static void Tst_PutIconToRemoveOneQst (void *QstCodPtr); static void Tst_PutParamsRemoveOnlyThisQst (void *QstCodPtr); -static void Tst_PutParamsRemoveOneQstWhileEditing (void *QstCodPtr); +static void Tst_PutParamsRemoveOneQstWhileEditing (void *TestPtr); static void Tst_RemoveOneQstFromDB (long CrsCod,long QstCod); static long Tst_GetQstCod (void); @@ -326,18 +320,21 @@ void Tst_RequestTest (void) { struct Tst_Test Test; - /***** Reset test *****/ - Tst_ResetTest (&Test); + /***** Create test *****/ + Tst_TstConstructor (&Test); /***** Show form to generate a self-assessment test *****/ Tst_ShowFormRequestTest (&Test); + + /***** Destroy test *****/ + Tst_TstDestructor (&Test); } /*****************************************************************************/ -/***************************** Reset answer types ****************************/ +/***************************** Test constructor ******************************/ /*****************************************************************************/ -static void Tst_ResetTest (struct Tst_Test *Test) +static void Tst_TstConstructor (struct Tst_Test *Test) { /***** Reset tags *****/ Tst_ResetTags (&Test->Tags); @@ -348,6 +345,22 @@ static void Tst_ResetTest (struct Tst_Test *Test) /***** Reset selected order *****/ Test->SelectedOrder = Tst_DEFAULT_ORDER; + + /***** Question constructor *****/ + Tst_QstConstructor (&Test->Question); + } + +/*****************************************************************************/ +/****************************** Test destructor ******************************/ +/*****************************************************************************/ + +static void Tst_TstDestructor (struct Tst_Test *Test) + { + /***** Question destructor *****/ + Tst_QstDestructor (&Test->Question); + + /***** Free tag list *****/ + Tst_FreeTagsList (&Test->Tags); } /*****************************************************************************/ @@ -361,6 +374,19 @@ static void Tst_ResetTags (struct Tst_Tags *Tags) Tags->List = NULL; } +/*****************************************************************************/ +/**************** Free memory allocated for the list of tags *****************/ +/*****************************************************************************/ + +static void Tst_FreeTagsList (struct Tst_Tags *Tags) + { + if (Tags->List) + { + free (Tags->List); + Tst_ResetTags (Tags); + } + } + /*****************************************************************************/ /*************** Show form to generate a self-assessment test ****************/ /*****************************************************************************/ @@ -378,9 +404,8 @@ static void Tst_ShowFormRequestTest (struct Tst_Test *Test) TstCfg_GetConfigFromDB (); /***** Begin box *****/ - Tst_SetParamGblTest (Test); Box_BoxBegin (NULL,Txt_Take_a_test, - Tst_PutIconsTests,(void *) &Gbl, + Tst_PutIconsTests,(void *) Test, Hlp_ASSESSMENT_Tests,Box_NOT_CLOSABLE); /***** Get tags *****/ @@ -457,6 +482,9 @@ void Tst_ShowNewTest (void) MYSQL_RES *mysql_res; unsigned NumAccessesTst; + /***** Create test *****/ + Tst_TstConstructor (&Test); + /***** Read test configuration from database *****/ TstCfg_GetConfigFromDB (); @@ -528,10 +556,10 @@ void Tst_ShowNewTest (void) } else Tst_ShowFormRequestTest (&Test); // Show the form again - - /***** Free memory used for by the list of tags *****/ - Tst_FreeTagsList (&Test.Tags); } + + /***** Destroy test *****/ + Tst_TstDestructor (&Test); } /*****************************************************************************/ @@ -1373,11 +1401,14 @@ void Tst_RequestEditTests (void) { struct Tst_Test Test; - /***** Reset test *****/ - Tst_ResetTest (&Test); + /***** Create test *****/ + Tst_TstConstructor (&Test); /***** Show form to generate a self-assessment test *****/ Tst_ShowFormRequestEditTests (&Test); + + /***** Destroy test *****/ + Tst_TstDestructor (&Test); } /*****************************************************************************/ @@ -1403,9 +1434,8 @@ static void Tst_ShowFormRequestEditTests (struct Tst_Test *Test) Mnu_ContextMenuEnd (); /***** Begin box *****/ - Tst_SetParamGblTest (Test); Box_BoxBegin (NULL,Txt_List_edit_questions, - Tst_PutIconsTests,(void *) &Gbl, + Tst_PutIconsTests,(void *) Test, Hlp_ASSESSMENT_Tests_editing_questions,Box_NOT_CLOSABLE); /***** Get tags already present in the table of questions *****/ @@ -1455,11 +1485,14 @@ void Tst_RequestSelectTestsForGame (void) { struct Tst_Test Test; - /***** Reset test *****/ - Tst_ResetTest (&Test); + /***** Create test *****/ + Tst_TstConstructor (&Test); /***** Show form to select test for game *****/ Tst_ShowFormRequestSelectTestsForGame (&Test); // No tags selected + + /***** Destroy test *****/ + Tst_TstDestructor (&Test); } /*****************************************************************************/ @@ -1534,11 +1567,11 @@ static bool Tst_CheckIfICanEditTests (void) /********************* Put contextual icons in tests *************************/ /*****************************************************************************/ -static void Tst_PutIconsTests (void *Args) +static void Tst_PutIconsTests (void *TestPtr) { extern const char *Txt_New_question; - if (Args) + if (TestPtr) { if (Tst_CheckIfICanEditTests ()) { @@ -1551,7 +1584,7 @@ static void Tst_PutIconsTests (void *Args) case ActChgShfTstQst: // Change shuffle of a question /***** Put form to remove selected test questions *****/ Ico_PutContextualIconToRemove (ActReqRemSevTstQst, - Tst_PutParamsRemoveSelectedQsts,(void *) &Gbl); + Tst_PutParamsRemoveSelectedQsts,TestPtr); break; default: break; @@ -2115,16 +2148,19 @@ static void Tst_ShowFormConfigTst (void) extern const char *Txt_Minimum_time_seconds_per_question_between_two_tests; extern const char *Txt_Result_visibility; extern const char *Txt_Save_changes; + struct Tst_Test Test; TstCfg_Pluggable_t Pluggable; char StrMinTimeNxtTstPerQst[Cns_MAX_DECIMAL_DIGITS_ULONG + 1]; + /***** Create test *****/ + Tst_TstConstructor (&Test); + /***** Read test configuration from database *****/ TstCfg_GetConfigFromDB (); /***** Begin box *****/ - Tst_ResetParamGblTest (); Box_BoxBegin (NULL,Txt_Configure_tests, - Tst_PutIconsTests,(void *) &Gbl, + Tst_PutIconsTests,(void *) &Test, Hlp_ASSESSMENT_Tests,Box_NOT_CLOSABLE); /***** Begin form *****/ @@ -2218,6 +2254,9 @@ static void Tst_ShowFormConfigTst (void) /***** End box *****/ Box_BoxEnd (); + + /***** Destroy test *****/ + Tst_TstDestructor (&Test); } /*****************************************************************************/ @@ -2334,6 +2373,9 @@ void Tst_ListQuestionsToEdit (void) struct Tst_Test Test; MYSQL_RES *mysql_res; + /***** Create test *****/ + Tst_TstConstructor (&Test); + /***** Get parameters, query the database and list the questions *****/ if (Tst_GetParamsTst (&Test,Tst_EDIT_TEST)) // Get parameters from the form { @@ -2362,8 +2404,8 @@ void Tst_ListQuestionsToEdit (void) /* Show the form again */ Tst_ShowFormRequestEditTests (&Test); - /***** Free memory used by the list of tags *****/ - Tst_FreeTagsList (&Test.Tags); + /***** Destroy test *****/ + Tst_TstDestructor (&Test); } /*****************************************************************************/ @@ -2375,6 +2417,9 @@ void Tst_ListQuestionsToSelect (void) struct Tst_Test Test; MYSQL_RES *mysql_res; + /***** Create test *****/ + Tst_TstConstructor (&Test); + /***** Get parameters, query the database and list the questions *****/ if (Tst_GetParamsTst (&Test,Tst_SELECT_QUESTIONS_FOR_GAME)) // Get parameters from the form { @@ -2390,8 +2435,8 @@ void Tst_ListQuestionsToSelect (void) /* Show the form again */ Tst_ShowFormRequestSelectTestsForGame (&Test); - /***** Free memory used by the list of tags *****/ - Tst_FreeTagsList (&Test.Tags); + /***** Destroy test *****/ + Tst_TstDestructor (&Test); } /*****************************************************************************/ @@ -2668,8 +2713,7 @@ static void Tst_GetQuestionsForTest (struct Tst_Test *Test,MYSQL_RES **mysql_res /*********************** List a test question for edition ********************/ /*****************************************************************************/ -static void Tst_ListOneQstToEdit (struct Tst_Test *Test, - struct Tst_Question *Question) +static void Tst_ListOneQstToEdit (struct Tst_Test *Test) { extern const char *Hlp_ASSESSMENT_Tests; extern const char *Txt_Questions; @@ -2678,9 +2722,8 @@ static void Tst_ListOneQstToEdit (struct Tst_Test *Test, Test->NumQsts = 1; /***** Begin box *****/ - Tst_SetParamGblTest (Test); Box_BoxBegin (NULL,Txt_Questions, - Tst_PutIconsTests,(void *) &Gbl, + Tst_PutIconsTests,(void *) Test, Hlp_ASSESSMENT_Tests,Box_NOT_CLOSABLE); /***** Write the heading *****/ @@ -2688,7 +2731,7 @@ static void Tst_ListOneQstToEdit (struct Tst_Test *Test, Tst_WriteHeadingRowQuestionsForEdition (Test); /***** Write question row *****/ - Tst_WriteQuestionRowForEdition (Test,0,Question); + Tst_WriteQuestionRowForEdition (Test,0); /***** End table *****/ HTM_TABLE_End (); @@ -2727,19 +2770,17 @@ bool Tst_GetOneQuestionByCod (long QstCod,MYSQL_RES **mysql_res) /****************** List for edition one or more test questions **************/ /*****************************************************************************/ -static void Tst_ListOneOrMoreQuestionsForEdition (const struct Tst_Test *Test, +static void Tst_ListOneOrMoreQuestionsForEdition (struct Tst_Test *Test, MYSQL_RES *mysql_res) { extern const char *Hlp_ASSESSMENT_Tests; extern const char *Txt_Questions; unsigned NumQst; MYSQL_ROW row; - struct Tst_Question Question; /***** Begin box *****/ - Tst_SetParamGblTest (Test); Box_BoxBegin (NULL,Txt_Questions, - Tst_PutIconsTests,(void *) &Gbl, + Tst_PutIconsTests,(void *) Test, Hlp_ASSESSMENT_Tests,Box_NOT_CLOSABLE); /***** Write the heading *****/ @@ -2754,18 +2795,18 @@ static void Tst_ListOneOrMoreQuestionsForEdition (const struct Tst_Test *Test, Gbl.RowEvenOdd = NumQst % 2; /***** Create test question *****/ - Tst_QstConstructor (&Question); + Tst_QstConstructor (&Test->Question); /***** Get question code (row[0]) *****/ row = mysql_fetch_row (mysql_res); - if ((Question.QstCod = Str_ConvertStrCodToLongCod (row[0])) < 0) + if ((Test->Question.QstCod = Str_ConvertStrCodToLongCod (row[0])) < 0) Lay_ShowErrorAndExit ("Wrong code of question."); /***** Write question row *****/ - Tst_WriteQuestionRowForEdition (Test,NumQst,&Question); + Tst_WriteQuestionRowForEdition (Test,NumQst); /***** Destroy test question *****/ - Tst_QstDestructor (&Question); + Tst_QstDestructor (&Test->Question); } /***** End table *****/ @@ -2818,8 +2859,7 @@ static void Tst_WriteHeadingRowQuestionsForEdition (const struct Tst_Test *Test) { Frm_StartForm (ActLstTstQst); Dat_WriteParamsIniEndDates (); - Tst_SetParamGblTest (Test); - Tst_WriteParamEditQst (); + Tst_WriteParamEditQst (Test); Par_PutHiddenParamUnsigned (NULL,"Order",(unsigned) Order); HTM_BUTTON_SUBMIT_Begin (Txt_TST_STR_ORDER_FULL[Order],"BT_LINK TIT_TBL",NULL); if (Order == Test->SelectedOrder) @@ -2845,9 +2885,8 @@ static void Tst_WriteHeadingRowQuestionsForEdition (const struct Tst_Test *Test) /********** Write question row in listing of questions for edition ***********/ /*****************************************************************************/ -static void Tst_WriteQuestionRowForEdition (const struct Tst_Test *Test, - unsigned NumQst, - struct Tst_Question *Question) +static void Tst_WriteQuestionRowForEdition (struct Tst_Test *Test, + unsigned NumQst) { MYSQL_RES *mysql_res; MYSQL_ROW row; @@ -2859,7 +2898,7 @@ static void Tst_WriteQuestionRowForEdition (const struct Tst_Test *Test, double TotalScoreThisQst; /***** Get and show question data *****/ - if (Tst_GetOneQuestionByCod (Question->QstCod,&mysql_res)) + if (Tst_GetOneQuestionByCod (Test->Question.QstCod,&mysql_res)) { /***** Get row from database *****/ row = mysql_fetch_row (mysql_res); @@ -2883,31 +2922,30 @@ static void Tst_WriteQuestionRowForEdition (const struct Tst_Test *Test, /* Write icon to remove the question */ Frm_StartForm (ActReqRemOneTstQst); - Tst_PutParamQstCod ((void *) Question->QstCod); + Tst_PutParamQstCod ((void *) &Test->Question.QstCod); if (Test->NumQsts == 1) Par_PutHiddenParamChar ("OnlyThisQst",'Y'); // If there are only one row, don't list again after removing Dat_WriteParamsIniEndDates (); - Tst_SetParamGblTest (Test); - Tst_WriteParamEditQst (); + Tst_WriteParamEditQst (Test); Ico_PutIconRemove (); Frm_EndForm (); /* Write icon to edit the question */ Ico_PutContextualIconToEdit (ActEdiOneTstQst,NULL, - Tst_PutParamQstCod,(void *) &Question->QstCod); + Tst_PutParamQstCod,(void *) &Test->Question.QstCod); HTM_TD_End (); /* Number of question and answer type (row[1]) */ HTM_TD_Begin ("class=\"RT COLOR%u\"",Gbl.RowEvenOdd); Tst_WriteNumQst (NumQst + 1); - Question->Answer.Type = Tst_ConvertFromStrAnsTypDBToAnsTyp (row[1]); - Tst_WriteAnswerType (Question->Answer.Type); + Test->Question.Answer.Type = Tst_ConvertFromStrAnsTypDBToAnsTyp (row[1]); + Tst_WriteAnswerType (Test->Question.Answer.Type); HTM_TD_End (); /* Question code */ HTM_TD_Begin ("class=\"DAT_SMALL CT COLOR%u\"",Gbl.RowEvenOdd); - HTM_TxtF ("%ld ",Question->QstCod); + HTM_TxtF ("%ld ",Test->Question.QstCod); HTM_TD_End (); /* Date (row[0] has the UTC date-time) */ @@ -2924,19 +2962,18 @@ static void Tst_WriteQuestionRowForEdition (const struct Tst_Test *Test, /* Question tags */ HTM_TD_Begin ("class=\"LT COLOR%u\"",Gbl.RowEvenOdd); - Tst_GetAndWriteTagsQst (Question->QstCod); + Tst_GetAndWriteTagsQst (Test->Question.QstCod); HTM_TD_End (); /* Shuffle (row[2]) */ HTM_TD_Begin ("class=\"DAT_SMALL CT COLOR%u\"",Gbl.RowEvenOdd); - if (Question->Answer.Type == Tst_ANS_UNIQUE_CHOICE || - Question->Answer.Type == Tst_ANS_MULTIPLE_CHOICE) + if (Test->Question.Answer.Type == Tst_ANS_UNIQUE_CHOICE || + Test->Question.Answer.Type == Tst_ANS_MULTIPLE_CHOICE) { Frm_StartForm (ActChgShfTstQst); - Tst_PutParamQstCod ((void *) Question->QstCod); + Tst_PutParamQstCod ((void *) &Test->Question.QstCod); Dat_WriteParamsIniEndDates (); - Tst_SetParamGblTest (Test); - Tst_WriteParamEditQst (); + Tst_WriteParamEditQst (Test); if (Test->NumQsts == 1) Par_PutHiddenParamChar ("OnlyThisQst",'Y'); // If editing only one question, don't edit others Par_PutHiddenParamUnsigned (NULL,"Order",(unsigned) Test->SelectedOrder); @@ -2954,15 +2991,15 @@ static void Tst_WriteQuestionRowForEdition (const struct Tst_Test *Test, true); // Visible /***** Get and show media (row[5]) *****/ - Question->Media.MedCod = Str_ConvertStrCodToLongCod (row[5]); - Med_GetMediaDataByCod (&Question->Media); - Med_ShowMedia (&Question->Media, + Test->Question.Media.MedCod = Str_ConvertStrCodToLongCod (row[5]); + Med_GetMediaDataByCod (&Test->Question.Media); + Med_ShowMedia (&Test->Question.Media, "TEST_MED_EDIT_LIST_CONT", "TEST_MED_EDIT_LIST"); /* Feedback (row[4]) and answers */ Tst_WriteQstFeedback (row[4],"TEST_EDI_LIGHT"); - Tst_WriteAnswersEdit (Question); + Tst_WriteAnswersEdit (&Test->Question); HTM_TD_End (); /* Get number of hits @@ -3212,62 +3249,15 @@ static void Tst_WriteQuestionRowForSelection (unsigned NumQst,long QstCod) /*********** Write hidden parameters for edition of test questions ***********/ /*****************************************************************************/ -void Tst_WriteParamEditQst (void) +void Tst_WriteParamEditQst (const struct Tst_Test *Test) { - struct Tst_Test Test; - - Tst_GetParamGblTest (&Test); - - Par_PutHiddenParamChar ("AllTags",Test.Tags.All ? 'Y' : - 'N'); - Par_PutHiddenParamString (NULL,"ChkTag",Test.Tags.List ? Test.Tags.List : - ""); - Par_PutHiddenParamChar ("AllAnsTypes",Test.AnswerTypes.All ? 'Y' : - 'N'); - Par_PutHiddenParamString (NULL,"AnswerType",Test.AnswerTypes.List); - } - -/*****************************************************************************/ -/************************* Function parameter with tags **********************/ -/*****************************************************************************/ - -static void Tst_ResetParamGblTest (void) - { - Tst_ResetTest (&Tst_ParamGblTest); - } - -void Tst_SetParamGblTest (const struct Tst_Test *TestSrc) - { - /***** Copy tags *****/ - Tst_ParamGblTest.Tags.Num = TestSrc->Tags.Num; - Tst_ParamGblTest.Tags.All = TestSrc->Tags.All; - Tst_ParamGblTest.Tags.List = TestSrc->Tags.List; - /* It's not necessary to copy the Txt field */ - - /***** Copy answer types *****/ - Tst_ParamGblTest.AnswerTypes.All = TestSrc->AnswerTypes.All; - Str_Copy (Tst_ParamGblTest.AnswerTypes.List,TestSrc->AnswerTypes.List, - Tst_MAX_BYTES_LIST_ANSWER_TYPES); - - /***** Copy selected order *****/ - Tst_ParamGblTest.SelectedOrder = TestSrc->SelectedOrder; - } - -void Tst_GetParamGblTest (struct Tst_Test *TestDst) - { - /***** Copy tags *****/ - TestDst->Tags.Num = Tst_ParamGblTest.Tags.Num; - TestDst->Tags.All = Tst_ParamGblTest.Tags.All; - TestDst->Tags.List = Tst_ParamGblTest.Tags.List; - /* It's not necessary to copy the Txt field */ - - /***** Copy answer types *****/ - TestDst->AnswerTypes.All = Tst_ParamGblTest.AnswerTypes.All; - Str_Copy (TestDst->AnswerTypes.List,Tst_ParamGblTest.AnswerTypes.List, - Tst_MAX_BYTES_LIST_ANSWER_TYPES); - - /***** Copy selected order *****/ - TestDst->SelectedOrder = Tst_ParamGblTest.SelectedOrder; + Par_PutHiddenParamChar ("AllTags",Test->Tags.All ? 'Y' : + 'N'); + Par_PutHiddenParamString (NULL,"ChkTag",Test->Tags.List ? Test->Tags.List : + ""); + Par_PutHiddenParamChar ("AllAnsTypes",Test->AnswerTypes.All ? 'Y' : + 'N'); + Par_PutHiddenParamString (NULL,"AnswerType",Test->AnswerTypes.List); } /*****************************************************************************/ @@ -5119,19 +5109,6 @@ static int Tst_CountNumAnswerTypesInList (const struct Tst_AnswerTypes *AnswerTy return NumAnsTypes; } -/*****************************************************************************/ -/**************** Free memory allocated for the list of tags *****************/ -/*****************************************************************************/ - -static void Tst_FreeTagsList (struct Tst_Tags *Tags) - { - if (Tags->List) - { - free (Tags->List); - Tst_ResetTags (Tags); - } - } - /*****************************************************************************/ /******************** Show form to edit one test question ********************/ /*****************************************************************************/ @@ -5212,7 +5189,7 @@ static void Tst_PutFormEditOneQst (const struct Tst_Question *Question, if (Question->QstCod > 0) // The question already has assigned a code { Box_BoxBegin (NULL,Str_BuildStringLong (Txt_Question_code_X,Question->QstCod), - Tst_PutIconToRemoveOneQst,NULL, + Tst_PutIconToRemoveOneQst,(void *) Question->QstCod, Hlp_ASSESSMENT_Tests_writing_a_question,Box_NOT_CLOSABLE); Str_FreeString (); } @@ -5223,7 +5200,7 @@ static void Tst_PutFormEditOneQst (const struct Tst_Question *Question, /***** Begin form *****/ Frm_StartForm (ActRcvTstQst); - Tst_PutParamQstCod ((void *) Question->QstCod); + Tst_PutParamQstCod ((void *) &Question->QstCod); /***** Begin table *****/ HTM_TABLE_BeginPadding (2); // Table for this question @@ -5677,7 +5654,7 @@ void Tst_QstDestructor (struct Tst_Question *Question) bool Tst_AllocateTextChoiceAnswer (struct Tst_Question *Question,unsigned NumOpt) { - Tst_FreeTagsList (&Question->Tags); + // Tst_FreeTagsList (&Question->Tags); // TODO: Necessary? Tst_FreeTextChoiceAnswer (Question,NumOpt); @@ -6000,46 +5977,43 @@ static Tst_AnswerType_t Tst_ConvertFromUnsignedStrToAnsTyp (const char *Unsigned void Tst_ReceiveQst (void) { - struct Tst_Question Question; struct Tst_Test Test; char Stem[Cns_MAX_BYTES_TEXT + 1]; char Feedback[Cns_MAX_BYTES_TEXT + 1]; - /***** Create test question *****/ - Tst_QstConstructor (&Question); + /***** Create test *****/ + Tst_TstConstructor (&Test); /***** Get parameters of the question from form *****/ Stem[0] = Feedback[0] = '\0'; - Tst_GetQstFromForm (&Question,Stem,Feedback); + Tst_GetQstFromForm (&Test.Question,Stem,Feedback); /***** Make sure that tags, text and answer are not empty *****/ - if (Tst_CheckIfQstFormatIsCorrectAndCountNumOptions (&Question)) + if (Tst_CheckIfQstFormatIsCorrectAndCountNumOptions (&Test.Question)) { /***** Move images to definitive directories *****/ - Tst_MoveMediaToDefinitiveDirectories (&Question); + Tst_MoveMediaToDefinitiveDirectories (&Test.Question); /***** Insert or update question, tags and answer in the database *****/ - Tst_InsertOrUpdateQstTagsAnsIntoDB (&Question); + Tst_InsertOrUpdateQstTagsAnsIntoDB (&Test.Question); /***** Show the question just inserted in the database *****/ - Tst_ResetTest (&Test); snprintf (Test.AnswerTypes.List,sizeof (Test.AnswerTypes.List), "%u", - (unsigned) Question.Answer.Type); - Tst_ListOneQstToEdit (&Test,&Question); - Tst_FreeTagsList (&Test.Tags); + (unsigned) Test.Question.Answer.Type); + Tst_ListOneQstToEdit (&Test); } else // Question is wrong { /***** Whether images has been received or not, reset images *****/ - Tst_ResetMediaOfQuestion (&Question); + Tst_ResetMediaOfQuestion (&Test.Question); /***** Put form to edit question again *****/ - Tst_PutFormEditOneQst (&Question,Stem,Feedback); + Tst_PutFormEditOneQst (&Test.Question,Stem,Feedback); } - /***** Destroy test question *****/ - Tst_QstDestructor (&Question); + /***** Destroy test *****/ + Tst_TstDestructor (&Test); } /*****************************************************************************/ @@ -6666,36 +6640,42 @@ void Tst_RequestRemoveSelectedQsts (void) extern const char *Txt_Remove_questions; struct Tst_Test Test; + /***** Create test *****/ + Tst_TstConstructor (&Test); + /***** Get parameters *****/ if (Tst_GetParamsTst (&Test,Tst_EDIT_TEST)) // Get parameters from the form { /***** Show question and button to remove question *****/ - Tst_SetParamGblTest (&Test); Ale_ShowAlertAndButton (ActRemSevTstQst,NULL,NULL, - Tst_PutParamsRemoveSelectedQsts,(void *) &Gbl, + Tst_PutParamsRemoveSelectedQsts,(void *) &Test, Btn_REMOVE_BUTTON,Txt_Remove_questions, Ale_QUESTION,Txt_Do_you_really_want_to_remove_the_selected_questions); } else Ale_ShowAlert (Ale_ERROR,"Wrong parameters."); - /***** Free memory used by the list of tags *****/ - Tst_FreeTagsList (&Test.Tags); - /***** Continue editing questions *****/ Tst_ListQuestionsToEdit (); + + /***** Destroy test *****/ + Tst_TstDestructor (&Test); } /*****************************************************************************/ /**************** Put parameters to remove selected questions ****************/ /*****************************************************************************/ -static void Tst_PutParamsRemoveSelectedQsts (void *Args) +static void Tst_PutParamsRemoveSelectedQsts (void *TestPtr) { - if (Args) + struct Tst_Test *Test; + + if (TestPtr) { + Test = (struct Tst_Test *) TestPtr; + Dat_WriteParamsIniEndDates (); - Tst_WriteParamEditQst (); + Tst_WriteParamEditQst (Test); } } @@ -6712,6 +6692,9 @@ void Tst_RemoveSelectedQsts (void) unsigned NumQst; long QstCod; + /***** Create test *****/ + Tst_TstConstructor (&Test); + /***** Get parameters *****/ if (Tst_GetParamsTst (&Test,Tst_EDIT_TEST)) // Get parameters { @@ -6738,6 +6721,9 @@ void Tst_RemoveSelectedQsts (void) /***** Write message *****/ Ale_ShowAlert (Ale_SUCCESS,Txt_Questions_removed_X,Test.NumQsts); } + + /***** Destroy test *****/ + Tst_TstDestructor (&Test); } /*****************************************************************************/ @@ -6758,17 +6744,16 @@ void Tst_RequestRemoveOneQst (void) { extern const char *Txt_Do_you_really_want_to_remove_the_question_X; extern const char *Txt_Remove_question; - struct Tst_Question Question; bool EditingOnlyThisQst; struct Tst_Test Test; - /***** Create test question *****/ - Tst_QstConstructor (&Question); + /***** Create test *****/ + Tst_TstConstructor (&Test); /***** Get main parameters from form *****/ /* Get the question code */ - Question.QstCod = Tst_GetQstCod (); - if (Question.QstCod <= 0) + Test.Question.QstCod = Tst_GetQstCod (); + if (Test.Question.QstCod <= 0) Lay_ShowErrorAndExit ("Wrong code of question."); /* Get a parameter that indicates whether it's necessary @@ -6781,26 +6766,23 @@ void Tst_RequestRemoveOneQst (void) Lay_ShowErrorAndExit ("Wrong test parameters."); /***** Show question and button to remove question *****/ - Tst_ResetParamGblTest (); Ale_ShowAlertAndButton (ActRemOneTstQst,NULL,NULL, EditingOnlyThisQst ? Tst_PutParamsRemoveOnlyThisQst : - Tst_PutParamsRemoveOneQstWhileEditing,(void *) &Question.QstCod, + Tst_PutParamsRemoveOneQstWhileEditing, + EditingOnlyThisQst ? (void *) &Test.Question.QstCod : + (void *) &Test, Btn_REMOVE_BUTTON,Txt_Remove_question, Ale_QUESTION,Txt_Do_you_really_want_to_remove_the_question_X, - Question.QstCod); + Test.Question.QstCod); /***** Continue editing questions *****/ if (EditingOnlyThisQst) - { - Tst_ResetTest (&Test); - Tst_ListOneQstToEdit (&Test,&Question); - Tst_FreeTagsList (&Test.Tags); - } + Tst_ListOneQstToEdit (&Test); else Tst_ListQuestionsToEdit (); - /***** Destroy test question *****/ - Tst_QstDestructor (&Question); + /***** Destroy test *****/ + Tst_TstDestructor (&Test); } /*****************************************************************************/ @@ -6809,19 +6791,29 @@ void Tst_RequestRemoveOneQst (void) static void Tst_PutParamsRemoveOnlyThisQst (void *QstCodPtr) { - Tst_PutParamQstCod (QstCodPtr); - Par_PutHiddenParamChar ("OnlyThisQst",'Y'); + if (QstCodPtr) + { + Tst_PutParamQstCod (QstCodPtr); + Par_PutHiddenParamChar ("OnlyThisQst",'Y'); + } } /*****************************************************************************/ /***** Put parameters to remove question when editing several questions ******/ /*****************************************************************************/ -static void Tst_PutParamsRemoveOneQstWhileEditing (void *QstCodPtr) +static void Tst_PutParamsRemoveOneQstWhileEditing (void *TestPtr) { - Tst_PutParamQstCod (QstCodPtr); - Dat_WriteParamsIniEndDates (); - Tst_WriteParamEditQst (); + struct Tst_Test *Test; + + if (TestPtr) + { + Test = (struct Tst_Test *) TestPtr; + + Tst_PutParamQstCod ((void *) &Test->Question.QstCod); + Dat_WriteParamsIniEndDates (); + Tst_WriteParamEditQst (Test); + } } /*****************************************************************************/ @@ -6895,17 +6887,16 @@ void Tst_ChangeShuffleQst (void) { extern const char *Txt_The_answers_of_the_question_with_code_X_will_appear_shuffled; extern const char *Txt_The_answers_of_the_question_with_code_X_will_appear_without_shuffling; - struct Tst_Question Question; + struct Tst_Test Test; bool EditingOnlyThisQst; bool Shuffle; - struct Tst_Test Test; - /***** Create test question *****/ - Tst_QstConstructor (&Question); + /***** Create test *****/ + Tst_TstConstructor (&Test); /***** Get the question code *****/ - Question.QstCod = Tst_GetQstCod (); - if (Question.QstCod <= 0) + Test.Question.QstCod = Tst_GetQstCod (); + if (Test.Question.QstCod <= 0) Lay_ShowErrorAndExit ("Wrong code of question."); /***** Get a parameter that indicates whether it's necessary to continue listing the rest of questions ******/ @@ -6921,25 +6912,21 @@ void Tst_ChangeShuffleQst (void) " WHERE QstCod=%ld AND CrsCod=%ld", Shuffle ? 'Y' : 'N', - Question.QstCod,Gbl.Hierarchy.Crs.CrsCod); + Test.Question.QstCod,Gbl.Hierarchy.Crs.CrsCod); /***** Write message *****/ Ale_ShowAlert (Ale_SUCCESS,Shuffle ? Txt_The_answers_of_the_question_with_code_X_will_appear_shuffled : Txt_The_answers_of_the_question_with_code_X_will_appear_without_shuffling, - Question.QstCod); + Test.Question.QstCod); /***** Continue editing questions *****/ if (EditingOnlyThisQst) - { - Tst_ResetTest (&Test); - Tst_ListOneQstToEdit (&Test,&Question); - Tst_FreeTagsList (&Test.Tags); - } + Tst_ListOneQstToEdit (&Test); else Tst_ListQuestionsToEdit (); - /***** Destroy test question *****/ - Tst_QstDestructor (&Question); + /***** Destroy test *****/ + Tst_TstDestructor (&Test); } /*****************************************************************************/ diff --git a/swad_test.h b/swad_test.h index 682b6ea8..f327e1a3 100644 --- a/swad_test.h +++ b/swad_test.h @@ -88,14 +88,6 @@ typedef enum } Tst_QuestionsOrder_t; #define Tst_DEFAULT_ORDER Tst_ORDER_STEM -struct Tst_Test - { - struct Tst_Tags Tags; - struct Tst_AnswerTypes AnswerTypes; - Tst_QuestionsOrder_t SelectedOrder; - unsigned NumQsts; - }; - struct Tst_Question { long QstCod; @@ -124,6 +116,15 @@ struct Tst_Question } Answer; }; +struct Tst_Test + { + struct Tst_Tags Tags; // Selected tags + struct Tst_AnswerTypes AnswerTypes; // Selected answer types + Tst_QuestionsOrder_t SelectedOrder; // Order for listing questions + unsigned NumQsts; // Number of questions + struct Tst_Question Question; // Selected / editing question + }; + typedef enum { Tst_SHOW_TEST_TO_ANSWER, // Showing a test to a student @@ -176,10 +177,7 @@ void Tst_RequestSelectTestsForGame (void); void Tst_ListQuestionsToEdit (void); void Tst_ListQuestionsToSelect (void); bool Tst_GetOneQuestionByCod (long QstCod,MYSQL_RES **mysql_res); -void Tst_WriteParamEditQst (void); - -void Tst_SetParamGblTest (const struct Tst_Test *TestSrc); -void Tst_GetParamGblTest (struct Tst_Test *TestDst); +void Tst_WriteParamEditQst (const struct Tst_Test *Test); unsigned Tst_GetNumAnswersQst (long QstCod); void Tst_GetAnswersQst (struct Tst_Question *Question,MYSQL_RES **mysql_res, diff --git a/swad_test_import.c b/swad_test_import.c index ae81530b..903df98d 100644 --- a/swad_test_import.c +++ b/swad_test_import.c @@ -65,7 +65,7 @@ extern struct Globals Gbl; /***************************** Private prototypes ****************************/ /*****************************************************************************/ -static void TsI_PutParamsExportQsts (void *Args); +static void TsI_PutParamsExportQsts (void *TestPtr); static void TsI_PutCreateXMLParam (void); static void TsI_ExportQuestion (long QstCod,FILE *FileXML); @@ -93,9 +93,8 @@ void TsI_PutFormToExportQuestions (const struct Tst_Test *Test) extern const char *Txt_Export_questions; /***** Put a link to create a file with questions *****/ - Tst_SetParamGblTest (Test); Lay_PutContextualLinkIconText (ActLstTstQst,NULL, - TsI_PutParamsExportQsts,(void *) &Gbl, + TsI_PutParamsExportQsts,(void *) &Test, "file-import.svg", Txt_Export_questions); } @@ -104,17 +103,18 @@ void TsI_PutFormToExportQuestions (const struct Tst_Test *Test) /****************** Put params to export test questions **********************/ /*****************************************************************************/ -static void TsI_PutParamsExportQsts (void *Args) +static void TsI_PutParamsExportQsts (void *TestPtr) { - struct Tst_Test Test; + struct Tst_Test *Test; - if (Args) + if (TestPtr) { - Tst_GetParamGblTest (&Test); + Test = (struct Tst_Test *) TestPtr; + Dat_WriteParamsIniEndDates (); - Tst_WriteParamEditQst (); + Tst_WriteParamEditQst (Test); Par_PutHiddenParamChar ("OnlyThisQst",'N'); - Par_PutHiddenParamUnsigned (NULL,"Order",(unsigned) Test.SelectedOrder); + Par_PutHiddenParamUnsigned (NULL,"Order",(unsigned) Test->SelectedOrder); TsI_PutCreateXMLParam (); } }