// Code generated by mockery v1.0.0. DO NOT EDIT.

package mocks

import (
	mock "github.com/stretchr/testify/mock"
	imgmatching "go.skia.org/infra/gold-client/go/imgmatching"
)

// MatcherFactory is an autogenerated mock type for the MatcherFactory type
type MatcherFactory struct {
	mock.Mock
}

// Make provides a mock function with given fields: optionalKeys
func (_m *MatcherFactory) Make(optionalKeys map[string]string) (imgmatching.AlgorithmName, imgmatching.Matcher, error) {
	ret := _m.Called(optionalKeys)

	var r0 imgmatching.AlgorithmName
	if rf, ok := ret.Get(0).(func(map[string]string) imgmatching.AlgorithmName); ok {
		r0 = rf(optionalKeys)
	} else {
		r0 = ret.Get(0).(imgmatching.AlgorithmName)
	}

	var r1 imgmatching.Matcher
	if rf, ok := ret.Get(1).(func(map[string]string) imgmatching.Matcher); ok {
		r1 = rf(optionalKeys)
	} else {
		if ret.Get(1) != nil {
			r1 = ret.Get(1).(imgmatching.Matcher)
		}
	}

	var r2 error
	if rf, ok := ret.Get(2).(func(map[string]string) error); ok {
		r2 = rf(optionalKeys)
	} else {
		r2 = ret.Error(2)
	}

	return r0, r1, r2
}
