Skip to content

Commit

Permalink
Merge pull request #572 from jplag/feature/jplagoptions-ro
Browse files Browse the repository at this point in the history
Convert JPlagOption to Record (→ Read-Only)
  • Loading branch information
dfuchss authored Aug 31, 2022
2 parents e8ea0ca + 97d5c8e commit 8ec60b6
Show file tree
Hide file tree
Showing 29 changed files with 362 additions and 471 deletions.
57 changes: 41 additions & 16 deletions jplag.cli/src/main/java/de/jplag/CLI.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,38 @@
package de.jplag;

import static de.jplag.CommandLineArgument.*;
import static de.jplag.CommandLineArgument.BASE_CODE;
import static de.jplag.CommandLineArgument.CLUSTER_AGGLOMERATIVE_INTER_CLUSTER_SIMILARITY;
import static de.jplag.CommandLineArgument.CLUSTER_AGGLOMERATIVE_THRESHOLD;
import static de.jplag.CommandLineArgument.CLUSTER_ALGORITHM;
import static de.jplag.CommandLineArgument.CLUSTER_DISABLE;
import static de.jplag.CommandLineArgument.CLUSTER_METRIC;
import static de.jplag.CommandLineArgument.CLUSTER_PREPROCESSING_CDF;
import static de.jplag.CommandLineArgument.CLUSTER_PREPROCESSING_NONE;
import static de.jplag.CommandLineArgument.CLUSTER_PREPROCESSING_PERCENTILE;
import static de.jplag.CommandLineArgument.CLUSTER_PREPROCESSING_THRESHOLD;
import static de.jplag.CommandLineArgument.CLUSTER_SPECTRAL_BANDWIDTH;
import static de.jplag.CommandLineArgument.CLUSTER_SPECTRAL_KMEANS_ITERATIONS;
import static de.jplag.CommandLineArgument.CLUSTER_SPECTRAL_MAX_RUNS;
import static de.jplag.CommandLineArgument.CLUSTER_SPECTRAL_MIN_RUNS;
import static de.jplag.CommandLineArgument.CLUSTER_SPECTRAL_NOISE;
import static de.jplag.CommandLineArgument.COMPARISON_MODE;
import static de.jplag.CommandLineArgument.DEBUG;
import static de.jplag.CommandLineArgument.EXCLUDE_FILE;
import static de.jplag.CommandLineArgument.LANGUAGE;
import static de.jplag.CommandLineArgument.MIN_TOKEN_MATCH;
import static de.jplag.CommandLineArgument.NEW_DIRECTORY;
import static de.jplag.CommandLineArgument.OLD_DIRECTORY;
import static de.jplag.CommandLineArgument.RESULT_FOLDER;
import static de.jplag.CommandLineArgument.ROOT_DIRECTORY;
import static de.jplag.CommandLineArgument.SHOWN_COMPARISONS;
import static de.jplag.CommandLineArgument.SIMILARITY_THRESHOLD;
import static de.jplag.CommandLineArgument.SUBDIRECTORY;
import static de.jplag.CommandLineArgument.SUFFIXES;
import static de.jplag.CommandLineArgument.VERBOSITY;

