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

package mocks

import (
	context "context"

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

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

// Start provides a mock function with given fields: ctx
func (_m *PeerFinder) Start(ctx context.Context) ([]string, <-chan []string, error) {
	ret := _m.Called(ctx)

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

	var r0 []string
	var r1 <-chan []string
	var r2 error
	if rf, ok := ret.Get(0).(func(context.Context) ([]string, <-chan []string, error)); ok {
		return rf(ctx)
	}
	if rf, ok := ret.Get(0).(func(context.Context) []string); ok {
		r0 = rf(ctx)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).([]string)
		}
	}

	if rf, ok := ret.Get(1).(func(context.Context) <-chan []string); ok {
		r1 = rf(ctx)
	} else {
		if ret.Get(1) != nil {
			r1 = ret.Get(1).(<-chan []string)
		}
	}

	if rf, ok := ret.Get(2).(func(context.Context) error); ok {
		r2 = rf(ctx)
	} else {
		r2 = ret.Error(2)
	}

	return r0, r1, r2
}

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

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

	return mock
}
