Module:Citation/CS1/testcases/identifiers
Documentation for this module may be created at Module:Citation/CS1/testcases/identifiers/doc
--[=[ 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 <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/new |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/new |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/new |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/new |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/new |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/new |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) }, {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/new |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 --[[--------------------------< D O I >------------------------------------------------------------------------ ]] function p:test_doi() self:preprocess_equals_preprocess_many( '{{cite book/new |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/new |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/new |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/new |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/new |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/new |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/new |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/new |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/new |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/new |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 self:preprocess_equals_preprocess_many( '{{cite book/new |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 = new_cfg.id_handlers['PMC'].id_limit; -- get samdbox limit self:preprocess_equals_preprocess_many( '{{cite book/new |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 self:preprocess_equals_preprocess_many( '{{cite book/new |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 = new_cfg.id_handlers['PMID'].id_limit; -- get samdbox limit self:preprocess_equals_preprocess_many( '{{cite book/new |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 _ Q I D >-------------------------------------------------------------- ]] function p:test_qid() self:preprocess_equals_preprocess_many( '{{cite journal/new |title=Title |journal=Journal |', '}}', '{{cite journal |title=Title |journal=Journal |', '}}', { {'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( '{{cite book/new |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 = new_cfg.id_handlers['S2CID'].id_limit self:preprocess_equals_preprocess_many( '{{cite book/new |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/new |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 self:preprocess_equals_preprocess_many( '{{cite book/new |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 = new_cfg.id_handlers['SSRN'].id_limit self:preprocess_equals_preprocess_many( '{{cite book/new |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/new |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/new |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/new |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/new |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/new |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/new |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