--[=[
Unit tests for [[Module:Citation/CS1/Identifiers]].
Click talk page to run tests.
]=]
local p = require('Module:UnitTests');
local live_cfg = mw.loadData ('Module:Citation/CS1/Configuration');
local new_cfg = mw.loadData ('Module:Citation/CS1/Configuration/Antigng');
local limit_huge = require'math'.huge -- LOCAL: Temporary fix for the first major version in sandbox
--[[--------------------------< T O D A Y _ P L U S _ O F F S E T _ G E T >------------------------------------
returns date offset from today by <offset> in <format> (#time parser function formatting)
Y - four digit year
m - two digit month
M - abbreviated month name
F - full month name
d - zero-padded day
j - day without zero-padding
<offset> must include units: days, months, years
]]
local function today_plus_offset_get (format, offset)
return mw.getContentLanguage():formatDate(format, 'today ' .. offset and ('+ ' .. offset) or '');
end
--[[--------------------------< A R X I V _ 9 1 0 7 _ 0 7 0 3 >------------------------------------------------
]]
function p:test_arxiv_9107_0703()
self:preprocess_equals_preprocess_many(
'{{cite book/Antigng |title=Title |', '}}', '{{cite book |title=Title |', '}}',
{
-- legitimate date range
{'arxiv=a.a/9007333'}, -- invalid yymm (fail)
{'arxiv=a.a/9106333'}, -- invalid yymm (fail)
{'arxiv=a.a/9107333'}, -- valid yymm (pass)
{'arxiv=a.a/0703333'}, -- valid yymm (pass)
{'arxiv=a.a/0704333'}, -- invalid yymm (fail)
{'arxiv=a.a/0803333'}, -- valid yymm (pass)
-- archive & class
{'arxiv=.a/9107333'}, -- without archive (fail)
{'arxiv=aa/9107333'}, -- without class (pass)
-- number
{'arxiv=aa/910722'}, -- not enough digits (fail)
{'arxiv=aa/91074444'}, -- too many digits (fail)
-- version
{'arxiv=a.a/9107333v'}, -- missing version number (fail)
{'arxiv=a.a/9107333v1'}, -- with version number (pass)
},
{nowiki=false, templatestyles=true}
)
end
--[[--------------------------< A R X I V _ 0 7 0 4 _ 1 4 1 2 >------------------------------------------------
]]
function p:test_arxiv_0704_1412()
self:preprocess_equals_preprocess_many(
'{{cite book/Antigng |title=Title |', '}}', '{{cite book |title=Title |', '}}',
{
-- date range
{'arxiv=0612.4444'}, -- invalid yymm (fail)
{'arxiv=0703.4444'}, -- invalid yymm (fail)
{'arxiv=0704.4444'}, -- valid yymm (pass)
{'arxiv=1412.4444'}, -- valid yymm (pass)
{'arxiv=1413.4444'}, -- invalid yymm (fail)
{'arxiv=1501.4444'}, -- invalid yymm (fail)
-- number
{'arxiv=0704.333'}, -- not enough digits (fail)
{'arxiv=0704.55555'}, -- too many digits (fail)
-- version
{'arxiv=0704.4444v'}, -- missing version number (fail)
{'arxiv=0704.4444v1'}, -- with version number (pass)
},
{nowiki=false, templatestyles=true}
)
end
--[[--------------------------< A R X I V _ 1 5 0 1 >----------------------------------------------------------
]]
function p:test_arxiv_1501()
self:preprocess_equals_preprocess_many(
'{{cite book/Antigng |title=Title |', '}}', '{{cite book |title=Title |', '}}',
{
-- date range
{'arxiv=1412.55555'}, -- invalid yymm (fail)
{'arxiv=1500.55555'}, -- invalid yymm (fail)
{'arxiv=1501.55555'}, -- valid yymm (pass)
{'arxiv=1513.55555'}, -- invalid yymm (fail)
-- number
{'arxiv=1501.4444'}, -- not enough digits (fail)
{'arxiv=1501.666666'}, -- too many digits (fail)
-- version
{'arxiv=1501.4444v'}, -- missing version number (fail)
{'arxiv=1501.4444v1'}, -- with version number (pass)
},
{nowiki=false, templatestyles=true}
)
end
--[[--------------------------< A S I N >----------------------------------------------------------------------
]]
function p:test_asin()
self:preprocess_equals_preprocess_many(
'{{cite book/Antigng |title=Title |', '}}', '{{cite book |title=Title |', '}}',
{
{'asin=4-12346789X'}, -- invalid char: hyphen (fail)
{'asin=412346789'}, -- length (9) (fail)
{'asin=ABCDEFGHIJK'}, -- length (11) (fail)
{'asin=ABCDEFGHIJ'}, -- valid (pass)
{'asin=412346789X'}, -- valid (isbn) (pass)
{'asin=6302732913'}, -- valid (but not an isbn) (pass)
{'asin=ABCDEFGHIJ|asin-tld=com'}, -- invalid tld (fail)
{'asin=ABCDEFGHIJ|asin-tld=jp'}, -- valid tld (pass)
{'asin=ABCDEFGHIJ|asin-tld=uk'}, -- valid tld (pass)
{'asin=ABCDEFGHIJ|asin-tld=au'}, -- valid tld (pass)
{'asin=ABCDEFGHIJ|asin-tld=br'}, -- valid tld (pass)
{'asin=ABCDEFGHIJ|asin-tld=mx'}, -- valid tld (pass)
},
{nowiki=false, templatestyles=true}
)
end
--[[--------------------------< B I B C O D E >----------------------------------------------------------------
]]
function p:test_bibcode()
local this_year = today_plus_offset_get ('Y', '0 year'); -- get this year
self:preprocess_equals_preprocess_many(
'{{cite book/Antigng |title=Title |', '}}', '{{cite book |title=Title |', '}}',
{
-- years
{'bibcode=0999a&1.b2.c3.d4..e'}, -- invalid yyyy (fail)
{'bibcode=1000a&1.b2.c3.d4..e'}, -- valid yyyy (pass)
{'bibcode=' .. this_year .. 'a&1.b2.c3.d4..e'}, -- valid yyyy (pass)
{'bibcode=' .. today_plus_offset_get ('Y', '1 year') .. 'a&1.b2.c3.d4..e'}, -- valid yyyy (pass)
{'bibcode=' .. today_plus_offset_get ('Y', '2 year') .. 'a&1.b2.c3.d4..e'}, -- invalid yyyy (fail)
{'bibcode=' .. this_year .. '#&1.b2.c3.d4..e'}, -- invalid [5] (fail)
{'bibcode=' .. this_year .. 'a#1.b2.c3.d4..e'}, -- invalid [6] (fail)
{'bibcode=' .. this_year .. 'a&#.b2.c3.d4..e'}, -- invalid [7] (fail)
{'bibcode=' .. this_year .. 'a&1#b2.c3.d4..e'}, -- invalid [8] (fail)
{'bibcode=' .. this_year .. 'a&..b2.c3.d4..e'}, -- ampersand preceeds dot (fail)
{'bibcode=' .. this_year .. 'a&1.#2.c3.d4..e'}, -- invalid [9] (fail)
{'bibcode=' .. this_year .. 'a&1.b#.c3.d4..e'}, -- invalid [10] (fail)
{'bibcode=' .. this_year .. 'a&1.b2#c3.d4..e'}, -- invalid [11] (fail)
{'bibcode=' .. this_year .. 'a&1.b2.#3.d4..e'}, -- invalid [12] (fail)
{'bibcode=' .. this_year .. 'a&1.b2.c#.d4..e'}, -- invalid [13] (fail)
{'bibcode=' .. this_year .. 'a&1.b2.c3#d4..e'}, -- invalid [14] (fail)
{'bibcode=' .. this_year .. 'a&1.b2.c3.#4..e'}, -- invalid [15] (fail)
{'bibcode=' .. this_year .. 'a&1.b2.c3.d#..e'}, -- invalid [16] (fail)
{'bibcode=' .. this_year .. 'a&1.b2.c3.d4#.e'}, -- invalid [17] (fail)
{'bibcode=' .. this_year .. 'a&1.b2.c3.d4.#e'}, -- invalid [18] (fail)
{'bibcode=' .. this_year .. 'a&1.b2.c3.d4..#'}, -- invalid [19] (fail)
},
{nowiki=false, templatestyles=true}
)
end
--[[--------------------------< B I O R X I V >----------------------------------------------------------------
]]
function p:test_biorxiv()
local today = today_plus_offset_get ('Y.m.d', '0 year');
self:preprocess_equals_preprocess_many(
'{{cite book/Antigng |title=Title |', '}}', '{{cite book |title=Title |', '}}',
{
-- years
{'biorxiv=10.1100/666666'}, -- invalid prefix (fail)
{'biorxiv=10.1101/666666'}, -- valid prefix (pass)
{'biorxiv=11.1101/666666'}, -- invalid prefix (fail)
{'biorxiv=10.1101/55555'}, -- invalid identifier (fail)
{'biorxiv=10.1101/7777777'}, -- invalid identifier (fail)
----
{'biorxiv=10.1100/2019.12.10.666666'}, -- invalid date (fail)
{'biorxiv=10.1101/2019.12.11.666666'}, -- valid date (pass)
{'biorxiv=10.1101/2019.00.11.666666'}, -- invalid date (fail)
{'biorxiv=10.1101/2019.13.11.666666'}, -- invalid date (fail)
{'biorxiv=10.1101/2019.12.00.666666'}, -- invalid date (fail)
{'biorxiv=10.1101/2019.12.32.666666'}, -- invalid date (fail)
{'biorxiv=10.1101/' .. today .. '.666666'}, -- valid date (pass)
{'biorxiv=10.1101/' .. today_plus_offset_get ('Y.m.d', '1 year') .. '.666666'}, -- valid date (pass)
{'biorxiv=10.1101/' .. today .. '55555'}, -- invalid identifier (fail)
{'biorxiv=10.1101/' .. today .. '7777777'}, -- invalid identifier (fail)
{'biorxiv=10.1101/' .. today .. '.666666v'}, -- valid date (pass)
{'biorxiv=10.1101/' .. today .. '.666666v1'}, -- valid date (pass)
{'biorxiv=2020.09.02.278564'},
{'biorxiv=10.1101/2020.09.02.278564'},
{'biorxiv=278564'},
{'biorxiv=10.1101/2020.09.02.278564v1'},
},
{nowiki=false, templatestyles=true}
)
end
--[[--------------------------< C I T E S E E R X >------------------------------------------------------------
]]
function p:test_citeseerx()
self:preprocess_equals_preprocess_many(
'{{cite book/Antigng |title=Title |', '}}', '{{cite book |title=Title |', '}}',
{
{'citeseerx=11.1.1.1234.1234'}, -- invalid site id (fail)
{'citeseerx=10.0.1.1234.1234'}, -- invalid deployment id (fail)
{'citeseerx=10.1.0.1234.1234'}, -- invalid type (fail)
{'citeseerx=10.1.1.0234.1234'}, -- invalid bin (fail)
{'citeseerx=10.1.1.1234.0234'}, -- invalid record (fail)
{'citeseerx=10.1.1.1234.1234'}, -- invalid record (fail)
},
{nowiki=false, templatestyles=true}
)
end
--[[--------------------------< C S B N >------------------------------------------------------------
]]
function p:test_csbn()
self:preprocess_equals_preprocess_many(
'{{cite book/Antigng |title=Title |', '}}', '{{cite book |title=Title |', '}}',
{
{'csbn=11001·813'},
{'csbn=11001813'},
{'unified = 18001·813'},
{'unified = 11001-813'},
{'CSBN = 110001-813'},
{'csbn = 12017·276 '},
{'CSBN=11140·24'},
{'unified=17002-28'},
{'unified=85409.165'},
{'unified = 85409·165'},
{'csbn =8061-2280'},
{'CSBN = 7002-69'},
},
{nowiki=false, templatestyles=true}
)
end
--[[--------------------------< C N I D >------------------------------------------------------------
]]
function p:test_cnid()
self:preprocess_equals_preprocess_many(
'{{cite book/Antigng |title=Title |', '}}', '{{cite book |title=Title |', '}}',
{
{'cn=CN 11-0065'}, -- 合法格式(印刷报纸)
{'cn=CN11-0065'}, -- 合法格式(印刷报纸)
{'cn=11-0065'}, -- 合法格式(印刷报纸)
{'cn=11-0065/A'}, -- 非法格式(印刷报纸带有图书分类)
{'cn=CN31-1559/TL'}, -- 合法格式(印刷刊物)
{'cn=31-1559'}, -- 非法格式(印刷刊物不带图书分类)
{'CN=CN 31-1559/TX'}, -- 非法格式(印刷刊物带有非法分类)
{'CN=CN 91-1559/TX'}, -- 非法格式(印刷刊物带有非法省份)
{'CN=CN50-9244/D'}, -- 合法格式(电子刊物)
{'CN=CN 50-9244/DR'}, -- 非法格式(电子刊物带有非法分类)
{'CN=50-9233/TB'}, -- 合法格式(电子刊物)
},
{nowiki=false, templatestyles=true}
)
end
--[[--------------------------< D O I >------------------------------------------------------------------------
]]
function p:test_doi()
self:preprocess_equals_preprocess_many(
'{{cite book/Antigng |title=Title |', '}}', '{{cite book |title=Title |', '}}',
{
{'doi=10.1000/something'}, -- valid directory indicator (pass)
{'doi=11.1000/something'}, -- invalid directory indicator (fail)
{'doi=10.10 00/something'}, -- invalid registrant (fail)
{'doi=10.5555/something'}, -- invalid registrant (fail)
{'doi=10.666666/something'}, -- invalid registrant (fail)
-- four digit < registrant w/o subcode
{'doi=10.1/something'}, -- invalid registrant (fail)
{'doi=10.22/something'}, -- invalid registrant (fail)
{'doi=10.333/something'}, -- invalid registrant (fail)
-- four digit < registrant w/ subcode
{'doi=10.1.1/something'}, -- valid registrant (pass)
{'doi=10.22.1/something'}, -- valid registrant (pass)
{'doi=10.333.1/something'}, -- valid registrant (pass)
-- four digit registrant w/o subcode
{'doi=10.0999/something'}, -- invalid registrant (fail)
{'doi=10.1000/something'}, -- valid registrant (pass)
{'doi=10.9999/something'}, -- valid registrant (pass)
-- four digit registrant w/ subcode
{'doi=10.0999.1/something'}, -- invalid registrant (fail)
{'doi=10.1000.1/something'}, -- valid registrant (pass)
{'doi=10.9999.1/something'}, -- valid registrant (pass)
-- five digit registrant w/o subcode
{'doi=10.09999/something'}, -- invalid registrant (fail)
{'doi=10.10000/something'}, -- valid registrant (pass)
{'doi=10.59999/something'}, -- valid registrant (pass)
{'doi=10.60000/something'}, -- invalid registrant (fail)
-- five digit registrant w/ subcode
{'doi=10.09999.1/something'}, -- invalid registrant (fail)
{'doi=10.10000.1/something'}, -- valid registrant (pass)
{'doi=10.39999.1/something'}, -- valid registrant (pass)
{'doi=10.40000.1/something'}, -- invalid registrant (fail)
-- terminal punctuation
{'doi=10.1000/something.'}, -- trailing dot (fail)
{'doi=10.1000/something,'}, -- trailing comma (fail)
{'doi=10.1000/some thing'}, -- space character in identifier (fail)
-- doi-broken date
{'doi=10.1000/something |doi-broken-date=2020'}, -- valid doi-broken date (pass)
{'doi=10.1000/something |doi-broken-date=January 1900'}, -- valid doi-broken date (pass) TODO: valid but not valid; limit to same-as-access-date?
{'doi=10.1000/something |doi-broken-date=XXXX'}, -- invalid doi-broken date (fail)
{'doi=10.1000/something |doi-broken-date=January 3500'}, -- invalid doi-broken date (fail)
},
{nowiki=false, templatestyles=true}
)
end
--[[--------------------------< H D L >------------------------------------------------------------------------
]]
function p:test_hdl()
self:preprocess_equals_preprocess_many(
'{{cite book/Antigng |title=Title |', '}}', '{{cite book |title=Title |', '}}',
{
{'hdl=abc 123/abc123'}, -- invalid prefix (fail)
{'hdl=abc–123/abc123'}, -- invalid prefix (fail)
{'hdl=abc123/abc 123'}, -- invalid suffix (fail)
{'hdl=abc123/abc–123'}, -- invalid suffix (fail)
{'hdl=abc123/abc123.'}, -- trailing dot (fail)
{'hdl=abc123/abc123,'}, -- trailing comma (fail)
{'hdl=abc123/abc123'}, -- valid (pass)
-- query strings
{'hdl=abc123/abc123?not_a_query=string'}, -- valid (pass)
{'hdl=abc123/abc123?noredirect=string'}, -- valid (pass) TODO: does this take a value?
{'hdl=abc123/abc123?ignore_aliases=string'}, -- valid (pass) TODO: does this take a value?
{'hdl=abc123/abc123?auth=string'}, -- valid (pass) TODO: does this take a value?
{'hdl=abc123/abc123?cert=string'}, -- valid (pass) TODO: does this take a value?
{'hdl=abc123/abc123?index=string'}, -- valid (pass)
{'hdl=abc123/abc123?type=string'}, -- valid (pass)
{'hdl=abc123/abc123?urlappend=string'}, -- valid (pass)
{'hdl=abc123/abc123?locatt=string'}, -- valid (pass)
{'hdl=abc123/abc123?action=string'}, -- valid (pass)
},
{nowiki=false, templatestyles=true}
)
end
--[[--------------------------< T E S T _ I S B N >------------------------------------------------------------
]]
function p:test_isbn()
self:preprocess_equals_preprocess_many(
'{{cite book/Antigng |title=Title |', '}}', '{{cite book |title=Title |', '}}',
{
{'isbn=3–123467899'}, -- invalid character (ndash) (fail)
{'isbn=312346789'}, -- length (9) (fail)
{'isbn=31234678999'}, -- length (11) (fail)
{'isbn=41234678X9'}, -- X in the wrong spot (fail)
{'isbn=3123467896'}, -- checkdigit (fail)
{'isbn=3123467899'}, -- valid (pass)
{'isbn=412346789X'}, -- valid (pass)
{'isbn=3-123467899'}, -- valid (pass)
{'isbn=4-12346789X'}, -- valid (pass)
{'isbn=3 123467899'}, -- valid (pass)
{'isbn=4 12346789X'}, -- valid (pass)
{'isbn=978-01234567866'}, -- length (14) (fail)
{'isbn=978-012345678'}, -- length (12) (fail)
{'isbn=978-012345678X'}, -- isbn13 is digits only (fail)
{'isbn=977-0123456786'}, -- 978 or 979 prefix only (fail)
{'isbn=979-0123456785'}, -- 9790 is ismn (fail)
{'isbn=978-0123456788'}, -- check digit (fail)
{'isbn=9780123456786'}, -- valid 978 (pass)
{'isbn=9791123456782'}, -- valid 979 (pass)
{'isbn=978-0123456786'}, -- valid 978 (pass)
{'isbn=979-1123456782'}, -- valid 979 (pass)
{'isbn=978 0123456786'}, -- valid 978 (pass)
{'isbn=979 1123456782'}, -- valid 979 (pass)
{'isbn=3123467896 |ignore-isbn-error=yes'}, -- checkdigit (pass)
{'isbn=3123467899 |ignore-isbn-error=yes'}, -- valid (pass)
{'isbn=978-0123456788 |ignore-isbn-error=yes'}, -- check digit (pass)
{'isbn=9780123456786 |ignore-isbn-error=yes'}, -- valid 978 (pass)
},
{nowiki=false, templatestyles=true}
)
end
--[[--------------------------< T E S T _ I S M N >------------------------------------------------------------
]]
function p:test_ismn()
self:preprocess_equals_preprocess_many(
'{{cite book/Antigng |title=Title |', '}}', '{{cite book |title=Title |', '}}',
{
{'ismn=979-01234567856'}, -- length (14) (fail)
{'ismn=979-012345678'}, -- length (12) (fail)
{'ismn=979-012345678X'}, -- digits only (fail)
{'ismn=979-1123456782'}, -- group designator must be 0 (fail)
{'ismn=979-0123456788'}, -- check digit (fail)
{'ismn=979–0123456785'}, -- valid (pass)
{'ismn=9790123456785'}, -- valid (pass)
{'ismn=979-0123456785'}, -- valid (pass)
{'ismn=979 0123456785'}, -- valid (pass)
},
{nowiki=false, templatestyles=true}
)
end
--[[--------------------------< T E S T _ I S S N >------------------------------------------------------------
]]
function p:test_issn()
self:preprocess_equals_preprocess_many(
'{{cite book/Antigng |title=Title |', '}}', '{{cite book |title=Title |', '}}',
{
{'issn=0123-45601'}, -- length (9) (fail)
{'issn=0123-456'}, -- length (7) (fail)
{'issn=7123-45X6'}, -- X mispositioned (fail)
{'issn=0123-4566'}, -- check digit (fail)
{'issn=0123–4560'}, -- valid (pass)
{'issn=01234560'}, -- valid (pass)
{'issn=7123-456X'}, -- valid (pass)
{'issn=7123 456X'}, -- valid (pass)
},
{nowiki=false, templatestyles=true}
)
end
--[[--------------------------< T E S T _ J F M >--------------------------------------------------------------
]]
function p:test_jfm()
self:preprocess_equals_preprocess_many(
'{{cite book/Antigng |title=Title |', '}}', '{{cite book |title=Title |', '}}',
{
{'jfm=1.4444.22'}, -- missing digit (fail)
{'jfm=22.333.22'}, -- missing digit (fail)
{'jfm=22.4444.1'}, -- missing digit (fail)
{'jfm=333.4444.22'}, -- to many digit (fail)
{'jfm=22.55555.22'}, -- to many digit (fail)
{'jfm=22.4444.333'}, -- to many digit (fail)
{'jfm=224444.22'}, -- missing separator (fail)
{'jfm=22.444422'}, -- missing separator (fail)
{'jfm=jfm22.4444.22'}, -- jfm prefix (pass)
{'jfm=22.4444.22'}, -- valid (pass)
},
{nowiki=false, templatestyles=true}
)
end
--[[--------------------------< T E S T _ L C C N >------------------------------------------------------------
]]
function p:test_lccn()
self:preprocess_equals_preprocess_many(
'{{cite book/Antigng |title=Title |', '}}', '{{cite book |title=Title |', '}}',
{
-- length 8
{'lccn=7777777'}, -- missing digit (fail)
{'lccn=8888888a'}, -- not all digit (fail)
{'lccn=888 8888'}, -- space (fail)
{'lccn=88888888'}, -- valid (pass)
-- length 9
{'lccn=999999999'}, -- to many digit (fail)
{'lccn=A99999999'}, -- case (fail)
{'lccn=a99999999'}, -- valid (pass)
-- length 10
{'lccn=a000000000'}, -- not all digit (fail)
{'lccn=AA00000000'}, -- case (fail)
{'lccn=000 000000'}, -- space (fail) TODO: fix this: renders as 000000 000 000000
{'lccn=0000000000'}, -- valid (pass)
{'lccn=aa00000000'}, -- valid (pass)
-- length 11
{'lccn=11111111111'}, -- all digit (fail)
{'lccn=aa111111111'}, -- not enough alpha (fail)
{'lccn=A1111111111'}, -- case (fail)
{'lccn=AAA11111111'}, -- case (fail)
{'lccn=a1111111111'}, -- valid (pass)
{'lccn=aaa11111111'}, -- valid (pass)
-- length 12
{'lccn=222222222222'}, -- all digit (fail)
{'lccn=a22222222222'}, -- not enough alpha (fail)
{'lccn=AA2222222222'}, -- case (fail)
{'lccn=aa2222222222'}, -- valid (pass)
},
{nowiki=false, templatestyles=true}
)
end
--[[--------------------------< T E S T _ M R >----------------------------------------------------------------
]]
function p:test_mr()
self:preprocess_equals_preprocess_many(
'{{cite book/Antigng |title=Title |', '}}', '{{cite book |title=Title |', '}}',
{
{'mr=88888888'}, -- to many digit (fail)
{'mr=a777777'}, -- non-digit (fail)
{'mr=7777777'}, -- valid (pass)
{'mr=MR7777777'}, -- valid (pass)
{'mr=MR7'}, -- zero fill valid (pass)
{'mr=7'}, -- zero fill valid (pass)
},
{nowiki=false, templatestyles=true}
)
end
--[[--------------------------< T E S T _ O C L C >------------------------------------------------------------
]]
function p:test_oclc()
self:preprocess_equals_preprocess_many(
'{{cite book/Antigng |title=Title |', '}}', '{{cite book |title=Title |', '}}',
{
{'oclc=ocm8888888'}, -- not enough digit (fail)
{'oclc=ocm888888888'}, -- too many digit (fail)
{'oclc=OCM88888888'}, -- case (fail)
{'oclc=ocm88888888'}, -- valid (pass)
{'oclc=ocn99999999'}, -- not enough digit (fail)
{'oclc=ocn9999999999'}, -- too many digit (fail)
{'oclc=OCN999999999'}, -- case (fail)
{'oclc=ocn999999999'}, -- valid (pass)
{'oclc=on000000000'}, -- not enough digit (fail)
{'oclc=ON0000000000'}, -- case (fail)
{'oclc=on0000000000'}, -- valid (pass)
{'oclc=(OCoLC)07'}, -- leading 0 (fail)
{'oclc=(OCoLC)9999999999'}, -- too many digit (fail)
{'oclc=(ocolc)07'}, -- case (fail)
{'oclc=OCoLC9'}, -- missing parentheses (fail)
{'oclc=(OCoLC)9'}, -- valid (pass)
{'oclc=(OCoLC)999999999'}, -- valid (pass)
{'oclc=00000000000'}, -- too many digit (fail)
{'oclc=000X000000'}, -- non-digit (fail)
{'oclc=0000000000'}, -- valid (pass)
{'oclc=0'}, -- valid (pass)
},
{nowiki=false, templatestyles=true}
)
end
--[[--------------------------< T E S T _ O L >----------------------------------------------------------------
]]
function p:test_ol()
self:preprocess_equals_preprocess_many(
'{{cite book/Antigng |title=Title |', '}}', '{{cite book |title=Title |', '}}',
{
{'ol=OLA'}, -- no digit (fail)
{'ol=ol22A'}, -- prefix case (fail)
{'ol=LO22A'}, -- invalid prefix (fail)
{'ol=OL 22A'}, -- space (fail)
{'ol=333'}, -- no suffix (fail)
{'ol=333a'}, -- suffix case (fail)
{'ol=333m'}, -- suffix case (fail)
{'ol=333w'}, -- suffix case (fail)
{'ol=333R'}, -- unknown suffix (fail)
{'ol=OL4444A'}, -- valid (pass)
{'ol=4444A'}, -- valid (pass)
{'ol=OL55555M'}, -- valid (pass)
{'ol=55555M'}, -- valid (pass)
{'ol=OL666666W'}, -- valid (pass)
{'ol=666666W'}, -- valid (pass)
},
{nowiki=false, templatestyles=true}
)
end
--[[--------------------------< T E S T _ P M C >--------------------------------------------------------------
]]
function p:test_pmc()
local limit = live_cfg.id_handlers['PMC'].id_limit or limit_huge
self:preprocess_equals_preprocess_many(
'{{cite book/Antigng |title=Title |', '}}', '{{cite book |title=Title |', '}}',
{
{'pmc=PMC'}, -- no digit (fail)
{'pmc=0'}, -- out of bounds (fail)
{'pmc=1'}, -- in bounds (pass)
{'pmc=' .. limit}, -- in bounds (pass)
{'pmc=' .. limit+1}, -- out of bounds (fail)
{'pmc=PMC1'}, -- valid (pass)
{'pmc=PMC1 |doi=10.1000/something |doi-access=free'}, -- title linked from pmc
{'pmc=22 |pmc-embargo-date=' .. today_plus_offset_get ('Y-m-d', '1 days')}, -- valid still embargoed
{'pmc=22 |pmc-embargo-date=' .. today_plus_offset_get ('Y-m-d', '0 days')}, -- valid (pass)
{'pmc=22 |pmc-embargo-date=' .. today_plus_offset_get ('F j, Y', '0 days')}, -- valid (pass)
{'pmc=22 |pmc-embargo-date=' .. today_plus_offset_get ('j F Y', '0 days')}, -- valid (pass)
{'pmc=22 |pmc-embargo-date=' .. today_plus_offset_get ('F Y', '0 days')}, -- valid (pass)
{'pmc=22 |pmc-embargo-date=' .. today_plus_offset_get ('Y', '0 days')}, -- valid (pass)
},
{nowiki=false, templatestyles=true}
)
limit = 100000; -- get samdbox limit
self:preprocess_equals_preprocess_many(
'{{cite book/Antigng |title=Sandbox limit test |', '}}', '{{cite book |title=Sandbox limit test |', '}}',
{
{'pmc=' .. limit}, -- in bounds (pass)
{'pmc=' .. limit+1}, -- out of bounds (fail)
},
{nowiki=false, templatestyles=true}
)
end
--[[--------------------------< T E S T _ P M I D >------------------------------------------------------------
]]
function p:test_pmid()
local limit = live_cfg.id_handlers['PMID'].id_limit or limit_huge
self:preprocess_equals_preprocess_many(
'{{cite book/Antigng |title=Title |', '}}', '{{cite book |title=Title |', '}}',
{
{'pmid=pmid'}, -- no digit (fail)
{'pmid=0'}, -- out of bounds (fail)
{'pmid=1'}, -- in bounds (pass)
{'pmid=' .. limit}, -- in bounds (pass)
{'pmid=' .. limit+1}, -- out of bounds (fail)
},
{nowiki=false, templatestyles=true}
)
limit = 130000; -- get samdbox limit
self:preprocess_equals_preprocess_many(
'{{cite book/Antigng |title=Sandbox limit test |', '}}', '{{cite book |title=Sandbox limit test |', '}}',
{
{'pmid=' .. limit}, -- in bounds (pass)
{'pmid=' .. limit+1}, -- out of bounds (fail)
},
{nowiki=false, templatestyles=true}
)
end
--[[--------------------------< T E S T _ S 2 C I D >----------------------------------------------------------
]]
function p:test_s2cid()
--local limit = live_cfg.id_handlers['S2CID'].id_limit or limit_huge -- LOCAL: temp fix
limit = 235000000
self:preprocess_equals_preprocess_many(
'{{cite book/Antigng |title=Title |', '}}', '{{cite book |title=Title |', '}}',
{
{'s2cid=s2cid'}, -- no digit (fail)
{'s2cid=0'}, -- out of bounds (fail)
{'s2cid=1'}, -- in bounds (pass)
{'s2cid=' .. limit}, -- in bounds (pass)
{'s2cid=' .. limit+1}, -- out of bounds (fail)
},
{nowiki=false, templatestyles=true}
)
limit = 235000000
self:preprocess_equals_preprocess_many(
'{{cite book/Antigng |title=Sandbox limit test |', '}}', '{{cite book |title=Sandbox limit test |', '}}',
{
{'s2cid=' .. limit}, -- in bounds (pass)
{'s2cid=' .. limit+1}, -- out of bounds (fail)
},
{nowiki=false, templatestyles=true}
)end
--[[--------------------------< T E S T _ S B N >--------------------------------------------------------------
]]
function p:test_sbn()
self:preprocess_equals_preprocess_many(
'{{cite book/Antigng |title=Title |', '}}', '{{cite book |title=Title |', '}}',
{
{'sbn=0–12345679'}, -- invalid character (ndash) (fail)
{'sbn=01234567'}, -- length (8) (fail)
{'sbn=0123456799'}, -- length (10) (fail)
{'sbn=6123456X7'}, -- X in the wrong spot (fail)
{'sbn=012345678'}, -- checkdigit (fail)
{'sbn=012345679'}, -- valid (pass)
{'sbn=61234567X'}, -- valid (pass)
{'sbn=0-12345679'}, -- valid (pass)
{'sbn=6-1234567X'}, -- valid (pass)
{'sbn=0 12345679'}, -- valid (pass)
{'sbn=6 1234567X'}, -- valid (pass)
},
{nowiki=false, templatestyles=true}
)
end
--[[--------------------------< T E S T _ S S R N >------------------------------------------------------------
]]
function p:test_ssrn()
local limit = live_cfg.id_handlers['SSRN'].id_limit or limit_huge
self:preprocess_equals_preprocess_many(
'{{cite book/Antigng |title=Title |', '}}', '{{cite book |title=Title |', '}}',
{
{'ssrn=ssrn'}, -- no digit (fail)
{'ssrn=99'}, -- out of bounds (fail)
{'ssrn=100'}, -- in bounds (pass)
{'ssrn=' .. limit}, -- in bounds (pass)
{'ssrn=' .. limit+1}, -- out of bounds (fail)
},
{nowiki=false, templatestyles=true}
)
limit = 3500000
self:preprocess_equals_preprocess_many(
'{{cite book/Antigng |title=Sandbox limit test |', '}}', '{{cite book |title=Sandbox limit test |', '}}',
{
{'ssrn=' .. limit}, -- in bounds (pass)
{'ssrn=' .. limit+1}, -- out of bounds (fail)
},
{nowiki=false, templatestyles=true}
)
end
--[[--------------------------< T E S T _ M E S S A G E - I D >------------------------------------------------
]]
function p:test_message_id()
self:preprocess_equals_preprocess_many(
'{{cite newsgroup/Antigng |title=Title |', '}}', '{{cite newsgroup |title=Title |', '}}',
{
{'message-id=something'}, -- missing '@' (fail)
{'message-id=<something@somewhere'}, -- leading '<' (fail)
{'message-id=something@somewhere>'}, -- trailing '>' (fail)
{'message-id=something@somewhere'}, -- valid (pass)
},
{nowiki=false, templatestyles=true}
)
end
--[[--------------------------< T E S T _ Z B L >--------------------------------------------------------------
]]
function p:test_zbl()
self:preprocess_equals_preprocess_many(
'{{cite newsgroup/Antigng |title=Title |', '}}', '{{cite newsgroup |title=Title |', '}}',
{
{'zbl=7777777'}, -- length (temp form) (fail)
{'zbl=999999999'}, -- length (temp form) (fail)
{'zbl=aaaaaaaa'}, -- must be digits (temp form) (fail)
{'zbl=88888888'}, -- valid (temp form) (pass)
{'zbl=444455555'}, -- missing dot (fail)
{'zbl=333.666666'}, -- dot misplaced (fail)
{'zbl=4444.55555'}, -- valid (pass)
},
{nowiki=false, templatestyles=true}
)
end
--[[--------------------------< T E S T _ A U T O _ L I N K >----------------------------------------=========
]]
function p:test_auto_link()
self:preprocess_equals_preprocess_many(
'{{cite book/Antigng |title=Title |doi-access=free |', '}}', '{{cite book |title=Title |doi-access=free |', '}}',
{
{'doi=10.1000/something'}, -- title not linked
{'pmc=1 |doi=10.1000/something'}, -- title not linked
},
{nowiki=false, templatestyles=true}
);
self:preprocess_equals_preprocess_many(
'{{cite journal/Antigng |title=Title |journal=Journal |', '}}', '{{cite journal |title=Title |journal=Journal |', '}}',
{
{'doi=10.1000/something |doi-access=free |doi-broken-date=2020-09-09'}, -- title linked by doi; TODO: but should it be linked?
{'doi=10.1000/some thing |doi-access=free'}, -- title linked by doi; TODO: but should it be linked?
{'doi=10.1000/something |doi-access=free'}, -- title linked by doi
{'pmc=1 |doi=10.1000/something |doi-access=free |pmc-embargo-date=' .. today_plus_offset_get ('Y-m-d', '1 days')}, -- embargoed pmc; title linked by doi
{'pmc=1 |doi=10.1000/something |doi-access=free'}, -- title linked by pmc
{'pmc=1 |pmc-embargo-date=' .. today_plus_offset_get ('Y-m-d', '1 days')}, -- title not linked
{'pmc=0 |pmc-embargo-date=' .. today_plus_offset_get ('Y-m-d', '1 days')}, -- title not linked
{'pmc=0 |doi=10.1000/something |doi-access=free'}, -- title linked by pmc; TODO: but shouldn't it be linked by doi?
{'pmc=0 |doi=10.1000/something |doi-access=free |doi-broken-date=2020-09-09'}, -- title linked by pmc; TODO: should not be linked?
{'pmc=0 |doi=10.1000/something |doi-access=free |doi-broken-date=2020-09-09 |pmc-embargo-date=' .. today_plus_offset_get ('Y-m-d', '1 days')}, -- title linked by pmc; TODO: should not be linked?
},
{nowiki=false, templatestyles=true}
)
end
--[[--------------------------< T E S T _ A C C E S S _ I C O N S >--------------------------------------------
]]
function p:test_access_icons()
self:preprocess_equals_preprocess_many(
'{{cite book/Antigng |title=Title |', '}}', '{{cite book |title=Title |', '}}',
{
{'bibcode=1000a&1.b2.c3.d4..e |bibcode-access=free'},
{'doi=10.1000/something |doi-access=free'},
{'hdl=abc123/abc123 |hdl-access=free'},
{'jstor=12345 |jstor-access=free'},
{'ol=OL4444A |ol-access=free'},
{'osti=15005772 |osti-access=free'},
{'s2cid=30337924 |s2cid-access=free'},
},
{nowiki=false, templatestyles=true}
)
end
--[[--------------------------< T E S T _ A C C E P T _ A S _ W R I T T E N >----------------------------------
]]
function p:test_accept_as_written()
self:preprocess_equals_preprocess_many(
'{{cite book/Antigng |title=Title |', '}}', '{{cite book |title=Title |', '}}',
{
{'doi=((10.1000/something.))'},
{'eissn=((0123-4566))'}, -- check digit (fail)
{'isbn=((3123467896))'}, -- checkdigit (fail)
{'isbn=((978-01234567866))'}, -- length (14) (fail)
{'isbn=((978-0123456788))'}, -- check digit (fail)
{'issn=((0123-4566))'}, -- check digit (fail)
{'sbn=((012345678))'}, -- checkdigit (fail)
},
{nowiki=false, templatestyles=true}
)
end
return p