// Path: src/main/java/de/skuzzle/enforcer/restrictimports/parser/ImportStatement.java
// public final class ImportStatement {
// 
//     private static final String IMPORT_PREFIX = "import ";
//     private static final String STATIC_PREFIX = "static ";
//     private final String importName;
//     private final int line;
//     private final boolean staticImport;
// 
//     public ImportStatement(String importName, int line, boolean staticImport) {
//         Preconditions.checkArgument(importName != null && !importName.isEmpty(), "importName must not be empty");
//         Preconditions.checkArgument(!importName.startsWith(IMPORT_PREFIX),
//                 "importName should be the raw package name without 'import ' prefix but was: '%s'", importName);
//         Preconditions.checkArgument(!importName.startsWith(STATIC_PREFIX),
//                 "importName should be the raw package name without 'static ' prefix but was: '%s'", importName);
//         Preconditions.checkArgument(importName.trim().equals(importName),
//                 "importName has leading or trailing spaces: '%s'", importName);
//         Preconditions.checkArgument(line > 0, "line numbers should be 1-based and not start at 0");
// 
//         this.importName = importName;
//         this.line = line;
//         this.staticImport = staticImport;
//     }
// 
//     /**
//      * The physical line within the source file in which the import has occurred. Number
//      * is always 1-based!
//      *
//      * @return The line number of the matched imports.
//      */
//     public int getLine() {
//         return line;
//     }
// 
//     /**
//      * Returns the import name including the 'static ' prefix if this represents a static
//      * import.
//      *
//      * @return The full import name.
//      */
//     public String getImportName() {
//         if (staticImport) {
//             return STATIC_PREFIX + importName;
//         }
//         return importName;
//     }
// 
//     public String getFqcn() {
//         return importName;
//     }
// 
//     @Override
//     public String toString() {
//         return StringRepresentation.ofInstance(this)
//                 .add("import", importName)
//                 .add("line", line)
//                 .add("static", staticImport)
//                 .toString();
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hash(importName, line, staticImport);
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         return obj == this || obj instanceof ImportStatement
//                 && Objects.equals(this.line, ((ImportStatement) obj).line)
//                 && Objects.equals(this.staticImport, ((ImportStatement) obj).staticImport)
//                 && Objects.equals(this.importName, ((ImportStatement) obj).importName);
//     }
// }
// 
// Path: src/main/java/de/skuzzle/enforcer/restrictimports/parser/ParsedFile.java
// public final class ParsedFile {
// 
//     private final Path path;
//     private final String declaredPackage;
//     private final String fqcn;
//     private final Collection<ImportStatement> imports;
// 
//     public ParsedFile(Path path, String declaredPackage, String fqcn, Collection<ImportStatement> imports) {
//         this.path = path;
//         this.declaredPackage = declaredPackage;
//         this.fqcn = fqcn;
//         this.imports = imports;
//     }
// 
//     public Path getPath() {
//         return path;
//     }
// 
//     public Collection<ImportStatement> getImports() {
//         return imports;
//     }
// 
//     public String getFqcn() {
//         return fqcn;
//     }
// 
//     @Override
//     public String toString() {
//         return StringRepresentation.ofInstance(this)
//                 .add("path", path)
//                 .add("declaredPackage", declaredPackage)
//                 .add("fqcn", fqcn)
//                 .add("imports", imports)
//                 .toString();
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hash(path, declaredPackage, fqcn, imports);
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         return obj == this || obj instanceof ParsedFile
//                 && Objects.equals(path, ((ParsedFile) obj).path)
//                 && Objects.equals(declaredPackage, ((ParsedFile) obj).declaredPackage)
//                 && Objects.equals(fqcn, ((ParsedFile) obj).fqcn)
//                 && Objects.equals(imports, ((ParsedFile) obj).imports);
//     }
// 
// }


import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import org.junit.jupiter.api.Test;
import de.skuzzle.enforcer.restrictimports.parser.ImportStatement;
import de.skuzzle.enforcer.restrictimports.parser.ParsedFile;
package de.skuzzle.enforcer.restrictimports.analyze;





class ImportAnalyzerTest {

    private final ImportAnalyzer subject = new ImportAnalyzer();

    private final ParsedFile parsedFile = parsedFile("File", "de.skuzzle.test",
            "de.skuzzle.sample.Test",
            "foo.bar.xyz",
            "de.skuzzle.sample.Test2",
            "de.skuzzle.sample.Test3",
            "de.foo.bar.Test");

