l) {
}
// Since scores get set to 0 ...
GradedTestResult baseScore = new GradedTestResult(sectionName, "",
- startingScore, GradedTestResult.HIDDEN);
+ startingScore, Visibility.HIDDEN);
baseScore.setScore(startingScore);
l.add(baseScore);
}
diff --git a/src/main/java/com/github/tkutcher/jgrade/gradedtest/GradedTest.java b/src/main/java/com/github/tkutcher/jgrade/gradedtest/GradedTest.java
index 3cf6a69..9f6bcff 100644
--- a/src/main/java/com/github/tkutcher/jgrade/gradedtest/GradedTest.java
+++ b/src/main/java/com/github/tkutcher/jgrade/gradedtest/GradedTest.java
@@ -9,7 +9,7 @@
* The GradedTest annotation is primarily based off of capturing the data for
* a test object in the Gradescope JSON output. They are used to create
* corresponding {@link GradedTestResult} objects.
- *
+ *
* Uses a String for the name of the test (default "Unnamed test") , a String
* for the question number (default ""), a double for the number of points the
* test is worth(defaults to 1.0), and a String for the visibility of the test
@@ -20,25 +20,29 @@
public @interface GradedTest {
/**
* The name of the test.
+ *
* @return The name of the test.
*/
String name() default GradedTestResult.DEFAULT_NAME;
/**
* The number corresponding to the test.
+ *
* @return The number corresponding to the test.
*/
String number() default GradedTestResult.DEFAULT_NUMBER;
/**
* The number of points the test is worth.
+ *
* @return The number of points the test is worth.
*/
double points() default GradedTestResult.DEFAULT_POINTS;
/**
* The visibility level of the test.
+ *
* @return The visibility level of the test.
*/
- String visibility() default GradedTestResult.DEFAULT_VISIBILITY;
+ Visibility visibility() default Visibility.VISIBLE;
}
diff --git a/src/main/java/com/github/tkutcher/jgrade/gradedtest/GradedTestResult.java b/src/main/java/com/github/tkutcher/jgrade/gradedtest/GradedTestResult.java
index f513cb6..ee1bc50 100644
--- a/src/main/java/com/github/tkutcher/jgrade/gradedtest/GradedTestResult.java
+++ b/src/main/java/com/github/tkutcher/jgrade/gradedtest/GradedTestResult.java
@@ -4,37 +4,22 @@
* A class for the data that models a graded test. Primarily based on the
* data needed for Gradescope's Autograder JSON. When creating
* {@link GradedTestResult}s and working with visibility, use the public
- * constants {@link GradedTestResult#VISIBLE}, {@link GradedTestResult#HIDDEN},
- * etc.
+ * constants in {@link Visibility}.
*/
public class GradedTestResult {
- //
-
- /** Visible to the student always. */
- public static final String VISIBLE = "visible";
-
- /** Never visible to the student. */
- public static final String HIDDEN = "hidden";
-
- /** Visible to the student only after the due date. */
- public static final String AFTER_DUE_DATE = "after_due_date";
-
- /** Visible to the student only after grades have been released. */
- public static final String AFTER_PUBLISHED = "after_published";
-
- //
-
// GradedTest annotation defaults
static final String DEFAULT_NAME = "Unnamed Test";
static final String DEFAULT_NUMBER = "";
static final double DEFAULT_POINTS = 1.0;
- static final String DEFAULT_VISIBILITY = VISIBLE;
+ // This duplicates the default value in the GradedTestResult annotation,
+ // but there is no clean way to get its value for a static constant.
+ static final Visibility DEFAULT_VISIBILITY = Visibility.VISIBLE;
private String name;
private String number;
private double points;
- private String visibility;
+ private Visibility visibility;
private double score;
private StringBuilder output;
@@ -48,18 +33,11 @@ public class GradedTestResult {
* @param visibility The visibility setting of the test.
* @throws IllegalArgumentException If the visibility is not valid.
*/
- public GradedTestResult(String name, String number, double points, String visibility)
+ public GradedTestResult(String name, String number, double points, Visibility visibility)
throws IllegalArgumentException {
this.name = name;
this.number = number;
this.points = points;
-
- if (!(visibility.equals(HIDDEN) || visibility.equals(VISIBLE)
- || visibility.equals(AFTER_DUE_DATE) || visibility.equals(AFTER_PUBLISHED))) {
- throw new IllegalArgumentException("visibility should be one of 'hidden', 'visible', "
- + "'after_due_date', or 'after_published'");
- }
-
this.visibility = visibility;
this.score = 0;
this.output = new StringBuilder();
@@ -132,7 +110,7 @@ public double getPoints() {
* Get the visibility setting of the test.
* @return The visibility setting of the test.
*/
- public String getVisibility() {
+ public Visibility getVisibility() {
return visibility;
}
diff --git a/src/main/java/com/github/tkutcher/jgrade/gradedtest/Visibility.java b/src/main/java/com/github/tkutcher/jgrade/gradedtest/Visibility.java
new file mode 100644
index 0000000..cd75393
--- /dev/null
+++ b/src/main/java/com/github/tkutcher/jgrade/gradedtest/Visibility.java
@@ -0,0 +1,18 @@
+package com.github.tkutcher.jgrade.gradedtest;
+
+public enum Visibility {
+ VISIBLE("visible"),
+ HIDDEN("hidden"),
+ AFTER_DUE_DATE("after_due_date"),
+ AFTER_PUBLISHED("after_published");
+
+ private String text;
+
+ Visibility(String text) {
+ this.text = text;
+ }
+
+ public String getText() {
+ return text;
+ }
+}
diff --git a/src/main/java/com/github/tkutcher/jgrade/gradescope/GradescopeJsonFormatter.java b/src/main/java/com/github/tkutcher/jgrade/gradescope/GradescopeJsonFormatter.java
index a2b0cd6..ff43d91 100644
--- a/src/main/java/com/github/tkutcher/jgrade/gradescope/GradescopeJsonFormatter.java
+++ b/src/main/java/com/github/tkutcher/jgrade/gradescope/GradescopeJsonFormatter.java
@@ -3,18 +3,13 @@
import com.github.tkutcher.jgrade.Grader;
import com.github.tkutcher.jgrade.OutputFormatter;
import com.github.tkutcher.jgrade.gradedtest.GradedTestResult;
+import com.github.tkutcher.jgrade.gradedtest.Visibility;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.List;
-import static com.github.tkutcher.jgrade.gradedtest.GradedTestResult.AFTER_DUE_DATE;
-import static com.github.tkutcher.jgrade.gradedtest.GradedTestResult.AFTER_PUBLISHED;
-import static com.github.tkutcher.jgrade.gradedtest.GradedTestResult.HIDDEN;
-import static com.github.tkutcher.jgrade.gradedtest.GradedTestResult.VISIBLE;
-
-
/**
* A concrete formatter for a {@link Grader} where the output it produces
* is the JSON a Gradescope Autograder can work with.
@@ -33,8 +28,8 @@ public class GradescopeJsonFormatter implements OutputFormatter {
private JSONObject json;
private int prettyPrint;
- private String visibility;
- private String stdoutVisibility;
+ private Visibility visibility;
+ private Visibility stdoutVisibility;
/**
* Creates an instance of the formatter. By default the pretty-print
@@ -57,25 +52,21 @@ private boolean hasStdoutVisibility() {
/**
* Sets the visibility for all of the test cases.
+ *
* @param visibility The top-level visibility to use for all test cases.
* @throws GradescopeJsonException If visibility not valid.
*/
- public void setVisibility(String visibility) throws GradescopeJsonException {
- if (!isValidVisibility(visibility)) {
- throw new GradescopeJsonException(visibility + " is not a valid visibility");
- }
+ public void setVisibility(Visibility visibility) throws GradescopeJsonException {
this.visibility = visibility;
}
/**
* Sets the visibility for standard out during the run.
+ *
* @param visibility The visibility to set for standard out.
* @throws GradescopeJsonException If visibility is not valid.
*/
- public void setStdoutVisibility(String visibility) throws GradescopeJsonException {
- if (!isValidVisibility(visibility)) {
- throw new GradescopeJsonException(visibility + " is not a valid visibility");
- }
+ public void setStdoutVisibility(Visibility visibility) throws GradescopeJsonException {
this.stdoutVisibility = visibility;
}
@@ -84,6 +75,7 @@ public void setStdoutVisibility(String visibility) throws GradescopeJsonExceptio
* spaces to add for each indent level. A negative integer corresponds to
* disabling pretty-print. If non-negative, simply calls
* {@link JSONObject#toString(int)}
+ *
* @param prettyPrint The integer for how much to indent
*/
public void setPrettyPrint(int prettyPrint) {
@@ -112,7 +104,7 @@ private JSONObject assemble(GradedTestResult r) {
.put(MAX_SCORE, r.getPoints())
.put(NUMBER, r.getNumber())
.put(OUTPUT, r.getOutput())
- .put(VISIBILITY, r.getVisibility());
+ .put(VISIBILITY, r.getVisibility().getText());
} catch (JSONException e) {
throw new InternalError(e);
}
@@ -142,10 +134,10 @@ private void assemble(Grader grader, JSONObject json) throws GradescopeJsonExcep
json.put(OUTPUT, grader.getOutput());
}
if (this.hasVisibility()) {
- json.put(VISIBILITY, this.visibility);
+ json.put(VISIBILITY, this.visibility.getText());
}
if (this.hasStdoutVisibility()) {
- json.put(STDOUT_VISIBILITY, this.stdoutVisibility);
+ json.put(STDOUT_VISIBILITY, this.stdoutVisibility.getText());
}
if (grader.hasGradedTestResults()) {
json.put(TESTS, this.assemble(grader.getGradedTestResults()));
@@ -159,27 +151,5 @@ private void validateGrader(Grader grader) {
if (!(grader.hasScore() || grader.hasGradedTestResults())) {
throw new GradescopeJsonException("Gradescope Json must have either tests or score set");
}
-
- /* The following checks ~should~ all pass because they would have been checked when set. */
- assert isValidVisibility(this.visibility);
- assert isValidVisibility(this.stdoutVisibility);
- assert allValidVisibility(grader.getGradedTestResults());
- }
-
- private static boolean allValidVisibility(List results) {
- for (GradedTestResult r : results) {
- if (!isValidVisibility(r.getVisibility())) {
- return false;
- }
- }
- return true;
- }
-
- private static boolean isValidVisibility(String visibility) {
- return visibility == null // Just wasn't set, which is OK
- || visibility.equals(VISIBLE)
- || visibility.equals(HIDDEN)
- || visibility.equals(AFTER_DUE_DATE)
- || visibility.equals(AFTER_PUBLISHED);
}
}
diff --git a/src/test/java/com/github/tkutcher/jgrade/DeductiveGraderStrategyTest.java b/src/test/java/com/github/tkutcher/jgrade/DeductiveGraderStrategyTest.java
index a642942..fc02cdf 100644
--- a/src/test/java/com/github/tkutcher/jgrade/DeductiveGraderStrategyTest.java
+++ b/src/test/java/com/github/tkutcher/jgrade/DeductiveGraderStrategyTest.java
@@ -1,13 +1,13 @@
package com.github.tkutcher.jgrade;
import com.github.tkutcher.jgrade.gradedtest.GradedTestResult;
+import com.github.tkutcher.jgrade.gradedtest.Visibility;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
-import static com.github.tkutcher.jgrade.gradedtest.GradedTestResult.HIDDEN;
import static org.junit.Assert.assertEquals;
public class DeductiveGraderStrategyTest {
@@ -23,13 +23,13 @@ public void initUnit() {
}
private static GradedTestResult failedGradedTestResult(double points) {
- GradedTestResult r = new GradedTestResult("", "", points, HIDDEN);
+ GradedTestResult r = new GradedTestResult("", "", points, Visibility.HIDDEN);
r.setPassed(false);
return r;
}
private static GradedTestResult successfulGradedTestResult(double points) {
- GradedTestResult r = new GradedTestResult("", "", points, HIDDEN);
+ GradedTestResult r = new GradedTestResult("", "", points, Visibility.HIDDEN);
r.setPassed(true);
r.setScore(points);
return r;
diff --git a/src/test/java/com/github/tkutcher/jgrade/GraderTest.java b/src/test/java/com/github/tkutcher/jgrade/GraderTest.java
index 911ab45..4014161 100644
--- a/src/test/java/com/github/tkutcher/jgrade/GraderTest.java
+++ b/src/test/java/com/github/tkutcher/jgrade/GraderTest.java
@@ -1,6 +1,7 @@
package com.github.tkutcher.jgrade;
import com.github.tkutcher.jgrade.gradedtest.GradedTestResult;
+import com.github.tkutcher.jgrade.gradedtest.Visibility;
import org.junit.Before;
import org.junit.Test;
@@ -54,7 +55,7 @@ public void canAddOutput() {
@Test
public void canAddGradedTestResults() {
- GradedTestResult t = new GradedTestResult("", "", 0.0, "visible");
+ GradedTestResult t = new GradedTestResult("", "", 0.0, Visibility.VISIBLE);
unit.addGradedTestResult(t);
assertTrue(unit.hasGradedTestResults());
List results = unit.getGradedTestResults();
diff --git a/src/test/java/com/github/tkutcher/jgrade/JGradeCommandLineTest.java b/src/test/java/com/github/tkutcher/jgrade/JGradeCommandLineTest.java
index a42b6ea..f026949 100644
--- a/src/test/java/com/github/tkutcher/jgrade/JGradeCommandLineTest.java
+++ b/src/test/java/com/github/tkutcher/jgrade/JGradeCommandLineTest.java
@@ -1,6 +1,7 @@
package com.github.tkutcher.jgrade;
import com.github.tkutcher.jgrade.gradedtest.GradedTestResult;
+import com.github.tkutcher.jgrade.gradedtest.Visibility;
import org.json.JSONException;
import org.json.JSONObject;
import org.junit.After;
@@ -87,7 +88,7 @@ public void graderMethod(Grader g) {
"Test GradedTestResult",
"1",
25.0,
- GradedTestResult.VISIBLE
+ Visibility.VISIBLE
));
}
}
diff --git a/src/test/java/com/github/tkutcher/jgrade/gradedtest/GradedTestListenerTest.java b/src/test/java/com/github/tkutcher/jgrade/gradedtest/GradedTestListenerTest.java
index 5af5a96..5992373 100644
--- a/src/test/java/com/github/tkutcher/jgrade/gradedtest/GradedTestListenerTest.java
+++ b/src/test/java/com/github/tkutcher/jgrade/gradedtest/GradedTestListenerTest.java
@@ -70,7 +70,7 @@ public void addsCustomGradedTestResult() {
assertEquals(EXAMPLE_NAME, result.getName());
assertEquals(EXAMPLE_NUMBER, result.getNumber());
assertEquals(EXAMPLE_POINTS, result.getPoints(), 0.0);
- Assert.assertEquals(GradedTestResult.HIDDEN, result.getVisibility());
+ Assert.assertEquals(Visibility.HIDDEN, result.getVisibility());
}
@Test
@@ -148,7 +148,7 @@ public static class SingleCustomGradedTest {
name=EXAMPLE_NAME,
number=EXAMPLE_NUMBER,
points=EXAMPLE_POINTS,
- visibility= GradedTestResult.HIDDEN)
+ visibility=Visibility.HIDDEN)
public void gradedTest() { assertTrue(true); }
}
diff --git a/src/test/java/com/github/tkutcher/jgrade/gradedtest/GradedTestResultTest.java b/src/test/java/com/github/tkutcher/jgrade/gradedtest/GradedTestResultTest.java
index 7298347..f97ffe2 100644
--- a/src/test/java/com/github/tkutcher/jgrade/gradedtest/GradedTestResultTest.java
+++ b/src/test/java/com/github/tkutcher/jgrade/gradedtest/GradedTestResultTest.java
@@ -63,9 +63,4 @@ public void canAddScore() {
public void cannotAddScoreGreaterThanPoints() {
unit.setScore(15.0);
}
-
- @Test(expected=IllegalArgumentException.class)
- public void visibilityMustBeValid() {
- new GradedTestResult(GradedTestResult.DEFAULT_NAME, GradedTestResult.DEFAULT_NUMBER, GradedTestResult.DEFAULT_POINTS, "INVALID");
- }
}
diff --git a/src/test/java/com/github/tkutcher/jgrade/gradescope/GradescopeJsonFormatterTest.java b/src/test/java/com/github/tkutcher/jgrade/gradescope/GradescopeJsonFormatterTest.java
index c1696b7..acb092c 100644
--- a/src/test/java/com/github/tkutcher/jgrade/gradescope/GradescopeJsonFormatterTest.java
+++ b/src/test/java/com/github/tkutcher/jgrade/gradescope/GradescopeJsonFormatterTest.java
@@ -2,6 +2,7 @@
import com.github.tkutcher.jgrade.Grader;
import com.github.tkutcher.jgrade.gradedtest.GradedTestResult;
+import com.github.tkutcher.jgrade.gradedtest.Visibility;
import org.json.JSONException;
import org.json.JSONObject;
import org.junit.Before;
@@ -43,17 +44,7 @@ public void validIfScoreSet() throws JSONException {
@Test
public void validIfTests() throws JSONException {
- grader.addGradedTestResult(new GradedTestResult("", "", 20.0, "visible"));
+ grader.addGradedTestResult(new GradedTestResult("", "", 20.0, Visibility.VISIBLE));
assertValidJson(unit.format(grader));
}
-
- @Test(expected=GradescopeJsonException.class)
- public void catchesInvalidVisibility() {
- unit.setVisibility("invisible");
- }
-
- @Test(expected=GradescopeJsonException.class)
- public void catchesInvalidStdoutVisibility() {
- unit.setStdoutVisibility("invisible");
- }
}