// Path: core/common/src/main/java/tech/harmonysoft/oss/traute/common/settings/TrautePluginSettings.java
// public class TrautePluginSettings {
// 
//     public static final String DEFAULT_EXCEPTION_TO_THROW = NullPointerException.class.getSimpleName();
// 
//     private final Set<String>                           notNullAnnotations          = new HashSet<>();
//     private final Set<String>                           nullableAnnotations         = new HashSet<>();
//     private final Set<InstrumentationType>              instrumentationsToApply     = new HashSet<>();
//     private final Map<InstrumentationType, String>      exceptionsToThrow           = new HashMap<>();
//     private final Map<InstrumentationType, String>      exceptionTextPatterns       = new HashMap<>();
//     private final Map<InstrumentationType, Set<String>> notNullByDefaultAnnotations = new HashMap<>();
// 
//     @Nullable private final File logFile;
// 
//     private final boolean verboseMode;
// 
//     public TrautePluginSettings(@NotNull Set<String> notNullAnnotations,
//                                 @NotNull Set<String> nullableAnnotations,
//                                 @NotNull Set<InstrumentationType> instrumentationsToApply,
//                                 @NotNull Map<InstrumentationType, String> exceptionsToThrow,
//                                 @NotNull Map<InstrumentationType, String> exceptionTextPatterns,
//                                 @NotNull Map<InstrumentationType, Set<String>> notNullByDefaultAnnotations,
//                                 @Nullable File logFile,
//                                 boolean verboseMode)
//     {
//         this.logFile = logFile;
//         this.notNullAnnotations.addAll(notNullAnnotations);
//         this.nullableAnnotations.addAll(nullableAnnotations);
//         this.instrumentationsToApply.addAll(instrumentationsToApply);
//         this.exceptionsToThrow.putAll(exceptionsToThrow);
//         this.exceptionTextPatterns.putAll(exceptionTextPatterns);
//         this.notNullByDefaultAnnotations.putAll(notNullByDefaultAnnotations);
//         this.verboseMode = verboseMode;
//     }
// 
//     @NotNull
//     public Set<String> getNotNullAnnotations() {
//         return notNullAnnotations;
//     }
// 
//     @NotNull
//     public Set<String> getNullableAnnotations() {
//         return nullableAnnotations;
//     }
// 
//     public boolean isEnabled(@NotNull InstrumentationType type) {
//         return instrumentationsToApply.contains(type);
//     }
// 
//     @NotNull
//     public Set<InstrumentationType> getInstrumentationsToApply() {
//         return instrumentationsToApply;
//     }
// 
//     @NotNull
//     public String getExceptionToThrow(@NotNull InstrumentationType type) {
//         return exceptionsToThrow.getOrDefault(type, DEFAULT_EXCEPTION_TO_THROW);
//     }
// 
//     @NotNull
//     public Map<InstrumentationType, String> getExceptionsToThrow() {
//         return exceptionsToThrow;
//     }
// 
//     @Nullable
//     public String getExceptionTextPattern(@NotNull InstrumentationType type) {
//         return exceptionTextPatterns.get(type);
//     }
// 
//     @NotNull
//     public Map<InstrumentationType, String> getExceptionTextPatterns() {
//         return exceptionTextPatterns;
//     }
// 
//     @NotNull
//     public Set<String> getNotNullByDefaultAnnotations(@NotNull InstrumentationType type) {
//         return notNullByDefaultAnnotations.get(type);
//     }
// 
//     @NotNull
//     public Map<InstrumentationType, Set<String>> getNotNullByDefaultAnnotations() {
//         return notNullByDefaultAnnotations;
//     }
// 
//     @NotNull
//     public Optional<File> getLogFile() {
//         return Optional.ofNullable(logFile);
//     }
// 
//     public boolean isVerboseMode() {
//         return verboseMode;
//     }
// }
// 
// Path: core/test/src/test/java/tech/harmonysoft/oss/traute/test/api/expectation/Expectation.java
// public interface Expectation<T> {
// 
//     /**
//      * Ensures that given data matches current expectations. Is expected to call {@link Assertions#fail(String)}
//      * in case of the mismatch.
//      *
//      * @param actual    data to match
//      */
//     void match(@NotNull T actual);
// }
// 
// Path: core/test/src/test/java/tech/harmonysoft/oss/traute/test/api/model/CompilationResult.java
// public interface CompilationResult extends Result<Collection<TestSource>> {
// 
//     /**
//      * @return      compiled classes. We use a {@link Supplier} here because there is a possible case that
//      *              compilation is failed and the test wants to check its {@code stderr}. We return a collection
//      *              of {@link ClassFile} because a single source file might result in multiple binaries after
//      *              compilation, e.g. when an inner/anonymous classes are involved
//      */
//     @NotNull
//     Supplier<Collection<ClassFile>> getCompiledClassesSupplier();
// 
//     /**
//      * @return      compiler's output generated during processing {@link #getInput() target binaries}
//      */
//     @NotNull
//     String getCompilationOutput();
// }
// 
// Path: core/test/src/test/java/tech/harmonysoft/oss/traute/test/api/model/TestSource.java
// public interface TestSource {
// 
//     /**
//      * @return  complete test source
//      */
//     @NotNull
//     String getSourceText();
// 
//     /**
//      * @return  qualified class name for the given test source
//      */
//     @NotNull
//     String getQualifiedClassName();
// }


