// Code generated by mockery v0.0.0-dev. DO NOT EDIT.

package mocks

import (
	context "context"

	mock "github.com/stretchr/testify/mock"
)

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

// Create provides a mock function with given fields: ctx, modifiedValue, key, originalValue
func (_m *ReverseKeyMapStore) Create(ctx context.Context, modifiedValue string, key string, originalValue string) (string, error) {
	ret := _m.Called(ctx, modifiedValue, key, originalValue)

	if len(ret) == 0 {
		panic("no return value specified for Create")
	}

	var r0 string
	var r1 error
	if rf, ok := ret.Get(0).(func(context.Context, string, string, string) (string, error)); ok {
		return rf(ctx, modifiedValue, key, originalValue)
	}
	if rf, ok := ret.Get(0).(func(context.Context, string, string, string) string); ok {
		r0 = rf(ctx, modifiedValue, key, originalValue)
	} else {
		r0 = ret.Get(0).(string)
	}

	if rf, ok := ret.Get(1).(func(context.Context, string, string, string) error); ok {
		r1 = rf(ctx, modifiedValue, key, originalValue)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// Get provides a mock function with given fields: ctx, modifiedValue, key
func (_m *ReverseKeyMapStore) Get(ctx context.Context, modifiedValue string, key string) (string, error) {
	ret := _m.Called(ctx, modifiedValue, key)

	if len(ret) == 0 {
		panic("no return value specified for Get")
	}

	var r0 string
	var r1 error
	if rf, ok := ret.Get(0).(func(context.Context, string, string) (string, error)); ok {
		return rf(ctx, modifiedValue, key)
	}
	if rf, ok := ret.Get(0).(func(context.Context, string, string) string); ok {
		r0 = rf(ctx, modifiedValue, key)
	} else {
		r0 = ret.Get(0).(string)
	}

	if rf, ok := ret.Get(1).(func(context.Context, string, string) error); ok {
		r1 = rf(ctx, modifiedValue, key)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// NewReverseKeyMapStore creates a new instance of ReverseKeyMapStore. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewReverseKeyMapStore(t interface {
	mock.TestingT
	Cleanup(func())
}) *ReverseKeyMapStore {
	mock := &ReverseKeyMapStore{}
	mock.Mock.Test(t)

	t.Cleanup(func() { mock.AssertExpectations(t) })

	return mock
}
