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

package mocks

import (
	context "context"

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

	paramtools "go.skia.org/infra/go/paramtools"

	types "go.skia.org/infra/golden/go/types"
)

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

// CalculateDiffs provides a mock function with given fields: ctx, grouping, additional
func (_m *Calculator) CalculateDiffs(ctx context.Context, grouping paramtools.Params, additional []types.Digest) error {
	ret := _m.Called(ctx, grouping, additional)

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

	var r0 error
	if rf, ok := ret.Get(0).(func(context.Context, paramtools.Params, []types.Digest) error); ok {
		r0 = rf(ctx, grouping, additional)
	} else {
		r0 = ret.Error(0)
	}

	return r0
}

// NewCalculator creates a new instance of Calculator. 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 NewCalculator(t interface {
	mock.TestingT
	Cleanup(func())
}) *Calculator {
	mock := &Calculator{}
	mock.Mock.Test(t)

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

	return mock
}
