// Path: x_common/compiler-testing/src/main/java/org/zalando/techtalks/hackingjava/common/compiler/CompilationResult.java
// public final class CompilationResult {
// 
//     private final boolean success;
//     private final List<String> warnings;
//     private final List<String> errors;
// 
//     public boolean isSuccess() {
//         return success;
//     }
// 
//     public List<String> getWarnings() {
//         return Collections.unmodifiableList(warnings);
//     }
// 
//     public List<String> getErrors() {
//         return Collections.unmodifiableList(errors);
//     }
// 
//     public CompilationResult(final boolean success, final List<String> warnings, final List<String> errors) {
//         this.success = success;
//         this.warnings = new ArrayList<>(warnings);
//         this.errors = new ArrayList<>(errors);
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hash(success, warnings, errors);
//     }
// 
//     @Override
//     public boolean equals(final Object obj) {
//         if (this == obj) {
//             return true;
//         }
// 
//         if (obj == null || getClass() != obj.getClass()) {
//             return false;
//         }
// 
//         final CompilationResult other = (CompilationResult) obj;
//         return Objects.equals(this.success, other.success) && Objects.equals(this.warnings, other.warnings)
//                 && Objects.equals(this.errors, other.errors);
//     }
// 
//     @Override
//     public String toString() {
//         return "CompilationResult{" + "success=" + success + ", warnings=" + warnings + ", errors=" + errors + '}';
//     }
// }
// 
// Path: 3_defect-analysis/x_baseline/src/main/java/org/zalando/techtalks/hackingjava/defectanalysis/baseline/marker/IllBehaved.java
// public interface IllBehaved {}
// 
// Path: 3_defect-analysis/x_baseline/src/main/java/org/zalando/techtalks/hackingjava/defectanalysis/baseline/marker/WellBehaved.java
// public interface WellBehaved {
// }


import org.junit.Test;
import org.zalando.techtalks.hackingjava.common.compiler.CompilationResult;
import org.zalando.techtalks.hackingjava.defectanalysis.baseline.marker.IllBehaved;
import org.zalando.techtalks.hackingjava.defectanalysis.baseline.marker.WellBehaved;
import static org.junit.Assert.assertThat;
package org.zalando.techtalks.hackingjava.defectanalysis.tests;



public abstract class AbstractDefectDetectionTest extends AbstractCompilerTest {

    protected abstract Class<? extends WellBehaved> wellBehavedClass();

    protected abstract Class<? extends IllBehaved> illBehavedClass();

    @Test
    public void detectWellBehavedClass() {
        final CompilationResult result = engine.compile(sourceFileFor(wellBehavedClass()));
        assertThat(result, isSuccess());
    }

    @Test
    public void detectIllBehavedClass() {
// Path: x_common/compiler-testing/src/main/java/org/zalando/techtalks/hackingjava/common/compiler/CompilationResult.java
// public final class CompilationResult {
// 
//     private final boolean success;
//     private final List<String> warnings;
//     private final List<String> errors;
// 
//     public boolean isSuccess() {
//         return success;
//     }
// 
//     public List<String> getWarnings() {
//         return Collections.unmodifiableList(warnings);
//     }
// 
//     public List<String> getErrors() {
//         return Collections.unmodifiableList(errors);
//     }
// 
//     public CompilationResult(final boolean success, final List<String> warnings, final List<String> errors) {
//         this.success = success;
//         this.warnings = new ArrayList<>(warnings);
//         this.errors = new ArrayList<>(errors);
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hash(success, warnings, errors);
//     }
// 
//     @Override
//     public boolean equals(final Object obj) {
//         if (this == obj) {
//             return true;
//         }
// 
//         if (obj == null || getClass() != obj.getClass()) {
//             return false;
//         }
// 
//         final CompilationResult other = (CompilationResult) obj;
//         return Objects.equals(this.success, other.success) && Objects.equals(this.warnings, other.warnings)
//                 && Objects.equals(this.errors, other.errors);
//     }
// 
//     @Override
//     public String toString() {
//         return "CompilationResult{" + "success=" + success + ", warnings=" + warnings + ", errors=" + errors + '}';
//     }
// }
// 
// Path: 3_defect-analysis/x_baseline/src/main/java/org/zalando/techtalks/hackingjava/defectanalysis/baseline/marker/IllBehaved.java
// public interface IllBehaved {}
// 
// Path: 3_defect-analysis/x_baseline/src/main/java/org/zalando/techtalks/hackingjava/defectanalysis/baseline/marker/WellBehaved.java
// public interface WellBehaved {
// }


// Path: 3_defect-analysis/x_tests/src/main/java/org/zalando/techtalks/hackingjava/defectanalysis/tests/AbstractDefectDetectionTest.java
import org.junit.Test;
import org.zalando.techtalks.hackingjava.common.compiler.CompilationResult;
import org.zalando.techtalks.hackingjava.defectanalysis.baseline.marker.IllBehaved;
import org.zalando.techtalks.hackingjava.defectanalysis.baseline.marker.WellBehaved;
import static org.junit.Assert.assertThat;

package org.zalando.techtalks.hackingjava.defectanalysis.tests;



public abstract class AbstractDefectDetectionTest extends AbstractCompilerTest {

    protected abstract Class<? extends WellBehaved> wellBehavedClass();

    protected abstract Class<? extends IllBehaved> illBehavedClass();

    @Test
    public void detectWellBehavedClass() {
        final CompilationResult result = engine.compile(sourceFileFor(wellBehavedClass()));
        assertThat(result, isSuccess());
    }

    @Test
    public void detectIllBehavedClass() {
        final CompilationResult result = engine.compile(sourceFileFor(illBehavedClass()));