import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.Random;
Expand Down Expand Up @@ -125,21 +154,15 @@ public JPlagOptions buildOptionsFromArguments(Namespace namespace) {
addAllMultiValueArgument(NEW_DIRECTORY.getListFrom(namespace), submissionDirectories);
addAllMultiValueArgument(OLD_DIRECTORY.getListFrom(namespace), oldSubmissionDirectories);

JPlagOptions options = new JPlagOptions(submissionDirectories, oldSubmissionDirectories, LANGUAGE.getFrom(namespace));
options.setBaseCodeSubmissionName(BASE_CODE.getFrom(namespace));
options.setVerbosity(Verbosity.fromOption(VERBOSITY.getFrom(namespace)));
options.setDebugParser(DEBUG.getFrom(namespace));
options.setSubdirectoryName(SUBDIRECTORY.getFrom(namespace));
options.setFileSuffixes(fileSuffixes);
options.setExclusionFileName(EXCLUDE_FILE.getFrom(namespace));
options.setMinimumTokenMatch(MIN_TOKEN_MATCH.getFrom(namespace));
options.setSimilarityThreshold(SIMILARITY_THRESHOLD.getFrom(namespace));
options.setMaximumNumberOfComparisons(SHOWN_COMPARISONS.getFrom(namespace));
ComparisonMode.fromName(COMPARISON_MODE.getFrom(namespace)).ifPresentOrElse(options::setComparisonMode,
() -> logger.warn("Unknown comparison mode, using default mode!"));
var language = LanguageLoader.getLanguage(LANGUAGE.getFrom(namespace)).orElseThrow();
var comparisonModeOptional = ComparisonMode.fromName(COMPARISON_MODE.getFrom(namespace));
if (comparisonModeOptional.isEmpty()) {
logger.warn("Unknown comparison mode, using default mode!");
}
var comparisonMode = comparisonModeOptional.orElse(JPlagOptions.DEFAULT_COMPARISON_MODE);

ClusteringOptions.Builder clusteringBuilder = new ClusteringOptions.Builder();
Optional.ofNullable(!(Boolean) CLUSTER_DISABLE.getFrom(namespace)).ifPresent(clusteringBuilder::enabled);
Optional.ofNullable((Boolean) CLUSTER_DISABLE.getFrom(namespace)).ifPresent(disabled -> clusteringBuilder.enabled(!disabled));
Optional.ofNullable((ClusteringAlgorithm) CLUSTER_ALGORITHM.getFrom(namespace)).ifPresent(clusteringBuilder::algorithm);
Optional.ofNullable((SimilarityMetric) CLUSTER_METRIC.getFrom(namespace)).ifPresent(clusteringBuilder::similarityMetric);
Optional.ofNullable((Float) CLUSTER_SPECTRAL_BANDWIDTH.getFrom(namespace)).ifPresent(clusteringBuilder::spectralKernelBandwidth);
Expand Down Expand Up @@ -169,9 +192,11 @@ public JPlagOptions buildOptionsFromArguments(Namespace namespace) {
clusteringBuilder.preprocessor(Preprocessing.THRESHOLD);
clusteringBuilder.preprocessorPercentile(threshold);
});
options.setClusteringOptions(clusteringBuilder.build());

return options;
return new JPlagOptions(language, MIN_TOKEN_MATCH.getFrom(namespace), submissionDirectories, oldSubmissionDirectories,
BASE_CODE.getFrom(namespace), SUBDIRECTORY.getFrom(namespace), Arrays.stream(fileSuffixes).toList(), EXCLUDE_FILE.getFrom(namespace),
JPlagOptions.DEFAULT_SIMILARITY_METRIC, SIMILARITY_THRESHOLD.getFrom(namespace), SHOWN_COMPARISONS.getFrom(namespace),
clusteringBuilder.build(), comparisonMode, Verbosity.fromOption(VERBOSITY.getFrom(namespace)), DEBUG.getFrom(namespace));
}

