/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

// Code generated by mockery v2.28.2. DO NOT EDIT.

package model

import (
	time "time"

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

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

type MockPlcSubscriptionRequestBuilder_Expecter struct {
	mock *mock.Mock
}

func (_m *MockPlcSubscriptionRequestBuilder) EXPECT() *MockPlcSubscriptionRequestBuilder_Expecter {
	return &MockPlcSubscriptionRequestBuilder_Expecter{mock: &_m.Mock}
}

// AddChangeOfStateTag provides a mock function with given fields: tagName, tag
func (_m *MockPlcSubscriptionRequestBuilder) AddChangeOfStateTag(tagName string, tag PlcTag) PlcSubscriptionRequestBuilder {
	ret := _m.Called(tagName, tag)

	var r0 PlcSubscriptionRequestBuilder
	if rf, ok := ret.Get(0).(func(string, PlcTag) PlcSubscriptionRequestBuilder); ok {
		r0 = rf(tagName, tag)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(PlcSubscriptionRequestBuilder)
		}
	}

	return r0
}

// MockPlcSubscriptionRequestBuilder_AddChangeOfStateTag_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddChangeOfStateTag'
type MockPlcSubscriptionRequestBuilder_AddChangeOfStateTag_Call struct {
	*mock.Call
}

// AddChangeOfStateTag is a helper method to define mock.On call
//   - tagName string
//   - tag PlcTag
func (_e *MockPlcSubscriptionRequestBuilder_Expecter) AddChangeOfStateTag(tagName interface{}, tag interface{}) *MockPlcSubscriptionRequestBuilder_AddChangeOfStateTag_Call {
	return &MockPlcSubscriptionRequestBuilder_AddChangeOfStateTag_Call{Call: _e.mock.On("AddChangeOfStateTag", tagName, tag)}
}

func (_c *MockPlcSubscriptionRequestBuilder_AddChangeOfStateTag_Call) Run(run func(tagName string, tag PlcTag)) *MockPlcSubscriptionRequestBuilder_AddChangeOfStateTag_Call {
	_c.Call.Run(func(args mock.Arguments) {
		run(args[0].(string), args[1].(PlcTag))
	})
	return _c
}

func (_c *MockPlcSubscriptionRequestBuilder_AddChangeOfStateTag_Call) Return(_a0 PlcSubscriptionRequestBuilder) *MockPlcSubscriptionRequestBuilder_AddChangeOfStateTag_Call {
	_c.Call.Return(_a0)
	return _c
}

func (_c *MockPlcSubscriptionRequestBuilder_AddChangeOfStateTag_Call) RunAndReturn(run func(string, PlcTag) PlcSubscriptionRequestBuilder) *MockPlcSubscriptionRequestBuilder_AddChangeOfStateTag_Call {
	_c.Call.Return(run)
	return _c
}

// AddChangeOfStateTagAddress provides a mock function with given fields: tagName, tagAddress
func (_m *MockPlcSubscriptionRequestBuilder) AddChangeOfStateTagAddress(tagName string, tagAddress string) PlcSubscriptionRequestBuilder {
	ret := _m.Called(tagName, tagAddress)

	var r0 PlcSubscriptionRequestBuilder
	if rf, ok := ret.Get(0).(func(string, string) PlcSubscriptionRequestBuilder); ok {
		r0 = rf(tagName, tagAddress)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(PlcSubscriptionRequestBuilder)
		}
	}

	return r0
}

// MockPlcSubscriptionRequestBuilder_AddChangeOfStateTagAddress_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddChangeOfStateTagAddress'
type MockPlcSubscriptionRequestBuilder_AddChangeOfStateTagAddress_Call struct {
	*mock.Call
}

