跳去內容

模組:PrevalenceData/testcases

出自維基百科,自由嘅百科全書
-- vi:set sw=4 ts=4 ai sm:

---- 呢啲測試只係 「盡人事」,原因係被測試嘅模組用維基數據,所以冇可能知道結果係乜;
---- 呢度用嘅預期嘅正確結果目前係基於2024年10月25號嘅維基數據。
----
---- 正確嘅測試方法係諗辦法模擬維基數據,然後整一啲假嘅數據淨係用嚟做測試,
---- 等我哋可以控制 「預期嘅正確結果」;做呢樣嘢應該超出咗粵維嘅有限資源。
----
---- 用法一,適用於加/改 test case:
---- p.test(require('模組:PrevalenceData'))
----
---- 用法二,適用於改模:
---- 喺模組:PrevalenceData 嗰陣:p.test()
---- 嗰便模組嘅 test 函數應該咁定義:
---- p.test = function ()
---- 	local q = require('模組:PrevalenceData/testcases');
---- 	return q.test(p);
---- end
----
---- 人手 「測試」 方法:
---- PrevalenceData 輸出可以人手睇,方法係喺 PrevalenceData 撳 「改」,然後喺下面 Debug console 打:
----
---- print(p.main({args={qId='維基數據號碼'}}))
----
---- 注意:
---- 1. 參數名係 qId,唔係 qid。
---- 2. 空白參數測試唔到,會喺系統底層產生錯誤錯息,連 pcall 都 trap 唔到。

require 'strict';
local p = {};

--- 內部輔助函數

-- 剷走追蹤分類
local function strip_cats (s)
	return mw.ustring.gsub(s, '%[%[Category:[^%[%]]+%]%]', '');
end

local function strip_refs (s)
	return mw.ustring.gsub(s, '<ref[^<>]*>.-</ref>', '');
end

local function strip_all_metadata (s)
	return strip_refs(strip_cats(s))
end

-- 入口:測試函數
-- PrevalenceData 冇用 parent frame、CSS 等等,唔使模擬呢啲,淨係畀 args 已經足夠
p.test = function (p)
	local a, b;

	-- 測試自嘅嘅輔助函數
	assert(strip_cats('a') == 'a');
	assert(strip_cats('a[[Category:foo]]') == 'a');
	assert(strip_cats('a[[Category]]') == 'a[[Category]]');

	assert(strip_all_metadata('a') == 'a');
	assert(strip_all_metadata('a[[Category:foo]]') == 'a');
	assert(strip_all_metadata('a[[Category]]') == 'a[[Category]]');

	-- 已知:唔畀參數唔會 crash,出空字串
	a, b = pcall(p.main, { args = {
		-- 冇參數
	}});
	assert(a);
	assert(type(b) == 'string');
	assert(#b == 0);

	-- 已知:畀嘅參數唔係病
	-- 正確輸出應該係空字串
	a, b = pcall(p.main, { args = {
		qId = 'Q12375546';
	}});
	assert(a);
	assert(type(b) == 'string');
	assert(#b == 0);

	-- 模組源碼用 Q133087 做例,原模組用 「to」 同夾硬(hard code)用英文 override,唔應該有 override
	-- 喺2024年10月25號原輸出 「1 to 2% ([[已發展國家|developed world]])」
	-- 正確輸出應該做咗本地化
	a, b = pcall(p.main, { args = {
		qId = 'Q133087';
	}});
	assert(a);
	assert(type(b) == 'string');
	assert(mw.ustring.match(strip_all_metadata(b), '^%d+-%d+%%(%[%[已發展國家%]%])$'));

	-- 維基數據 Property:P1193 畀 Q190564 做例,實際上模組會出空字串
	-- 正確輸出應該有嘢
	a, b = pcall(p.main, { args = {
		qId = 'Q190564';
	}});
	assert(a);
	assert(type(b) == 'string');
	assert(mw.ustring.match(strip_refs(b), '^%d%.%d+%%(%[%[英國%]%])$'));

	-- Q12202,2024年10月25號輸出 「0.24%([[法國]]), 0.6%([[新西伯利亞]])」
	-- 正確輸出應該用頓號
	a, b = pcall(p.main, { args = {
		qId = 'Q12202';
	}});
	assert(a);
	assert(type(b) == 'string');
	assert(mw.ustring.match(strip_all_metadata(b), '^%d%.%d+%%(.-、.-)$'));

	--(維基數據 Property:P1193 畀嘅第二個例 Q1648484,實際上喺維基數據唔係咁寫,用唔到嚟做 test case)
	-- Q219223,2024年10月25號輸出 「65%、10%」
	-- 正確輸出應該兩個數都有括弧
	a, b = pcall(p.main, { args = {
		qId = 'Q219223';
	}});
	assert(a);
	assert(type(b) == 'string');
	b = strip_all_metadata(b);
	assert(not mw.ustring.match(strip_all_metadata(b), '%%$') and not mw.ustring.match(b, '%%、'));

	-- Q12204,2024年10月25號輸出 「0.043-0.045%([[蘇里南]])、0.00033-0.00053%([[冰島]])、0.077-0.079%([[厄瓜多爾]])、-0.99-1.01%([[挪威]])、-0.00088-0.00112%([[法國]])、0.0029%([[美國]])、0.0028%」
	-- 正確輸出應該全部數都有括弧同唔應該有負數
	a, b = pcall(p.main, { args = {
		qId = 'Q12204';
	}});
	assert(a);
	assert(type(b) == 'string');
	b = strip_all_metadata(b);

	-- subtest A 唔應該有負數
	assert(not mw.ustring.match(b, '^%-%d') and not mw.ustring.match(b, '、%-%d'));

	-- subtest B 唔應該有冇括弧嘅數值
	assert(not mw.ustring.match(b, '%%$') and not mw.ustring.match(b, '%%、'));

	-- Q267602,2024年10月26號輸出 「0.05%、0.01%」,最大值同最細值用咗 P1480=Q10578722、Q10585806 表示
	-- 暫時當應該加入追蹤類
	a, b = pcall(p.main, { args = {
		qId = 'Q267602';
	}});
	assert(a);
	assert(type(b) == 'string');
	assert(mw.ustring.match(b, '未知修飾子'));

	-- Q1022718,2024年10月26號輸出 「0.00198%、0.005%」
	-- 應該加入追蹤類
	a, b = pcall(p.main, { args = {
		qId = 'Q1022718';
	}});
	assert(a);
	assert(type(b) == 'string');
	assert(mw.ustring.match(b, '多過一個冇括弧數值'));
end

return p;