// 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;
//     }
// }


import jinsist.matchers.Arguments;
import java.lang.reflect.Method;
package jinsist.mock.testtypes;



public class Stub<MockType, ReturnType> {
    private final Class<MockType> classToMock;
    private final Method method;
    private final Arguments arguments;
    private final ReturnType result;

    public Stub(Class<MockType> classToMock, Method method, Arguments arguments, ReturnType result) {
        this.classToMock = classToMock;
        this.method = method;
        this.arguments = arguments;
        this.result = result;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Stub<?, ?> stub = (Stub<?, ?>) o;

        if (!classToMock.equals(stub.classToMock)) return false;
        if (!method.equals(stub.method)) return false;
        if (!arguments.equals(stub.arguments)) return false;
// 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: mock/src/test/java/jinsist/mock/testtypes/Stub.java
import jinsist.matchers.Arguments;
import java.lang.reflect.Method;

package jinsist.mock.testtypes;



public class Stub<MockType, ReturnType> {
    private final Class<MockType> classToMock;
    private final Method method;
    private final Arguments arguments;
    private final ReturnType result;

    public Stub(Class<MockType> classToMock, Method method, Arguments arguments, ReturnType result) {
        this.classToMock = classToMock;
        this.method = method;
        this.arguments = arguments;
        this.result = result;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Stub<?, ?> stub = (Stub<?, ?>) o;

        if (!classToMock.equals(stub.classToMock)) return false;
        if (!method.equals(stub.method)) return false;
        if (!arguments.equals(stub.arguments)) return false;
        return result != null ? result.equals(stub.result) : stub.result == null;