Module:Citation/CS1/testcases/identifiers

--[=[

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/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 in (#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

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(   	, ,		{																				-- 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(   	, ,		{																				-- 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(   	, ,		{																				-- 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(   	, ,		{			{'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(   	, ,		{																				-- 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(   	, ,		{																				-- 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) },		{nowiki=false, templatestyles=true} ) end

----< C I T E S E E R X >

function p:test_citeseerx self:preprocess_equals_preprocess_many(   	, ,		{			{'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

----< D O I >

function p:test_doi self:preprocess_equals_preprocess_many(   	, ,		{			{'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(   	, ,		{			{'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(   	, ,		{			{'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(   	, ,		{			{'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(   	, ,		{			{'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(   	, ,		{			{'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(   	, ,		{		-- 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(   	, ,		{			{'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(   	, ,		{			{'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(   	, ,		{			{'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 self:preprocess_equals_preprocess_many(   	, ,		{			{'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 = new_cfg.id_handlers['PMC'].id_limit;								-- get samdbox limit   self:preprocess_equals_preprocess_many( , ,		{			{'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 self:preprocess_equals_preprocess_many(   	, ,		{			{'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 = new_cfg.id_handlers['PMID'].id_limit;								-- get samdbox limit self:preprocess_equals_preprocess_many(   	, ,		{			{'pmid=' .. limit},													-- in bounds (pass)			{'pmid=' .. limit+1},												-- out of bounds (fail)		},		{nowiki=false, templatestyles=true}	) end

----< T E S T _ Q I D >--

function p:test_qid self:preprocess_equals_preprocess_many(   	, ,		{			{'q=Q'},															-- no digit (fail)			{'q=q1'},															-- not uppercase Q (fail)			{'q=Q1'},															-- valid (pass)		},		{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 self:preprocess_equals_preprocess_many(   	, ,		{			{'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 = new_cfg.id_handlers['S2CID'].id_limit self:preprocess_equals_preprocess_many(   	, ,		{			{'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(   	, ,		{			{'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 self:preprocess_equals_preprocess_many(   	, ,		{			{'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 = new_cfg.id_handlers['SSRN'].id_limit   self:preprocess_equals_preprocess_many( , ,		{			{'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(   	, ,		{			{'message-id=something'},											-- missing '@' (fail)			{'message-id='},								-- 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(   	, ,		{			{'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(   	, ,		{			{'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(   	, ,		{			{'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(   	, ,		{			{'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(   	, ,		{			{'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