    private ParsedFile parsedFile(String className, String packageName, String... lines) {
        final String fqcn = packageName + "." + className;
        final Path path = mock(Path.class);
// Path: src/main/java/de/skuzzle/enforcer/restrictimports/parser/ImportStatement.java
// public final class ImportStatement {
// 
//     private static final String IMPORT_PREFIX = "import ";
//     private static final String STATIC_PREFIX = "static ";
//     private final String importName;
//     private final int line;
//     private final boolean staticImport;
// 
//     public ImportStatement(String importName, int line, boolean staticImport) {
//         Preconditions.checkArgument(importName != null && !importName.isEmpty(), "importName must not be empty");
//         Preconditions.checkArgument(!importName.startsWith(IMPORT_PREFIX),
//                 "importName should be the raw package name without 'import ' prefix but was: '%s'", importName);
//         Preconditions.checkArgument(!importName.startsWith(STATIC_PREFIX),
//                 "importName should be the raw package name without 'static ' prefix but was: '%s'", importName);
//         Preconditions.checkArgument(importName.trim().equals(importName),
//                 "importName has leading or trailing spaces: '%s'", importName);
//         Preconditions.checkArgument(line > 0, "line numbers should be 1-based and not start at 0");
// 
//         this.importName = importName;
//         this.line = line;
//         this.staticImport = staticImport;
//     }
// 
//     /**
//      * The physical line within the source file in which the import has occurred. Number
//      * is always 1-based!
//      *
//      * @return The line number of the matched imports.
//      */
//     public int getLine() {
//         return line;
//     }
// 
//     /**
//      * Returns the import name including the 'static ' prefix if this represents a static
//      * import.
//      *
//      * @return The full import name.
//      */
//     public String getImportName() {
//         if (staticImport) {
//             return STATIC_PREFIX + importName;
//         }
//         return importName;
//     }
// 
//     public String getFqcn() {
//         return importName;
//     }
// 
//     @Override
//     public String toString() {
//         return StringRepresentation.ofInstance(this)
//                 .add("import", importName)
//                 .add("line", line)
//                 .add("static", staticImport)
//                 .toString();
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hash(importName, line, staticImport);
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         return obj == this || obj instanceof ImportStatement
//                 && Objects.equals(this.line, ((ImportStatement) obj).line)
//                 && Objects.equals(this.staticImport, ((ImportStatement) obj).staticImport)
//                 && Objects.equals(this.importName, ((ImportStatement) obj).importName);
//     }
// }
// 
// Path: src/main/java/de/skuzzle/enforcer/restrictimports/parser/ParsedFile.java
// public final class ParsedFile {
// 
//     private final Path path;
//     private final String declaredPackage;
//     private final String fqcn;
//     private final Collection<ImportStatement> imports;
// 
//     public ParsedFile(Path path, String declaredPackage, String fqcn, Collection<ImportStatement> imports) {
//         this.path = path;
//         this.declaredPackage = declaredPackage;
//         this.fqcn = fqcn;
//         this.imports = imports;
//     }
// 
//     public Path getPath() {
//         return path;
//     }
// 
//     public Collection<ImportStatement> getImports() {
//         return imports;
//     }
// 
//     public String getFqcn() {
//         return fqcn;
//     }
// 
//     @Override
//     public String toString() {
//         return StringRepresentation.ofInstance(this)
//                 .add("path", path)
//                 .add("declaredPackage", declaredPackage)
//                 .add("fqcn", fqcn)
//                 .add("imports", imports)
//                 .toString();
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hash(path, declaredPackage, fqcn, imports);
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         return obj == this || obj instanceof ParsedFile
//                 && Objects.equals(path, ((ParsedFile) obj).path)
//                 && Objects.equals(declaredPackage, ((ParsedFile) obj).declaredPackage)
//                 && Objects.equals(fqcn, ((ParsedFile) obj).fqcn)
//                 && Objects.equals(imports, ((ParsedFile) obj).imports);
//     }
// 
// }


// Path: src/test/java/de/skuzzle/enforcer/restrictimports/analyze/ImportAnalyzerTest.java
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import org.junit.jupiter.api.Test;
import de.skuzzle.enforcer.restrictimports.parser.ImportStatement;
import de.skuzzle.enforcer.restrictimports.parser.ParsedFile;

package de.skuzzle.enforcer.restrictimports.analyze;





class ImportAnalyzerTest {

    private final ImportAnalyzer subject = new ImportAnalyzer();

    private final ParsedFile parsedFile = parsedFile("File", "de.skuzzle.test",
            "de.skuzzle.sample.Test",
            "foo.bar.xyz",
            "de.skuzzle.sample.Test2",
            "de.skuzzle.sample.Test3",
            "de.foo.bar.Test");

    private ParsedFile parsedFile(String className, String packageName, String... lines) {
        final String fqcn = packageName + "." + className;
        final Path path = mock(Path.class);
        final Path fileName = mock(Path.class);