Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added .github/workflows/files/languageParameterTest.zip
Binary file not shown.
28 changes: 17 additions & 11 deletions .github/workflows/test-e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -63,16 +63,22 @@ jobs:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
dataset: [
{zip: "progpedia.zip", name: "progpedia", folder: "ACCEPTED", language: "java", cliArgs: "-bc base"},
{zip: "fileSingleRoot.zip", name: "fileSingleRoot", folder: "fileSingleRoot", language: "java", cliArgs: ""},
{zip: "folderSingleRoot.zip", name: "folderSingleRoot", folder: "folderSingleRoot", language: "java", cliArgs: ""},
{zip: "fileMultiRoot.zip", name: "fileMultiRoot", folder: "f0", language: "java", cliArgs: "--new f1"},
{zip: "folderMultiRoot.zip", name: "folderMultiRoot", folder: "f0", language: "java", cliArgs: "--new f1"},
{zip: "mixedMultiRoot.zip", name: "mixedBaseFile", folder: "f0", language: "java", cliArgs: "--new f1"},
{zip: "mixedMultiRoot.zip", name: "mixedBaseFolder", folder: "f1", language: "java", cliArgs: "--new f0"},
{zip: "cpp.zip", name: "cpp", folder: "./cpp", language: "cpp", cliArgs: ""},
{zip: "csharp.zip", name: "csharp", folder: "./csharp", language: "csharp", cliArgs: ""},
{zip: "python.zip", name: "python", folder: "./python", language: "python3", cliArgs: ""}
# Test multiple ways of giving code directories
{zip: "progpedia.zip", name: "progpedia", folder: "ACCEPTED", cliArgs: "-l java -bc base"},
{zip: "fileSingleRoot.zip", name: "fileSingleRoot", folder: "fileSingleRoot", cliArgs: "-l java"},
{zip: "folderSingleRoot.zip", name: "folderSingleRoot", folder: "folderSingleRoot", cliArgs: "-l java"},
{zip: "fileMultiRoot.zip", name: "fileMultiRoot", folder: "f0", cliArgs: "-l java --new f1"},
{zip: "folderMultiRoot.zip", name: "folderMultiRoot", folder: "f0", cliArgs: "-l java --new f1"},
{zip: "mixedMultiRoot.zip", name: "mixedBaseFile", folder: "f0", cliArgs: "-l java --new f1"},
{zip: "mixedMultiRoot.zip", name: "mixedBaseFolder", folder: "f1", cliArgs: "-l java --new f0"},
# Test that different languages work
{zip: "cpp.zip", name: "cpp", folder: "./cpp", cliArgs: "-l cpp"},
{zip: "csharp.zip", name: "csharp", folder: "./csharp", cliArgs: "-l csharp"},
{zip: "python.zip", name: "python", folder: "./python", cliArgs: "-l python3"},
# Test multiple varients of giving JPlag the language
{zip: "languageParameterTest.zip", name: "languageParameterTest1", folder: "languageParameterTest", cliArgs: "-l java -t 1"}, {zip: "languageParameterTest.zip", name: "languageParameterTest2", folder: "languageParameterTest", cliArgs: "-t 1 -l java"},
{zip: "languageParameterTest.zip", name: "languageParameterTest3", folder: "languageParameterTest", cliArgs: "java -t 1"},
{zip: "languageParameterTest.zip", name: "languageParameterTest4", folder: "languageParameterTest", cliArgs: "-t 1 java"}
]

steps:
Expand Down Expand Up @@ -102,7 +108,7 @@ jobs:

- name: Run JPlag
run: |
java -jar jplag.jar ${{ matrix.dataset.folder }} -l ${{ matrix.dataset.language }} -r ${{ matrix.dataset.name }}-report ${{ matrix.dataset.cliArgs }}
java -jar jplag.jar ${{ matrix.dataset.folder }} -r ${{ matrix.dataset.name }}-report ${{ matrix.dataset.cliArgs }}

