local p = require('Module:UnitTests')
local protect = require('Module:Protect')

local o = {}
function o.f1(a)
    if not a then
        error('missing argument')
    end
    return a
end

function o:f2(a)
    if not a then
        error('missing argument')
    end
    return a
end

function p:test_protect()
	self:equals(
		'Keep location',
		protect(error, {removeLocation = false})('foo', 3),
		self.frame:preprocess('{{Error|Error: Module:Protect/testcases:22: foo}}')
	)

	self:equals(
		'.',
		protect(o.f1)('Foo'),
		'Foo'
	)
	
	self:equals(
		'.',
		protect(o.f1)(o, 'Foo'),
		o
	)
	
	self:equals(
		':',
		protect(o.f2)('Foo'),
		self.frame:preprocess('{{Error|Error: missing argument}}')
	)
	
	self:equals(
		':',
		protect(o.f2)(o, 'Foo'),
		'Foo'
	)
	
protect(o.f2)
protect(o.f2)
local a = o.f2
local b = o.f2

	self:equals(
		'Success',
		protect(mw.clone)('Foo'),
		'Foo'
	)
	
	self:equals(
		'Default error',
		protect(error)('foo'),
		self.frame:preprocess('{{Error|Error: foo}}')
	)
	
	self:equals(
		'No caught message',
		protect(error)(),
		self.frame:preprocess('{{Error|Error: (no message)}}')
	)
	
	self:equals(
		'Custom errFormat',
		protect(error, 'Failure (%s)')('foo'),
		self.frame:preprocess('{{Error|Failure (foo)}}')
	)
	
	self:equals(
		'Raw errFormat',
		protect(error, {raw = true})('foo'),
		'Error: foo'
	)

	self:equals(
		'Custom raw errFormat',
		protect(error, 'Failure (%s)', {raw = true})('foo'),
		'Failure (foo)'
	)
	
	self:equals(
		'Remove location',
		protect(error)('foo', 3),
		self.frame:preprocess('{{Error|Error: foo}}')
	)
end

return p