import org.jetbrains.annotations.NotNull;
import tech.harmonysoft.oss.traute.common.settings.TrautePluginSettings;
import tech.harmonysoft.oss.traute.test.api.expectation.Expectation;
import tech.harmonysoft.oss.traute.test.api.model.CompilationResult;
import tech.harmonysoft.oss.traute.test.api.model.TestSource;
import java.util.Collection;
package tech.harmonysoft.oss.traute.test.api.engine;



/**
 * Defines an interface for a service which knows how to produce a {@link CompilationResult} from a {@link TestSource}.
 */
public interface TestCompiler {

    /**
     * Produces a {@link CompilationResult} from the given {@link TestSource}
     *
     * @param testSources    test sources to compile
     * @param settings       plugin settings to use
     * @return               compilation result
     */
    @NotNull
// Path: core/common/src/main/java/tech/harmonysoft/oss/traute/common/settings/TrautePluginSettings.java
// public class TrautePluginSettings {
// 
//     public static final String DEFAULT_EXCEPTION_TO_THROW = NullPointerException.class.getSimpleName();
// 
//     private final Set<String>                           notNullAnnotations          = new HashSet<>();
//     private final Set<String>                           nullableAnnotations         = new HashSet<>();
//     private final Set<InstrumentationType>              instrumentationsToApply     = new HashSet<>();
//     private final Map<InstrumentationType, String>      exceptionsToThrow           = new HashMap<>();
//     private final Map<InstrumentationType, String>      exceptionTextPatterns       = new HashMap<>();
//     private final Map<InstrumentationType, Set<String>> notNullByDefaultAnnotations = new HashMap<>();
// 
//     @Nullable private final File logFile;
// 
//     private final boolean verboseMode;
// 
//     public TrautePluginSettings(@NotNull Set<String> notNullAnnotations,
//                                 @NotNull Set<String> nullableAnnotations,
//                                 @NotNull Set<InstrumentationType> instrumentationsToApply,
//                                 @NotNull Map<InstrumentationType, String> exceptionsToThrow,
//                                 @NotNull Map<InstrumentationType, String> exceptionTextPatterns,
//                                 @NotNull Map<InstrumentationType, Set<String>> notNullByDefaultAnnotations,
//                                 @Nullable File logFile,
//                                 boolean verboseMode)
//     {
//         this.logFile = logFile;
//         this.notNullAnnotations.addAll(notNullAnnotations);
//         this.nullableAnnotations.addAll(nullableAnnotations);
//         this.instrumentationsToApply.addAll(instrumentationsToApply);
//         this.exceptionsToThrow.putAll(exceptionsToThrow);
//         this.exceptionTextPatterns.putAll(exceptionTextPatterns);
//         this.notNullByDefaultAnnotations.putAll(notNullByDefaultAnnotations);
//         this.verboseMode = verboseMode;
//     }
// 
//     @NotNull
//     public Set<String> getNotNullAnnotations() {
//         return notNullAnnotations;
//     }
// 
//     @NotNull
//     public Set<String> getNullableAnnotations() {
//         return nullableAnnotations;
//     }
// 
//     public boolean isEnabled(@NotNull InstrumentationType type) {
//         return instrumentationsToApply.contains(type);
//     }
// 
//     @NotNull
//     public Set<InstrumentationType> getInstrumentationsToApply() {
//         return instrumentationsToApply;
//     }
// 
//     @NotNull
//     public String getExceptionToThrow(@NotNull InstrumentationType type) {
//         return exceptionsToThrow.getOrDefault(type, DEFAULT_EXCEPTION_TO_THROW);
//     }
// 
//     @NotNull
//     public Map<InstrumentationType, String> getExceptionsToThrow() {
//         return exceptionsToThrow;
//     }
// 
//     @Nullable
//     public String getExceptionTextPattern(@NotNull InstrumentationType type) {
//         return exceptionTextPatterns.get(type);
//     }
// 
//     @NotNull
//     public Map<InstrumentationType, String> getExceptionTextPatterns() {
//         return exceptionTextPatterns;
//     }
// 
//     @NotNull
//     public Set<String> getNotNullByDefaultAnnotations(@NotNull InstrumentationType type) {
//         return notNullByDefaultAnnotations.get(type);
//     }
// 
//     @NotNull
//     public Map<InstrumentationType, Set<String>> getNotNullByDefaultAnnotations() {
//         return notNullByDefaultAnnotations;
//     }
// 
//     @NotNull
//     public Optional<File> getLogFile() {
//         return Optional.ofNullable(logFile);
//     }
// 
//     public boolean isVerboseMode() {
//         return verboseMode;
//     }
// }
// 
// Path: core/test/src/test/java/tech/harmonysoft/oss/traute/test/api/expectation/Expectation.java
// public interface Expectation<T> {
// 
//     /**
//      * Ensures that given data matches current expectations. Is expected to call {@link Assertions#fail(String)}
//      * in case of the mismatch.
//      *
//      * @param actual    data to match
//      */
//     void match(@NotNull T actual);
// }
// 
// Path: core/test/src/test/java/tech/harmonysoft/oss/traute/test/api/model/CompilationResult.java
// public interface CompilationResult extends Result<Collection<TestSource>> {
// 
//     /**
//      * @return      compiled classes. We use a {@link Supplier} here because there is a possible case that
//      *              compilation is failed and the test wants to check its {@code stderr}. We return a collection
//      *              of {@link ClassFile} because a single source file might result in multiple binaries after
//      *              compilation, e.g. when an inner/anonymous classes are involved
//      */
//     @NotNull
//     Supplier<Collection<ClassFile>> getCompiledClassesSupplier();
// 
//     /**
//      * @return      compiler's output generated during processing {@link #getInput() target binaries}
//      */
//     @NotNull
//     String getCompilationOutput();
// }
// 
// Path: core/test/src/test/java/tech/harmonysoft/oss/traute/test/api/model/TestSource.java
// public interface TestSource {
// 
//     /**
//      * @return  complete test source
//      */
//     @NotNull
//     String getSourceText();
// 
//     /**
//      * @return  qualified class name for the given test source
//      */
//     @NotNull
//     String getQualifiedClassName();
// }


// Path: core/test/src/test/java/tech/harmonysoft/oss/traute/test/api/engine/TestCompiler.java
import org.jetbrains.annotations.NotNull;
import tech.harmonysoft.oss.traute.common.settings.TrautePluginSettings;
import tech.harmonysoft.oss.traute.test.api.expectation.Expectation;
import tech.harmonysoft.oss.traute.test.api.model.CompilationResult;
import tech.harmonysoft.oss.traute.test.api.model.TestSource;
import java.util.Collection;

package tech.harmonysoft.oss.traute.test.api.engine;



/**
 * Defines an interface for a service which knows how to produce a {@link CompilationResult} from a {@link TestSource}.
 */
public interface TestCompiler {

    /**
     * Produces a {@link CompilationResult} from the given {@link TestSource}
     *
     * @param testSources    test sources to compile
     * @param settings       plugin settings to use
     * @return               compilation result
     */
    @NotNull
    CompilationResult compile(@NotNull Collection<TestSource> testSources, @NotNull TrautePluginSettings settings);