private String generateDescription() {
Expand Down
7 changes: 3 additions & 4 deletions jplag.cli/src/test/java/de/jplag/cli/BaseCodeOptionTest.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package de.jplag.cli;

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.util.Optional;
import static org.junit.jupiter.api.Assertions.assertNull;

import org.junit.jupiter.api.Test;

Expand All @@ -15,13 +14,13 @@ class BaseCodeOptionTest extends CommandLineInterfaceTest {
@Test
void testDefaultValue() {
buildOptionsFromCLI(CURRENT_DIRECTORY);
assertEquals(Optional.empty(), options.getBaseCodeSubmissionName());
assertNull(options.baseCodeSubmissionName());
}

@Test
void testCustomName() {
String argument = buildArgument(CommandLineArgument.BASE_CODE, NAME);
buildOptionsFromCLI(argument, CURRENT_DIRECTORY);
assertEquals(NAME, options.getBaseCodeSubmissionName().get());
assertEquals(NAME, options.baseCodeSubmissionName());
}
}
12 changes: 6 additions & 6 deletions jplag.cli/src/test/java/de/jplag/cli/ClusteringTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,35 +15,35 @@ class ClusteringTest extends CommandLineInterfaceTest {
void parseSkipClustering() {
String argument = CommandLineArgument.CLUSTER_DISABLE.flag();
buildOptionsFromCLI(argument, CURRENT_DIRECTORY);
assertEquals(false, options.getClusteringOptions().isEnabled());
assertEquals(false, options.clusteringOptions().isEnabled());
}

@Test
void parseDefaultClustering() {
buildOptionsFromCLI(CURRENT_DIRECTORY);
assertEquals(true, options.getClusteringOptions().isEnabled());
assertEquals(true, options.clusteringOptions().isEnabled());
}

@Test
void parsePercentilePreProcessor() {
String argument = buildArgument(CommandLineArgument.CLUSTER_PREPROCESSING_PERCENTILE, Float.toString(0.5f));
buildOptionsFromCLI(argument, CURRENT_DIRECTORY);
assertEquals(Preprocessing.PERCENTILE, options.getClusteringOptions().getPreprocessor());
assertEquals(0.5, options.getClusteringOptions().getPreprocessorPercentile(), EPSILON);
assertEquals(Preprocessing.PERCENTILE, options.clusteringOptions().getPreprocessor());
assertEquals(0.5, options.clusteringOptions().getPreprocessorPercentile(), EPSILON);
}

@Test
void parseCdfPreProcessor() {
String argument = CommandLineArgument.CLUSTER_PREPROCESSING_CDF.flag();
buildOptionsFromCLI(argument, CURRENT_DIRECTORY);
assertEquals(Preprocessing.CUMULATIVE_DISTRIBUTION_FUNCTION, options.getClusteringOptions().getPreprocessor());
assertEquals(Preprocessing.CUMULATIVE_DISTRIBUTION_FUNCTION, options.clusteringOptions().getPreprocessor());
}

@Test
void parseNoPreProcessor() {
String argument = CommandLineArgument.CLUSTER_PREPROCESSING_NONE.flag();
buildOptionsFromCLI(argument, CURRENT_DIRECTORY);
assertEquals(Preprocessing.NONE, options.getClusteringOptions().getPreprocessor());
assertEquals(Preprocessing.NONE, options.clusteringOptions().getPreprocessor());
}

}
6 changes: 3 additions & 3 deletions jplag.cli/src/test/java/de/jplag/cli/ComparisonModeTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class ComparisonModeTest extends CommandLineInterfaceTest {
@Test
void testDefaultMode() {
buildOptionsFromCLI(CURRENT_DIRECTORY);
assertEquals(JPlagOptions.DEFAULT_COMPARISON_MODE, options.getComparisonMode());
assertEquals(JPlagOptions.DEFAULT_COMPARISON_MODE, options.comparisonMode());
}

@Test
Expand All @@ -29,15 +29,15 @@ void testNormalMode() {
ComparisonMode mode = ComparisonMode.NORMAL;
String argument = buildArgument(CommandLineArgument.COMPARISON_MODE, mode.getName());
buildOptionsFromCLI(argument, CURRENT_DIRECTORY);
assertEquals(mode, options.getComparisonMode());
assertEquals(mode, options.comparisonMode());
}

@Test
void testParallelMode() {
ComparisonMode mode = ComparisonMode.PARALLEL;
String argument = buildArgument(CommandLineArgument.COMPARISON_MODE, mode.getName());
buildOptionsFromCLI(argument, CURRENT_DIRECTORY);
assertEquals(mode, options.getComparisonMode());
assertEquals(mode, options.comparisonMode());
}

}
4 changes: 2 additions & 2 deletions jplag.cli/src/test/java/de/jplag/cli/LanguageTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class LanguageTest extends CommandLineInterfaceTest {
@Test
void testDefaultLanguage() {
buildOptionsFromCLI(CURRENT_DIRECTORY);
assertEquals(CommandLineArgument.DEFAULT_LANGUAGE_IDENTIFIER, options.getLanguageIdentifier());
assertEquals(CommandLineArgument.DEFAULT_LANGUAGE_IDENTIFIER, options.language().getIdentifier());
}

@Test
Expand All @@ -36,7 +36,7 @@ void testValidLanguages() {
for (Language language : LanguageLoader.getAllAvailableLanguages().values()) {
String argument = buildArgument(CommandLineArgument.LANGUAGE, language.getIdentifier());
buildOptionsFromCLI(argument, CURRENT_DIRECTORY);
assertEquals(language.getIdentifier(), options.getLanguageIdentifier());
assertEquals(language.getIdentifier(), options.language().getIdentifier());
}
}

Expand Down
28 changes: 10 additions & 18 deletions jplag.cli/src/test/java/de/jplag/cli/MinTokenMatchTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,51 +6,43 @@
import org.junit.jupiter.api.Test;

import de.jplag.CommandLineArgument;
import de.jplag.JPlag;

public class MinTokenMatchTest extends CommandLineInterfaceTest {
class MinTokenMatchTest extends CommandLineInterfaceTest {

@Test
public void testLanguageDefault() {
void testLanguageDefault() {
// Language defaults not set yet:
buildOptionsFromCLI(CURRENT_DIRECTORY);
assertNull(options.getMinimumTokenMatch());
assertNull(options.getLanguage());

// Init JPlag:
new JPlag(options);

// Now the language is set:
assertNotNull(options.getLanguage());
assertEquals(options.getLanguage().minimumTokenMatch(), options.getMinimumTokenMatch().intValue());
assertNotNull(options.language());
assertEquals(options.language().minimumTokenMatch(), options.minimumTokenMatch().intValue());
}

@Test
public void testInvalidInput() throws Exception {
void testInvalidInput() throws Exception {
String argument = buildArgument(CommandLineArgument.MIN_TOKEN_MATCH, "Not an integer...");
int statusCode = catchSystemExit(() -> buildOptionsFromCLI(argument, CURRENT_DIRECTORY));
assertEquals(1, statusCode);
}

@Test
public void testUpperBound() throws Exception {
void testUpperBound() throws Exception {
String argument = buildArgument(CommandLineArgument.MIN_TOKEN_MATCH, "2147483648"); // max value plus one
int statusCode = catchSystemExit(() -> buildOptionsFromCLI(argument, CURRENT_DIRECTORY));
assertEquals(1, statusCode);
}

@Test
public void testLowerBound() {
void testLowerBound() {
String argument = buildArgument(CommandLineArgument.MIN_TOKEN_MATCH, Integer.toString(-1));
buildOptionsFromCLI(argument, CURRENT_DIRECTORY);
assertEquals(1, options.getMinimumTokenMatch().intValue());
assertEquals(1, options.minimumTokenMatch().intValue());
}

@Test
public void testValidThreshold() {
void testValidThreshold() {
int expectedValue = 50;
String argument = buildArgument(CommandLineArgument.MIN_TOKEN_MATCH, Integer.toString(expectedValue));
buildOptionsFromCLI(argument, CURRENT_DIRECTORY);
assertEquals(expectedValue, options.getMinimumTokenMatch().intValue());
assertEquals(expectedValue, options.minimumTokenMatch().intValue());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,52 +4,52 @@

import org.junit.jupiter.api.Test;

public class OldNewRootDirectoriesArgumentTest extends CommandLineInterfaceTest {
class OldNewRootDirectoriesArgumentTest extends CommandLineInterfaceTest {
@Test
public void testNoRootDirectories() {
void testNoRootDirectories() {
buildOptionsFromCLI();

assertEquals(0, options.getSubmissionDirectories().size());
assertEquals(0, options.getOldSubmissionDirectories().size());
assertEquals(0, options.submissionDirectories().size());
assertEquals(0, options.oldSubmissionDirectories().size());
}

@Test
public void testTwoRootDirectoryArguments() {
void testTwoRootDirectoryArguments() {
buildOptionsFromCLI("root1", "root2");

assertEquals(2, options.getSubmissionDirectories().size());
assertEquals(0, options.getOldSubmissionDirectories().size());
assertEquals(2, options.submissionDirectories().size());
assertEquals(0, options.oldSubmissionDirectories().size());
}

@Test
public void testNewOption() {
void testNewOption() {
buildOptionsFromCLI("-new", "root1", "root2");

assertEquals(2, options.getSubmissionDirectories().size());
assertEquals(0, options.getOldSubmissionDirectories().size());
assertEquals(2, options.submissionDirectories().size());
assertEquals(0, options.oldSubmissionDirectories().size());
}

@Test
public void testDoubleNewOption() {
void testDoubleNewOption() {
buildOptionsFromCLI("-new", "root1", "-new", "root2");

assertEquals(2, options.getSubmissionDirectories().size());
assertEquals(0, options.getOldSubmissionDirectories().size());
assertEquals(2, options.submissionDirectories().size());
assertEquals(0, options.oldSubmissionDirectories().size());
}

@Test
public void testOldOption() {
void testOldOption() {
buildOptionsFromCLI("-old", "root1");

assertEquals(0, options.getSubmissionDirectories().size());
assertEquals(1, options.getOldSubmissionDirectories().size());
assertEquals(0, options.submissionDirectories().size());
assertEquals(1, options.oldSubmissionDirectories().size());
}

@Test
public void testNewAndOldOption() {
void testNewAndOldOption() {
buildOptionsFromCLI("-new", "root1", "-old", "root2");

assertEquals(1, options.getSubmissionDirectories().size());
assertEquals(1, options.getOldSubmissionDirectories().size());
assertEquals(1, options.submissionDirectories().size());
assertEquals(1, options.oldSubmissionDirectories().size());
}
}
20 changes: 10 additions & 10 deletions jplag.cli/src/test/java/de/jplag/cli/SimiliarityThresholdTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,40 +8,40 @@
import de.jplag.CommandLineArgument;
import de.jplag.options.JPlagOptions;

public class SimiliarityThresholdTest extends CommandLineInterfaceTest {
class SimiliarityThresholdTest extends CommandLineInterfaceTest {

@Test
public void testDefaultThreshold() {
void testDefaultThreshold() {
buildOptionsFromCLI(CURRENT_DIRECTORY);
assertEquals(JPlagOptions.DEFAULT_SIMILARITY_THRESHOLD, options.getSimilarityThreshold(), DELTA);
assertEquals(JPlagOptions.DEFAULT_SIMILARITY_THRESHOLD, options.similarityThreshold(), DELTA);
}

@Test
public void testInvalidThreshold() throws Exception {
void testInvalidThreshold() throws Exception {
String argument = buildArgument(CommandLineArgument.SIMILARITY_THRESHOLD, "Not a float...");
int statusCode = catchSystemExit(() -> buildOptionsFromCLI(argument, CURRENT_DIRECTORY));
assertEquals(1, statusCode);
}

@Test
public void testLowerBound() {
void testLowerBound() {
String argument = buildArgument(CommandLineArgument.SIMILARITY_THRESHOLD, Float.toString(-1f));
buildOptionsFromCLI(argument, CURRENT_DIRECTORY);
assertEquals(0f, options.getSimilarityThreshold(), DELTA);
assertEquals(0f, options.similarityThreshold(), DELTA);
}

@Test
public void testUpperBound() {
void testUpperBound() {
String argument = buildArgument(CommandLineArgument.SIMILARITY_THRESHOLD, Float.toString(101f));
buildOptionsFromCLI(argument, CURRENT_DIRECTORY);
assertEquals(100f, options.getSimilarityThreshold(), DELTA);
assertEquals(100f, options.similarityThreshold(), DELTA);
}

@Test
public void testValidThreshold() {
void testValidThreshold() {
float expectedValue = 50f;
String argument = buildArgument(CommandLineArgument.SIMILARITY_THRESHOLD, Float.toString(expectedValue));
buildOptionsFromCLI(argument, CURRENT_DIRECTORY);
assertEquals(expectedValue, options.getSimilarityThreshold(), DELTA);
assertEquals(expectedValue, options.similarityThreshold(), DELTA);
}
}
Loading

0 comments on commit 8ec60b6

Please sign in to comment.