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

Commit 03304dc

Browse files
author
jclc
committed
testing and submitting updates local cache
1 parent 7e944da commit 03304dc

9 files changed

Lines changed: 56 additions & 35 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: 16 additions & 5 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;
@@ -26,7 +28,7 @@
2628
@Command(name = "submit", desc = "Submit exercises")
2729
public class SubmitCommand extends AbstractCommand {
2830

29-
private static final Logger logger = LoggerFactory.getLogger(SubmitCommand.class);
31+
private static final Logger logger = LoggerFactory.getLogger(RunTestsCommand.class);
3032

3133
private Io io;
3234
private boolean showAll;
@@ -56,20 +58,20 @@ public void run(CommandLine args, Io io) {
5658
WorkDir workDir = app.getWorkDir();
5759
for (String exercise : exercisesFromArgs) {
5860
if (!workDir.addPath(exercise)) {
59-
io.println("Error: '" + exercise + "' is not a valid exercise.");
61+
io.println("Error: " + exercise + " is not a valid exercise.");
6062
return;
6163
}
6264
}
6365

6466
List<String> exerciseNames = workDir.getExerciseNames();
6567
if (exerciseNames.isEmpty()) {
66-
io.println("You have to be in a course directory to"
67-
+ " submit");
68+
io.println("You have to be in a course directory to submit");
6869
return;
6970
}
7071

7172
CourseInfo info = CourseInfoIo.load(workDir.getConfigFile());
72-
Course course = info.getCourse();
73+
String courseName = info.getCourseName();
74+
Course course = TmcUtil.findCourse(core, courseName);
7375

7476
if (course == null) {
7577
io.println("Could not fetch course info from server.");
@@ -94,8 +96,17 @@ public void run(CommandLine args, Io io) {
9496
resultPrinter.printSubmissionResult(result, isOnlyExercise, color1, color2);
9597
total += result.getTestCases().size();
9698
passed += ResultPrinter.passedTests(result.getTestCases());
99+
100+
info.getExercise(exerciseName).setAttempted(true);
101+
if (result.getTestResultStatus() == NONE_FAILED) {
102+
if (info.getLocalCompletedExercises().contains(exerciseName)) {
103+
info.getLocalCompletedExercises().remove(exerciseName);
104+
}
105+
info.getExercise(exerciseName).setCompleted(true);
106+
}
97107
}
98108
}
109+
CourseInfoIo.save(info, workDir.getConfigFile());
99110
if (total > 0 && !isOnlyExercise) {
100111
// Print a progress bar showing how the ratio of passed exercises
101112
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
@@ -88,7 +88,7 @@ public void printSubmissionResult(SubmissionResult result, Boolean printProgress
8888
return;
8989
}
9090

91-
public void printRunResult(RunResult result, Boolean printProgressBar,
91+
public void printRunResult(RunResult result, Boolean submitted, Boolean printProgressBar,
9292
Color.AnsiColor color1, Color.AnsiColor color2) {
9393
printTestResults(result.testResults);
9494
this.total = result.testResults.size();
@@ -101,9 +101,10 @@ public void printRunResult(RunResult result, Boolean printProgressBar,
101101
String msg = null;
102102
switch (result.status) {
103103
case PASSED:
104-
msg = "All tests passed!";
105-
msg = Color.colorString(msg, Color.AnsiColor.ANSI_GREEN)
106-
+ " Submit to server with 'tmc submit'";
104+
msg = Color.colorString("All tests passed!", Color.AnsiColor.ANSI_GREEN);
105+
if (!submitted) {
106+
msg += " Submit to server with 'tmc submit'";
107+
}
107108
break;
108109
case TESTS_FAILED:
109110
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: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ 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

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
@@ -70,7 +70,7 @@ public void printSubmissionResultWorksIfSomeTestsFail() {
7070
public void printRunResultWorksIfTestsPass() {
7171
testResults = ImmutableList.of(new TestResult("test1", true, "Cool!"));
7272
runResult = new RunResult(Status.PASSED, testResults, logs);
73-
printer.printRunResult(runResult, false, null, null);
73+
printer.printRunResult(runResult, false, false, null, null);
7474
assertTrue(io.out().contains("All tests passed!"));
7575
}
7676

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

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

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

0 commit comments

Comments
 (0)