From 5f2b4ada0ac7f36430ee3f1048bdbff9456f259a Mon Sep 17 00:00:00 2001
From: Gero Lueckemeyer <gero.lueckemeyer@hft-stuttgart.de>
Date: Mon, 13 Nov 2023 13:46:37 +0100
Subject: [PATCH] added documentation comments

---
 dta.zip                              | Bin 19339 -> 20153 bytes
 dta/db/upgrade.php                   |   3 +-
 dta/lang/en/assignsubmission_dta.php |   1 +
 dta/lib.php                          |   1 +
 dta/locallib.php                     |  20 ++++--
 dta/models/DtaResult.php             |  93 ++++++++++++++++++++++++++-
 dta/settings.php                     |   1 +
 dta/utils/view.php                   |  31 +++++----
 dta/version.php                      |   1 +
 9 files changed, 131 insertions(+), 20 deletions(-)

diff --git a/dta.zip b/dta.zip
index b35770daf7870b735d46f7150169198a2a38df19..cc6f4c3f06c523eb5039144924d3f51da123844b 100644
GIT binary patch
delta 14176
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

delta 13380
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

diff --git a/dta/db/upgrade.php b/dta/db/upgrade.php
index 7ee51ec..65e64b4 100644
--- a/dta/db/upgrade.php
+++ b/dta/db/upgrade.php
@@ -19,6 +19,7 @@
  *
  * @package   assignsubmission_dta
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ * @copyright Gero Lueckemeyer and student project teams
  */
 
 /**
@@ -28,6 +29,6 @@
  */
 function xmldb_assignsubmission_dta_upgrade($oldversion) {
     global $CFG;
-
+    // Currently no adjustments necessary for Moodle upgrades. Works without changes since the first MoJEC version.
     return true;
 }
diff --git a/dta/lang/en/assignsubmission_dta.php b/dta/lang/en/assignsubmission_dta.php
index 2b8d945..54cffa3 100644
--- a/dta/lang/en/assignsubmission_dta.php
+++ b/dta/lang/en/assignsubmission_dta.php
@@ -19,6 +19,7 @@
  *
  * @package   assignsubmission_dta
  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ * @copyright Gero Lueckemeyer and student project teams
  */
 
 // General.