// AddChangeOfStateTagAddress is a helper method to define mock.On call
//   - tagName string
//   - tagAddress string
func (_e *MockPlcSubscriptionRequestBuilder_Expecter) AddChangeOfStateTagAddress(tagName interface{}, tagAddress interface{}) *MockPlcSubscriptionRequestBuilder_AddChangeOfStateTagAddress_Call {
	return &MockPlcSubscriptionRequestBuilder_AddChangeOfStateTagAddress_Call{Call: _e.mock.On("AddChangeOfStateTagAddress", tagName, tagAddress)}
}

func (_c *MockPlcSubscriptionRequestBuilder_AddChangeOfStateTagAddress_Call) Run(run func(tagName string, tagAddress string)) *MockPlcSubscriptionRequestBuilder_AddChangeOfStateTagAddress_Call {
	_c.Call.Run(func(args mock.Arguments) {
		run(args[0].(string), args[1].(string))
	})
	return _c
}

func (_c *MockPlcSubscriptionRequestBuilder_AddChangeOfStateTagAddress_Call) Return(_a0 PlcSubscriptionRequestBuilder) *MockPlcSubscriptionRequestBuilder_AddChangeOfStateTagAddress_Call {
	_c.Call.Return(_a0)
	return _c
}

func (_c *MockPlcSubscriptionRequestBuilder_AddChangeOfStateTagAddress_Call) RunAndReturn(run func(string, string) PlcSubscriptionRequestBuilder) *MockPlcSubscriptionRequestBuilder_AddChangeOfStateTagAddress_Call {
	_c.Call.Return(run)
	return _c
}

// AddCyclicTag provides a mock function with given fields: tagName, tag, interval
func (_m *MockPlcSubscriptionRequestBuilder) AddCyclicTag(tagName string, tag PlcTag, interval time.Duration) PlcSubscriptionRequestBuilder {
	ret := _m.Called(tagName, tag, interval)

	var r0 PlcSubscriptionRequestBuilder
	if rf, ok := ret.Get(0).(func(string, PlcTag, time.Duration) PlcSubscriptionRequestBuilder); ok {
		r0 = rf(tagName, tag, interval)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(PlcSubscriptionRequestBuilder)
		}
	}

	return r0
}

// MockPlcSubscriptionRequestBuilder_AddCyclicTag_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddCyclicTag'
type MockPlcSubscriptionRequestBuilder_AddCyclicTag_Call struct {
	*mock.Call
}

// AddCyclicTag is a helper method to define mock.On call
//   - tagName string
//   - tag PlcTag
//   - interval time.Duration
func (_e *MockPlcSubscriptionRequestBuilder_Expecter) AddCyclicTag(tagName interface{}, tag interface{}, interval interface{}) *MockPlcSubscriptionRequestBuilder_AddCyclicTag_Call {
	return &MockPlcSubscriptionRequestBuilder_AddCyclicTag_Call{Call: _e.mock.On("AddCyclicTag", tagName, tag, interval)}
}

func (_c *MockPlcSubscriptionRequestBuilder_AddCyclicTag_Call) Run(run func(tagName string, tag PlcTag, interval time.Duration)) *MockPlcSubscriptionRequestBuilder_AddCyclicTag_Call {
	_c.Call.Run(func(args mock.Arguments) {
		run(args[0].(string), args[1].(PlcTag), args[2].(time.Duration))
	})
	return _c
}

func (_c *MockPlcSubscriptionRequestBuilder_AddCyclicTag_Call) Return(_a0 PlcSubscriptionRequestBuilder) *MockPlcSubscriptionRequestBuilder_AddCyclicTag_Call {
	_c.Call.Return(_a0)
	return _c
}

func (_c *MockPlcSubscriptionRequestBuilder_AddCyclicTag_Call) RunAndReturn(run func(string, PlcTag, time.Duration) PlcSubscriptionRequestBuilder) *MockPlcSubscriptionRequestBuilder_AddCyclicTag_Call {
	_c.Call.Return(run)
	return _c
}

