// Path: src/main/java/io/jvoid/instrumentation/provider/api/ClassHandler.java
// public interface ClassHandler {
// 
//     void handleClass(CtClass ctClass) throws CannotCompileException;
// 
// }
// 
// Path: src/main/java/io/jvoid/instrumentation/provider/api/InstrumentationProvider.java
// public interface InstrumentationProvider {
// 
//     boolean matches(CtClass ctClass);
// 
//     List<ClassHandler> getClassHandlers(CtClass ctClass);
// 
//     List<MethodInstrumenter> getMethodInstrumenters(CtMethod ctMethod);
// 
// }
// 
// Path: src/main/java/io/jvoid/instrumentation/provider/api/MethodInstrumenter.java
// public interface MethodInstrumenter {
// 
//     void instrument(CtMethod ctMethod) throws CannotCompileException;
// 
//     boolean shouldInstrument(CtMethod ctMethod);
// 
// }


import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.google.inject.Inject;
import io.jvoid.instrumentation.provider.api.ClassHandler;
import io.jvoid.instrumentation.provider.api.InstrumentationProvider;
import io.jvoid.instrumentation.provider.api.MethodInstrumenter;
import javassist.CtClass;
import javassist.CtMethod;
package io.jvoid.instrumentation.provider.junit4;




/**
 * JVoid instrumentation provider for JUnit 4. It will integrate with JUnit 4 test
 * lifecycle, being able to track the status of the tests and skipping them in case
 * their execution is not necessary because no changes have been made to the classes
 * of the application.
 *
 */
public class JUnitInstrumentationProvider implements InstrumentationProvider {

    private Map<String, MethodInstrumenter> instrumenterMap;

    @Inject
    public JUnitInstrumentationProvider(JUnitRunNotifierMethodInstrumenter junitRunNotifierMethodInstrumenter,
                                        RunChildMethodInstrumenter runChildMethodInstrumenter) {
        this.instrumenterMap = new HashMap<>();
// Path: src/main/java/io/jvoid/instrumentation/provider/api/ClassHandler.java
// public interface ClassHandler {
// 
//     void handleClass(CtClass ctClass) throws CannotCompileException;
// 
// }
// 
// Path: src/main/java/io/jvoid/instrumentation/provider/api/InstrumentationProvider.java
// public interface InstrumentationProvider {
// 
//     boolean matches(CtClass ctClass);
// 
//     List<ClassHandler> getClassHandlers(CtClass ctClass);
// 
//     List<MethodInstrumenter> getMethodInstrumenters(CtMethod ctMethod);
// 
// }
// 
// Path: src/main/java/io/jvoid/instrumentation/provider/api/MethodInstrumenter.java
// public interface MethodInstrumenter {
// 
//     void instrument(CtMethod ctMethod) throws CannotCompileException;
// 
//     boolean shouldInstrument(CtMethod ctMethod);
// 
// }


// Path: src/main/java/io/jvoid/instrumentation/provider/junit4/JUnitInstrumentationProvider.java
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.google.inject.Inject;
import io.jvoid.instrumentation.provider.api.ClassHandler;
import io.jvoid.instrumentation.provider.api.InstrumentationProvider;
import io.jvoid.instrumentation.provider.api.MethodInstrumenter;
import javassist.CtClass;
import javassist.CtMethod;

package io.jvoid.instrumentation.provider.junit4;




/**
 * JVoid instrumentation provider for JUnit 4. It will integrate with JUnit 4 test
 * lifecycle, being able to track the status of the tests and skipping them in case
 * their execution is not necessary because no changes have been made to the classes
 * of the application.
 *
 */
public class JUnitInstrumentationProvider implements InstrumentationProvider {

    private Map<String, MethodInstrumenter> instrumenterMap;

    @Inject
    public JUnitInstrumentationProvider(JUnitRunNotifierMethodInstrumenter junitRunNotifierMethodInstrumenter,
                                        RunChildMethodInstrumenter runChildMethodInstrumenter) {
        this.instrumenterMap = new HashMap<>();
        this.instrumenterMap.put("org.junit.runner.notification.RunNotifier", junitRunNotifierMethodInstrumenter);