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

package mocks

import (
	context "context"

	mock "github.com/stretchr/testify/mock"
	powercycle "go.skia.org/infra/skolo/go/powercycle"

	testing "testing"

	time "time"
)

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

// DeviceIDs provides a mock function with given fields:
func (_m *Controller) DeviceIDs() []powercycle.DeviceID {
	ret := _m.Called()

	var r0 []powercycle.DeviceID
	if rf, ok := ret.Get(0).(func() []powercycle.DeviceID); ok {
		r0 = rf()
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).([]powercycle.DeviceID)
		}
	}

	return r0
}

// PowerCycle provides a mock function with given fields: ctx, id, delayOverride
func (_m *Controller) PowerCycle(ctx context.Context, id powercycle.DeviceID, delayOverride time.Duration) error {
	ret := _m.Called(ctx, id, delayOverride)

	var r0 error
	if rf, ok := ret.Get(0).(func(context.Context, powercycle.DeviceID, time.Duration) error); ok {
		r0 = rf(ctx, id, delayOverride)
	} else {
		r0 = ret.Error(0)
	}

	return r0
}

// NewController creates a new instance of Controller. It also registers a cleanup function to assert the mocks expectations.
func NewController(t testing.TB) *Controller {
	mock := &Controller{}

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

	return mock
}