// AddCyclicTagAddress provides a mock function with given fields: tagName, tagAddress, interval
func (_m *MockPlcSubscriptionRequestBuilder) AddCyclicTagAddress(tagName string, tagAddress string, interval time.Duration) PlcSubscriptionRequestBuilder {
	ret := _m.Called(tagName, tagAddress, interval)

	var r0 PlcSubscriptionRequestBuilder
	if rf, ok := ret.Get(0).(func(string, string, time.Duration) PlcSubscriptionRequestBuilder); ok {
		r0 = rf(tagName, tagAddress, interval)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(PlcSubscriptionRequestBuilder)
		}
	}

	return r0
}

// MockPlcSubscriptionRequestBuilder_AddCyclicTagAddress_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddCyclicTagAddress'
type MockPlcSubscriptionRequestBuilder_AddCyclicTagAddress_Call struct {
	*mock.Call
}

// AddCyclicTagAddress is a helper method to define mock.On call
//   - tagName string
//   - tagAddress string
//   - interval time.Duration
func (_e *MockPlcSubscriptionRequestBuilder_Expecter) AddCyclicTagAddress(tagName interface{}, tagAddress interface{}, interval interface{}) *MockPlcSubscriptionRequestBuilder_AddCyclicTagAddress_Call {
	return &MockPlcSubscriptionRequestBuilder_AddCyclicTagAddress_Call{Call: _e.mock.On("AddCyclicTagAddress", tagName, tagAddress, interval)}
}

func (_c *MockPlcSubscriptionRequestBuilder_AddCyclicTagAddress_Call) Run(run func(tagName string, tagAddress string, interval time.Duration)) *MockPlcSubscriptionRequestBuilder_AddCyclicTagAddress_Call {
	_c.Call.Run(func(args mock.Arguments) {
		run(args[0].(string), args[1].(string), args[2].(time.Duration))
	})
	return _c
}

func (_c *MockPlcSubscriptionRequestBuilder_AddCyclicTagAddress_Call) Return(_a0 PlcSubscriptionRequestBuilder) *MockPlcSubscriptionRequestBuilder_AddCyclicTagAddress_Call {
	_c.Call.Return(_a0)
	return _c
}

func (_c *MockPlcSubscriptionRequestBuilder_AddCyclicTagAddress_Call) RunAndReturn(run func(string, string, time.Duration) PlcSubscriptionRequestBuilder) *MockPlcSubscriptionRequestBuilder_AddCyclicTagAddress_Call {
	_c.Call.Return(run)
	return _c
}

// AddEventTag provides a mock function with given fields: tagName, tag
func (_m *MockPlcSubscriptionRequestBuilder) AddEventTag(tagName string, tag PlcTag) PlcSubscriptionRequestBuilder {
	ret := _m.Called(tagName, tag)

	var r0 PlcSubscriptionRequestBuilder
	if rf, ok := ret.Get(0).(func(string, PlcTag) PlcSubscriptionRequestBuilder); ok {
		r0 = rf(tagName, tag)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(PlcSubscriptionRequestBuilder)
		}
	}

	return r0
}

// MockPlcSubscriptionRequestBuilder_AddEventTag_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddEventTag'
type MockPlcSubscriptionRequestBuilder_AddEventTag_Call struct {
	*mock.Call
}

// AddEventTag is a helper method to define mock.On call
//   - tagName string
//   - tag PlcTag
func (_e *MockPlcSubscriptionRequestBuilder_Expecter) AddEventTag(tagName interface{}, tag interface{}) *MockPlcSubscriptionRequestBuilder_AddEventTag_Call {
	return &MockPlcSubscriptionRequestBuilder_AddEventTag_Call{Call: _e.mock.On("AddEventTag", tagName, tag)}
}

func (_c *MockPlcSubscriptionRequestBuilder_AddEventTag_Call) Run(run func(tagName string, tag PlcTag)) *MockPlcSubscriptionRequestBuilder_AddEventTag_Call {
	_c.Call.Run(func(args mock.Arguments) {
		run(args[0].(string), args[1].(PlcTag))
	})
	return _c
}

