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

package mocks

import (
	context "context"

	alerts "go.skia.org/infra/perf/go/alerts"

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

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

// ProcessRegressionInGroup provides a mock function with given fields: ctx, alert, anomalyID, startCommit, endCommit, testPath, paramSet
func (_m *AnomalyGrouper) ProcessRegressionInGroup(ctx context.Context, alert *alerts.Alert, anomalyID string, startCommit int64, endCommit int64, testPath string, paramSet map[string]string) (string, error) {
	ret := _m.Called(ctx, alert, anomalyID, startCommit, endCommit, testPath, paramSet)

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

	var r0 string
	var r1 error
	if rf, ok := ret.Get(0).(func(context.Context, *alerts.Alert, string, int64, int64, string, map[string]string) (string, error)); ok {
		return rf(ctx, alert, anomalyID, startCommit, endCommit, testPath, paramSet)
	}
	if rf, ok := ret.Get(0).(func(context.Context, *alerts.Alert, string, int64, int64, string, map[string]string) string); ok {
		r0 = rf(ctx, alert, anomalyID, startCommit, endCommit, testPath, paramSet)
	} else {
		r0 = ret.Get(0).(string)
	}

	if rf, ok := ret.Get(1).(func(context.Context, *alerts.Alert, string, int64, int64, string, map[string]string) error); ok {
		r1 = rf(ctx, alert, anomalyID, startCommit, endCommit, testPath, paramSet)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

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

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

	return mock
}
