// 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"

	testing "testing"

	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)

	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 cleanup function to assert the mocks expectations.
func NewCalculator(t testing.TB) *Calculator {
	mock := &Calculator{}

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

	return mock
}