func (_c *MockPlcSubscriptionRequestBuilder_AddEventTag_Call) Return(_a0 PlcSubscriptionRequestBuilder) *MockPlcSubscriptionRequestBuilder_AddEventTag_Call {
	_c.Call.Return(_a0)
	return _c
}

func (_c *MockPlcSubscriptionRequestBuilder_AddEventTag_Call) RunAndReturn(run func(string, PlcTag) PlcSubscriptionRequestBuilder) *MockPlcSubscriptionRequestBuilder_AddEventTag_Call {
	_c.Call.Return(run)
	return _c
}

// AddEventTagAddress provides a mock function with given fields: tagName, tagAddress
func (_m *MockPlcSubscriptionRequestBuilder) AddEventTagAddress(tagName string, tagAddress string) PlcSubscriptionRequestBuilder {
	ret := _m.Called(tagName, tagAddress)

	var r0 PlcSubscriptionRequestBuilder
	if rf, ok := ret.Get(0).(func(string, string) PlcSubscriptionRequestBuilder); ok {
		r0 = rf(tagName, tagAddress)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(PlcSubscriptionRequestBuilder)
		}
	}

	return r0
}

// MockPlcSubscriptionRequestBuilder_AddEventTagAddress_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddEventTagAddress'
type MockPlcSubscriptionRequestBuilder_AddEventTagAddress_Call struct {
	*mock.Call
}

// AddEventTagAddress is a helper method to define mock.On call
//   - tagName string
//   - tagAddress string
func (_e *MockPlcSubscriptionRequestBuilder_Expecter) AddEventTagAddress(tagName interface{}, tagAddress interface{}) *MockPlcSubscriptionRequestBuilder_AddEventTagAddress_Call {
	return &MockPlcSubscriptionRequestBuilder_AddEventTagAddress_Call{Call: _e.mock.On("AddEventTagAddress", tagName, tagAddress)}
}

func (_c *MockPlcSubscriptionRequestBuilder_AddEventTagAddress_Call) Run(run func(tagName string, tagAddress string)) *MockPlcSubscriptionRequestBuilder_AddEventTagAddress_Call {
	_c.Call.Run(func(args mock.Arguments) {
		run(args[0].(string), args[1].(string))
	})
	return _c
}

func (_c *MockPlcSubscriptionRequestBuilder_AddEventTagAddress_Call) Return(_a0 PlcSubscriptionRequestBuilder) *MockPlcSubscriptionRequestBuilder_AddEventTagAddress_Call {
	_c.Call.Return(_a0)
	return _c
}

func (_c *MockPlcSubscriptionRequestBuilder_AddEventTagAddress_Call) RunAndReturn(run func(string, string) PlcSubscriptionRequestBuilder) *MockPlcSubscriptionRequestBuilder_AddEventTagAddress_Call {
	_c.Call.Return(run)
	return _c
}

// AddPreRegisteredConsumer provides a mock function with given fields: tagName, consumer
func (_m *MockPlcSubscriptionRequestBuilder) AddPreRegisteredConsumer(tagName string, consumer PlcSubscriptionEventConsumer) PlcSubscriptionRequestBuilder {
	ret := _m.Called(tagName, consumer)

	var r0 PlcSubscriptionRequestBuilder
	if rf, ok := ret.Get(0).(func(string, PlcSubscriptionEventConsumer) PlcSubscriptionRequestBuilder); ok {
		r0 = rf(tagName, consumer)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(PlcSubscriptionRequestBuilder)
		}
	}

	return r0
}

// MockPlcSubscriptionRequestBuilder_AddPreRegisteredConsumer_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddPreRegisteredConsumer'
type MockPlcSubscriptionRequestBuilder_AddPreRegisteredConsumer_Call struct {
	*mock.Call
}