diff --git a/dta/lib.php b/dta/lib.php
index b412fe9..c090bfc 100644
--- a/dta/lib.php
+++ b/dta/lib.php
@@ -19,6 +19,7 @@
  *
  * @package   assignsubmission_dta
  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ * @copyright Gero Lueckemeyer and student project teams
  */
 
 /**
diff --git a/dta/locallib.php b/dta/locallib.php
index 1e77341..1e65203 100644
--- a/dta/locallib.php
+++ b/dta/locallib.php
@@ -30,13 +30,21 @@ 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";
 
     /**
@@ -304,7 +312,7 @@ class assign_submission_dta extends assign_submission_plugin {
     public function view_summary(stdClass $submission, & $showviewlink) {
         $showviewlink = true;
 
-        return ViewSubmissionUtils::generatesummaryhtml(
+        return view_submission_utils::generatesummaryhtml(
             $this->assignment->get_instance()->id,
             $submission->id
         );
@@ -317,7 +325,7 @@ class assign_submission_dta extends assign_submission_plugin {
      * @return string detailed results html
      */
     public function view(stdClass $submission) {
-        return ViewSubmissionUtils::generatedetailhtml(
+        return view_submission_utils::generatedetailhtml(
             $this->assignment->get_instance()->id,
             $submission->id
         );
diff --git a/dta/models/DtaResult.php b/dta/models/DtaResult.php
index b666f51..4ca751e 100644
--- a/dta/models/DtaResult.php
+++ b/dta/models/DtaResult.php
@@ -16,13 +16,33 @@
 
 defined('MOODLE_INTERNAL') || die();
 
+/**
+ * entity class for DTA submission plugin result
+ *
+ * @package assignsubmission_dta
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ * @copyright Gero Lueckemeyer and student project teams
+ */
 class DtaResult {
 
-    // Broadly used in logic, parametrized for easier change.
+    /** 
+     * Broadly used in logic, parametrized for easier change.
+     */
     const COMPONENT_NAME = "assignsubmission_dta";
 
+    /** 
+     * Package name of the test.
+     */
     public $packagename;
+    
+    /** 
+     * Unit name of the test.
+     */
     public $classname;
+    
+    /** 
+     * Name of the test.
+     */
     public $name;
 
     /**
@@ -35,16 +55,37 @@ class DtaResult {
      */
     public $state;
 
+    /** 
+     * Type of test failure if applicable, "" otherwise.
+     */
     public $failuretype;
+    
+    /** 
+     * Reason of test failure if applicable, "" otherwise.
+     */    
     public $failurereason;
+    
+    /** 
+     * Stack trace of test failure if applicable, "" otherwise.
+     */    
     public $stacktrace;
 
+    /** 
+     * Column number of compile failure if applicable, "" otherwise.
+     */    
     public $columnnumber;
+    /** 
+     * Line number of compile failure if applicable, "" otherwise.
+     */    
     public $linenumber;
+    /** 
+     * Position of compile failure if applicable, "" otherwise.
+     */    
     public $position;
 
     /**
-     * @return name of state like defined
+     * Returns the name of a state with the given number of display.
+     * @return name of state as defined
      */
     public static function getstatename(int $state): string {
         if ($state == 1) {
@@ -59,15 +100,40 @@ class DtaResult {
     }
 }
 
+/**
+ * entity class for DTA submission plugin result
+ *
+ * @package assignsubmission_dta
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ * @copyright Gero Lueckemeyer and student project teams
+ */
 class DtaResultSummary {
 
+    /** 
+     * Result timestamp for chronological ordering and deletion of previous results.
+     */    
     public $timestamp;
+    
+    /** 
+     * Global stack trace if applicable, "" otherwise.
+     */    
     public $globalstacktrace;
+    
+    /** 
+     * Successfully tested competencies according to tests and weights, "" otherwise.
+     */    
     public $successfultestcompetencies;
+    /** 
+     * Overall tested competencies according to tests and weights, "" otherwise.
+     */    
     public $overalltestcompetencies;
+    /** 
+     * List of detail results.
+     */    
     public $results;
 
     /**
+     * Decodes the JSON result summary returned by the backend service call into the plugin PHP data structure.
      * @param string $jsonString jsonString containing DtaResultSummary
      * @return DtaResultSummary
      */
@@ -87,6 +153,7 @@ class DtaResultSummary {
     }
 
     /**
+     * Decodes the array of JSON detail results returned by the backend service call into the plugin PHP data structure.
      * @param array $jsonArray decoded json array of results array
      * @return array of DtaResult
      */
@@ -113,11 +180,17 @@ class DtaResultSummary {
         return $ret;
     }
 
+
+    /**
+     * Returns the number of detail results attached to the summary.
+     * @return int count of occurences
+     */
     public function resultcount(): int {
         return count($this->results);
     }
 
     /**
+     * Returns the number of detail results with the given state attached to the summary.
      * @param int $state state ordinal number
      * @return int count of occurences provided state has
      */
@@ -131,18 +204,34 @@ class DtaResultSummary {
         return $num;
     }
 
+    /**
+     * Returns the number of detail results with compilation errors attached to the summary.
+     * @return int count of occurences
+     */
     public function compilationerrorcount(): int {
         return $this->stateoccurencecount(3);
     }
 
+    /**
+     * Returns the number of detail results with test failures attached to the summary.
+     * @return int count of occurences
+     */
     public function failedcount(): int {
         return $this->stateoccurencecount(2);
     }
 
+    /**
+     * Returns the number of detail results with successful tests attached to the summary.
+     * @return int count of occurences
+     */
     public function successfulcount(): int {
         return $this->stateoccurencecount(1);
     }
 
+    /**
+     * Returns the number of detail results with an unknown result - mostly due to compile errors - attached to the summary.
+     * @return int count of occurences
+     */
     public function unknowncount(): int {
         return $this->stateoccurencecount(0);
     }
diff --git a/dta/settings.php b/dta/settings.php
index 1dcd60a..fe1071a 100644
--- a/dta/settings.php
+++ b/dta/settings.php
@@ -19,6 +19,7 @@
  *
  * @package   assignsubmission_dta
  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ * @copyright Gero Lueckemeyer and student project teams
  */
 
 defined('MOODLE_INTERNAL') || die();
diff --git a/dta/utils/view.php b/dta/utils/view.php
index 98af5c3..db3cd77 100644
--- a/dta/utils/view.php
+++ b/dta/utils/view.php
@@ -14,9 +14,18 @@
 // You should have received a copy of the GNU General Public License
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
-class ViewSubmissionUtils {
-
-    // Broadly used in logic, parametrized for easier change.
+/**
+ * utility class for DTA submission plugin result display
+ *
+ * @package assignsubmission_dta
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ * @copyright Gero Lueckemeyer and student project teams
+ */
+class view_submission_utils {
+
+    /** 
+     * Broadly used in logic, parametrized for easier change.
+     */
     const COMPONENT_NAME = "assignsubmission_dta";
 
     /**
@@ -60,16 +69,16 @@ class ViewSubmissionUtils {
         $overallcompetencies = explode(";", $summary->overalltestcompetencies);
         
         $tmp = "";
-        for ($index=0, $size=count($showncompetencies); $index<$size; $index++) {
-            $shown=$showncompetencies[$index];
-            $comp=$overallcompetencies[$index];
+        for ($index = 0, $size = count($showncompetencies); $index < $size; $index++) {
+            $shown = $showncompetencies[$index];
+            $comp = $overallcompetencies[$index];
             // If the competency was actually assessed by the assignment and tests, add a summary entry.
             if($shown!="0") {
                 $tmp .= get_string("comp" . $index, self::COMPONENT_NAME) . " " . 100*floatval($shown)/floatval($comp) . "% " . "<br />";
             }
         }
         
-        $html .= get_string("success_competencies", self::COMPONENT_NAME) . $tmp . "<br />";
+        $html .= get_string("success_competencies", self::COMPONENT_NAME) . "<br />" . $tmp . "<br />";
 
         return html_writer::div($html, "dtaSubmissionSummary");
     }
@@ -223,11 +232,11 @@ class ViewSubmissionUtils {
         $showncompetencies = explode(";", $summary->successfultestcompetencies);
         $overallcompetencies = explode(";", $summary->overalltestcompetencies);
         
-        for ($index=0, $size=count($overallcompetencies); $index<$size; $index++) {
-            $comp=$overallcompetencies[$index];
-            $shown=$showncompetencies[$index];
+        for ($index = 0, $size = count($overallcompetencies); $index < $size; $index++) {
+            $comp = $overallcompetencies[$index];
+            $shown = $showncompetencies[$index];
             // If the competency was actually assessed by the assignment and tests, add a row in the table.
-            if($comp!="0") {
+            if($comp != "0") {
                 // New copy of base attributes array.
                 $resultrowattributes = $tablerowattributes;
                 $tmp = "";
diff --git a/dta/version.php b/dta/version.php
index ddff0ae..b7de914 100644
--- a/dta/version.php
+++ b/dta/version.php
@@ -19,6 +19,7 @@
  *
  * @package    assignsubmission_dta
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ * @copyright Gero Lueckemeyer and student project teams
  */
 
 defined('MOODLE_INTERNAL') || die();
-- 
GitLab