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

package mocks

import (
	mock "github.com/stretchr/testify/mock"
	interfaces "go.skia.org/skia/bazel/exporter/interfaces"

	testing "testing"
)

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

// OpenFile provides a mock function with given fields: path
func (_m *FileSystem) OpenFile(path string) (interfaces.Writer, error) {
	ret := _m.Called(path)

	var r0 interfaces.Writer
	if rf, ok := ret.Get(0).(func(string) interfaces.Writer); ok {
		r0 = rf(path)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(interfaces.Writer)
		}
	}

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

	return r0, r1
}

// ReadFile provides a mock function with given fields: filename
func (_m *FileSystem) ReadFile(filename string) ([]byte, error) {
	ret := _m.Called(filename)

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

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

	return r0, r1
}

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

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

	return mock
}
