From 5b161f96ed58cfe10b9f4f5b09ee367e2b78ae9d Mon Sep 17 00:00:00 2001 From: eerojala Date: Mon, 25 Sep 2017 18:01:11 +0300 Subject: [PATCH 01/11] Created preliminary RPlugin and RStudentFilePolicy classes --- .../fi/helsinki/cs/tmc/langs/r/RPlugin.java | 104 ++++++++++++++++++ .../cs/tmc/langs/r/RStudentFilePolicy.java | 25 +++++ 2 files changed, 129 insertions(+) create mode 100644 tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java create mode 100644 tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RStudentFilePolicy.java diff --git a/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java new file mode 100644 index 000000000..0334f8803 --- /dev/null +++ b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java @@ -0,0 +1,104 @@ +package fi.helsinki.cs.tmc.langs.r; + +import com.google.common.base.Optional; +import fi.helsinki.cs.tmc.langs.AbstractLanguagePlugin; +import fi.helsinki.cs.tmc.langs.abstraction.ValidationResult; +import fi.helsinki.cs.tmc.langs.domain.ExerciseBuilder; +import fi.helsinki.cs.tmc.langs.domain.ExerciseDesc; +import fi.helsinki.cs.tmc.langs.domain.RunResult; +import fi.helsinki.cs.tmc.langs.io.StudentFilePolicy; +import fi.helsinki.cs.tmc.langs.io.sandbox.StudentFileAwareSubmissionProcessor; +import fi.helsinki.cs.tmc.langs.io.zip.StudentFileAwareUnzipper; +import fi.helsinki.cs.tmc.langs.io.zip.StudentFileAwareZipper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Locale; + + +public class RPlugin extends AbstractLanguagePlugin{ + + // Various static final Path-variables for filepaths to various folders and files in a R exercise project here + private static final Path R_FOLDER_PATH = Paths.get("R"); + private static final Path TEST_FOLDER_PATH = Paths.get("tests"); + private static final Path TESTTHAT_FOLDER_PATH = Paths.get("testthat"); + private static final Path TMC_FOLDER_PATH = Paths.get("tmc"); + private static final Path DESCRIPTION_PATH = Paths.get("DESCRIPTION"); + private static final Path RHISTORY_PATH = Paths.get(".RHistory"); + private static final Path RESULT_R_PATH = Paths.get("result.R"); + + + + // Various static final String-variables for error messages related to parsing and running R tests here + + + private static Logger log = LoggerFactory.getLogger(RPlugin.class); + + public RPlugin() { + super( + new ExerciseBuilder(), + new StudentFileAwareSubmissionProcessor(), + new StudentFileAwareZipper(), + new StudentFileAwareUnzipper()); + } + + @Override + public boolean isExerciseTypeCorrect(Path path) { + return Files.exists(path.resolve(R_FOLDER_PATH)) + || Files.exists(path.resolve(TEST_FOLDER_PATH).resolve(TESTTHAT_FOLDER_PATH)) + || Files.exists(path.resolve(DESCRIPTION_PATH)) + || Files.exists(path.resolve(RHISTORY_PATH)) + || Files.exists(path.resolve(TMC_FOLDER_PATH).resolve(RESULT_R_PATH)); + + /* + R folder contains the actual R files used in the project/package. It is automatically included when creating a + R package but now when making a regular project in RStudio. + + test/testthat folder contains the unit testing files which use the testThat library for the R project. + + DESCRIPTION file contains package information. Included automatically when making a new package, but not + included when making a regular project in RStudio. + + .RHistory file contains the history of executed code on the R terminal. Generated after running code on the R + terminal for the first time. + + tmc/result.R contains the call to tmcRtestrunner's runTests function. + */ + } + + @Override + protected StudentFilePolicy getStudentFilePolicy(Path projectPath) { + return new RStudentFilePolicy(projectPath); + } + + @Override + public RunResult runTests(Path path) { + // TO DO + return null; + } + + @Override + public ValidationResult checkCodeStyle(Path path, Locale messageLocale) throws UnsupportedOperationException { + // TO DO + return null; + } + + @Override + public Optional scanExercise(Path path, String exerciseName) { + // TO DO + return null; + } + + @Override + public void clean(Path path) { + // TO DO + } + + @Override + public String getPluginName() { + return "r"; + } +} diff --git a/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RStudentFilePolicy.java b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RStudentFilePolicy.java new file mode 100644 index 000000000..eb152680a --- /dev/null +++ b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RStudentFilePolicy.java @@ -0,0 +1,25 @@ +package fi.helsinki.cs.tmc.langs.r; + +import fi.helsinki.cs.tmc.langs.io.ConfigurableStudentFilePolicy; + +import java.nio.file.Path; +import java.nio.file.Paths; + +public class RStudentFilePolicy extends ConfigurableStudentFilePolicy{ + public RStudentFilePolicy(Path configFileParent) { + super(configFileParent); + } + + /** + * Returns {@code True} for all files in the projectRoot/R/ directory and other + * files required for building the project. + * + *

Will NOT return {@code True} for any test files. If test file modification are part + * of the exercise, those test files are whitelisted as ExtraStudentFiles and the + * decision to include them is made by {@link ConfigurableStudentFilePolicy}. + */ + @Override + public boolean isStudentSourceFile(Path path, Path projectRootPath) { + return path.startsWith(Paths.get("R")); + } +} From 2a96c67f57b0557bd0648ad51c1da7660cc71111 Mon Sep 17 00:00:00 2001 From: eerojala Date: Mon, 25 Sep 2017 21:03:49 +0300 Subject: [PATCH 02/11] Fixed checkstyle issue (?) --- .../src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java index 0334f8803..ae354de5a 100644 --- a/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java +++ b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java @@ -89,7 +89,7 @@ public ValidationResult checkCodeStyle(Path path, Locale messageLocale) throws U @Override public Optional scanExercise(Path path, String exerciseName) { // TO DO - return null; + return Optional.absent(); } @Override From cb2d384634b7a518cba6e95d875146964217720a Mon Sep 17 00:00:00 2001 From: samuvait Date: Mon, 25 Sep 2017 22:19:13 +0300 Subject: [PATCH 03/11] fixed checkstyle --- .../fi/helsinki/cs/tmc/langs/r/RPlugin.java | 19 ++++++++++++------- .../cs/tmc/langs/r/RStudentFilePolicy.java | 2 +- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java index 2c639d36f..4e4bc9612 100644 --- a/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java +++ b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java @@ -31,7 +31,8 @@ public final class RPlugin extends AbstractLanguagePlugin { - // Various static final Path-variables for filepaths to various folders and files in a R exercise project here + // Various static final Path-variables for filepaths + // to various folders and files in a R exercise project here private static final Path R_FOLDER_PATH = Paths.get("R"); private static final Path TEST_FOLDER_PATH = Paths.get("tests"); private static final Path TESTTHAT_FOLDER_PATH = Paths.get("testthat"); @@ -46,7 +47,8 @@ public final class RPlugin extends AbstractLanguagePlugin { private static final String CANNOT_PARSE_EXERCISE_DESCRIPTION_MESSAGE = "Failed to parse exercise description."; - // Various static final String-variables for error messages related to parsing and running R tests here + // Various static final String-variables for + // error messages related to parsing and running R tests here private static Logger log = LoggerFactory.getLogger(RPlugin.class); @@ -65,17 +67,20 @@ public boolean isExerciseTypeCorrect(Path path) { || Files.exists(path.resolve(DESCRIPTION_PATH)) || Files.exists(path.resolve(RHISTORY_PATH)) || Files.exists(path.resolve(TMC_FOLDER_PATH).resolve(RESULT_R_PATH)); - /* - R folder contains the actual R files used in the project/package. It is automatically included when creating a + R folder contains the actual R files used in the + project/package. It is automatically included when creating a R package but now when making a regular project in RStudio. - test/testthat folder contains the unit testing files which use the testThat library for the R project. + test/testthat folder contains the unit testing + files which use the testThat library for the R project. - DESCRIPTION file contains package information. Included automatically when making a new package, but not + DESCRIPTION file contains package information. + Included automatically when making a new package, but not included when making a regular project in RStudio. - .RHistory file contains the history of executed code on the R terminal. Generated after running code on the R + .RHistory file contains the history of executed code on + the R terminal. Generated after running code on the R terminal for the first time. tmc/result.R contains the call to tmcRtestrunner's runTests function. diff --git a/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RStudentFilePolicy.java b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RStudentFilePolicy.java index eb152680a..fc2f92284 100644 --- a/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RStudentFilePolicy.java +++ b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RStudentFilePolicy.java @@ -5,7 +5,7 @@ import java.nio.file.Path; import java.nio.file.Paths; -public class RStudentFilePolicy extends ConfigurableStudentFilePolicy{ +public class RStudentFilePolicy extends ConfigurableStudentFilePolicy { public RStudentFilePolicy(Path configFileParent) { super(configFileParent); } From e5fb302796ae13d5859156dd6a85fd52b5a46f66 Mon Sep 17 00:00:00 2001 From: samuvait Date: Mon, 25 Sep 2017 22:30:41 +0300 Subject: [PATCH 04/11] test fixed to pass from passed --- .../test/resources/example_json/.results.json | 45 +++++++++---------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/tmc-langs-r/src/test/resources/example_json/.results.json b/tmc-langs-r/src/test/resources/example_json/.results.json index 5d0cb9f6d..c35b74613 100644 --- a/tmc-langs-r/src/test/resources/example_json/.results.json +++ b/tmc-langs-r/src/test/resources/example_json/.results.json @@ -1,6 +1,6 @@ [ { - "status": "passed", + "status": "pass", "name": "Addition works", "message": "", "backtrace": "", @@ -10,7 +10,7 @@ ] }, { - "status": "passed", + "status": "pass", "name": "Multiplication works", "message": "", "backtrace": "", @@ -20,7 +20,7 @@ ] }, { - "status": "passed", + "status": "pass", "name": "Subtraction works", "message": "", "backtrace": "", @@ -29,7 +29,7 @@ ] }, { - "status": "passed", + "status": "pass", "name": "Division works", "message": "", "backtrace": "", @@ -38,7 +38,7 @@ ] }, { - "status": "passed", + "status": "pass", "name": "Test with no points", "message": "", "backtrace": "", @@ -47,7 +47,7 @@ ] }, { - "status": "failed", + "status": "fail", "name": "Dummy test set to fail", "message": "Failed with call: expect_true, FALSE\nFALSE isn't true.\nFailed with call: expect_equal, 1, 2\n1 not equal to 2.\n1/1 mismatches\n[1] 1 - 2 == -1\n", "backtrace": "", @@ -56,7 +56,7 @@ ] }, { - "status": "passed", + "status": "pass", "name": "Matrix transpose with [[1,2]] works", "message": "", "backtrace": "", @@ -65,7 +65,7 @@ ] }, { - "status": "passed", + "status": "pass", "name": "Matrix transpose with [[1,2],[3,4]] works", "message": "", "backtrace": "", @@ -74,7 +74,7 @@ ] }, { - "status": "passed", + "status": "pass", "name": "Constant string works", "message": "", "backtrace": "", @@ -83,7 +83,7 @@ ] }, { - "status": "passed", + "status": "pass", "name": "Exercise 1 is correct", "message": "", "backtrace": "", @@ -92,7 +92,7 @@ ] }, { - "status": "passed", + "status": "pass", "name": "Exercise 2 is correct", "message": "", "backtrace": "", @@ -101,7 +101,7 @@ ] }, { - "status": "passed", + "status": "pass", "name": "Exercise 3 is correct", "message": "", "backtrace": "", @@ -111,7 +111,7 @@ ] }, { - "status": "passed", + "status": "pass", "name": "Exercise 4 is correct", "message": "", "backtrace": "", @@ -120,7 +120,7 @@ ] }, { - "status": "passed", + "status": "pass", "name": "Exercise 5 is correct", "message": "", "backtrace": "", @@ -129,7 +129,7 @@ ] }, { - "status": "passed", + "status": "pass", "name": "Exercise 6 is correct", "message": "", "backtrace": "", @@ -138,7 +138,7 @@ ] }, { - "status": "passed", + "status": "pass", "name": "Exercise 7 is correct", "message": "", "backtrace": "", @@ -147,7 +147,7 @@ ] }, { - "status": "passed", + "status": "pass", "name": "Exercise 8 is correct", "message": "", "backtrace": "", @@ -156,7 +156,7 @@ ] }, { - "status": "passed", + "status": "pass", "name": "Exercise 9 is correct", "message": "", "backtrace": "", @@ -165,7 +165,7 @@ ] }, { - "status": "passed", + "status": "pass", "name": "Exercise 10 is correct", "message": "", "backtrace": "", @@ -174,7 +174,7 @@ ] }, { - "status": "passed", + "status": "pass", "name": "Exercise 11 is correct", "message": "", "backtrace": "", @@ -183,7 +183,7 @@ ] }, { - "status": "passed", + "status": "pass", "name": "Exercise 12 is correct", "message": "", "backtrace": "", @@ -192,7 +192,7 @@ ] }, { - "status": "passed", + "status": "pass", "name": "Exercise 13 is correct", "message": "", "backtrace": "", @@ -201,4 +201,3 @@ ] } ] - From 7a9860c8bc76c511c0f32375e5ee59e7496f669b Mon Sep 17 00:00:00 2001 From: Janne Hyttinen Date: Tue, 26 Sep 2017 00:49:56 +0300 Subject: [PATCH 05/11] added parsing for available points --- .../cs/tmc/langs/r/RExerciseDescParser.java | 45 +++++++++++++++++ .../fi/helsinki/cs/tmc/langs/r/RPlugin.java | 25 ++++++++-- .../cs/tmc/langs/r/RTestResultParser.java | 2 +- .../fi/helsinki/cs/tmc/langs/r/TestMain.java | 6 +-- .../tmc/langs/r/RExerciseDescParserTest.java | 49 +++++++++++++++++++ .../helsinki/cs/tmc/langs/r/RPluginTest.java | 15 ++++++ .../cs/tmc/langs/r/RTestResultParserTest.java | 2 + .../example_json/.available_points.json | 8 +++ 8 files changed, 143 insertions(+), 9 deletions(-) create mode 100644 tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RExerciseDescParser.java create mode 100644 tmc-langs-r/src/test/java/fi/helsinki/cs/tmc/langs/r/RExerciseDescParserTest.java create mode 100644 tmc-langs-r/src/test/java/fi/helsinki/cs/tmc/langs/r/RPluginTest.java create mode 100644 tmc-langs-r/src/test/resources/example_json/.available_points.json diff --git a/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RExerciseDescParser.java b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RExerciseDescParser.java new file mode 100644 index 000000000..81654ee3a --- /dev/null +++ b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RExerciseDescParser.java @@ -0,0 +1,45 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package fi.helsinki.cs.tmc.langs.r; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.ImmutableList; +import fi.helsinki.cs.tmc.langs.domain.TestDesc; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * + * @author janne + */ +class RExerciseDescParser { + private static Path RESULT_FILE = Paths.get(".available_points.json"); + private static final TypeReference>> MAP_TYPE_REFERENCE = + new TypeReference>>() {}; + private Path path; + private ObjectMapper mapper; + public RExerciseDescParser(Path path) { + this.path = path; + this.mapper = new ObjectMapper(); + } + public ImmutableList parse() throws IOException { + List testDescs = new ArrayList<>(); + byte[] json = Files.readAllBytes(path.resolve(RESULT_FILE)); + Map> parse = mapper.readValue(json, MAP_TYPE_REFERENCE); + for (String name : parse.keySet()) { + ImmutableList points = ImmutableList.copyOf(parse.get(name)); + testDescs.add(new TestDesc(name, points)); + } + return ImmutableList.copyOf(testDescs); + } + +} diff --git a/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java index fc2bfb89f..c0c6a7a5b 100644 --- a/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java +++ b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java @@ -16,6 +16,8 @@ import fi.helsinki.cs.tmc.langs.utils.ProcessRunner; import com.google.common.base.Optional; +import com.google.common.collect.ImmutableList; +import fi.helsinki.cs.tmc.langs.domain.TestDesc; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.SystemUtils; @@ -60,9 +62,22 @@ public String getPluginName() { return null; } - @Override + @Override public Optional scanExercise(Path path, String exerciseName) { - return null; + ProcessRunner runner = new ProcessRunner(getAvailablePointsCommand(), path); + try { + runner.call(); + } catch (Exception e) { + System.out.println(e); + log.error(CANNOT_SCAN_EXERCISE_MESSAGE, e); + } + try { + ImmutableList testDescs = new RExerciseDescParser(path).parse(); + return Optional.of(new ExerciseDesc(exerciseName, testDescs)); + } catch (IOException e) { + log.error(CANNOT_PARSE_EXERCISE_DESCRIPTION_MESSAGE, e); + } + return Optional.absent(); } @Override @@ -98,7 +113,11 @@ private String[] getTestCommand() { } return ArrayUtils.addAll(rscr, command); } - + private String[] getAvailablePointsCommand() { + String[] rscr = new String[] {"Rscript", "-e"}; + String[] command = new String[] {"\"library('tmcRtestrunner');getAvailablePoints(\"$PWD\")\""}; + return ArrayUtils.addAll(rscr, command); + } @Override public void clean(Path path) { diff --git a/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RTestResultParser.java b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RTestResultParser.java index 0ab926fa3..ea687952f 100644 --- a/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RTestResultParser.java +++ b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RTestResultParser.java @@ -67,7 +67,7 @@ private TestResult toTestResult(JsonNode node) { backTrace.add(line.asText()); } - boolean passed = node.get("status").asText().equals("pass"); + boolean passed = node.get("status").asText().equals("passed"); return new TestResult( node.get("name").asText(), diff --git a/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/TestMain.java b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/TestMain.java index 249a726c0..ca59c4c18 100644 --- a/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/TestMain.java +++ b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/TestMain.java @@ -23,11 +23,7 @@ public static void main(String[] args) { //For now, add the path you want to test here fully, //for example: pathToGithubFolder/tmc-r/example_projects/example_project1 - String exampleProjectLocation = "/tmc-r/example_projects/example_project1"; - Path path = Paths.get(exampleProjectLocation); - RunResult runRes = runTests(path); - printTestResult(runRes); - RunResult rr; + /* try { rr = new RTestResultParser(path).parse(); diff --git a/tmc-langs-r/src/test/java/fi/helsinki/cs/tmc/langs/r/RExerciseDescParserTest.java b/tmc-langs-r/src/test/java/fi/helsinki/cs/tmc/langs/r/RExerciseDescParserTest.java new file mode 100644 index 000000000..187066531 --- /dev/null +++ b/tmc-langs-r/src/test/java/fi/helsinki/cs/tmc/langs/r/RExerciseDescParserTest.java @@ -0,0 +1,49 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package fi.helsinki.cs.tmc.langs.r; + +import com.google.common.collect.ImmutableList; +import fi.helsinki.cs.tmc.langs.domain.TestDesc; +import fi.helsinki.cs.tmc.langs.utils.TestUtils; +import java.io.IOException; +import java.nio.file.Path; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import org.junit.Test; + +/** + * + * @author janne + */ +public class RExerciseDescParserTest { + private ImmutableList re; + private Path jsonDir; + public RExerciseDescParserTest() { + jsonDir = TestUtils.getPath(getClass(), "example_json"); + try { + re = new RExerciseDescParser(jsonDir).parse(); + } catch (IOException e) { + System.out.println("Something wrong: " + e.getMessage()); + } + } + @Test + public void testThatParseSeemsToWorkOnExampleJson(){ + System.out.println(re); + assertEquals(re.size(),6); + assertEquals(re.get(0).points.size(),2); + assertEquals(re.get(0).name,"Addition works"); + assertEquals(re.get(1).points.size(),2); + assertEquals(re.get(1).name,"Multiplication works"); + assertEquals(re.get(2).points.size(),1); + assertEquals(re.get(2).name,"Subtraction works"); + assertEquals(re.get(3).points.size(),1); + assertEquals(re.get(3).name,"Division works"); + assertEquals(re.get(4).points.size(),0); + assertEquals(re.get(4).name, "Test with no points"); + assertEquals(re.get(5).points.size(),0); + assertEquals(re.get(5).name, "Dummy test set to fail"); + } +} diff --git a/tmc-langs-r/src/test/java/fi/helsinki/cs/tmc/langs/r/RPluginTest.java b/tmc-langs-r/src/test/java/fi/helsinki/cs/tmc/langs/r/RPluginTest.java new file mode 100644 index 000000000..81c9580b7 --- /dev/null +++ b/tmc-langs-r/src/test/java/fi/helsinki/cs/tmc/langs/r/RPluginTest.java @@ -0,0 +1,15 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package fi.helsinki.cs.tmc.langs.r; + +/** + * + * @author janne + */ +public class RPluginTest { + + +} diff --git a/tmc-langs-r/src/test/java/fi/helsinki/cs/tmc/langs/r/RTestResultParserTest.java b/tmc-langs-r/src/test/java/fi/helsinki/cs/tmc/langs/r/RTestResultParserTest.java index f59fd828e..e255339d8 100644 --- a/tmc-langs-r/src/test/java/fi/helsinki/cs/tmc/langs/r/RTestResultParserTest.java +++ b/tmc-langs-r/src/test/java/fi/helsinki/cs/tmc/langs/r/RTestResultParserTest.java @@ -32,6 +32,7 @@ public void testThatParseSeemsToWorkOnExampleJson() { assertEquals(22, rr.testResults.size()); for (TestResult tr : rr.testResults) { + System.out.println(tr); if (tr.getName().equals("Addition works")) { assertTrue(tr.isSuccessful()); assertEquals(2, tr.points.size()); @@ -43,4 +44,5 @@ public void testThatParseSeemsToWorkOnExampleJson() { } } } + } diff --git a/tmc-langs-r/src/test/resources/example_json/.available_points.json b/tmc-langs-r/src/test/resources/example_json/.available_points.json new file mode 100644 index 000000000..25862cfca --- /dev/null +++ b/tmc-langs-r/src/test/resources/example_json/.available_points.json @@ -0,0 +1,8 @@ +{"Addition works": ["r1.1","r1.2"], + "Multiplication works":["r1.3", "r1.4"], + "Subtraction works":["r1.5"], + "Division works":["r1.6"], + "Test with no points":[], + "Dummy test set to fail":[] +} + From 941e573b4343745cbc17f665c5f0a6383ec03043 Mon Sep 17 00:00:00 2001 From: Janne Hyttinen Date: Tue, 26 Sep 2017 01:17:08 +0300 Subject: [PATCH 06/11] testing travis --- .../java/fi/helsinki/cs/tmc/langs/r/RPluginTest.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tmc-langs-r/src/test/java/fi/helsinki/cs/tmc/langs/r/RPluginTest.java b/tmc-langs-r/src/test/java/fi/helsinki/cs/tmc/langs/r/RPluginTest.java index 81c9580b7..468052e18 100644 --- a/tmc-langs-r/src/test/java/fi/helsinki/cs/tmc/langs/r/RPluginTest.java +++ b/tmc-langs-r/src/test/java/fi/helsinki/cs/tmc/langs/r/RPluginTest.java @@ -5,11 +5,19 @@ */ package fi.helsinki.cs.tmc.langs.r; +import org.junit.Test; + /** * * @author janne */ public class RPluginTest { - + + @Test + public void testGetAvailablePointsCommand(){ + String[] command = new String[] {"Rscript", "-e","\"library('tmcRtestrunner');getAvailablePoints(\"$PWD\")\""}; + + } + } From b1e416ec8680ebae92476a34beb57191c41e26e4 Mon Sep 17 00:00:00 2001 From: Janne Hyttinen Date: Tue, 26 Sep 2017 02:06:06 +0300 Subject: [PATCH 07/11] checkstyle fixed? --- .../cs/tmc/langs/r/RExerciseDescParser.java | 23 +++++++++--------- .../fi/helsinki/cs/tmc/langs/r/RPlugin.java | 12 +++++----- .../tmc/langs/r/RExerciseDescParserTest.java | 24 ++++++++----------- .../helsinki/cs/tmc/langs/r/RPluginTest.java | 13 ++-------- 4 files changed, 29 insertions(+), 43 deletions(-) diff --git a/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RExerciseDescParser.java b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RExerciseDescParser.java index 81654ee3a..d49a052a8 100644 --- a/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RExerciseDescParser.java +++ b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RExerciseDescParser.java @@ -1,14 +1,12 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ + package fi.helsinki.cs.tmc.langs.r; +import fi.helsinki.cs.tmc.langs.domain.TestDesc; + import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.ImmutableList; -import fi.helsinki.cs.tmc.langs.domain.TestDesc; + import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -17,20 +15,21 @@ import java.util.List; import java.util.Map; -/** - * - * @author janne - */ + + class RExerciseDescParser { + private static Path RESULT_FILE = Paths.get(".available_points.json"); private static final TypeReference>> MAP_TYPE_REFERENCE = new TypeReference>>() {}; private Path path; private ObjectMapper mapper; + public RExerciseDescParser(Path path) { - this.path = path; - this.mapper = new ObjectMapper(); + this.path = path; + this.mapper = new ObjectMapper(); } + public ImmutableList parse() throws IOException { List testDescs = new ArrayList<>(); byte[] json = Files.readAllBytes(path.resolve(RESULT_FILE)); diff --git a/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java index c0c6a7a5b..adbe6b78d 100644 --- a/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java +++ b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java @@ -1,5 +1,6 @@ package fi.helsinki.cs.tmc.langs.r; + import fi.helsinki.cs.tmc.langs.AbstractLanguagePlugin; import fi.helsinki.cs.tmc.langs.abstraction.ValidationResult; import fi.helsinki.cs.tmc.langs.domain.ExerciseBuilder; @@ -7,12 +8,8 @@ import fi.helsinki.cs.tmc.langs.domain.RunResult; import fi.helsinki.cs.tmc.langs.io.StudentFilePolicy; import fi.helsinki.cs.tmc.langs.io.sandbox.StudentFileAwareSubmissionProcessor; -import fi.helsinki.cs.tmc.langs.io.sandbox.SubmissionProcessor; import fi.helsinki.cs.tmc.langs.io.zip.StudentFileAwareUnzipper; import fi.helsinki.cs.tmc.langs.io.zip.StudentFileAwareZipper; -import fi.helsinki.cs.tmc.langs.io.zip.Unzipper; -import fi.helsinki.cs.tmc.langs.io.zip.Zipper; -import fi.helsinki.cs.tmc.langs.python3.Python3TestResultParser; import fi.helsinki.cs.tmc.langs.utils.ProcessRunner; import com.google.common.base.Optional; @@ -62,7 +59,7 @@ public String getPluginName() { return null; } - @Override + @Override public Optional scanExercise(Path path, String exerciseName) { ProcessRunner runner = new ProcessRunner(getAvailablePointsCommand(), path); try { @@ -113,11 +110,14 @@ private String[] getTestCommand() { } return ArrayUtils.addAll(rscr, command); } + private String[] getAvailablePointsCommand() { String[] rscr = new String[] {"Rscript", "-e"}; - String[] command = new String[] {"\"library('tmcRtestrunner');getAvailablePoints(\"$PWD\")\""}; + String[] command = new String[] {"\"library('tmcRtestrunner');" + + "getAvailablePoints(\"$PWD\")\""}; return ArrayUtils.addAll(rscr, command); } + @Override public void clean(Path path) { diff --git a/tmc-langs-r/src/test/java/fi/helsinki/cs/tmc/langs/r/RExerciseDescParserTest.java b/tmc-langs-r/src/test/java/fi/helsinki/cs/tmc/langs/r/RExerciseDescParserTest.java index 187066531..fcf19ea23 100644 --- a/tmc-langs-r/src/test/java/fi/helsinki/cs/tmc/langs/r/RExerciseDescParserTest.java +++ b/tmc-langs-r/src/test/java/fi/helsinki/cs/tmc/langs/r/RExerciseDescParserTest.java @@ -1,26 +1,22 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ + package fi.helsinki.cs.tmc.langs.r; -import com.google.common.collect.ImmutableList; import fi.helsinki.cs.tmc.langs.domain.TestDesc; import fi.helsinki.cs.tmc.langs.utils.TestUtils; + +import com.google.common.collect.ImmutableList; + +import org.junit.Test; + import java.io.IOException; import java.nio.file.Path; + import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import org.junit.Test; -/** - * - * @author janne - */ public class RExerciseDescParserTest { private ImmutableList re; private Path jsonDir; + public RExerciseDescParserTest() { jsonDir = TestUtils.getPath(getClass(), "example_json"); try { @@ -29,9 +25,9 @@ public RExerciseDescParserTest() { System.out.println("Something wrong: " + e.getMessage()); } } + @Test - public void testThatParseSeemsToWorkOnExampleJson(){ - System.out.println(re); + public void testThatParseSeemsToWorkOnExampleJson() { assertEquals(re.size(),6); assertEquals(re.get(0).points.size(),2); assertEquals(re.get(0).name,"Addition works"); diff --git a/tmc-langs-r/src/test/java/fi/helsinki/cs/tmc/langs/r/RPluginTest.java b/tmc-langs-r/src/test/java/fi/helsinki/cs/tmc/langs/r/RPluginTest.java index 468052e18..4a0882319 100644 --- a/tmc-langs-r/src/test/java/fi/helsinki/cs/tmc/langs/r/RPluginTest.java +++ b/tmc-langs-r/src/test/java/fi/helsinki/cs/tmc/langs/r/RPluginTest.java @@ -1,22 +1,13 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ + package fi.helsinki.cs.tmc.langs.r; import org.junit.Test; -/** - * - * @author janne - */ public class RPluginTest { @Test public void testGetAvailablePointsCommand(){ - String[] command = new String[] {"Rscript", "-e","\"library('tmcRtestrunner');getAvailablePoints(\"$PWD\")\""}; - + } From fa0ad87249b74e0cd2d6dd87c29eee2d64fb0282 Mon Sep 17 00:00:00 2001 From: Janne Hyttinen Date: Tue, 26 Sep 2017 02:14:59 +0300 Subject: [PATCH 08/11] checkstyle fixed --- .../src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java | 3 ++- .../fi/helsinki/cs/tmc/langs/r/RExerciseDescParserTest.java | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java index adbe6b78d..218cd5445 100644 --- a/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java +++ b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java @@ -11,10 +11,11 @@ import fi.helsinki.cs.tmc.langs.io.zip.StudentFileAwareUnzipper; import fi.helsinki.cs.tmc.langs.io.zip.StudentFileAwareZipper; import fi.helsinki.cs.tmc.langs.utils.ProcessRunner; +import fi.helsinki.cs.tmc.langs.domain.TestDesc; import com.google.common.base.Optional; import com.google.common.collect.ImmutableList; -import fi.helsinki.cs.tmc.langs.domain.TestDesc; + import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.SystemUtils; diff --git a/tmc-langs-r/src/test/java/fi/helsinki/cs/tmc/langs/r/RExerciseDescParserTest.java b/tmc-langs-r/src/test/java/fi/helsinki/cs/tmc/langs/r/RExerciseDescParserTest.java index fcf19ea23..7e8b84953 100644 --- a/tmc-langs-r/src/test/java/fi/helsinki/cs/tmc/langs/r/RExerciseDescParserTest.java +++ b/tmc-langs-r/src/test/java/fi/helsinki/cs/tmc/langs/r/RExerciseDescParserTest.java @@ -1,6 +1,8 @@ package fi.helsinki.cs.tmc.langs.r; +import static org.junit.Assert.assertEquals; + import fi.helsinki.cs.tmc.langs.domain.TestDesc; import fi.helsinki.cs.tmc.langs.utils.TestUtils; @@ -11,7 +13,7 @@ import java.io.IOException; import java.nio.file.Path; -import static org.junit.Assert.assertEquals; + public class RExerciseDescParserTest { private ImmutableList re; From 3416b2a5d2df2691907904b54f0c2e973c526626 Mon Sep 17 00:00:00 2001 From: Janne Hyttinen Date: Tue, 26 Sep 2017 02:27:37 +0300 Subject: [PATCH 09/11] checkstyle fixed --- .../src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java index 218cd5445..d294a2423 100644 --- a/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java +++ b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java @@ -6,12 +6,14 @@ import fi.helsinki.cs.tmc.langs.domain.ExerciseBuilder; import fi.helsinki.cs.tmc.langs.domain.ExerciseDesc; import fi.helsinki.cs.tmc.langs.domain.RunResult; +import fi.helsinki.cs.tmc.langs.domain.TestDesc; import fi.helsinki.cs.tmc.langs.io.StudentFilePolicy; import fi.helsinki.cs.tmc.langs.io.sandbox.StudentFileAwareSubmissionProcessor; import fi.helsinki.cs.tmc.langs.io.zip.StudentFileAwareUnzipper; import fi.helsinki.cs.tmc.langs.io.zip.StudentFileAwareZipper; + import fi.helsinki.cs.tmc.langs.utils.ProcessRunner; -import fi.helsinki.cs.tmc.langs.domain.TestDesc; + import com.google.common.base.Optional; import com.google.common.collect.ImmutableList; From a45c4d19a7b7ef1d6ad1d644cd5dfb7aa7aacd7c Mon Sep 17 00:00:00 2001 From: Janne Hyttinen Date: Tue, 26 Sep 2017 02:51:29 +0300 Subject: [PATCH 10/11] merged my own work with rplugin-class --- .../main/java/fi/helsinki/cs/tmc/langs/r/RTestResultParser.java | 2 +- .../src/main/java/fi/helsinki/cs/tmc/langs/r/TestMain.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RTestResultParser.java b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RTestResultParser.java index ea687952f..0ab926fa3 100644 --- a/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RTestResultParser.java +++ b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RTestResultParser.java @@ -67,7 +67,7 @@ private TestResult toTestResult(JsonNode node) { backTrace.add(line.asText()); } - boolean passed = node.get("status").asText().equals("passed"); + boolean passed = node.get("status").asText().equals("pass"); return new TestResult( node.get("name").asText(), diff --git a/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/TestMain.java b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/TestMain.java index ca59c4c18..b240db700 100644 --- a/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/TestMain.java +++ b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/TestMain.java @@ -10,7 +10,6 @@ import java.io.IOException; import java.nio.file.Path; -import java.nio.file.Paths; public class TestMain { From 90823144c41f8a723ea1a0cc70a1af1289d594d4 Mon Sep 17 00:00:00 2001 From: Janne Hyttinen Date: Tue, 26 Sep 2017 03:48:24 +0300 Subject: [PATCH 11/11] final commit --- .../java/fi/helsinki/cs/tmc/langs/r/RPlugin.java | 2 +- .../java/fi/helsinki/cs/tmc/langs/r/TestMain.java | 15 ++++++--------- .../cs/tmc/langs/r/RTestResultParserTest.java | 1 - 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java index dfb950f79..8b93a00c5 100644 --- a/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java +++ b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/RPlugin.java @@ -153,7 +153,7 @@ private String[] getTestCommand() { private String[] getAvailablePointsCommand() { String[] rscr = new String[] {"Rscript", "-e"}; - String[] command = new String[] {"\"library('tmcRtestrunner');" + String[] command = new String[] {"\"library(tmcRtestrunner);" + "getAvailablePoints(\"$PWD\")\""}; return ArrayUtils.addAll(rscr, command); } diff --git a/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/TestMain.java b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/TestMain.java index b240db700..82b00e175 100644 --- a/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/TestMain.java +++ b/tmc-langs-r/src/main/java/fi/helsinki/cs/tmc/langs/r/TestMain.java @@ -10,6 +10,7 @@ import java.io.IOException; import java.nio.file.Path; +import java.nio.file.Paths; public class TestMain { @@ -22,16 +23,12 @@ public static void main(String[] args) { //For now, add the path you want to test here fully, //for example: pathToGithubFolder/tmc-r/example_projects/example_project1 - + String exampleProjectLocation = "/example_projects/example_project1"; + Path path = Paths.get(exampleProjectLocation); + RunResult runRes = runTests(path); + printTestResult(runRes); + RunResult rr; -/* try { - rr = new RTestResultParser(path).parse(); - for (TestResult tr : rr.testResults) { - System.out.println(tr.toString()); - } - } catch (IOException e) { - System.out.println("Something wrong: " + e.getMessage()); - }*/ } public static void printTestResult(RunResult rr) { diff --git a/tmc-langs-r/src/test/java/fi/helsinki/cs/tmc/langs/r/RTestResultParserTest.java b/tmc-langs-r/src/test/java/fi/helsinki/cs/tmc/langs/r/RTestResultParserTest.java index e255339d8..0ce59ca87 100644 --- a/tmc-langs-r/src/test/java/fi/helsinki/cs/tmc/langs/r/RTestResultParserTest.java +++ b/tmc-langs-r/src/test/java/fi/helsinki/cs/tmc/langs/r/RTestResultParserTest.java @@ -32,7 +32,6 @@ public void testThatParseSeemsToWorkOnExampleJson() { assertEquals(22, rr.testResults.size()); for (TestResult tr : rr.testResults) { - System.out.println(tr); if (tr.getName().equals("Addition works")) { assertTrue(tr.isSuccessful()); assertEquals(2, tr.points.size());