package org.codefx.mvn.jdeps.parse;
import org.codefx.mvn.jdeps.dependency.InternalType;
import org.codefx.mvn.jdeps.dependency.Type;
import org.codefx.mvn.jdeps.dependency.Violation;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import java.io.BufferedReader;
import java.io.StringReader;
import java.util.function.Consumer;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
/**
* Tests the class {@link ViolationParser}.
*/
public class ViolationParserTest {
private ViolationParser parser;
private Consumer<Violation> violationVerifier;
@Before
public void setup() {
violationVerifier = mock(Consumer.class);
parser = new ViolationParser(violationVerifier);
}
// isInternalTypeLine
@Test(expected = NullPointerException.class)
public void parseLine_nullLine_throwsNullPointerException() throws Exception {
parser.parseLine(null);
}
@Test
public void isViolation_emptyLine_createsNoViolation() throws Exception {
parser.parseLine("");
verifyZeroInteractions(violationVerifier);
}
@Test(expected = IllegalStateException.class)
public void isViolation_onlyDependent_throwsIllegalStateException() throws Exception {
String onlyDependent = " org.codefx.lab.App (target)\n";
parseBlock(parser, onlyDependent);
}
@Test
public void parseLine_matchingBlock$1_createsViolation() throws Exception {
String matchingBlock = ""
+ " org.codefx.lab.App (target)\n"
+ " -> sun.misc.BASE64Decoder JDK internal API (rt.jar)\n"
+ " -> sun.misc.Unsafe JDK internal API (rt.jar)\n";
ArgumentCaptor<Violation> violationCaptor = ArgumentCaptor.forClass(Violation.class);
parseBlock(parser, matchingBlock);
verify(violationVerifier).accept(violationCaptor.capture());
Violation violation = violationCaptor.getValue();
assertThat(violation.getDependent()).isEqualTo(Type.of("org.codefx.lab", "App"));
assertThat(violation.getInternalDependencies())
.hasSize(2)
.contains(InternalType.of("sun.misc", "BASE64Decoder", "JDK internal API", "rt.jar"))
.contains(InternalType.of("sun.misc", "Unsafe", "JDK internal API", "rt.jar"));
}
@Test
public void parseLine_matchingBlockWithCapitalLettersInDependendent_createsViolation() throws Exception {
String matchingBlockWithCapitalLettersInDependent = ""
+ " Org.codefx.lAb.App (target)\n"
+ " -> sun.misc.BASE64Decoder JDK internal API (rt.jar)\n"
+ " -> sun.misc.Unsafe JDK internal API (rt.jar)\n";
ArgumentCaptor<Violation> violationCaptor = ArgumentCaptor.forClass(Violation.class);
parseBlock(parser, matchingBlockWithCapitalLettersInDependent);
verify(violationVerifier).accept(violationCaptor.capture());
Violation violation = violationCaptor.getValue();
assertThat(violation.getDependent()).isEqualTo(Type.of("Org.codefx.lAb", "App"));
}
@Test
public void parseLine_matchingBlockWithCapitalLettersInDependencies_createsViolation() throws Exception {
String matchingBlockWithCapitalLettersInDependencies = ""
+ " org.codefx.lab.App (target)\n"
+ " -> Sun.misc.BASE64Decoder JDK internal API (rt.jar)\n"
+ " -> sun.miSc.Unsafe JDK internal API (rt.jar)\n";
ArgumentCaptor<Violation> violationCaptor = ArgumentCaptor.forClass(Violation.class);
parseBlock(parser, matchingBlockWithCapitalLettersInDependencies);
verify(violationVerifier).accept(violationCaptor.capture());
Violation violation = violationCaptor.getValue();
assertThat(violation.getInternalDependencies())
.hasSize(2)
.contains(InternalType.of("Sun.misc", "BASE64Decoder", "JDK internal API", "rt.jar"))
.contains(InternalType.of("sun.miSc", "Unsafe", "JDK internal API", "rt.jar"));
}
private static void parseBlock(ViolationParser parser, String block) {
new BufferedReader(new StringReader(block))
.lines()
.forEach(parser::parseLine);
parser.finish();
}
}