モジュール:学校コード検査/testcases

local p = require('Module:UnitTests')

function p:test_live()
    self:preprocess_equals_many('{{#invoke:学校コード検査|Main|', '}}', {
    	{'', ''},
    	{' ', ''},
    	{'X012345678912', '[[Category:Infoboxに不備のある学校記事]]'},
    	{'F113110102700', 'F113110102700'},	-- 東京大学
    	{'D114310000222', 'D114310000222'},	-- 慶應義塾高等学校
    	{'H228310000663', 'H228310000663'},	-- 宝塚音楽学校
    	{'H109310000551', '[[Category:Infoboxに不備のある学校記事]]'},	-- CITY FOOTBALL ACADEMY
    	{'E201199999991', '[[Category:Infoboxに不備のある学校記事]]'},	-- 存在しない学校種
    	{'A100199999992', '[[Category:Infoboxに不備のある学校記事]]'},	-- 存在しない都道府県番号
    	{'A148199999996', '[[Category:Infoboxに不備のある学校記事]]'},	-- 存在しない都道府県番号
    	{'A101499999995', '[[Category:Infoboxに不備のある学校記事]]'},	-- 存在しない設置区分
    	{'A101100000004', '[[Category:Infoboxに不備のある学校記事]]'},	-- 学校番号の先頭が0
    	{'F11311010270', '[[Category:Infoboxに不備のある学校記事]]'},	-- 桁数が不足
    	{'F1131101027000', '[[Category:Infoboxに不備のある学校記事]]'},	-- 桁数が過剰
    	{'F113110102709', '[[Category:Infoboxに不備のある学校記事]]'},	-- 検査数字が合わない
    }, {nowiki=1})
end

function p:test_sandbox()
    self:preprocess_equals_many('{{#invoke:学校コード検査/sandbox|main|', '}}', {
    	{'', 'failed'},
    	{' ', 'failed'},
    	{'X012345678912', 'failed'},
    	{'F113110102700', ''},	-- 東京大学
    	{'D114310000222', ''},	-- 慶應義塾高等学校
    	{'H228310000663', ''},	-- 宝塚音楽学校
    	{'H109310000551', 'failed'},	-- CITY FOOTBALL ACADEMY
    	{'H109310000551 | edition = 202305', ''},
    	{'E201199999991', 'failed'},	-- 存在しない学校種
    	{'A100199999992', 'failed'},	-- 存在しない都道府県番号
    	{'A148199999996', 'failed'},	-- 存在しない都道府県番号
    	{'A101499999995', 'failed'},	-- 存在しない設置区分
    	{'A101100000004', 'failed'},	-- 学校番号の先頭が0
    	{'F11311010270', 'failed'},		-- 桁数が不足
    	{'F1131101027000', 'failed'},	-- 桁数が過剰
    	{'F113110102709', 'failed'},	-- 検査数字が合わない
    }, {nowiki=1})
end

-- 編集画面のデバッグコンソールで使用するための関数
function p.calcCheckDigit(id)
	if not id:match('^[A-H]%d%d%d%d%d%d%d%d%d%d%d%d?$') then
		error('異常なフォーマット')
	end
	
	local sumDigits = function(num)
		return (num > 9) and (1 + num % 10) or num
	end
	
	local temp = sumDigits((id:byte(1) - 0x40) * 2) 
	for i = 2, 12 do
		temp = temp + sumDigits(tonumber(id:sub(i, i)) * (1 + i % 2))
	end
	
	return (10 - (temp % 10)) % 10
end

return p