// AddPreRegisteredConsumer is a helper method to define mock.On call
//   - tagName string
//   - consumer PlcSubscriptionEventConsumer
func (_e *MockPlcSubscriptionRequestBuilder_Expecter) AddPreRegisteredConsumer(tagName interface{}, consumer interface{}) *MockPlcSubscriptionRequestBuilder_AddPreRegisteredConsumer_Call {
	return &MockPlcSubscriptionRequestBuilder_AddPreRegisteredConsumer_Call{Call: _e.mock.On("AddPreRegisteredConsumer", tagName, consumer)}
}

func (_c *MockPlcSubscriptionRequestBuilder_AddPreRegisteredConsumer_Call) Run(run func(tagName string, consumer PlcSubscriptionEventConsumer)) *MockPlcSubscriptionRequestBuilder_AddPreRegisteredConsumer_Call {
	_c.Call.Run(func(args mock.Arguments) {
		run(args[0].(string), args[1].(PlcSubscriptionEventConsumer))
	})
	return _c
}

func (_c *MockPlcSubscriptionRequestBuilder_AddPreRegisteredConsumer_Call) Return(_a0 PlcSubscriptionRequestBuilder) *MockPlcSubscriptionRequestBuilder_AddPreRegisteredConsumer_Call {
	_c.Call.Return(_a0)
	return _c
}

func (_c *MockPlcSubscriptionRequestBuilder_AddPreRegisteredConsumer_Call) RunAndReturn(run func(string, PlcSubscriptionEventConsumer) PlcSubscriptionRequestBuilder) *MockPlcSubscriptionRequestBuilder_AddPreRegisteredConsumer_Call {
	_c.Call.Return(run)
	return _c
}

// Build provides a mock function with given fields:
func (_m *MockPlcSubscriptionRequestBuilder) Build() (PlcSubscriptionRequest, error) {
	ret := _m.Called()

	var r0 PlcSubscriptionRequest
	var r1 error
	if rf, ok := ret.Get(0).(func() (PlcSubscriptionRequest, error)); ok {
		return rf()
	}
	if rf, ok := ret.Get(0).(func() PlcSubscriptionRequest); ok {
		r0 = rf()
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(PlcSubscriptionRequest)
		}
	}

	if rf, ok := ret.Get(1).(func() error); ok {
		r1 = rf()
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// MockPlcSubscriptionRequestBuilder_Build_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Build'
type MockPlcSubscriptionRequestBuilder_Build_Call struct {
	*mock.Call
}

// Build is a helper method to define mock.On call
func (_e *MockPlcSubscriptionRequestBuilder_Expecter) Build() *MockPlcSubscriptionRequestBuilder_Build_Call {
	return &MockPlcSubscriptionRequestBuilder_Build_Call{Call: _e.mock.On("Build")}
}

func (_c *MockPlcSubscriptionRequestBuilder_Build_Call) Run(run func()) *MockPlcSubscriptionRequestBuilder_Build_Call {
	_c.Call.Run(func(args mock.Arguments) {
		run()
	})
	return _c
}

func (_c *MockPlcSubscriptionRequestBuilder_Build_Call) Return(_a0 PlcSubscriptionRequest, _a1 error) *MockPlcSubscriptionRequestBuilder_Build_Call {
	_c.Call.Return(_a0, _a1)
	return _c
}

func (_c *MockPlcSubscriptionRequestBuilder_Build_Call) RunAndReturn(run func() (PlcSubscriptionRequest, error)) *MockPlcSubscriptionRequestBuilder_Build_Call {
	_c.Call.Return(run)
	return _c
}

type mockConstructorTestingTNewMockPlcSubscriptionRequestBuilder interface {
	mock.TestingT
	Cleanup(func())
}

// NewMockPlcSubscriptionRequestBuilder creates a new instance of MockPlcSubscriptionRequestBuilder. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
func NewMockPlcSubscriptionRequestBuilder(t mockConstructorTestingTNewMockPlcSubscriptionRequestBuilder) *MockPlcSubscriptionRequestBuilder {
	mock := &MockPlcSubscriptionRequestBuilder{}
	mock.Mock.Test(t)

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

	return mock
}
