// Code generated by mockery v2.4.0. DO NOT EDIT.

package mocks

import (
	context "context"

	mock "github.com/stretchr/testify/mock"
	incremental "go.skia.org/infra/status/go/incremental"

	time "time"
)

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

// Get provides a mock function with given fields: repo, since, maxCommits
func (_m *IncrementalCache) Get(repo string, since time.Time, maxCommits int) (*incremental.Update, error) {
	ret := _m.Called(repo, since, maxCommits)

	var r0 *incremental.Update
	if rf, ok := ret.Get(0).(func(string, time.Time, int) *incremental.Update); ok {
		r0 = rf(repo, since, maxCommits)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(*incremental.Update)
		}
	}

	var r1 error
	if rf, ok := ret.Get(1).(func(string, time.Time, int) error); ok {
		r1 = rf(repo, since, maxCommits)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// GetAll provides a mock function with given fields: repo, maxCommits
func (_m *IncrementalCache) GetAll(repo string, maxCommits int) (*incremental.Update, error) {
	ret := _m.Called(repo, maxCommits)

	var r0 *incremental.Update
	if rf, ok := ret.Get(0).(func(string, int) *incremental.Update); ok {
		r0 = rf(repo, maxCommits)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(*incremental.Update)
		}
	}

	var r1 error
	if rf, ok := ret.Get(1).(func(string, int) error); ok {
		r1 = rf(repo, maxCommits)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// GetRange provides a mock function with given fields: repo, from, to, maxCommits
func (_m *IncrementalCache) GetRange(repo string, from time.Time, to time.Time, maxCommits int) (*incremental.Update, error) {
	ret := _m.Called(repo, from, to, maxCommits)

	var r0 *incremental.Update
	if rf, ok := ret.Get(0).(func(string, time.Time, time.Time, int) *incremental.Update); ok {
		r0 = rf(repo, from, to, maxCommits)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(*incremental.Update)
		}
	}

	var r1 error
	if rf, ok := ret.Get(1).(func(string, time.Time, time.Time, int) error); ok {
		r1 = rf(repo, from, to, maxCommits)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// Update provides a mock function with given fields: ctx, reset
func (_m *IncrementalCache) Update(ctx context.Context, reset bool) error {
	ret := _m.Called(ctx, reset)

	var r0 error
	if rf, ok := ret.Get(0).(func(context.Context, bool) error); ok {
		r0 = rf(ctx, reset)
	} else {
		r0 = ret.Error(0)
	}

	return r0
}

// UpdateLoop provides a mock function with given fields: ctx, frequency
func (_m *IncrementalCache) UpdateLoop(ctx context.Context, frequency time.Duration) {
	_m.Called(ctx, frequency)
}
