モジュール:Citation/CS-ja/testcases

local p = require('Module:UnitTests')
local cfg = mw.loadData('Module:Citation/CS-ja/Configuration/sandbox')
local utilities = require('Module:Citation/CS1/Utilities/sandbox')
local validation = require('Module:Citation/CS1/Date validation/sandbox')
utilities.set_selected_modules(cfg)
validation.set_selected_modules(cfg, utilities)
local lang = mw.language.getContentLanguage()
local lang2 = mw.language.new('en')
local format_date_tests = {
	{ lang:formatDate('Y年Fj日'), ja = lang:formatDate('Y年Fj日'), dmy = lang2:formatDate('j F Y'), mdy = lang2:formatDate('F j, Y'), ymd = lang2:formatDate('Y-m-d') },
	{ lang:formatDate('Y-m-d'), ja = lang:formatDate('Y年Fj日'), dmy = lang2:formatDate('j F Y'), mdy = lang2:formatDate('F j, Y'), ymd = lang2:formatDate('Y-m-d') },
	{ lang2:formatDate('F j, Y'), ja = lang:formatDate('Y年Fj日'), dmy = lang2:formatDate('j F Y'), mdy = lang2:formatDate('F j, Y'), ymd = lang2:formatDate('Y-m-d') },
	{ lang2:formatDate('M j, Y'), ja = lang:formatDate('Y年Fj日'), dmy = lang2:formatDate('j F Y'), mdy = lang2:formatDate('F j, Y'), ymd = lang2:formatDate('Y-m-d') },
	{ lang2:formatDate('j F Y'), ja = lang:formatDate('Y年Fj日'), dmy = lang2:formatDate('j F Y'), mdy = lang2:formatDate('F j, Y'), ymd = lang2:formatDate('Y-m-d') },
	{ lang2:formatDate('j M Y'), ja = lang:formatDate('Y年Fj日'), dmy = lang2:formatDate('j F Y'), mdy = lang2:formatDate('F j, Y'), ymd = lang2:formatDate('Y-m-d') },
	{ '2023年12月15日', ja = '2023年12月15日', dmy = '15 December 2023', mdy = 'December 15, 2023', ymd = '2023-12-15' },
	{ '2023-12-15', ja = '2023年12月15日', dmy = '15 December 2023', mdy = 'December 15, 2023', ymd = '2023-12-15' },
	{ '2023年9月1日', ja = '2023年9月1日', dmy = '1 September 2023', mdy = 'September 1, 2023', ymd = '2023-09-01' },
	{ '2023年09月1日', ja = '2023年9月1日', dmy = '1 September 2023', mdy = 'September 1, 2023', ymd = '2023-09-01' },
	{ '2023年9月01日', ja = '2023年9月1日', dmy = '1 September 2023', mdy = 'September 1, 2023', ymd = '2023-09-01' },
	{ '2023年09月01日', ja = '2023年9月1日', dmy = '1 September 2023', mdy = 'September 1, 2023', ymd = '2023-09-01' },
	{ '2023-09-01', ja = '2023年9月1日', dmy = '1 September 2023', mdy = 'September 1, 2023', ymd = '2023-09-01' },
	{ '2023-09-1', ja = '2023年9月1日', dmy = '1 September 2023', mdy = 'September 1, 2023', ymd = '2023-09-01' },
	{ '2023-9-01', ja = '2023年9月1日', dmy = '1 September 2023', mdy = 'September 1, 2023', ymd = '2023-09-01' },
	{ '2023-9-1', ja = '2023年9月1日', dmy = '1 September 2023', mdy = 'September 1, 2023', ymd = '2023-09-01' },
	{ '2023年9月', ja = '2023年9月', dmy = 'September 2023', mdy = 'September 2023' },
	{ '2023年09月', ja = '2023年9月', dmy = 'September 2023', mdy = 'September 2023' },
	{ '2023-09', ja = '2023年9月', dmy = 'September 2023', mdy = 'September 2023' },
	{ '2023-9', ja = '2023年9月', dmy = 'September 2023', mdy = 'September 2023' },
	{ 'September 2023', ja = '2023年9月', dmy = 'September 2023', mdy = 'September 2023' },
	{ '2023年', ja = '2023年', dmy = '2023', mdy = '2023', ymd = '2023' },
	{ '2023', ja = '2023年', dmy = '2023', mdy = '2023' },
	{
		lang:formatDate('Y年12月31日', '+1 years'),
		ja = lang:formatDate('Y年', '+1 years') .. '12月31日',
		dmy = '31 December ' .. lang2:formatDate('Y', '+1 years'),
		mdy = 'December 31, ' .. lang2:formatDate('Y', '+1 years'),
		ymd = lang2:formatDate('Y-12-31', '+1 years')
	}, {
		lang:formatDate('Y-12-31', '+1 years'),
		ja = lang:formatDate('Y年', '+1 years') .. '12月31日',
		dmy = '31 December ' .. lang2:formatDate('Y', '+1 years'),
		mdy = 'December 31, ' .. lang2:formatDate('Y', '+1 years'),
		ymd = lang2:formatDate('Y-12-31', '+1 years')
	},
	{ '2023-2024', ja = '2023年 - 2024年', dmy = '2023–2024', mdy = '2023–2024' },
	{ '2023–2024', ja = '2023年 - 2024年', dmy = '2023–2024', mdy = '2023–2024' },
	{ '2023年-2024年', ja = '2023年 - 2024年', dmy = '2023–2024', mdy = '2023–2024' },
	{ '2023年–2024年', ja = '2023年 - 2024年', dmy = '2023–2024', mdy = '2023–2024' },
	{ '2023-2024年', ja = '2023年 - 2024年', dmy = '2023–2024', mdy = '2023–2024' },
	{ '2023 – 2024年', ja = '2023年 - 2024年', dmy = '2023–2024', mdy = '2023–2024' },
	{ '2023年 - 2024年', ja = '2023年 - 2024年', dmy = '2023–2024', mdy = '2023–2024' },
	{ '2023年 – 2024年', ja = '2023年 - 2024年', dmy = '2023–2024', mdy = '2023–2024' },
	{ '2023 - 2024年', ja = '2023年 - 2024年', dmy = '2023–2024', mdy = '2023–2024' },
	{ '2023 – 2024年', ja = '2023年 - 2024年', dmy = '2023–2024', mdy = '2023–2024' },
	{
		'2023年9月-2024年1月',
		dmy = 'September 2023 – January 2024',
		mdy = 'September 2023 – January 2024',
		ja = '2023年9月 - 2024年1月'
	}, {
		'2023年9月-10月',
		dmy = 'September–October 2023',
		mdy = 'September–October 2023',
		ja = '2023年9月 - 10月'
	}, {
		'2023年9月5日-2024年1月1日',
		dmy = '5 September 2023 – 1 January 2024',
		mdy = 'September 5, 2023 – January 1, 2024',
		ja = '2023年9月5日 - 2024年1月1日'
	}, {
		'2023年9月5日-10月1日',
		dmy = '5 September – 1 October 2023',
		mdy = 'September 5 – October 1, 2023',
		ja = '2023年9月5日 - 10月1日'
	}, {
		'2023年9月5日-10日',
		dmy = '5–10 September 2023',
		mdy = 'September 5–10, 2023',
		ja = '2023年9月5日 - 10日'
	},
	{ '2012–13', ja = '2012年 - 2013年', dmy = '2012–2013', mdy = '2012–2013' },
	{ '2010-11', ja = '2010年11月', dmy = 'November 2010', mdy = 'November 2010' },
	{ 'Spring 2000', ja = '2000年春', dmy = 'Spring 2000', mdy = 'Spring 2000' },
	{ '2000年春', ja = '2000年春', dmy = 'Spring 2000', mdy = 'Spring 2000' },
	{ 'Spring–Summer 2000', ja = '2000年春 - 夏', dmy = 'Spring–Summer 2000', mdy = 'Spring–Summer 2000' },
	{ '2000年春-夏', ja = '2000年春 - 夏', dmy = 'Spring–Summer 2000', mdy = 'Spring–Summer 2000' },
	{ 'Spring 2000 – Summer 2001', ja = '2000年春 - 2001年夏', dmy = 'Spring 2000 – Summer 2001', mdy = 'Spring 2000 – Summer 2001' },
	{ '2000年春-2001年夏', ja = '2000年春 - 2001年夏', dmy = 'Spring 2000 – Summer 2001', mdy = 'Spring 2000 – Summer 2001' },
	{ 'Winter 2000–2001' },
	{ 'Winter 2000–01' },
	{ 'First Quarter 2000', ja = '2000年第1四半期', dmy = 'First Quarter 2000', mdy = 'First Quarter 2000' },
	{ '2000年第1四半期', ja = '2000年第1四半期', dmy = 'First Quarter 2000', mdy = 'First Quarter 2000' },
	{ 'Christmas 2000', ja = '2000年クリスマス', dmy = 'Christmas 2000', mdy = 'Christmas 2000' },
	{ '2000年クリスマス', ja = '2000年クリスマス', dmy = 'Christmas 2000', mdy = 'Christmas 2000' },
	{ 'c. 2000' },
	{ 'n.d.' },
	{ 'nd' },
	{ '不明' },
}
local invalid_date_tests = {
	'9月15日', '09月15日', '09-15', '9-15',
	'2023年9月32日', '2023年09月32日', '2023-09-32', '2023-9-32',
	'2023年13月1日', '2023年13月01日', '2023-13-01', '2023-13-1',
	'2023年2月29日', '2023-02-29',
	'２０２３年９月１５日',
	'2023年0月15日', '2023年00月15日', '2023-00-15', '2023-0-15',
	'2023年9月0日', '2023年09月00日', '2023-09-0', '2023-9-0',
	lang:formatDate('Y年1月1日', '+2 years'), lang:formatDate('Y-01-01', '+2 years'),
	'2024-2023', '2024–2023', '2024年-2023年', '2024年–2023年', '2024-2023年', '2024–2023年', '2024–23',
	'2010–11',
	'2000年Jan', '2000年Spring', '春 2000', '9月 2000', '9 2000',
}
local function format_date(value, date_format)
	local date_parameters_list = { 'date' = {val = value} }
	local error_list = {}
	validation.dates(date_parameters_list, {}, error_list)
	if #error_list > 0 then return 'invalid date' end
	return validation.reformat_dates(date_parameters_list, date_format) and
		date_parameters_list'date'.val or
		value
end
function p:_test_format_dates(df)
	for _, v in ipairs(format_date_tests) do
		local case, expected = v1, vdf
		local _, result = pcall(format_date, case, df)
		p:equals(case, result, expected or case)
	end
end
function p:test_format_dates_01_ja()
	p:_test_format_dates('ja')
end
function p:test_format_dates_02_dmy()
	p:_test_format_dates('dmy')
end
function p:test_format_dates_03_mdy()
	p:_test_format_dates('mdy')
end
function p:test_format_dates_04_ymd()
	p:_test_format_dates('ymd')
end
function p:test_invalid_dates()
	for _, case in ipairs(invalid_date_tests) do
		local _, result = pcall(format_date, case, 'mdy')
		p:equals(case, result, 'invalid date')
	end
end
return p