Skip to content
This repository was archived by the owner on Jun 3, 2025. It is now read-only.

Commit 9d98d43

Browse files
authored
Merge pull request #309 from tmc-cli/cache-test-results-jclc
Cache test results jclc
2 parents ccb4cc9 + 5d3a297 commit 9d98d43

9 files changed

Lines changed: 66 additions & 34 deletions

File tree

src/main/java/fi/helsinki/cs/tmc/cli/Application.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,10 @@ public void setWorkdir(WorkDir workDir) {
246246
this.workDir = workDir;
247247
}
248248

249+
public void setTmcProjectDirectory(Path path) {
250+
this.settings.setTmcProjectDirectory(path);
251+
}
252+
249253
public HashMap<String, String> getProperties() {
250254
// Loads properties from the global configuration file in .config/tmc-cli/
251255
return this.properties;

src/main/java/fi/helsinki/cs/tmc/cli/command/RunTestsCommand.java

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
package fi.helsinki.cs.tmc.cli.command;
22

3+
import static fi.helsinki.cs.tmc.langs.domain.RunResult.Status.PASSED;
4+
35
import fi.helsinki.cs.tmc.cli.Application;
46
import fi.helsinki.cs.tmc.cli.command.core.AbstractCommand;
57
import fi.helsinki.cs.tmc.cli.command.core.Command;
68
import fi.helsinki.cs.tmc.cli.io.Color;
79
import fi.helsinki.cs.tmc.cli.io.Io;
810
import fi.helsinki.cs.tmc.cli.io.ResultPrinter;
911
import fi.helsinki.cs.tmc.cli.io.TmcCliProgressObserver;
12+
import fi.helsinki.cs.tmc.cli.tmcstuff.CourseInfo;
1013
import fi.helsinki.cs.tmc.cli.tmcstuff.CourseInfoIo;
1114
import fi.helsinki.cs.tmc.cli.tmcstuff.Settings;
1215
import fi.helsinki.cs.tmc.cli.tmcstuff.WorkDir;
@@ -25,6 +28,7 @@
2528
import java.nio.file.Path;
2629
import java.util.List;
2730

31+
2832
@Command(name = "test", desc = "Run local exercise tests")
2933
public class RunTestsCommand extends AbstractCommand {
3034

@@ -58,13 +62,13 @@ public void run(CommandLine args, Io io) {
5862
return;
5963
}
6064
}
61-
String courseName = getCourseName(workDir);
6265
List<String> exerciseNames = workDir.getExerciseNames();
6366

6467
if (exerciseNames.isEmpty()) {
6568
io.println("You have to be in a course directory to run tests");
6669
return;
6770
}
71+
CourseInfo info = CourseInfoIo.load(workDir.getConfigFile());
6872

6973
// Local tests don't require login so make sure tmcCore is never null.
7074
app.createTmcCore(new Settings());
@@ -90,16 +94,25 @@ public void run(CommandLine args, Io io) {
9094

9195
io.println(Color.colorString("Testing: " + name, Color.AnsiColor.ANSI_YELLOW));
9296
//name = name.replace("-", File.separator);
93-
Exercise exercise = new Exercise(name, courseName);
97+
Exercise exercise = info.getExercise(name);
98+
// Exercise exercise = new Exercise(name, courseName);
9499

95100
// TmcCliProgressObserver progobs = new TmcCliProgressObserver(io);
96101
runResult = core.runTests(ProgressObserver.NULL_OBSERVER, exercise).call();
97102
// progobs.end(0);
98103

99-
resultPrinter.printRunResult(runResult, isOnlyExercise, color1, color2);
104+
resultPrinter.printRunResult(runResult, exercise.isCompleted(),
105+
isOnlyExercise, color1, color2);
100106
total += runResult.testResults.size();
101107
passed += ResultPrinter.passedTests(runResult.testResults);
108+
exercise.setAttempted(true);
109+
if (runResult.status == PASSED && !exercise.isCompleted()) {
110+
if (!info.getLocalCompletedExercises().contains(exercise.getName())) {
111+
info.getLocalCompletedExercises().add(exercise.getName());
112+
}
113+
}
102114
}
115+
CourseInfoIo.save(info, workDir.getConfigFile());
103116
if (total > 0 && !isOnlyExercise) {
104117
// Print a progress bar showing how the ratio of passed exercises
105118
// But only if more than one exercise was tested
@@ -115,15 +128,6 @@ public void run(CommandLine args, Io io) {
115128
}
116129
}
117130

118-
private String getCourseName(WorkDir dirUtil) {
119-
Path courseDir = dirUtil.getCourseDirectory();
120-
try {
121-
return courseDir.getName(courseDir.getNameCount() - 1).toString();
122-
} catch (Exception e) {
123-
}
124-
return null;
125-
}
126-
127131
private String[] parseArgs(CommandLine args) {
128132
this.showPassed = args.hasOption("a");
129133
this.showDetails = args.hasOption("d");

src/main/java/fi/helsinki/cs/tmc/cli/command/SubmitCommand.java

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package fi.helsinki.cs.tmc.cli.command;
22

3+
import static fi.helsinki.cs.tmc.core.domain.submission.SubmissionResult.TestResultStatus.NONE_FAILED;
4+
35
import fi.helsinki.cs.tmc.cli.Application;
46
import fi.helsinki.cs.tmc.cli.command.core.AbstractCommand;
57
import fi.helsinki.cs.tmc.cli.command.core.Command;
@@ -38,6 +40,7 @@ public class SubmitCommand extends AbstractCommand {
3840
public void getOptions(Options options) {
3941
options.addOption("a", "all", false, "Show all test results");
4042
options.addOption("d", "details", false, "Show detailed error message");
43+
options.addOption("c", "completed", false, "Only exercises that have passed all tests");
4144
}
4245

4346
@Override
@@ -58,14 +61,24 @@ public void run(CommandLine args, Io io) {
5861
WorkDir workDir = app.getWorkDir();
5962
for (String exercise : exercisesFromArgs) {
6063
if (!workDir.addPath(exercise)) {
61-
io.println("Error: '" + exercise + "' is not a valid exercise.");
64+
io.println("Error: " + exercise + " is not a valid exercise.");
6265
return;
6366
}
6467
}
6568

66-
List<String> exerciseNames = workDir.getExerciseNames();
69+
List<String> exerciseNames;
70+
if (args.hasOption("c")) {
71+
exerciseNames = workDir.getExerciseNames(true, true, false);
72+
} else {
73+
exerciseNames = workDir.getExerciseNames();
74+
}
75+
6776
if (exerciseNames.isEmpty()) {
68-
io.println("You have to be in a course directory to submit");
77+
if (args.hasOption("c") && workDir.getCourseDirectory() != null) {
78+
io.println("No locally tested exercises.");
79+
return;
80+
}
81+
io.println("No exercises specified.");
6982
return;
7083
}
7184

@@ -95,8 +108,17 @@ public void run(CommandLine args, Io io) {
95108
resultPrinter.printSubmissionResult(result, isOnlyExercise, color1, color2);
96109
total += result.getTestCases().size();
97110
passed += ResultPrinter.passedTests(result.getTestCases());
111+
112+
exercise.setAttempted(true);
113+
if (result.getTestResultStatus() == NONE_FAILED) {
114+
if (info.getLocalCompletedExercises().contains(exercise.getName())) {
115+
info.getLocalCompletedExercises().remove(exercise.getName());
116+
}
117+
exercise.setCompleted(true);
118+
}
98119
}
99120
}
121+
CourseInfoIo.save(info, workDir.getConfigFile());
100122
if (total > 0 && !isOnlyExercise) {
101123
// Print a progress bar showing how the ratio of passed exercises
102124
io.println("");

src/main/java/fi/helsinki/cs/tmc/cli/command/UpdateCommand.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import fi.helsinki.cs.tmc.cli.command.core.AbstractCommand;
44
import fi.helsinki.cs.tmc.cli.command.core.Command;
5+
import fi.helsinki.cs.tmc.cli.io.Color;
56
import fi.helsinki.cs.tmc.cli.io.Io;
67
import fi.helsinki.cs.tmc.cli.io.TmcCliProgressObserver;
78
import fi.helsinki.cs.tmc.cli.tmcstuff.CourseInfo;
@@ -65,8 +66,10 @@ public void updateExercises(TmcCore core, CourseInfo info, Path configFile) {
6566
printExercises(exerciseUpdater.getUpdatedExercises(), "Modified exercises:");
6667
io.println("");
6768

69+
Color.AnsiColor color1 = getApp().getColor("progressbar-left");
70+
Color.AnsiColor color2 = getApp().getColor("progressbar-right");
6871
List<Exercise> downloaded = exerciseUpdater.downloadUpdates(
69-
new TmcCliProgressObserver(io));
72+
new TmcCliProgressObserver(io, color1, color2));
7073
if (downloaded.isEmpty()) {
7174
io.println("Failed to download exercises");
7275
return;

src/main/java/fi/helsinki/cs/tmc/cli/io/ResultPrinter.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ public void printSubmissionResult(SubmissionResult result, Boolean printProgress
105105
}
106106
}
107107

108-
public void printRunResult(RunResult result, Boolean printProgressBar,
108+
public void printRunResult(RunResult result, Boolean submitted, Boolean printProgressBar,
109109
Color.AnsiColor color1, Color.AnsiColor color2) {
110110
printTestResults(result.testResults);
111111
this.total = result.testResults.size();
@@ -118,9 +118,10 @@ public void printRunResult(RunResult result, Boolean printProgressBar,
118118
String msg = null;
119119
switch (result.status) {
120120
case PASSED:
121-
msg = "All tests passed!";
122-
msg = Color.colorString(msg, Color.AnsiColor.ANSI_GREEN)
123-
+ " Submit to server with 'tmc submit'";
121+
msg = Color.colorString("All tests passed!", Color.AnsiColor.ANSI_GREEN);
122+
if (!submitted) {
123+
msg += " Submit to server with 'tmc submit'";
124+
}
124125
break;
125126
case TESTS_FAILED:
126127
msg = "Please review your answer before submitting";

src/main/java/fi/helsinki/cs/tmc/cli/tmcstuff/CourseInfo.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,10 @@ public Course getCourse() {
4646
public List<String> getLocalCompletedExercises() {
4747
// Check for null pointer in case of old .tmc.json files
4848
// Remove this when we are sure nobody's using 0.5.1 anymore
49-
if (this.localCompletedExercises != null) {
50-
return this.localCompletedExercises;
51-
} else {
52-
return new ArrayList<String>();
49+
if (this.localCompletedExercises == null) {
50+
this.localCompletedExercises = new ArrayList<String>();
5351
}
52+
return this.localCompletedExercises;
5453
}
5554

5655
public List<Exercise> getExercises() {

src/main/java/fi/helsinki/cs/tmc/cli/tmcstuff/WorkDir.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -127,12 +127,11 @@ private Boolean filterExercise(Exercise exercise, String exDir, List<String> tes
127127
* return the current working directory.
128128
*/
129129
public Path getWorkingDirectory() {
130-
if (this.directoryCount() == 1) {
131-
return this.directories.get(0);
132-
} else if (this.directoryCount() == 0) {
130+
if (this.courseDirectory != null) {
131+
return this.courseDirectory;
132+
} else {
133133
return workdir;
134134
}
135-
return null;
136135
}
137136

138137
public List<Path> getDirectories() {

src/test/java/fi/helsinki/cs/tmc/cli/command/SubmitCommandTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,15 +176,15 @@ public void abortIfInvalidCmdLineArgumentIsGiven() {
176176
public void abortIfInvalidExerciseNameIsGivenAsArgument() {
177177
app.setWorkdir(new WorkDir(pathToDummyCourse));
178178
app.run(new String[]{"submit", "foo"});
179-
assertThat(io.out(), containsString("Error: 'foo' is not a valid exercise."));
179+
assertThat(io.out(), containsString("Error: foo is not a valid exercise."));
180180
assertEquals(0, countSubstring("Submitting: ", io.out()));
181181
}
182182

183183
@Test
184184
public void abortGracefullyIfNotInCourseDir() {
185185
app.setWorkdir(new WorkDir(pathToNonCourseDir));
186186
app.run(new String[]{"submit"});
187-
assertThat(io.out(), containsString("You have to be in a course directory"));
187+
assertThat(io.out(), containsString("No exercises specified."));
188188

189189
verifyStatic(times(0));
190190
TmcUtil.submitExercise(any(TmcCore.class), any(Exercise.class));

src/test/java/fi/helsinki/cs/tmc/cli/io/ResultPrinterTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public void printSubmissionResultWorksIfSomeTestsFail() {
7373
public void printRunResultWorksIfTestsPass() {
7474
testResults = ImmutableList.of(new TestResult("test1", true, "Cool!"));
7575
runResult = new RunResult(Status.PASSED, testResults, logs);
76-
printer.printRunResult(runResult, false, null, null);
76+
printer.printRunResult(runResult, false, false, null, null);
7777
assertTrue(io.out().contains("All tests passed!"));
7878
}
7979

@@ -82,7 +82,7 @@ public void printRunResultWorksIfTestsFail() {
8282
testResults = ImmutableList.of(new TestResult("test1", false, "Not good.",
8383
"Try harder", true));
8484
runResult = new RunResult(Status.TESTS_FAILED, testResults, logs);
85-
printer.printRunResult(runResult, false, null, null);
85+
printer.printRunResult(runResult, false, false, null, null);
8686
assertTrue(io.out().contains("Please review your answer before submitting"));
8787
}
8888

@@ -93,15 +93,15 @@ public void printRunResultWorksIfTestsFailWithException() {
9393
testResults = ImmutableList.of(new TestResult("test1", false, points,
9494
"Not good.", exceptions));
9595
runResult = new RunResult(Status.TESTS_FAILED, testResults, logs);
96-
printer.printRunResult(runResult, false, null, null);
96+
printer.printRunResult(runResult, false, false, null, null);
9797
assertTrue(io.out().contains("Please review your answer before submitting"));
9898
}
9999

100100
@Test
101101
public void printRunResultWorksIfCompilationFail() {
102102
testResults = ImmutableList.of();
103103
runResult = new RunResult(Status.COMPILE_FAILED, testResults, logs);
104-
printer.printRunResult(runResult, false, null, null);
104+
printer.printRunResult(runResult, false, false, null, null);
105105
assertTrue(io.out().contains("Failed to compile project"));
106106
}
107107

0 commit comments

Comments
 (0)