- name: Upload result
uses: actions/upload-artifact@v6
Expand Down
1 change: 0 additions & 1 deletion cli/src/main/java/de/jplag/cli/JPlagOptionsBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ public JPlagOptions buildOptions() throws CliException {
Set<File> oldSubmissionDirectories = Set.of(this.cliOptions.oldDirectories);
List<String> suffixes = List.of(this.cliOptions.advanced.suffixes);
submissionDirectories.addAll(List.of(this.cliOptions.newDirectories));
submissionDirectories.addAll(this.cliInputHandler.getSubcommandSubmissionDirectories());

JPlagOptions jPlagOptions = initializeJPlagOptions(submissionDirectories, oldSubmissionDirectories, suffixes);

Expand Down
31 changes: 16 additions & 15 deletions cli/src/main/java/de/jplag/cli/picocli/CliInputHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
Expand Down Expand Up @@ -78,7 +77,9 @@ private CommandLine buildCommandLine() {
}).collect(Collectors.joining(System.lineSeparator())) + System.lineSeparator());
cli.getHelpSectionMap().put(SECTION_KEY_COMMAND_LIST_HEADING, help -> "Languages:" + System.lineSeparator());

buildSubcommands().forEach(cli::addSubcommand);
for (CommandLine.Model.CommandSpec subcommand : buildSubcommands()) {
cli.addSubcommand(subcommand).setHelpFactory(new HelpFactory());
}

cli.getHelpSectionMap().put(SECTION_KEY_SYNOPSIS, help -> help.synopsis(help.synopsisHeadingLength()) + generateDescription());
cli.getHelpSectionMap().put(SECTION_KEY_DESCRIPTION_HEADING, help -> OPTION_LIST_HEADING);
Expand All @@ -95,14 +96,24 @@ private List<CommandLine.Model.CommandSpec> buildSubcommands() {
command.addOption(CommandLine.Model.OptionSpec.builder(option.getNameAsUnixParameter()).type(option.getType().getJavaType())
.description(option.getDescription()).build());
}
command.mixinStandardHelpOptions(true);
command.addPositional(
CommandLine.Model.PositionalParamSpec.builder().type(List.class).auxiliaryTypes(File.class).hidden(true).required(false).build());
command.addMixin("root", buildRootParametersForSubcommands());

return command;
}).toList();
}

private CommandLine.Model.CommandSpec buildRootParametersForSubcommands() {
CommandLine.Model.CommandSpec originalOptions = CommandLine.Model.CommandSpec.forAnnotatedObject(this.options);
CommandLine.Model.CommandSpec hiddenOptions = CommandLine.Model.CommandSpec.create();
originalOptions.options().forEach(option -> {
hiddenOptions.addOption(CommandLine.Model.OptionSpec.builder(option).hidden(true).required(false).build());
});
originalOptions.positionalParameters().forEach(parameter -> {
hiddenOptions.addPositional(CommandLine.Model.PositionalParamSpec.builder(parameter).hidden(true).required(false).build());
});
return hiddenOptions;
}

/**
* Parses the cli parameters and prints the usage help if requested.
* @return true, if the usage help has been requested. In this case the program should stop.
Expand Down Expand Up @@ -160,16 +171,6 @@ public Language getSelectedLanguage() throws CliException {
return language;
}

/**
* @return The submission directories configured for the subcommand, if one has been given.
*/
public List<File> getSubcommandSubmissionDirectories() {
if (this.parseResult.subcommand() != null && this.parseResult.subcommand().hasMatchedPositional(0)) {
return this.parseResult.subcommand().matchedPositional(0).getValue();
}
return Collections.emptyList();
}

private String generateDescription() {
var randomDescription = DESCRIPTIONS[RANDOM.nextInt(DESCRIPTIONS.length)];
return String.format(DESCRIPTION_PATTERN, randomDescription, CREDITS);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,15 @@ const testSets: DataSet[] = [
}
]

// Add the tests for each language parameter test
for (let i = 1; i <= 4; i++) {
testSets.push({
datasetName: `languageParameterTest${i}-report.jplag`,
firstSubmissionName: '1.java',
secondSubmissionName: '2.java'
})
}

for (const testSet of testSets) {
test(`Can open ${testSet.datasetName}`, async ({ page }) => {
await uploadFile(testSet.datasetName, page)
Expand Down
Loading