Modul:JSONutil/test
| Vorlagenprogrammierung | Diskussionen | Lua | Test | Unterseiten | |||
| Modul | Deutsch | English
|
Modul: | Dokumentation | |||
Diese Seite enthält Code in der Programmiersprache Lua. Einbindungszahl Cirrus
local Export = { suite = "JSONutil",
sub = "test",
serial = "2019-07-17" }
--[=[
Unit test for JSONutil
=p.fiat()
]=]
local Cases = {
{ source = '{ "simple": "assignment" }' },
{ source = '{ "beg": "\\"escaped quote", "mid": "escaped\\"quote", "end": "escaped quote\\"" }' },
{ source = '{ "multiline": "Some text\nin several lines\nalso with\ttabulator" }',
second = '{ "multiline": "Some text\\nin several lines\\nalso with\\ttabulator" }' },
{ source = '{ "lineseps": "Ux\nstyle and\rApple and MS\r\nDOS" }',
second = '{ "lineseps": "Ux\\nstyle and\\nApple and MS\\nDOS" }' },
{ source = '{ "commented": true } // line at end',
second = '{ "commented": true }' },
{ source = '{ "commented":// line amid\n true// second line\n } ',
second = '{ "commented": true }' },
{ source = '{ "commented": /* middle */true }',
second = '{ "commented": true }' },
{ source = '{ "commented":/* middle */"edge" }',
second = '{ "commented":"edge" }' },
{ source = '{ "NoComment": "An URL http://example.org/ is not a comment" }' },
{ source = 'No JSON',
status = 'Bracket0' },
{ source = '{ "simple": "assignment" } garbage',
status = 'Trailing',
second = 'garbage' },
{ source = '{ "quoting": \'apostrophes\' }',
status = 'Qoute',
second = "'apostrophes' }" },
{ source = '{ "missing": "qoute }',
status = 'QouteEnd',
second = 'qoute }' },
{ source = '{ "missing": "qoute (escaped)\\" }',
status = 'QouteEnd',
second = 'qoute (escaped)\\" }' },
{ source = '{ "htab": "h' .. string.char( 8 ) .. 'tab" }',
status = 'ControlChar',
second = 'tab" }' },
{ source = '{ "comma": "trailing", }',
status = 'CommaEnd',
second = ', }' },
{ source = '{ "comma": [ "trailing", ] }',
status = 'CommaEnd',
second = ', ] }' },
{ source = '{ "comma": true, }',
status = 'CommaEnd',
second = ': true, }' },
{ source = '{ "unclosed": true',
status = 'BracketCloseLack',
second = '}' },
{ source = '{ "unclosed": "terminating"',
status = 'BracketCloseLack',
second = '}' },
{ source = '{ { "unclosed": 99',
status = 'BracketCloseLack',
second = '2 }' },
{ source = '{ "unclosed": [ 42 }',
status = 'BracketCloseLack',
second = ']' },
{ source = '{ "unclosed": [ 42 ] ] }',
status = 'BracketClosePlus',
second = ']' },
{ source = '{ "unclosed": [ 42 ] ] ] }',
status = 'BracketClosePlus',
second = '2 ]' },
{ source = '{ "commented": /* middle true }',
status = 'CommentEnd',
second = 'middle true }' }
}
local Codes = { { k = 9,
s = "\\t",
say = "Tab" },
{ k = 10,
s = "\\n",
say = "LF" } ,
{ k = 13,
s = "\\r",
say = "CR" } }
local Frame, Slang, Utility
local function far()
local r
if not Slang then
local o = mw.message.new( "lang" )
if o:exists() then
Slang = Frame:preprocess( "{{int:lang}}" )
else
local g, lucky, s, t
Slang = true
s = string.format( "I18n/Module:%s.tab", Export.suite )
lucky, t = pcall( mw.ext.data.get, s, "_" )
lucky, g = pcall( require, "Module:Multilingual" )
if type( g ) == "table" and
type( g.Multilingual ) == "function" and
type( t ) == "table" then
local Multilingual = g.Multilingual()
t = t.data
if type( t ) == "table" and
type( Multilingual.userLang ) == "function" then
local e
g = { }
s = ""
for i = 1, #t do
e = t[ i ]
if type( e ) == "table" and
type( e[ 1 ] ) == "string" and
e[ 1 ]:find( "^err_" ) and
type( e[ 2 ] ) == "table" then
e = e[ 2 ]
if type( e ) == "table" then
for k, v in pairs( e ) do
if type( k ) == "string" and
type( v ) == "string" then
g[ k ] = true
end
end -- for k, v
end
end
end -- for i
for k, v in pairs( g ) do
if s == "" then
s = k
else
s = string.format( "%s %s", s, k )
end
end -- for k, v
Slang = Multilingual.userLang( s, Frame )
end
end
end
end
if type( Slang ) == "string" then
r = Slang
end
return r
end -- far()
local function father()
local r
if not Utility then
local try = string.format( "Module:%s", Export.suite )
local lucky
lucky, try = pcall( require, try )
if type( try ) == "table" then
if type( try.JSONutil ) == "function" then
Utility = try.JSONutil()
else
r = string.format( "%s bad init", Export.suite )
end
else
r = try
end
if r then
local e = mw.html.create( "span" )
:addClass( "error" )
:wikitext( r )
r = tostring( e )
end
end
return r
end -- father()
local function fault()
-- Retrieve unit test result
-- Returns string with wikisyntax
local errors = { "Bracket0",
"BracketCloseLack",
"BracketClosePlus",
"CommaEnd",
"CommentEnd",
"ControlChar",
"Qoute",
"QouteEnd",
"Trailing" }
local r = ""
local s, s2
for i = 1, #errors do
s = errors[ i ]
s2 = string.format( "Trailing%d", i )
r = string.format( "%s\n; %s\n: %s",
r, s, Utility.fault( s, s2, far() ) )
end -- for i
return r
end -- fault()
local function fetch()
-- Retrieve unit test result
-- Returns string with wikisyntax
local r = ""
local e, s
for i = 1, #Cases do
if i > 1 then
r = r .. "\n----\n"
end
e = Cases[ i ]
e = Utility.fetch( e.source, true, far() )
s = type( e )
if s == "string" then
r = r .. mw.text.encode( e )
elseif s == "table" then
s = mw.text.jsonEncode( e, mw.text.JSON_PRETTY )
s = mw.text.encode( s ):gsub( "\n", "<br / >" )
:gsub( "://", "://" )
e = mw.html.create( "span" )
:css( {["font-family"] = "monospace" } )
:wikitext( s )
r = r .. tostring( e )
else
r = string.format( "%s%s %s", r, "fetch() BAD TYPE:", s )
end
end -- for i
return r
end -- fetch()
local function fiat()
-- Retrieve unit test result
-- Returns string with wikisyntax
local scream = "style='background:red'"
local spaced = "style='font-family:monospace'"
local flip = function ( apply, at, alter )
local xe
local xr = apply:gsub( "''", "''" )
for k = 1, #Codes do
xe = Codes[ k ]
xr = xr:gsub( xe[ at ], xe[ alter ] )
end -- for k
xr = xr:gsub( "://", "://" )
return xr
end -- flip()
local r = "{| class='wikitable'\n" ..
"|-\n" ..
"! Input !! Code (fault) !! String (trailing)\n"
local e, legal, s, score, second, show, sign
for i = 1, #Codes do
e = Codes[ i ]
e.str = string.char( e.k )
e.sup = string.format( "<sup>%s</sup>", e.say )
end -- for i
for i = 1, #Cases do
e = Cases[ i ]
legal = true
score, s = Utility.fair( e.source )
if score then
legal = ( score == e.status )
if not legal then
score = string.format( "'''%s'''",
e.status or "unexpected" )
end
elseif e.status then
score = string.format( "− %s", e.status )
legal = false
else
score = "–"
end
if legal then
second = e.second or e.source
legal = ( s == second )
end
if legal then
sign = ""
else
sign = scream
end
show = flip( e.source, "str", "sup" )
s = flip( s, "str", "sup" )
r = string.format( "%s|- %s\n|%s| %s\n| %s\n|%s| %s\n",
r, sign, spaced, show, score, spaced, s )
end -- for i
r = r .. "|}"
return r
end -- fiat()
-- Export
local p = { }
p.fault = function ( frame )
Frame = frame
return father() or fault()
end
p.fetch = function ( frame )
Frame = frame
return father() or fetch()
end
p.fiat = function ()
return father() or fiat()
end
return p
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.