// Path: expectations/src/main/java/jinsist/expectations/Expectations.java
// public interface Expectations {
//     <ReturnType, MockType> void recordStub(
//             Class<MockType> classToMock,
//             MockType instance,
//             Method method,
//             Arguments arguments,
//             ReturnType result
//     );
// 
//     <MockType> Object execute(
//             Class<MockType> classToMock,
//             MockType instance,
//             Method method,
//             Object[] arguments
//     );
// 
//     void verify();
// }
// 
// Path: matchers/src/main/java/jinsist/matchers/Arguments.java
// public class Arguments {
//     private List<ArgumentMatcher<?>> argumentMatchers;
// 
//     public Arguments(List<ArgumentMatcher<?>> argumentMatchers) {
//         this.argumentMatchers = argumentMatchers;
//     }
// 
//     public boolean matches(Object... arguments) {
//         int length = argumentMatchers.size();
//         if (length != arguments.length)
//             return false;
//         else
//             for (int i = 0; i < length; i++) {
//                 ArgumentMatcher matcher = argumentMatchers.get(i);
//                 @SuppressWarnings("unchecked")
//                 boolean matches = matcher.matches(arguments[i]);
//                 if (!matches) return false;
//             }
//         return true;
//     }
// 
//     public List<ArgumentMatcher<?>> getArgumentMatchers() {
//         return argumentMatchers;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
// 
//         Arguments arguments = (Arguments) o;
// 
//         return argumentMatchers.equals(arguments.argumentMatchers);
//     }
// 
//     @Override
//     public int hashCode() {
//         return argumentMatchers != null ? argumentMatchers.hashCode() : 0;
//     }
// }
// 
// Path: matchers/src/main/java/jinsist/matchers/EqualsMatcher.java
// public class EqualsMatcher<T> implements ArgumentMatcher<T> {
//     private T value;
// 
//     public EqualsMatcher(T value) {
//         this.value = value;
//     }
// 
//     @Override
//     public boolean matches(T argument) {
//         boolean isValueNull = value == null;
//         boolean isArgumentNull = argument == null;
// 
//         return isArgumentNull && isValueNull || !isValueNull && value.equals(argument);
//     }
// 
//     @Override
//     public String toString() {
//         return "EqualsMatcher " + value;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
// 
//         EqualsMatcher<?> that = (EqualsMatcher<?>) o;
// 
//         return value != null ? value.equals(that.value) : that.value == null;
//     }
// 
//     @Override
//     public int hashCode() {
//         return value != null ? value.hashCode() : 0;
//     }
// }


import jinsist.expectations.Expectations;
import jinsist.matchers.Arguments;
import jinsist.matchers.EqualsMatcher;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static java.util.Collections.emptyList;
import static java.util.stream.Collectors.toList;
package jinsist.mock.testtypes;




public class TestFactories {

    protected List<Stub> registry = new ArrayList<>();
    protected Method firstMethod = Collaborator.class.getMethod("firstMethod", String.class);
    protected Method voidMethod = Collaborator.class.getMethod("voidMethod");
// Path: expectations/src/main/java/jinsist/expectations/Expectations.java
// public interface Expectations {
//     <ReturnType, MockType> void recordStub(
//             Class<MockType> classToMock,
//             MockType instance,
//             Method method,
//             Arguments arguments,
//             ReturnType result
//     );
// 
//     <MockType> Object execute(
//             Class<MockType> classToMock,
//             MockType instance,
//             Method method,
//             Object[] arguments
//     );
// 
//     void verify();
// }
// 
// Path: matchers/src/main/java/jinsist/matchers/Arguments.java
// public class Arguments {
//     private List<ArgumentMatcher<?>> argumentMatchers;
// 
//     public Arguments(List<ArgumentMatcher<?>> argumentMatchers) {
//         this.argumentMatchers = argumentMatchers;
//     }
// 
//     public boolean matches(Object... arguments) {
//         int length = argumentMatchers.size();
//         if (length != arguments.length)
//             return false;
//         else
//             for (int i = 0; i < length; i++) {
//                 ArgumentMatcher matcher = argumentMatchers.get(i);
//                 @SuppressWarnings("unchecked")
//                 boolean matches = matcher.matches(arguments[i]);
//                 if (!matches) return false;
//             }
//         return true;
//     }
// 
//     public List<ArgumentMatcher<?>> getArgumentMatchers() {
//         return argumentMatchers;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
// 
//         Arguments arguments = (Arguments) o;
// 
//         return argumentMatchers.equals(arguments.argumentMatchers);
//     }
// 
//     @Override
//     public int hashCode() {
//         return argumentMatchers != null ? argumentMatchers.hashCode() : 0;
//     }
// }
// 
// Path: matchers/src/main/java/jinsist/matchers/EqualsMatcher.java
// public class EqualsMatcher<T> implements ArgumentMatcher<T> {
//     private T value;
// 
//     public EqualsMatcher(T value) {
//         this.value = value;
//     }
// 
//     @Override
//     public boolean matches(T argument) {
//         boolean isValueNull = value == null;
//         boolean isArgumentNull = argument == null;
// 
//         return isArgumentNull && isValueNull || !isValueNull && value.equals(argument);
//     }
// 
//     @Override
//     public String toString() {
//         return "EqualsMatcher " + value;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
// 
//         EqualsMatcher<?> that = (EqualsMatcher<?>) o;
// 
//         return value != null ? value.equals(that.value) : that.value == null;
//     }
// 
//     @Override
//     public int hashCode() {
//         return value != null ? value.hashCode() : 0;
//     }
// }


// Path: mock/src/test/java/jinsist/mock/testtypes/TestFactories.java
import jinsist.expectations.Expectations;
import jinsist.matchers.Arguments;
import jinsist.matchers.EqualsMatcher;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static java.util.Collections.emptyList;
import static java.util.stream.Collectors.toList;

package jinsist.mock.testtypes;




public class TestFactories {

    protected List<Stub> registry = new ArrayList<>();
    protected Method firstMethod = Collaborator.class.getMethod("firstMethod", String.class);
    protected Method voidMethod = Collaborator.class.getMethod("voidMethod");
    protected String input = "value";