Skip to content

Commit

Permalink
Added simple tests for multi language
Browse files Browse the repository at this point in the history
  • Loading branch information
TwoOfTwelve committed Dec 2, 2024
1 parent 0dd5f8e commit d62a358
Show file tree
Hide file tree
Showing 5 changed files with 106 additions and 4 deletions.
15 changes: 14 additions & 1 deletion languages/multi-language/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,19 @@
</parent>
<artifactId>multi-language</artifactId>

<dependencies></dependencies>
<dependencies>
<dependency>
<groupId>de.jplag</groupId>
<artifactId>java</artifactId>
<version>${revision}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>de.jplag</groupId>
<artifactId>cpp</artifactId>
<version>${revision}</version>
<scope>test</scope>
</dependency>
</dependencies>

</project>
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,24 @@

public class MultiLanguageOptions extends LanguageOptions {
private static final String ERROR_LANGUAGE_NOT_FOUND = "The selected language %s could not be found";
private static final String ERROR_NOT_ENOUGH_LANGUAGES = "To use multi language specify at least 2 languages";
private static final String ERROR_NOT_ENOUGH_LANGUAGES = "To use multi language specify at least 1 language";

public LanguageOption<String> languageNames = createOption(OptionType.string(), "langs",
public LanguageOption<String> languageNames = createOption(OptionType.string(), "languages",
"The languages that should be used. This is a ',' separated list");
private List<Language> languages = null;

public List<Language> getLanguages() {
if (this.languages == null) {
if (languageNames.getValue() == null) {
throw new IllegalArgumentException(ERROR_NOT_ENOUGH_LANGUAGES);
}

List<Language> languages = Arrays.stream(languageNames.getValue().split(","))
.map(name -> LanguageLoader.getLanguage(name)
.orElseThrow(() -> new IllegalArgumentException(String.format(ERROR_LANGUAGE_NOT_FOUND, name))))
.filter(language -> !language.getClass().equals(MultiLanguage.class)).toList();

if (languages.size() <= 1) {
if (languages.isEmpty()) {
throw new IllegalArgumentException(ERROR_NOT_ENOUGH_LANGUAGES);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package de.java.multilang;

import static de.jplag.SharedTokenType.FILE_END;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;

import de.jplag.ParsingException;
import de.jplag.Token;
import de.jplag.TokenType;
import de.jplag.cpp.CPPTokenType;
import de.jplag.java.JavaTokenType;
import de.jplag.multilang.MultiLanguage;
import de.jplag.multilang.MultiLanguageOptions;

public class MultilangTest {
private static File testDataDirectory;
private static File javaCode;
private static File cppCode;

private static List<TokenType> expectedTokens = List.of(CPPTokenType.FUNCTION_BEGIN, CPPTokenType.RETURN, CPPTokenType.FUNCTION_END, FILE_END,
JavaTokenType.J_CLASS_BEGIN, JavaTokenType.J_CLASS_END, FILE_END);

@BeforeAll
static void setUp() throws IOException {
testDataDirectory = Files.createTempDirectory("multiLanguageTestData").toFile();
cppCode = new File(testDataDirectory, "CppCode.cpp");
javaCode = new File(testDataDirectory, "JavaCode.java");

MultilangTest.class.getResourceAsStream("/de/jplag/multilang/testDataSet/CppCode.cpp").transferTo(new FileOutputStream(cppCode));
MultilangTest.class.getResourceAsStream("/de/jplag/multilang/testDataSet/JavaCode.java").transferTo(new FileOutputStream(javaCode));
}

@Test
void testMultiLanguageParsing() throws ParsingException {
MultiLanguage languageModule = new MultiLanguage();
((MultiLanguageOptions) languageModule.getOptions()).languageNames.setValue("java,cpp");

Set<File> sources = new TreeSet<>(List.of(javaCode, cppCode)); // Using TreeSet to ensure order of entries
List<Token> tokens = languageModule.parse(sources, false);

Assertions.assertEquals(expectedTokens, tokens.stream().map(Token::getType).toList());
}

@Test
void testNoLanguagesConfigured() {
MultiLanguage languageModule = new MultiLanguage();
Assertions.assertThrowsExactly(IllegalArgumentException.class, () -> {
languageModule.parse(Set.of(javaCode, cppCode), false);
});
}

@Test
void testInvalidLanguage() {
MultiLanguage languageModule = new MultiLanguage();
((MultiLanguageOptions) languageModule.getOptions()).languageNames.setValue("thisIsNotALanguage");

Assertions.assertThrowsExactly(IllegalArgumentException.class, () -> {
languageModule.parse(Set.of(javaCode, cppCode), false);
});
}

@AfterAll
static void cleanUp() {
javaCode.delete();
cppCode.delete();
testDataDirectory.delete();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
int main() {
return 0;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
public class JavaCode {

}

0 comments on commit d62a358

Please sign in to comment.