diff --git a/dta.zip b/dta.zip index 97275a3081dca3d9f2c3bec385c0939025ecf263..7132db0972680920d93e9542d6aa1a3cf551aeb0 100644 Binary files a/dta.zip and b/dta.zip differ diff --git a/dta/db/upgrade.php b/dta/db/upgrade.php index 66321f5a42fd9bb54a7393942396e97f01d83eec..7ee51ec0098bb3775619ec74728bcf65d33f5f4e 100644 --- a/dta/db/upgrade.php +++ b/dta/db/upgrade.php @@ -21,8 +21,6 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -defined('MOODLE_INTERNAL') || die(); - /** * Stub for upgrade code * @param int $oldversion diff --git a/dta/lib.php b/dta/lib.php index 058e217a950c714b1f32c76a52361400605d7adf..155b3f238b2fa22d1221908d9a2d9676c296af75 100644 --- a/dta/lib.php +++ b/dta/lib.php @@ -20,7 +20,6 @@ * @package assignsubmission_dta * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -defined('MOODLE_INTERNAL') || die(); /** * Serves assignment submissions and other files. @@ -85,4 +84,4 @@ function assignsubmission_dta_pluginfile( // Download MUST be forced - security! send_stored_file($file, 0, 0, true); -} \ No newline at end of file +} diff --git a/dta/locallib.php b/dta/locallib.php index 25bba02db872da80ba57f2f528cd845fa3636459..04c78db7a2a5a4b3d0469690dfce10d620682092 100644 --- a/dta/locallib.php +++ b/dta/locallib.php @@ -16,7 +16,7 @@ defined('MOODLE_INTERNAL') || die(); -// import various files logic is organized in +//Import various entity and application logic files. require_once($CFG->dirroot . '/mod/assign/submission/dta/models/DtaResult.php'); require_once($CFG->dirroot . '/mod/assign/submission/dta/utils/database.php'); require_once($CFG->dirroot . '/mod/assign/submission/dta/utils/backend.php'); @@ -30,18 +30,15 @@ require_once($CFG->dirroot . '/mod/assign/submission/dta/utils/view.php'); */ class assign_submission_dta extends assign_submission_plugin { - // broadly used in logic, parametrized for easier change + //Broadly used in logic, parametrized for easier change. const COMPONENT_NAME = "assignsubmission_dta"; - - // draft file area for dta tests to be uploaded by the teacher + //Draft file area for dta tests to be uploaded by the teacher. const ASSIGNSUBMISSION_DTA_DRAFT_FILEAREA_TEST = "tests_draft_dta"; - // file area for dta tests to be uploaded by the teacher + //File area for dta tests to be uploaded by the teacher. const ASSIGNSUBMISSION_DTA_FILEAREA_TEST = "tests_dta"; - // file area for dta submission assignment + //File area for dta submission assignment. const ASSIGNSUBMISSION_DTA_FILEAREA_SUBMISSION = "submissions_dta"; - // ========== abstract methods to be implemented ========== // - /** * get plugin name * @return string @@ -50,11 +47,6 @@ class assign_submission_dta extends assign_submission_plugin { return get_string("pluginname", self::COMPONENT_NAME); } - // ========== end of section ========== // - - // ========== parent methods overloaded ========== // - - // ===== assignment settings ===== // /** * Get default settings for assignment submission settings * @@ -62,37 +54,31 @@ class assign_submission_dta extends assign_submission_plugin { * @return void */ public function get_settings(MoodleQuickForm $mform): void { - // add draft filemanager to form + //Add draft filemanager to form. $mform->addElement( - // filemanager "filemanager", - // unique element name in form self::ASSIGNSUBMISSION_DTA_DRAFT_FILEAREA_TEST, - // label shown to user left of filemanager get_string("submission_settings_label", self::COMPONENT_NAME), - // attributes null, - // options array $this->get_file_options(true) ); - // add help button to added filemanager + //Add help button to added filemanager. $mform->addHelpButton( - // form-unique element id to add button to + //Form-unique element id to which to add button. self::ASSIGNSUBMISSION_DTA_DRAFT_FILEAREA_TEST, - // key to search for "submission_settings_label", - // language file to use + //Language file to use. self::COMPONENT_NAME ); - // only show filemanager, if our plugin is enabled + //Only show filemanager if plugin is enabled. $mform->hideIf( - // form-unique element id to hide + //Form-unique element id to hide. self::ASSIGNSUBMISSION_DTA_DRAFT_FILEAREA_TEST, - // condition to check + //Condition to check. self::COMPONENT_NAME . '_enabled', - // state to match for hiding + //State to match for hiding. 'notchecked' ); } @@ -104,21 +90,16 @@ class assign_submission_dta extends assign_submission_plugin { * @param array $defaultvalues */ public function data_preprocessing(&$defaultvalues): void { - $draftitemid = file_get_submitted_draft_itemid(self::ASSIGNSUBMISSION_DTA_DRAFT_FILEAREA_TEST); + //Get id of draft area for file manager creation. + $draftitemid = file_get_submitted_draft_itemid(self::ASSIGNSUBMISSION_DTA_DRAFT_FILEAREA_TEST); - // prepare draft area with created draft filearea + //Prepare draft area with created draft filearea. file_prepare_draft_area( - // draft filemanager form-unique id $draftitemid, - // id of current assignment $this->assignment->get_context()->id, - // component name self::COMPONENT_NAME, - // proper filearea self::ASSIGNSUBMISSION_DTA_FILEAREA_TEST, - // entry id 0, - // options array? array('subdirs' => 0) ); @@ -133,69 +114,59 @@ class assign_submission_dta extends assign_submission_plugin { */ public function save_settings(stdClass $data): bool { - // if the assignment has no filemanager for our plugin just leave - $draftFileManagerId = self::ASSIGNSUBMISSION_DTA_DRAFT_FILEAREA_TEST; - if (!isset($data->$draftFileManagerId)) { + //If the assignment has no filemanager for our plugin just leave. + $draftfilemanagerid = self::ASSIGNSUBMISSION_DTA_DRAFT_FILEAREA_TEST; + if (!isset($data->$draftfilemanagerid)) { return true; } - // store files from draft filearea to proper one + //Store files from draft filearea to final one. file_save_draft_area_files( - // form-unique element id of draft filemanager from the edit - $data->$draftFileManagerId, - // id of the assignment we edit right now + //Form-unique element id of draft filemanager from the edit. + $data->$draftfilemanagerid, + //Id of the assignment in edit. $this->assignment->get_context()->id, - // component name self::COMPONENT_NAME, - // proper file area self::ASSIGNSUBMISSION_DTA_FILEAREA_TEST, - // entry id 0 ); - // get files from proper filearea + //Get files from proper filearea. $fs = get_file_storage(); $files = $fs->get_area_files( - // id of current assignment + //Id of the current assignment. $this->assignment->get_context()->id, - // component name self::COMPONENT_NAME, - // proper filearea self::ASSIGNSUBMISSION_DTA_FILEAREA_TEST, - // entry id 0, - // ? 'id', - // ? false ); - // check if a file is uploaded + //Check if a file was uploaded. if (empty($files)) { \core\notification::error(get_string("no_testfile_warning", self::COMPONENT_NAME)); return true; } - // get file + //Get the file. $file = reset($files); - // send file to backend + //Send file to backend. return DtaBackendUtils::sendTestConfigToBackend($this->assignment, $file); } - // ===== student submission ===== // - /** * Add elements to submission form * * @param mixed $submission stdClass|null * @param MoodleQuickForm $mform * @param stdClass $data - * @param int $userid + * @param int $userid * @return bool */ public function get_form_elements_for_user($submissionorgrade, MoodleQuickForm $mform, stdClass $data, $userid): bool { - // prepare submission filearea + //Prepare submission filearea. $data = file_prepare_standard_filemanager( $data, 'tasks', @@ -206,27 +177,26 @@ class assign_submission_dta extends assign_submission_plugin { $submissionorgrade ? $submissionorgrade->id : 0 ); - // add filemanager to form + //Add filemanager to form. $mform->addElement( - // filemanager 'filemanager', - // form-unique identifier + //Form-unique identifier. 'tasks_filemanager', - // label to show next to filemanager + //Label to show next to the filemanager. get_string("submission_label", self::COMPONENT_NAME), - // attributes + //Attributes. null, - // options + //Options. $this->get_file_options(false) ); - // add help button + //Add help button. $mform->addHelpButton( - // what form item to add a helpbutton + //Related form item. "tasks_filemanager", - // what key to use + //Key. "submission_label", - // in which language file to look in + //Language file. self::COMPONENT_NAME ); @@ -239,21 +209,21 @@ class assign_submission_dta extends assign_submission_plugin { */ public function is_empty(stdClass $submission): bool { return $this->count_files($submission->id, self::ASSIGNSUBMISSION_DTA_FILEAREA_SUBMISSION) == 0; - } + } /** * Count the number of files in a filearea * - * @param int $submissionId submission id to check - * @param string $areaId filearea id to count + * @param int $submissionid submission id to check + * @param string $areaid filearea id to count * @return int */ - private function count_files($submissionId, $areaId) { + private function count_files($submissionid, $areaid) { $fs = get_file_storage(); $files = $fs->get_area_files($this->assignment->get_context()->id, self::COMPONENT_NAME, - $areaId, - $submissionId, + $areaid, + $submissionid, 'id', false); @@ -278,55 +248,49 @@ class assign_submission_dta extends assign_submission_plugin { $submission->id ); - // if submission is empty leave directly + //If submission is empty leave directly. if ($this->is_empty($submission)) { return true; } - // get submitted files + //Get submitted files. $fs = get_file_storage(); $files = $fs->get_area_files( - // id of current assignment + //Id of current assignment. $this->assignment->get_context()->id, - // component name self::COMPONENT_NAME, - // proper filearea self::ASSIGNSUBMISSION_DTA_FILEAREA_SUBMISSION, - // entry id $submission->id, - // ? 'id', - // ? false ); - // check if a file is uploaded + //Check if a file is uploaded. if (empty($files)) { \core\notification::error(get_string("no_submissionfile_warning", self::COMPONENT_NAME)); return true; } - // Get the file and post it to our backend. + //Get the file. $file = reset($files); - + + //Send file to backend. $response = DtaBackendUtils::sendSubmissionToBackend($this->assignment, $file); - // if we got a null response, return with error + //With a null response, return an error. if (is_null($response)) { return false; } - // convert received json to valid class instances - $resultSummary = DtaResultSummary::decodeJson($response); + //Convert received json to valid class instances. + $resultsummary = DtaResultSummary::decodeJson($response); - // persist new results to database - DbUtils::storeResultSummaryToDatabase($this->assignment->get_instance()->id, $submission->id, $resultSummary); + //Persist new results to database. + DbUtils::storeResultSummaryToDatabase($this->assignment->get_instance()->id, $submission->id, $resultsummary); return true; } - // ===== view submission results ===== // - /** * Display a short summary of the test results of the submission * This is diplayed as default view, with the option to expand @@ -358,8 +322,6 @@ class assign_submission_dta extends assign_submission_plugin { ); } - // ========== end of section ========== // - /** * generate array of allowed filetypes to upload. * @@ -371,7 +333,7 @@ class assign_submission_dta extends assign_submission_plugin { private function get_file_options(bool $settings): array { $fileoptions = array('subdirs' => 0, "maxfiles" => 1, - 'accepted_types' => ($settings ? array(".txt") : array(".txt",".zip")), + 'accepted_types' => ($settings ? array(".txt") : array(".txt", ".zip")), 'return_types' => FILE_INTERNAL); return $fileoptions; } @@ -405,7 +367,7 @@ class assign_submission_dta extends assign_submission_plugin { false); foreach ($files as $file) { - // Do we return the full folder path or just the file name? + //Do we return the full folder path or just the file name? if (isset($submission->exportfullpath) && $submission->exportfullpath == false) { $result[$file->get_filename()] = $file; } else { diff --git a/dta/models/DtaResult.php b/dta/models/DtaResult.php index e96e84bef32dba328bff5908e335e8f401ce3a3a..add16c3d158bfcb39ce22c2bec8d2ae97d2dfadf 100644 --- a/dta/models/DtaResult.php +++ b/dta/models/DtaResult.php @@ -14,10 +14,12 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. +defined('MOODLE_INTERNAL') || die(); + class DtaResult { - public $packageName; - public $className; + public $packageName; + public $className; public $name; /** @@ -66,41 +68,41 @@ class DtaResultSummary { * @param string $jsonString jsonString containing DtaResultSummary * @return DtaResultSummary */ - public static function decodeJson($jsonString): DtaResultSummary { - $response = json_decode($jsonString); + public static function decodeJson($jsonstring): DtaResultSummary { + $response = json_decode($jsonstring); $summary = new DtaResultSummary(); $summary->timestamp = $response->timestamp; - $summary->globalStacktrace = $response->globalStacktrace; - - $summary->successfulTestCompetencyProfile = $response->successfulTestCompetencyProfile; - $summary->overallTestCompetencyProfile = $response->overallTestCompetencyProfile; + $summary->globalStacktrace = $response->globalStacktrace; + + $summary->successfulTestCompetencyProfile = $response->successfulTestCompetencyProfile; + $summary->overallTestCompetencyProfile = $response->overallTestCompetencyProfile; $summary->results = self::decodeJsonResultArray($response->results); return $summary; } - private static function decodeJsonCompetencyArray($jsonArray): array { + private static function decodeJsonCompetencyArray($jsonarray): array { $ret = array(); - foreach ($jsonArray as $entry) { - $ret[] = $entry; - } - return $ret; + foreach ($jsonarray as $entry) { + $ret[] = $entry; + } + return $ret; } /** * @param array $jsonArray decoded json array of results array * @return array of DtaResult */ - private static function decodeJsonResultArray($jsonArray): array { + private static function decodeJsonResultArray($jsonarray): array { $ret = array(); - foreach ($jsonArray as $entry) { + foreach ($jsonarray as $entry) { $value = new DtaResult(); $value->packageName = $entry->packageName; - $value->className = $entry->className; - $value->name = $entry->name; - + $value->className = $entry->className; + $value->name = $entry->name; + $value->state = $entry->state; $value->failureType = $entry->failureType; @@ -122,7 +124,7 @@ class DtaResultSummary { */ public function stateOccurenceCount(int $state): int { $num = 0; - foreach($this->results as $r) { + foreach ($this->results as $r) { if ($r->state == $state) { $num++; } diff --git a/dta/utils/backend.php b/dta/utils/backend.php index 4e790a855f2d9dfdef8334285b1a9dec4b1a1ef6..2a4349dbad72af3209991f03b7f0020ad46c745b 100644 --- a/dta/utils/backend.php +++ b/dta/utils/backend.php @@ -20,13 +20,13 @@ class DtaBackendUtils { * @return string backend host base url */ private static function getBackendBaseUrl(): string { - $backendAddress = get_config(assign_submission_dta::COMPONENT_NAME, "backendHost"); + $backendaddress = get_config(assign_submission_dta::COMPONENT_NAME, "backendHost"); - if (empty($backendAddress)) { + if (empty($backendaddress)) { \core\notification::error(get_string("backendHost_not_set", assign_submission_dta::COMPONENT_NAME)); } - return $backendAddress; + return $backendaddress; } /** @@ -38,21 +38,21 @@ class DtaBackendUtils { * @return bool true if no error occurred */ public static function sendTestConfigToBackend($assignment, $file): bool { - $backendAddress = self::getBackendBaseUrl(); - if (empty($backendAddress)) { + $backendaddress = self::getBackendBaseUrl(); + if (empty($backendaddress)) { return true; } - // set endpoint for test upload - $url = $backendAddress . "/v1/unittest"; + //Set endpoint for test upload. + $url = $backendaddress . "/v1/unittest"; - // prepare params + //Prepare params. $params = array( "unitTestFile" => $file, "assignmentId" => $assignment->get_instance()->id ); - // if request returned null, return false to indicate failure + //If request returned null, return false to indicate failure. if (is_null(self::post($url, $params))) { return false; } else { @@ -69,15 +69,15 @@ class DtaBackendUtils { * @return string json string with testresults or null on error */ public static function sendSubmissionToBackend($assignment, $file): ?string { - $backendAddress = self::getBackendBaseUrl(); - if (empty($backendAddress)) { + $backendaddress = self::getBackendBaseUrl(); + if (empty($backendaddress)) { return true; } - // set endpoint for test upload - $url = $backendAddress . "/v1/task"; + //Set endpoint for test upload. + $url = $backendaddress . "/v1/task"; - // prepare params + //Prepare params. $params = array( "taskFile" => $file, "assignmentId" => $assignment->get_instance()->id @@ -104,14 +104,15 @@ class DtaBackendUtils { $curl = new curl(); $response = $curl->post($url, $params, $options); - // check state of request, if response code is a 2xx return the answer + //Check state of request, if response code is a 2xx return the answer. $info = $curl->get_info(); if ($info["http_code"] >= 200 && $info["http_code"] < 300) { return $response; } - // Something went wrong, return null and give an error msg - debugging(assign_submission_dta::COMPONENT_NAME . ": Post file to server was not successful: http_code=" . $info["http_code"]); + //Something went wrong, return null and give an error message. + debugging(assign_submission_dta::COMPONENT_NAME . ": Post file to server was not successful: http_code=" . + $info["http_code"]); if ($info['http_code'] >= 400 && $info['http_code'] < 500) { \core\notification::error(get_string("http_client_error_msg", assign_submission_dta::COMPONENT_NAME)); @@ -120,7 +121,8 @@ class DtaBackendUtils { \core\notification::error(get_string("http_server_error_msg", assign_submission_dta::COMPONENT_NAME)); return null; } else { - \core\notification::error(get_string("http_unknown_error_msg", assign_submission_dta::COMPONENT_NAME) . $info["http_code"] . $response); + \core\notification::error(get_string("http_unknown_error_msg", assign_submission_dta::COMPONENT_NAME) . + $info["http_code"] . $response); return null; } } diff --git a/dta/utils/database.php b/dta/utils/database.php index a704541d71e97421626bcd56aac09efff07ff261..6da56b7ab5700a08ca7edd78c62d5aa700df20f3 100644 --- a/dta/utils/database.php +++ b/dta/utils/database.php @@ -24,39 +24,39 @@ class DbUtils { /** * get's summary with all corresponding result entries * - * @param int $assignmentId assignment id to search for - * @param int $submissionId submission id to search for + * @param int $assignmentid assignment id to search for + * @param int $submissionid submission id to search for * @return DttResultSummary representing given submission */ public static function getResultSummaryFromDatabase( - int $assignmentId, - int $submissionId + int $assignmentid, + int $submissionid ): DtaResultSummary { global $DB; - // fetch data from database - $summaryDbRecord = $DB->get_record(self::TABLE_SUMMARY, array( - "assignment_id" => $assignmentId, - "submission_id" => $submissionId + //Fetch data from database. + $summary_record = $DB->get_record(self::TABLE_SUMMARY, array( + "assignment_id" => $assignmentid, + "submission_id" => $submissionid )); - $resultsDbArray = $DB->get_records(self::TABLE_RESULT, array( - "assignment_id" => $assignmentId, - "submission_id" => $submissionId + $results_array = $DB->get_records(self::TABLE_RESULT, array( + "assignment_id" => $assignmentid, + "submission_id" => $submissionid )); - // create summary instance + //Create a summary instance. $summary = new DtaResultSummary(); - $summary->timestamp = $summaryDbRecord->timestamp; - $summary->globalStacktrace = $summaryDbRecord->global_stacktrace; - $summary->successfulTestCompetencyProfile = $summaryDbRecord->successful_competencies; - $summary->overallTestCompetencyProfile = $summaryDbRecord->tested_competencies; + $summary->timestamp = $summary_record->timestamp; + $summary->globalStacktrace = $summary_record->global_stacktrace; + $summary->successfulTestCompetencyProfile = $summary_record->successful_competencies; + $summary->overallTestCompetencyProfile = $summary_record->tested_competencies; $summary->results = array(); - // create result instances and add to array of summary instance - foreach($resultsDbArray as $rr) { + //Create result instances and add to array of summary instance. + foreach($results_array as $rr) { $result = new DtaResult(); - $result->packageName = $rr->package_name; + $result->packageName = $rr->package_name; $result->className = $rr->class_name; $result->name = $rr->name; $result->state = $rr->state; @@ -77,33 +77,33 @@ class DbUtils { * save given result summary and single results to database * under given assignment and submission id * - * @param int assignmentId assigment this is submission is linked to - * @param int submissionId submission of this result + * @param int assignmentid assigment this is submission is linked to + * @param int submissionid submission of this result * @param DttResultSummary instance to persist */ public static function storeResultSummaryToDatabase( - int $assignmentId, - int $submissionId, + int $assignmentid, + int $submissionid, DtaResultSummary $summary ): void { global $DB; - // prepare new database entries - $summaryRecord = new stdClass(); - $summaryRecord->assignment_id = $assignmentId; - $summaryRecord->submission_id = $submissionId; - $summaryRecord->successful_competencies = $summary->successfulTestCompetencyProfile; - $summaryRecord->tested_competencies = $summary->overallTestCompetencyProfile; - $summaryRecord->timestamp = $summary->timestamp; - $summaryRecord->global_stacktrace = $summary->globalStacktrace; - - // prepare results to persist to array - $resultRecordArray = array(); + //Prepare new database entries. + $summary_record = new stdClass(); + $summary_record->assignment_id = $assignmentid; + $summary_record->submission_id = $submissionid; + $summary_record->successful_competencies = $summary->successfulTestCompetencyProfile; + $summary_record->tested_competencies = $summary->overallTestCompetencyProfile; + $summary_record->timestamp = $summary->timestamp; + $summary_record->global_stacktrace = $summary->globalStacktrace; + + //Prepare results to persist to array. + $result_records = array(); foreach($summary->results as $r) { $record = new stdClass(); - $record->assignment_id = $assignmentId; - $record->submission_id = $submissionId; - $record->package_name = $r->packageName; + $record->assignment_id = $assignmentid; + $record->submission_id = $submissionid; + $record->package_name = $r->packageName; $record->class_name = $r->className; $record->name = $r->name; $record->state = $r->state; @@ -113,30 +113,30 @@ class DbUtils { $record->column_number = $r->columnNumber; $record->line_number = $r->lineNumber; $record->position = $r->position; - $resultRecordArray[] = $record; + $result_records[] = $record; } - // if results exist yet, delete old values beforehand + //If results already exist, delete old values beforehand. $submission = $DB->get_record(self::TABLE_SUMMARY, array( - 'assignment_id' => $assignmentId, - 'submission_id' => $submissionId + 'assignment_id' => $assignmentid, + 'submission_id' => $submissionid )); if ($submission) { $DB->delete_records(self::TABLE_RESULT, array( - 'assignment_id' => $assignmentId, - 'submission_id' => $submissionId + 'assignment_id' => $assignmentid, + 'submission_id' => $submissionid )); $DB->delete_records(self::TABLE_SUMMARY, array( - 'assignment_id' => $assignmentId, - 'submission_id' => $submissionId + 'assignment_id' => $assignmentid, + 'submission_id' => $submissionid )); } - // create summary and single result entries - $DB->insert_record(self::TABLE_SUMMARY, $summaryRecord); - foreach($resultRecordArray as $rr) { + //Create summary and single result entries. + $DB->insert_record(self::TABLE_SUMMARY, $summary_record); + foreach($result_records as $rr) { $DB->insert_record(self::TABLE_RESULT, $rr); } } diff --git a/dta/utils/view.php b/dta/utils/view.php index 8487870e100587243e0589ad45f40e8657ca7d29..c211a9b8ed6a1d43ef0d8a0d50dc3a9e5b4698c5 100644 --- a/dta/utils/view.php +++ b/dta/utils/view.php @@ -19,29 +19,29 @@ class ViewSubmissionUtils { /** * generates a short summary html * - * @param int assignmentId assignment - * @param int submissionId submission to create a report for + * @param int assignmentid assignment + * @param int submissionid submission to create a report for * @return string html */ public static function generateSummaryHtml( - int $assignmentId, - int $submissionId + int $assignmentid, + int $submissionid ): string { - // fetch data - $summary = DbUtils::getResultSummaryFromDatabase($assignmentId, $submissionId); + //Fetch data. + $summary = DbUtils::getResultSummaryFromDatabase($assignmentid, $submissionid); $html = ""; - // calculate success rate, if no unknown result states or compilation errors - $successRate = "?"; + //Calculate success rate, if no unknown result states or compilation errors. + $successrate = "?"; if ($summary->unknownCount() == 0 && $summary->compilationErrorCount() == 0) { - $successRate = round(($summary->successfulCount() / $summary->resultCount()) * 100, 2 ); + $successrate = round(($summary->successfulCount() / $summary->resultCount()) * 100, 2 ); } - // generate html + //Generate html. $html .= $summary->successfulCount() . "/"; $html .= ($summary->compilationErrorCount() == 0 && $summary->unknownCount() == 0) - ? $summary->resultCount() . " (" . $successRate . "%)" + ? $summary->resultCount() . " (" . $successrate . "%)" : "?"; $html .= " tests successful<br>"; @@ -61,32 +61,32 @@ class ViewSubmissionUtils { /** * generates detailed view html * - * @param int assignmentId assignment - * @param int submissionId submission to create a report for + * @param int assignmentid assignment + * @param int submissionid submission to create a report for */ public static function generateDetailHtml( - int $assignmentId, - int $submissionId + int $assignmentid, + int $submissionid ): string { - // fetch data - $summary = DbUtils::getResultSummaryFromDatabase($assignmentId, $submissionId); + //Fetch data. + $summary = DbUtils::getResultSummaryFromDatabase($assignmentid, $submissionid); $html = ""; - // define a few css classes and prepare html attribute arrays - $tableHeaderRowAttributes = array("class" => "dtaTableHeaderRow"); - $tableRowAttributes = array("class" => "dtaTableRow"); - $resultRowAttributes = $tableRowAttributes; - $unknownAttrib = 'dtaResultUnknown'; - $successAttrib = 'dtaResultSuccess'; - $failureAttrib = 'dtaResultFailure'; - $compErrorAttrib = 'dtaResultCompilationError'; + //Define a few css classes and prepare html attribute arrays to beautify the output. + $tableheaderrow_attributes = array("class" => "dtaTableHeaderRow"); + $tablerow_attributes = array("class" => "dtaTableRow"); + $resultrow_attributes = $tablerow_attributes; + $unknown_attributes = 'dtaResultUnknown'; + $success_attributes = 'dtaResultSuccess'; + $failure_attributes = 'dtaResultFailure'; + $compilationerror_attributes = 'dtaResultCompilationError'; - // summary table + //Summary table. $tmp = ""; $tmp .= html_writer::tag("th", "Summary", array("class" => "dtaTableHeader")); $tmp .= html_writer::empty_tag("th", array("class" => "dtaTableHeader")); - $header = html_writer::tag("tr", $tmp, $tableHeaderRowAttributes); + $header = html_writer::tag("tr", $tmp, $tableheaderrow_attributes); $header = html_writer::tag("thead", $header); $body = ""; @@ -102,67 +102,67 @@ class ViewSubmissionUtils { $summary->resultCount(), $attributes); - $resultRowAttributes = $tableRowAttributes; - $resultRowAttributes['class'] = $resultRowAttributes['class'] . " " . $unknownAttrib; + $resultrow_attributes = $tablerow_attributes; + $resultrow_attributes['class'] = $resultrow_attributes['class'] . " " . $unknown_attributes; - $body .= html_writer::tag("tr", $tmp, $resultRowAttributes); + $body .= html_writer::tag("tr", $tmp, $resultrow_attributes); $tmp = ""; $tmp .= html_writer::tag("td", "successes", $attributes); $tmp .= html_writer::tag( "td", $summary->successfulCount(), $attributes); - $resultRowAttributes = $tableRowAttributes; - $successRate = "?"; + $resultrow_attributes = $tablerow_attributes; + $successrate = "?"; if ($summary->unknownCount() > 0 || $summary->compilationErrorCount() > 0) { - $resultRowAttributes['class'] = $resultRowAttributes['class'] . " " . $unknownAttrib; + $resultrow_attributes['class'] = $resultrow_attributes['class'] . " " . $unknown_attributes; } else { - $successRate = round(($summary->successfulCount() / $summary->resultCount()) * 100, 2 ); - if ($successRate < 50) { - $resultRowAttributes['class'] = $resultRowAttributes['class'] . " " . $compErrorAttrib; - } else if ($successRate < 75) { - $resultRowAttributes['class'] = $resultRowAttributes['class'] . " " . $failureAttrib; + $successrate = round(($summary->successfulCount() / $summary->resultCount()) * 100, 2 ); + if ($successrate < 50) { + $resultrow_attributes['class'] = $resultrow_attributes['class'] . " " . $compilationerror_attributes; + } else if ($successrate < 75) { + $resultrow_attributes['class'] = $resultrow_attributes['class'] . " " . $failure_attributes; } else { - $resultRowAttributes['class'] = $resultRowAttributes['class'] . " " . $successAttrib; + $resultrow_attributes['class'] = $resultrow_attributes['class'] . " " . $success_attributes; } } - $body .= html_writer::tag("tr", $tmp, $resultRowAttributes); + $body .= html_writer::tag("tr", $tmp, $resultrow_attributes); $tmp = ""; $tmp .= html_writer::tag("td", "failures", $attributes); $tmp .= html_writer::tag("td", $summary->failedCount(), $attributes); - $resultRowAttributes = $tableRowAttributes; + $resultrow_attributes = $tablerow_attributes; if ($summary->failedCount() > 0) { - $resultRowAttributes['class'] = $resultRowAttributes['class'] . " " . $failureAttrib; + $resultrow_attributes['class'] = $resultrow_attributes['class'] . " " . $failure_attributes; } else { - $resultRowAttributes['class'] = $resultRowAttributes['class'] . " " . $successAttrib; + $resultrow_attributes['class'] = $resultrow_attributes['class'] . " " . $success_attributes; } - $body .= html_writer::tag("tr", $tmp, $resultRowAttributes); + $body .= html_writer::tag("tr", $tmp, $resultrow_attributes); $tmp = ""; $tmp .= html_writer::tag("td", "compilation errors", $attributes); $tmp .= html_writer::tag("td", $summary->compilationErrorCount(), $attributes); - $resultRowAttributes = $tableRowAttributes; + $resultrow_attributes = $tablerow_attributes; if ($summary->compilationErrorCount() > 0) { - $resultRowAttributes['class'] = $resultRowAttributes['class'] . " " . $compErrorAttrib; + $resultrow_attributes['class'] = $resultrow_attributes['class'] . " " . $compilationerror_attributes; } else { - $resultRowAttributes['class'] = $resultRowAttributes['class'] . " " . $successAttrib; + $resultrow_attributes['class'] = $resultrow_attributes['class'] . " " . $success_attributes; } - $body .= html_writer::tag("tr", $tmp, $resultRowAttributes); + $body .= html_writer::tag("tr", $tmp, $resultrow_attributes); $tmp = ""; $tmp .= html_writer::tag("td", "unknown state", $attributes); $tmp .= html_writer::tag("td", $summary->unknownCount(), $attributes); - $resultRowAttributes = $tableRowAttributes; + $resultrow_attributes = $tablerow_attributes; if ($summary->unknownCount() > 0) { - $resultRowAttributes['class'] = $resultRowAttributes['class'] . " " . $unknownAttrib; + $resultrow_attributes['class'] = $resultrow_attributes['class'] . " " . $unknown_attributes; } else { - $resultRowAttributes['class'] = $resultRowAttributes['class'] . " " . $successAttrib; + $resultrow_attributes['class'] = $resultrow_attributes['class'] . " " . $success_attributes; } - $body .= html_writer::tag("tr", $tmp, $resultRowAttributes); + $body .= html_writer::tag("tr", $tmp, $resultrow_attributes); $tmp = ""; $tmp .= html_writer::tag("td", html_writer::tag("b","success rate"), $attributes); @@ -170,59 +170,59 @@ class ViewSubmissionUtils { "td", html_writer::tag("b", $summary->successfulCount() . "/" . (($summary->compilationErrorCount() == 0 && $summary->unknownCount() == 0) ? $summary->resultCount() - . " (" . $successRate . "%)" + . " (" . $successrate . "%)" : "?")), $attributes); - $resultRowAttributes = $tableRowAttributes; + $resultrow_attributes = $tablerow_attributes; if ($summary->unknownCount() > 0 || $summary->compilationErrorCount() > 0) { - $resultRowAttributes['class'] = $resultRowAttributes['class'] . " " . $unknownAttrib; + $resultrow_attributes['class'] = $resultrow_attributes['class'] . " " . $unknown_attributes; } else { - if ($successRate < 50) { - $resultRowAttributes['class'] = $resultRowAttributes['class'] . " " . $compErrorAttrib; - } else if ($successRate < 75) { - $resultRowAttributes['class'] = $resultRowAttributes['class'] . " " . $failureAttrib; + if ($successrate < 50) { + $resultrow_attributes['class'] = $resultrow_attributes['class'] . " " . $compilationerror_attributes; + } else if ($successrate < 75) { + $resultrow_attributes['class'] = $resultrow_attributes['class'] . " " . $failure_attributes; } else { - $resultRowAttributes['class'] = $resultRowAttributes['class'] . " " . $successAttrib; + $resultrow_attributes['class'] = $resultrow_attributes['class'] . " " . $success_attributes; } } - $body .= html_writer::tag("tr", $tmp, $resultRowAttributes); + $body .= html_writer::tag("tr", $tmp, $resultrow_attributes); $body = html_writer::tag("tbody", $body); $table = html_writer::tag("table", $header . $body, array("class" => "dtaTable")); $html .= $table; - // add empty div for spacing between summary and details table + //Add empty div for spacing between summary and details table. $html .= html_writer::empty_tag("div", array("class" => "dtaSpacer")); - // details table + //Details table. $tmp = ""; $tmp .= html_writer::tag("th", "Details", array("class" => "dtaTableHeader")); $tmp .= html_writer::empty_tag("th", array("class" => "dtaTableHeader")); - $header = html_writer::tag("tr", $tmp, $tableHeaderRowAttributes); + $header = html_writer::tag("tr", $tmp, $tableheaderrow_attributes); $header = html_writer::tag("thead", $header); $body = ""; - $spacerRow = null; + $spacerrow = null; foreach($summary->results as $r) { - // add spacer first, if not null - if (!is_null($spacerRow)) { - $body .= $spacerRow; + //Add spacer first if not null. + if (!is_null($spacerrow)) { + $body .= $spacerrow; } - // new copy of base attributes array - $resultRowAttributes = $tableRowAttributes; + //New copy of base attributes array. + $resultrow_attributes = $tablerow_attributes; - // check which css class to add for the colored left-border according to resuls state + //Check which css class to add for the colored left-border according to resuls state. if ($r->state == 0) { - $resultRowAttributes['class'] = $resultRowAttributes['class'] . ' dtaResultUnknown'; + $resultrow_attributes['class'] = $resultrow_attributes['class'] . ' dtaResultUnknown'; } else if ($r->state == 1) { - $resultRowAttributes['class'] = $resultRowAttributes['class'] . ' dtaResultSuccess'; + $resultrow_attributes['class'] = $resultrow_attributes['class'] . ' dtaResultSuccess'; } else if ($r->state == 2) { - $resultRowAttributes['class'] = $resultRowAttributes['class'] . ' dtaResultFailure'; + $resultrow_attributes['class'] = $resultrow_attributes['class'] . ' dtaResultFailure'; } else if ($r->state == 3) { - $resultRowAttributes['class'] = $resultRowAttributes['class'] . ' dtaResultCompilationError'; + $resultrow_attributes['class'] = $resultrow_attributes['class'] . ' dtaResultCompilationError'; } $tmp = ""; @@ -230,12 +230,12 @@ class ViewSubmissionUtils { "td", "name", $attributes); - + $tmp .= html_writer::tag( "td", $r->name, $attributes); - $body .= html_writer::tag("tr", $tmp, $resultRowAttributes); + $body .= html_writer::tag("tr", $tmp, $resultrow_attributes); $tmp = ""; $tmp .= html_writer::tag( @@ -247,9 +247,9 @@ class ViewSubmissionUtils { "td", DtaResult::getStateName($r->state), $attributes); - $body .= html_writer::tag("tr", $tmp, $resultRowAttributes); + $body .= html_writer::tag("tr", $tmp, $resultrow_attributes); - // if state is something different than successful, show additional rows + //If state is something different than successful, show additional rows. if ($r->state != 1) { $tmp = ""; $tmp .= html_writer::tag( @@ -261,21 +261,21 @@ class ViewSubmissionUtils { "td", $r->failureType, $attributes); - $body .= html_writer::tag("tr", $tmp, $resultRowAttributes); - + $body .= html_writer::tag("tr", $tmp, $resultrow_attributes); + $tmp = ""; $tmp .= html_writer::tag( "td", "failure reason", $attributes); - + $tmp .= html_writer::tag( "td", $r->failureReason, $attributes); - $body .= html_writer::tag("tr", $tmp, $resultRowAttributes); + $body .= html_writer::tag("tr", $tmp, $resultrow_attributes); - // only show line, column and position if they have useful values + //Only show line, column and position if they have useful values. if (!is_null($r->lineNumber) && $r->lineNumber > 0) { $tmp = ""; $tmp .= html_writer::tag( @@ -287,7 +287,7 @@ class ViewSubmissionUtils { "td", $r->lineNumber, $attributes); - $body .= html_writer::tag("tr", $tmp, $resultRowAttributes); + $body .= html_writer::tag("tr", $tmp, $resultrow_attributes); } if (!is_null($r->columnNumber) && $r->columnNumber > 0) { @@ -301,7 +301,7 @@ class ViewSubmissionUtils { "td", $r->columnNumber, $attributes); - $body .= html_writer::tag("tr", $tmp, $resultRowAttributes); + $body .= html_writer::tag("tr", $tmp, $resultrow_attributes); } if (!is_null($r->position) && $r->position > 0) { @@ -315,7 +315,7 @@ class ViewSubmissionUtils { "td", $r->position, $attributes); - $body .= html_writer::tag("tr", $tmp, $resultRowAttributes); + $body .= html_writer::tag("tr", $tmp, $resultrow_attributes); } $tmp = ""; @@ -328,12 +328,12 @@ class ViewSubmissionUtils { "td", html_writer::tag("details", $r->stacktrace, array("class" => "dtaStacktraceDetails")), $attributes); - $body .= html_writer::tag("tr", $tmp, $resultRowAttributes); + $body .= html_writer::tag("tr", $tmp, $resultrow_attributes); } - // set spacerRow value if null for next rount separation - if (is_null($spacerRow)) { - $spacerRow = html_writer::empty_tag("tr", array("class" => "dtaTableSpacer")); + //Set spacerrow value if null for next rount separation. + if (is_null($spacerrow)) { + $spacerrow = html_writer::empty_tag("tr", array("class" => "dtaTableSpacer")); } } $html .= html_writer::tag("table", $header . $body, array("class" => "dtaTable"));