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

package mocks

import (
	context "context"

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

	testing "testing"

	vcsinfo "go.skia.org/infra/go/vcsinfo"
)

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

// Log provides a mock function with given fields: ctx, logExpr, opts
func (_m *GitilesLogger) Log(ctx context.Context, logExpr string, opts ...gitiles.LogOption) ([]*vcsinfo.LongCommit, error) {
	_va := make([]interface{}, len(opts))
	for _i := range opts {
		_va[_i] = opts[_i]
	}
	var _ca []interface{}
	_ca = append(_ca, ctx, logExpr)
	_ca = append(_ca, _va...)
	ret := _m.Called(_ca...)

	var r0 []*vcsinfo.LongCommit
	if rf, ok := ret.Get(0).(func(context.Context, string, ...gitiles.LogOption) []*vcsinfo.LongCommit); ok {
		r0 = rf(ctx, logExpr, opts...)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).([]*vcsinfo.LongCommit)
		}
	}

	var r1 error
	if rf, ok := ret.Get(1).(func(context.Context, string, ...gitiles.LogOption) error); ok {
		r1 = rf(ctx, logExpr, opts...)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// LogFirstParent provides a mock function with given fields: ctx, from, to, opts
func (_m *GitilesLogger) LogFirstParent(ctx context.Context, from string, to string, opts ...gitiles.LogOption) ([]*vcsinfo.LongCommit, error) {
	_va := make([]interface{}, len(opts))
	for _i := range opts {
		_va[_i] = opts[_i]
	}
	var _ca []interface{}
	_ca = append(_ca, ctx, from, to)
	_ca = append(_ca, _va...)
	ret := _m.Called(_ca...)

	var r0 []*vcsinfo.LongCommit
	if rf, ok := ret.Get(0).(func(context.Context, string, string, ...gitiles.LogOption) []*vcsinfo.LongCommit); ok {
		r0 = rf(ctx, from, to, opts...)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).([]*vcsinfo.LongCommit)
		}
	}

	var r1 error
	if rf, ok := ret.Get(1).(func(context.Context, string, string, ...gitiles.LogOption) error); ok {
		r1 = rf(ctx, from, to, opts...)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

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

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

	return mock
}
