mirror of
https://github.com/Wan-Video/Wan2.1.git
synced 2025-07-14 19:50:10 +00:00
782 lines
27 KiB
JavaScript
782 lines
27 KiB
JavaScript
if (!clarinet) { // node
|
||
var clarinet = require('../clarinet.js')
|
||
, _ = require('underscore')
|
||
;
|
||
}
|
||
|
||
function assert(expr, msg) {
|
||
if (!expr) {
|
||
throw new Error(msg || 'failed');
|
||
}
|
||
}
|
||
|
||
var seps = [undefined, /\t|\n|\r/, '']
|
||
, sep
|
||
, docs =
|
||
{ empty_array :
|
||
{ text : '[]'
|
||
, events :
|
||
[ ['openarray' , undefined]
|
||
, ['closearray' , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
, just_slash :
|
||
{ text : '["\\\\"]'
|
||
, events :
|
||
[ ['openarray' , undefined]
|
||
, ["value" , "\\"]
|
||
, ['closearray' , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
, zero_byte :
|
||
{ text : '{"foo": "\\u0000"}'
|
||
, events :
|
||
[ ["openobject" , "foo"]
|
||
, ["value" , "\u0000"]
|
||
, ["closeobject" , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
, empty_value :
|
||
{ text : '{"foo": ""}'
|
||
, events :
|
||
[ ["openobject" , "foo"]
|
||
, ["value" , ""]
|
||
, ["closeobject" , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
, three_byte_utf8 :
|
||
{ text : '{"matzue": "松江", "asakusa": "浅草"}'
|
||
, events :
|
||
[ ["openobject" , "matzue"]
|
||
, ["value" , "松江"]
|
||
, ["key" , "asakusa"]
|
||
, ["value" , "浅草"]
|
||
, ["closeobject" , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
, four_byte_utf8 :
|
||
{ text : '{ "U+10ABCD": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" }'
|
||
, events :
|
||
[ ["openobject" , "U+10ABCD"]
|
||
, ["value" , "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"]
|
||
, ["closeobject" , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
, bulgarian :
|
||
{ text : '["Да Му Еба Майката"]'
|
||
, events :
|
||
[ ["openarray" , undefined]
|
||
, ["value" , "Да Му Еба Майката"]
|
||
, ["closearray" , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
, codepoints_from_unicodes :
|
||
{ text : '["\\u004d\\u0430\\u4e8c\\ud800\\udf02"]'
|
||
, events :
|
||
[ ["openarray" , undefined]
|
||
, ["value" , "\u004d\u0430\u4e8c\ud800\udf02"]
|
||
, ["closearray" , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
, empty_object :
|
||
{ text : '{}'
|
||
, events :
|
||
[ ["openobject" , undefined]
|
||
, ["closeobject" , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
, foobar :
|
||
{ text : '{"foo": "bar"}'
|
||
, events :
|
||
[ ["openobject" , "foo"]
|
||
, ["value" , "bar"]
|
||
, ["closeobject" , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
, as_is :
|
||
{ text : "{\"foo\": \"its \\\"as is\\\", \\\"yeah\", \"bar\": false}"
|
||
, events :
|
||
[ ["openobject" , "foo"]
|
||
, ["value" , 'its "as is", "yeah']
|
||
, ["key" , "bar"]
|
||
, ["value" , false]
|
||
, ["closeobject" , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
, array :
|
||
{ text : '["one", "two"]'
|
||
, events :
|
||
[ ['openarray' , undefined]
|
||
, ['value' , 'one']
|
||
, ['value' , 'two']
|
||
, ['closearray' , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
, array_fu :
|
||
{ text : '["foo", "bar", "baz",true,false,null,{"key":"value"},' +
|
||
'[null,null,null,[]]," \\\\ "]'
|
||
, events :
|
||
[ ['openarray' , undefined]
|
||
, ['value' , 'foo']
|
||
, ['value' , 'bar']
|
||
, ['value' , 'baz']
|
||
, ['value' , true]
|
||
, ['value' , false]
|
||
, ['value' , null]
|
||
, ['openobject' , 'key']
|
||
, ['value' , "value"]
|
||
, ["closeobject" , undefined]
|
||
, ['openarray' , undefined]
|
||
, ['value' , null]
|
||
, ['value' , null]
|
||
, ['value' , null]
|
||
, ['openarray' , undefined]
|
||
, ['closearray' , undefined]
|
||
, ['closearray' , undefined]
|
||
, ['value' , " \\ "]
|
||
, ['closearray' , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
, simple_exp :
|
||
{ text : '[10e-01]'
|
||
, events :
|
||
[ ['openarray' , undefined]
|
||
, ['value' , 10e-01]
|
||
, ['closearray' , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
, nested :
|
||
{ text : '{"a":{"b":"c"}}'
|
||
, events :
|
||
[ ["openobject" , "a"]
|
||
, ["openobject" , "b"]
|
||
, ["value" , "c"]
|
||
, ["closeobject" , undefined]
|
||
, ["closeobject" , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
, nested_array :
|
||
{ text : '{"a":["b", "c"]}'
|
||
, events :
|
||
[ ["openobject" , "a"]
|
||
, ['openarray' , undefined]
|
||
, ['value' , 'b']
|
||
, ['value' , 'c']
|
||
, ['closearray' , undefined]
|
||
, ["closeobject" , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
, array_of_objs :
|
||
{ text : '[{"a":"b"}, {"c":"d"}]'
|
||
, events :
|
||
[ ['openarray' , undefined]
|
||
, ["openobject" , 'a']
|
||
, ['value' , 'b']
|
||
, ["closeobject" , undefined]
|
||
, ["openobject" , 'c']
|
||
, ['value' , 'd']
|
||
, ["closeobject" , undefined]
|
||
, ['closearray' , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
, two_keys :
|
||
{ text : '{"a": "b", "c": "d"}'
|
||
, events :
|
||
[ ["openobject" , "a"]
|
||
, ["value" , "b"]
|
||
, ["key" , "c"]
|
||
, ["value" , "d"]
|
||
, ["closeobject" , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
, key_true :
|
||
{ text : '{"foo": true, "bar": false, "baz": null}'
|
||
, events :
|
||
[ ["openobject" , "foo"]
|
||
, ["value" , true]
|
||
, ["key" , "bar"]
|
||
, ["value" , false]
|
||
, ["key" , "baz"]
|
||
, ["value" , null]
|
||
, ["closeobject" , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
, obj_strange_strings :
|
||
{ text :
|
||
'{"foo": "bar and all\\\"", "bar": "its \\\"nice\\\""}'
|
||
, events :
|
||
[ ["openobject" , "foo"]
|
||
, ["value" , 'bar and all"']
|
||
, ["key" , "bar"]
|
||
, ["value" , 'its "nice"']
|
||
, ["closeobject" , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
, bad_foo_bar :
|
||
{ text :
|
||
'["foo", "bar"'
|
||
, events :
|
||
[ ["openarray" , undefined]
|
||
, ["value" , 'foo']
|
||
, ["value" , 'bar']
|
||
, ['error' , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
, string_invalid_escape:
|
||
{ text :
|
||
'["and you can\'t escape thi\s"]'
|
||
, events :
|
||
[ ["openarray" , undefined]
|
||
, ["value" , 'and you can\'t escape this']
|
||
, ["closearray" , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
, nuts_and_bolts :
|
||
{ text : '{"boolean, true": true' +
|
||
', "boolean, false": false' +
|
||
', "null": null }'
|
||
, events :
|
||
[ ["openobject" , "boolean, true"]
|
||
, ["value" , true]
|
||
, ["key" , "boolean, false"]
|
||
, ["value" , false]
|
||
, ["key" , "null"]
|
||
, ["value" , null]
|
||
, ["closeobject" , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
, frekin_string:
|
||
{ text : '["\\\\\\"\\"a\\""]'
|
||
, events :
|
||
[ ["openarray" , undefined]
|
||
, ["value" , '\\\"\"a\"']
|
||
, ["closearray" , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
, array_of_string_insanity :
|
||
{ text : '["\\\"and this string has an escape at the beginning",' +
|
||
'"and this string has no escapes"]'
|
||
, events :
|
||
[ ["openarray" , undefined]
|
||
, ["value" , "\"and this string has an escape at the beginning"]
|
||
, ["value" , "and this string has no escapes"]
|
||
, ["closearray" , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
, non_utf8 :
|
||
{ text :
|
||
'{"CoreletAPIVersion":2,"CoreletType":"standalone",' +
|
||
'"documentation":"A corelet that provides the capability to upload' +
|
||
' a folder’s contents into a user’s locker.","functions":[' +
|
||
'{"documentation":"Displays a dialog box that allows user to ' +
|
||
'select a folder on the local system.","name":' +
|
||
'"ShowBrowseDialog","parameters":[{"documentation":"The ' +
|
||
'callback function for results.","name":"callback","required":' +
|
||
'true,"type":"callback"}]},{"documentation":"Uploads all mp3 files' +
|
||
' in the folder provided.","name":"UploadFolder","parameters":' +
|
||
'[{"documentation":"The path to upload mp3 files from."' +
|
||
',"name":"path","required":true,"type":"string"},{"documentation":' +
|
||
' "The callback function for progress.","name":"callback",' +
|
||
'"required":true,"type":"callback"}]},{"documentation":"Returns' +
|
||
' the server name to the current locker service.",' +
|
||
'"name":"GetLockerService","parameters":[]},{"documentation":' +
|
||
'"Changes the name of the locker service.","name":"SetLockerSer' +
|
||
'vice","parameters":[{"documentation":"The value of the locker' +
|
||
' service to set active.","name":"LockerService","required":true' +
|
||
',"type":"string"}]},{"documentation":"Downloads locker files to' +
|
||
' the suggested folder.","name":"DownloadFile","parameters":[{"' +
|
||
'documentation":"The origin path of the locker file.",' +
|
||
'"name":"path","required":true,"type":"string"},{"documentation"' +
|
||
':"The Window destination path of the locker file.",' +
|
||
'"name":"destination","required":true,"type":"integer"},{"docum' +
|
||
'entation":"The callback function for progress.","name":' +
|
||
'"callback","required":true,"type":"callback"}]}],' +
|
||
'"name":"LockerUploader","version":{"major":0,' +
|
||
'"micro":1,"minor":0},"versionString":"0.0.1"}'
|
||
, events :
|
||
[ [ "openobject" , "CoreletAPIVersion"]
|
||
, [ "value" , 2 ]
|
||
, [ "key" , "CoreletType"]
|
||
, [ "value" , "standalone" ]
|
||
, [ "key" , "documentation"]
|
||
, [ "value" , "A corelet that provides the capability to upload a folder’s contents into a user’s locker."]
|
||
, ["key" , "functions"]
|
||
, [ "openarray" , undefined]
|
||
, [ "openobject" , "documentation"]
|
||
, [ "value" , "Displays a dialog box that allows user to select a folder on the local system."]
|
||
, [ "key" , "name"]
|
||
, [ "value" , "ShowBrowseDialog"]
|
||
, [ "key" , "parameters"]
|
||
, [ "openarray" , undefined]
|
||
, [ "openobject" , "documentation"]
|
||
, [ "value" , "The callback function for results."]
|
||
, [ "key" , "name"]
|
||
, [ "value" , "callback"]
|
||
, [ "key" , "required"]
|
||
, [ "value" , true]
|
||
, [ "key" , "type"]
|
||
, [ "value" , "callback"]
|
||
, [ "closeobject" , undefined]
|
||
, [ "closearray" , undefined]
|
||
, [ "closeobject" , undefined]
|
||
, [ "openobject" , "documentation"]
|
||
, [ "value" , "Uploads all mp3 files in the folder provided."]
|
||
, [ "key" , "name"]
|
||
, [ "value" , "UploadFolder"]
|
||
, [ "key" , "parameters"]
|
||
, [ "openarray" , undefined]
|
||
, [ "openobject" , "documentation"]
|
||
, [ "value" , "The path to upload mp3 files from."]
|
||
, [ "key" , "name"]
|
||
, [ "value" , "path"]
|
||
, [ "key" , "required"]
|
||
, [ "value" , true]
|
||
, [ "key" , "type"]
|
||
, [ "value" , "string"]
|
||
, [ "closeobject" , undefined]
|
||
, [ "openobject" , "documentation"]
|
||
, [ "value" , "The callback function for progress."]
|
||
, [ "key" , "name"]
|
||
, [ "value" , "callback"]
|
||
, [ "key" , "required"]
|
||
, [ "value" , true ]
|
||
, [ "key" , "type"]
|
||
, [ "value" , "callback"]
|
||
, [ "closeobject" , undefined]
|
||
, [ "closearray" , undefined]
|
||
, [ "closeobject" , undefined]
|
||
, [ "openobject" , "documentation"]
|
||
, [ "value" , "Returns the server name to the current locker service."]
|
||
, [ "key" , "name"]
|
||
, [ "value" , "GetLockerService"]
|
||
, [ "key" , "parameters"]
|
||
, [ "openarray" , undefined]
|
||
, [ "closearray" , undefined]
|
||
, [ "closeobject" , undefined]
|
||
, [ "openobject" , "documentation"]
|
||
, [ "value" , "Changes the name of the locker service."]
|
||
, [ "key" , "name"]
|
||
, [ "value" , "SetLockerService"]
|
||
, [ "key" , "parameters"]
|
||
, [ "openarray" , undefined]
|
||
, [ "openobject" , "documentation"]
|
||
, [ "value" , "The value of the locker service to set active."]
|
||
, [ "key" , "name"]
|
||
, [ "value" , "LockerService" ]
|
||
, [ "key" , "required" ]
|
||
, [ "value" , true]
|
||
, [ "key" , "type"]
|
||
, [ "value" , "string"]
|
||
, [ "closeobject" , undefined]
|
||
, [ "closearray" , undefined]
|
||
, [ "closeobject" , undefined]
|
||
, [ "openobject" , "documentation"]
|
||
, [ "value" , "Downloads locker files to the suggested folder."]
|
||
, [ "key" , "name"]
|
||
, [ "value" , "DownloadFile"]
|
||
, [ "key" , "parameters"]
|
||
, [ "openarray" , undefined]
|
||
, [ "openobject" , "documentation"]
|
||
, [ "value" , "The origin path of the locker file."]
|
||
, [ "key" , "name"]
|
||
, [ "value" , "path"]
|
||
, [ "key" , "required"]
|
||
, [ "value" , true]
|
||
, [ "key" , "type"]
|
||
, [ "value" , "string"]
|
||
, [ "closeobject" , undefined]
|
||
, [ "openobject" , "documentation"]
|
||
, [ "value" , "The Window destination path of the locker file."]
|
||
, [ "key" , "name"]
|
||
, [ "value" , "destination"]
|
||
, [ "key" , "required"]
|
||
, [ "value" , true]
|
||
, [ "key" , "type"]
|
||
, [ "value" , "integer"]
|
||
, [ "closeobject" , undefined]
|
||
, [ "openobject" , "documentation"]
|
||
, [ "value" , "The callback function for progress."]
|
||
, [ "key" , "name"]
|
||
, [ "value" , "callback"]
|
||
, [ "key" , "required"]
|
||
, [ "value" , true]
|
||
, [ "key" , "type"]
|
||
, [ "value" , "callback"]
|
||
, [ "closeobject" , undefined]
|
||
, [ "closearray" , undefined]
|
||
, [ "closeobject" , undefined]
|
||
, [ "closearray" , undefined]
|
||
, [ "key" , "name"]
|
||
, [ "value" , "LockerUploader"]
|
||
, [ "key" , "version"]
|
||
, [ "openobject" , "major"]
|
||
, [ "value" , 0]
|
||
, [ "key" , "micro"]
|
||
, [ "value" , 1]
|
||
, [ "key" , "minor"]
|
||
, [ "value" , 0]
|
||
, [ "closeobject" , undefined]
|
||
, [ "key" , "versionString"]
|
||
, [ "value" , "0.0.1"]
|
||
, [ "closeobject" , undefined]
|
||
, [ "end" , undefined]
|
||
, [ "ready" , undefined]
|
||
]
|
||
}
|
||
, array_of_arrays :
|
||
{ text : '[[[["foo"]]]]'
|
||
, events :
|
||
[ ['openarray' , undefined]
|
||
, ['openarray' , undefined]
|
||
, ['openarray' , undefined]
|
||
, ['openarray' , undefined]
|
||
, ["value" , "foo"]
|
||
, ['closearray' , undefined]
|
||
, ['closearray' , undefined]
|
||
, ['closearray' , undefined]
|
||
, ['closearray' , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
, low_overflow :
|
||
{ text : '[-9223372036854775808]'
|
||
, events :
|
||
[ ['openarray' , undefined]
|
||
, ["value" , -9223372036854775808]
|
||
, ['closearray' , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
, high_overflow :
|
||
{ text : '[9223372036854775808]'
|
||
, events :
|
||
[ ['openarray' , undefined]
|
||
, ["value" , 9223372036854775808]
|
||
, ['closearray' , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
, floats :
|
||
{ text : '[0.1e2, 1e1, 3.141569, 10000000000000e-10]'
|
||
, events :
|
||
[ ['openarray' , undefined]
|
||
, ["value" , 0.1e2]
|
||
, ["value" , 1e1]
|
||
, ["value" , 3.141569]
|
||
, ["value" , 10000000000000e-10]
|
||
, ['closearray' , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
, numbers_game :
|
||
{ text : '[1,0,-1,-0.3,0.3,1343.32,3345,3.1e124,'+
|
||
' 9223372036854775807,-9223372036854775807,0.1e2, ' +
|
||
'1e1, 3.141569, 10000000000000e-10,' +
|
||
'0.00011999999999999999, 6E-06, 6E-06, 1E-06, 1E-06,'+
|
||
'"2009-10-20@20:38:21.539575", 9223372036854775808,' +
|
||
'123456789,-123456789,' +
|
||
'2147483647, -2147483647]'
|
||
, events :
|
||
[ ['openarray' , undefined]
|
||
, ["value" , 1]
|
||
, ["value" , 0]
|
||
, ["value" , -1]
|
||
, ["value" , -0.3]
|
||
, ["value" , 0.3]
|
||
, ["value" , 1343.32]
|
||
, ["value" , 3345]
|
||
, ["value" , 3.1e124]
|
||
, ["value" , 9223372036854775807]
|
||
, ["value" , -9223372036854775807]
|
||
, ["value" , 0.1e2]
|
||
, ["value" , 1e1]
|
||
, ["value" , 3.141569]
|
||
, ["value" , 10000000000000e-10]
|
||
, ["value" , 0.00011999999999999999]
|
||
, ["value" , 6E-06]
|
||
, ["value" , 6E-06]
|
||
, ["value" , 1E-06]
|
||
, ["value" , 1E-06]
|
||
, ["value" , "2009-10-20@20:38:21.539575"]
|
||
, ["value" , 9223372036854775808]
|
||
, ["value" , 123456789]
|
||
, ["value" , -123456789]
|
||
, ["value" , 2147483647]
|
||
, ["value" , -2147483647]
|
||
, ['closearray' , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
, johnsmith :
|
||
{ text : '{ "firstName": "John", "lastName" : "Smith", "age" : ' +
|
||
'25, "address" : { "streetAddress": "21 2nd Street", ' +
|
||
'"city" : "New York", "state" : "NY", "postalCode" : ' +
|
||
' "10021" }, "phoneNumber": [ { "type" : "home", ' +
|
||
'"number": "212 555-1234" }, { "type" : "fax", ' +
|
||
'"number": "646 555-4567" } ] }'
|
||
, events :
|
||
[ ["openobject" , "firstName"]
|
||
, ["value" , "John"]
|
||
, ["key" , "lastName"]
|
||
, ["value" , "Smith"]
|
||
, ["key" , "age"]
|
||
, ["value" , 25]
|
||
, ["key" , "address"]
|
||
, ["openobject" , "streetAddress"]
|
||
, ["value" , "21 2nd Street"]
|
||
, ["key" , "city"]
|
||
, ["value" , "New York"]
|
||
, ["key" , "state"]
|
||
, ["value" , "NY"]
|
||
, ["key" , "postalCode"]
|
||
, ["value" , "10021"]
|
||
, ["closeobject" , undefined]
|
||
, ["key" , "phoneNumber"]
|
||
, ["openarray" , undefined]
|
||
, ["openobject" , "type"]
|
||
, ["value" , "home"]
|
||
, ["key" , "number"]
|
||
, ["value" , "212 555-1234"]
|
||
, ["closeobject" , undefined]
|
||
, ["openobject" , "type"]
|
||
, ["value" , "fax"]
|
||
, ["key" , "number"]
|
||
, ["value" , "646 555-4567"]
|
||
, ["closeobject" , undefined]
|
||
, ["closearray" , undefined]
|
||
, ["closeobject" , undefined]
|
||
]
|
||
}
|
||
, array_null :
|
||
{ text : '[null,false,true]'
|
||
, events :
|
||
[ ["openarray" , undefined]
|
||
, ["value" , null]
|
||
, ["value" , false]
|
||
, ["value" , true]
|
||
, ["closearray" , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
, empty_array_comma :
|
||
{ text : '{"a":[],"c": {}, "b": true}'
|
||
, events :
|
||
[ ["openobject" , "a"]
|
||
, ["openarray" , undefined]
|
||
, ["closearray" , undefined]
|
||
, ["key" , "c"]
|
||
, ["openobject" , undefined]
|
||
, ["closeobject" , undefined]
|
||
, ["key" , "b"]
|
||
, ["value" , true]
|
||
, ["closeobject" , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
, incomplete_json_terminates_ending_in_number :
|
||
{ text : '[[1,2,3],[4,5'
|
||
, events :
|
||
[ ["openarray" , undefined]
|
||
, ["openarray" , undefined]
|
||
, ["value" , 1]
|
||
, ["value" , 2]
|
||
, ["value" , 3]
|
||
, ["closearray" , undefined]
|
||
, ["openarray" , undefined]
|
||
, ["value" , 4]
|
||
, ["error" , undefined]
|
||
]
|
||
}
|
||
, incomplete_json_terminates_ending_in_comma :
|
||
{ text : '[[1,2,3],'
|
||
, events :
|
||
[ ["openarray" , undefined]
|
||
, ["openarray" , undefined]
|
||
, ["value" , 1]
|
||
, ["value" , 2]
|
||
, ["value" , 3]
|
||
, ["closearray" , undefined]
|
||
, ["error" , undefined]
|
||
]
|
||
}
|
||
, json_org :
|
||
{ text :
|
||
('{\r\n' +
|
||
' "glossary": {\n' +
|
||
' "title": "example glossary",\n\r' +
|
||
' \t\t"GlossDiv": {\r\n' +
|
||
' "title": "S",\r\n' +
|
||
' \t\t\t"GlossList": {\r\n' +
|
||
' "GlossEntry": {\r\n' +
|
||
' "ID": "SGML",\r\n' +
|
||
' \t\t\t\t\t"SortAs": "SGML",\r\n' +
|
||
' \t\t\t\t\t"GlossTerm": "Standard Generalized ' +
|
||
'Markup Language",\r\n' +
|
||
' \t\t\t\t\t"Acronym": "SGML",\r\n' +
|
||
' \t\t\t\t\t"Abbrev": "ISO 8879:1986",\r\n' +
|
||
' \t\t\t\t\t"GlossDef": {\r\n' +
|
||
' "para": "A meta-markup language,' +
|
||
' used to create markup languages such as DocBook.",\r\n' +
|
||
' \t\t\t\t\t\t"GlossSeeAlso": ["GML", "XML"]\r\n' +
|
||
' },\r\n' +
|
||
' \t\t\t\t\t"GlossSee": "markup"\r\n' +
|
||
' }\r\n' +
|
||
' }\r\n' +
|
||
' }\r\n' +
|
||
' }\r\n' +
|
||
' }\r\n')
|
||
, events :
|
||
[ ["openobject" , "glossary"]
|
||
, ["openobject" , "title"]
|
||
, ['value' , "example glossary"]
|
||
, ["key" , "GlossDiv"]
|
||
, ["openobject" , "title"]
|
||
, ['value' , "S"]
|
||
, ["key" , "GlossList"]
|
||
, ["openobject" , "GlossEntry"]
|
||
, ["openobject" , "ID"]
|
||
, ['value' , "SGML"]
|
||
, ["key" , "SortAs"]
|
||
, ['value' , "SGML"]
|
||
, ["key" , "GlossTerm"]
|
||
, ['value' , "Standard Generalized Markup Language"]
|
||
, ["key" , "Acronym"]
|
||
, ['value' , "SGML"]
|
||
, ["key" , "Abbrev"]
|
||
, ['value' , 'ISO 8879:1986']
|
||
, ["key" , "GlossDef"]
|
||
, ["openobject" , "para"]
|
||
, ['value' , 'A meta-markup language, used to create markup languages such as DocBook.']
|
||
, ["key" , "GlossSeeAlso"]
|
||
, ['openarray' , undefined]
|
||
, ['value' , "GML"]
|
||
, ['value' , "XML"]
|
||
, ['closearray' , undefined]
|
||
, ["closeobject" , undefined]
|
||
, ["key" , "GlossSee"]
|
||
, ["value" , "markup"]
|
||
, ["closeobject" , undefined]
|
||
, ["closeobject" , undefined]
|
||
, ["closeobject" , undefined]
|
||
, ["closeobject" , undefined]
|
||
, ["closeobject" , undefined]
|
||
, ['end' , undefined]
|
||
, ['ready' , undefined]
|
||
]
|
||
}
|
||
};
|
||
|
||
function generic(key,sep) {
|
||
return function () {
|
||
var doc = docs[key].text
|
||
, events = docs[key].events
|
||
, l = typeof FastList === 'function' ? new FastList() : []
|
||
, doc_chunks = doc.split(sep)
|
||
, parser = clarinet.parser()
|
||
, i = 0
|
||
, current
|
||
, env = process && process.env ? process.env : window
|
||
, record = []
|
||
;
|
||
|
||
_.each(events, function(event_pair) {
|
||
l.push(event_pair);
|
||
});
|
||
_.each(clarinet.EVENTS, function(event) {
|
||
parser["on"+event] = function (value) {
|
||
if(env.CRECORD) { // for really big json we dont want to type all
|
||
record.push([event,value]);
|
||
if(event === 'end') console.log(JSON.stringify(record, null, 2));
|
||
} else {
|
||
current = l.shift();
|
||
++i;
|
||
if(!(current && current[0])) { return; }
|
||
assert(current[0] === event,
|
||
'[ln' + i + '] event: [' + current[0] + '] got: [' + event +']');
|
||
if(event!== 'error')
|
||
assert(current[1] === value,
|
||
'[ln' + i + '] value: [' + current[1] + '] got: [' + value +']');
|
||
}
|
||
};
|
||
});
|
||
_.each(doc_chunks, function(chunk) {
|
||
parser.write(chunk);
|
||
});
|
||
parser.end();
|
||
};
|
||
}
|
||
|
||
describe('clarinet', function(){
|
||
describe('#generic', function() {
|
||
for (var key in docs) {
|
||
if (docs.hasOwnProperty(key)) {
|
||
// undefined means no split
|
||
// /\t|\n|\r| / means on whitespace
|
||
// '' means on every char
|
||
for(var i in seps) {
|
||
sep = seps[i];
|
||
it('[' + key + '] should be able to parse -> ' + sep,
|
||
generic(key,sep));
|
||
}
|
||
}
|
||
}
|
||
});
|
||
});
|