From 23e5605488f613bd864671a322562ecfcb2d945d Mon Sep 17 00:00:00 2001 From: murphy Date: Wed, 8 Oct 2008 20:18:31 +0000 Subject: New: *JSON* (closes #53). Version 0.8 is near! * Simple and really nice scanner (I think), produces colorful output. * Checked against strange examples from Ruby's JSON lib. More changes: * Changed version number. Finally! * Added some token styles for :key token group. * cYcnus style: chars inside of strings are highlighted purple instead of blue. * murphy style needs work. --- etc/coderay-lib.tmproj | 38 +--- lib/coderay.rb | 2 +- lib/coderay/scanners/json.rb | 106 +++++++++ lib/coderay/styles/cycnus.rb | 13 +- test/scanners/json/big.expected.raydebug | 295 ++++++++++++++++++++++++++ test/scanners/json/big.in.json | 295 ++++++++++++++++++++++++++ test/scanners/json/big2.expected.raydebug | 267 +++++++++++++++++++++++ test/scanners/json/big2.in.json | 267 +++++++++++++++++++++++ test/scanners/json/example.expected.raydebug | 22 ++ test/scanners/json/example.in.json | 22 ++ test/scanners/json/json-lib.expected.raydebug | 73 +++++++ test/scanners/json/json-lib.in.json | 73 +++++++ test/scanners/json/suite.rb | 2 + 13 files changed, 1433 insertions(+), 42 deletions(-) create mode 100644 lib/coderay/scanners/json.rb create mode 100644 test/scanners/json/big.expected.raydebug create mode 100644 test/scanners/json/big.in.json create mode 100644 test/scanners/json/big2.expected.raydebug create mode 100644 test/scanners/json/big2.in.json create mode 100644 test/scanners/json/example.expected.raydebug create mode 100644 test/scanners/json/example.in.json create mode 100644 test/scanners/json/json-lib.expected.raydebug create mode 100644 test/scanners/json/json-lib.in.json create mode 100644 test/scanners/json/suite.rb diff --git a/etc/coderay-lib.tmproj b/etc/coderay-lib.tmproj index 3ecc1fe..19c8e34 100644 --- a/etc/coderay-lib.tmproj +++ b/etc/coderay-lib.tmproj @@ -9,8 +9,6 @@ lib regexFolderFilter !.*/(\.[^/]*|CVS|_darcs|\{arch\}|blib|.*~\.nib|.*\.(framework|app|pbproj|pbxproj|xcode(proj)?|bundle))$ - selected - sourceDirectory ../lib @@ -19,52 +17,38 @@ bin regexFolderFilter !.*/(\.[^/]*|CVS|_darcs|\{arch\}|blib|.*~\.nib|.*\.(framework|app|pbproj|pbxproj|xcode(proj)?|bundle))$ - selected - sourceDirectory ../bin filename ../FOLDERS - selected - filename ../ftp.yaml - selected - name gem_server regexFolderFilter !.*/(\.[^/]*|CVS|_darcs|\{arch\}|blib|.*~\.nib|.*\.(framework|app|pbproj|pbxproj|xcode(proj)?|bundle))$ - selected - sourceDirectory ../gem_server filename ../IDEA - selected - filename ../LICENSE - selected - name pkg regexFolderFilter !.*/(\.[^/]*|CVS|_darcs|\{arch\}|blib|.*~\.nib|.*\.(framework|app|pbproj|pbxproj|xcode(proj)?|bundle))$ - selected - sourceDirectory ../pkg @@ -73,8 +57,6 @@ rake_helpers regexFolderFilter !.*/(\.[^/]*|CVS|_darcs|\{arch\}|blib|.*~\.nib|.*\.(framework|app|pbproj|pbxproj|xcode(proj)?|bundle))$ - selected - sourceDirectory ../rake_helpers @@ -83,8 +65,6 @@ rake_tasks regexFolderFilter !.*/(\.[^/]*|CVS|_darcs|\{arch\}|blib|.*~\.nib|.*\.(framework|app|pbproj|pbxproj|xcode(proj)?|bundle))$ - selected - sourceDirectory ../rake_tasks @@ -93,20 +73,16 @@ ../Rakefile lastUsed 2008-08-06T18:57:10Z - selected - filename ../README - selected - filename ../diff lastUsed - 2008-08-11T12:12:11Z + 2008-09-30T16:57:58Z selected @@ -115,16 +91,12 @@ ../TODO lastUsed 2008-01-21T03:03:08Z - selected - name functional regexFolderFilter !.*/(\.[^/]*|CVS|_darcs|\{arch\}|blib|.*~\.nib|.*\.(framework|app|pbproj|pbxproj|xcode(proj)?|bundle))$ - selected - sourceDirectory ../test/functional @@ -132,25 +104,19 @@ filename ../test/scanners/coderay_suite.rb lastUsed - 2008-09-16T21:34:38Z - selected - + 2008-09-30T15:54:46Z filename ../test/scanners/suite.rb lastUsed 2008-08-04T21:50:01Z - selected - filename ../bench/bench.rb lastUsed 2008-08-04T21:50:12Z - selected - fileHierarchyDrawerWidth diff --git a/lib/coderay.rb b/lib/coderay.rb index 4d9aae1..05c1d90 100644 --- a/lib/coderay.rb +++ b/lib/coderay.rb @@ -134,7 +134,7 @@ module CodeRay # Minor: odd for beta, even for stable # Teeny: development state # Revision: Subversion Revision number (generated on rake) - VERSION = '0.7.9' + VERSION = '0.8' require 'coderay/tokens' require 'coderay/scanner' diff --git a/lib/coderay/scanners/json.rb b/lib/coderay/scanners/json.rb new file mode 100644 index 0000000..ae941a0 --- /dev/null +++ b/lib/coderay/scanners/json.rb @@ -0,0 +1,106 @@ +module CodeRay +module Scanners + + class JSON < Scanner + + include Streamable + + register_for :json + + CONSTANTS = %w( true false null ) + IDENT_KIND = WordList.new(:key).add(CONSTANTS, :reserved) + + ESCAPE = / [bfnrt\\"\/] /x + UNICODE_ESCAPE = / u[a-fA-F0-9]{4} /x + + def scan_tokens tokens, options + + state = :initial + stack = [] + string_delimiter = nil + key_expected = false + + until eos? + + kind = nil + match = nil + + case state + + when :initial + if match = scan(/ \s+ | \\\n /x) + tokens << [match, :space] + next + elsif match = scan(/ [:,\[{\]}] /x) + kind = :operator + case match + when '{': stack << :object; key_expected = true + when '[': stack << :array + when ':': key_expected = false + when ',': key_expected = true if stack.last == :object + when '}', ']': stack.pop # no error recovery, but works for valid JSON + end + elsif match = scan(/ true | false | null /x) + kind = IDENT_KIND[match] + elsif match = scan(/-?(?:0|[1-9]\d*)/) + kind = :integer + if scan(/\.\d+(?:[eE][-+]?\d+)?|[eE][-+]?\d+/) + match << matched + kind = :float + end + elsif match = scan(/"/) + state = key_expected ? :key : :string + tokens << [:open, state] + kind = :delimiter + else + getch + kind = :error + end + + when :string, :key + if scan(/[^\\"]+/) + kind = :content + elsif scan(/"/) + tokens << ['"', :delimiter] + tokens << [:close, state] + state = :initial + next + elsif scan(/ \\ (?: #{ESCAPE} | #{UNICODE_ESCAPE} ) /mox) + kind = :char + elsif scan(/\\./m) + kind = :content + elsif scan(/ \\ | $ /x) + tokens << [:close, :delimiter] + kind = :error + state = :initial + else + raise_inspect "else case \" reached; %p not handled." % peek(1), tokens + end + + else + raise_inspect 'Unknown state', tokens + + end + + match ||= matched + if $DEBUG and not kind + raise_inspect 'Error token %p in line %d' % + [[match, kind], line], tokens + end + raise_inspect 'Empty token', tokens unless match + + tokens << [match, kind] + + end + + if [:string, :key].include? state + tokens << [:close, state] + end + + tokens + end + + end + +end +end diff --git a/lib/coderay/styles/cycnus.rb b/lib/coderay/styles/cycnus.rb index 521c3c9..c0dab99 100644 --- a/lib/coderay/styles/cycnus.rb +++ b/lib/coderay/styles/cycnus.rb @@ -97,6 +97,8 @@ ol.CodeRay li { white-space: pre } .r, .kw { color:#080; font-weight:bold } .ke { color: #808; } +.ke .dl { color: #606; } +.ke .ch { color: #80f; } .vl { color: #088; } .rx { background-color:#fff0ff } @@ -105,11 +107,12 @@ ol.CodeRay li { white-space: pre } .rx .mod { color:#C2C } .rx .fu { color:#404; font-weight: bold } -.s { background-color:#fff0f0 } -.s .s { background-color:#ffe0e0 } -.s .s .s { background-color:#ffd0d0 } -.s .k { color:#D20 } -.s .dl { color:#710 } +.s { background-color:#fff0f0 } +.s .s { background-color:#ffe0e0 } +.s .s .s { background-color:#ffd0d0 } +.s .k { color: #D20; } +.s .ch { color: #b0b; } +.s .dl { color: #710; } .sh { background-color:#f0fff0 } .sh .k { color:#2B2 } diff --git a/test/scanners/json/big.expected.raydebug b/test/scanners/json/big.expected.raydebug new file mode 100644 index 0000000..c72cb2b --- /dev/null +++ b/test/scanners/json/big.expected.raydebug @@ -0,0 +1,295 @@ +operator([) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(false)operator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(false)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) operator([) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) operator({) + keyoperator(:) operator([) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(null) + operator(}) + operator(]) + operator(})operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) operator([) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) operator([) + operator(])operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(false)operator(,) + keyoperator(:) string + operator(}) + operator(])operator(,) + keyoperator(:) reserved(true) + operator(})operator(,) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) operator({) + keyoperator(:) operator([) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(null) + operator(}) + operator(]) + operator(})operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) operator([) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) operator([) + operator(])operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(false)operator(,) + keyoperator(:) string + operator(}) + operator(])operator(,) + keyoperator(:) reserved(true) + operator(})operator(,) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) operator({) + keyoperator(:) operator([) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(null) + operator(}) + operator(]) + operator(})operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) operator([) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) operator([) + operator(])operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(false)operator(,) + keyoperator(:) string + operator(}) + operator(])operator(,) + keyoperator(:) reserved(true) + operator(})operator(,) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) operator({) + keyoperator(:) operator([) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(null) + operator(})operator(,) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) string + operator(})operator(,) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) string + operator(})operator(,) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) string + operator(}) + operator(]) + operator(})operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) operator([) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) operator([) + operator(])operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(false)operator(,) + keyoperator(:) string + operator(}) + operator(])operator(,) + keyoperator(:) reserved(true) + operator(}) + operator(])operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(true) + operator(})operator(,) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) reserved(false)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(false)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) operator([) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) operator({) + keyoperator(:) operator([) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(null) + operator(}) + operator(]) + operator(})operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) operator([) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) operator([) + operator(])operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) string + operator(}) + operator(])operator(,) + keyoperator(:) reserved(true) + operator(})operator(,) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) operator({) + keyoperator(:) operator([) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(null) + operator(}) + operator(]) + operator(})operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) operator([) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) operator([) + operator(])operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(false)operator(,) + keyoperator(:) string + operator(}) + operator(])operator(,) + keyoperator(:) reserved(true) + operator(})operator(,) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) operator({) + keyoperator(:) operator([) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(null) + operator(}) + operator(]) + operator(})operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) operator([) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) operator([) + operator(])operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(false)operator(,) + keyoperator(:) string + operator(}) + operator(])operator(,) + keyoperator(:) reserved(true) + operator(})operator(,) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) operator({) + keyoperator(:) operator([) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(null) + operator(}) + operator(]) + operator(})operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) operator([) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) operator([) + operator(])operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(false)operator(,) + keyoperator(:) string + operator(}) + operator(])operator(,) + keyoperator(:) reserved(true) + operator(})operator(,) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) operator({) + keyoperator(:) operator([) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(null) + operator(}) + operator(]) + operator(})operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) operator([) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) operator([) + operator(])operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(false)operator(,) + keyoperator(:) string + operator(}) + operator(])operator(,) + keyoperator(:) reserved(true) + operator(}) + operator(])operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(true) + operator(}) +operator(]) \ No newline at end of file diff --git a/test/scanners/json/big.in.json b/test/scanners/json/big.in.json new file mode 100644 index 0000000..1af2d3e --- /dev/null +++ b/test/scanners/json/big.in.json @@ -0,0 +1,295 @@ +[ + { + "import_url": "http:\/\/localhost:3000\/neighbourhoods\/Neighbourhoods::Storage\/import", + "type": "Neighbourhood", + "reflected": false, + "selected": true, + "export_url": "http:\/\/localhost:3000\/neighbourhoods\/Neighbourhoods::Storage\/export", + "snapshots_url": "http:\/\/localhost:3000\/snapshots", + "uri": "http:\/\/localhost:3000\/neighbourhoods\/Neighbourhoods::Storage\/lists", + "print_url": "http:\/\/localhost:3000\/neighbourhoods\/Neighbourhoods::Storage\/print", + "locked": false, + "name": "Lager", + "lists": [ + { + "type": "List", + "sort_keys": { + "options": [ + { + "name": "Standardsortierung", + "id": null + } + ] + }, + "uri": "http:\/\/localhost:3000\/lists\/Lists::Manufacturers\/elements.json", + "sort_key_uri": "http:\/\/localhost:3000\/lists\/Lists::Manufacturers\/sort_key", + "name": "Hersteller", + "readable": true, + "id": "Lists::Manufacturers", + "element_types": [ + { + "create_element_url": "http:\/\/localhost:3000\/elements?list=Lists%3A%3AManufacturers&type=Elements%3A%3AManufacturer", + "essential_attributes": [ + ], + "name": "Hersteller", + "ask_for_email": false, + "id": "Elements::Manufacturer" + } + ], + "writable": true + }, + { + "type": "List", + "sort_keys": { + "options": [ + { + "name": "Standardsortierung", + "id": null + } + ] + }, + "uri": "http:\/\/localhost:3000\/lists\/Lists::Categories\/elements.json", + "sort_key_uri": "http:\/\/localhost:3000\/lists\/Lists::Categories\/sort_key", + "name": "Rubriken", + "readable": true, + "id": "Lists::Categories", + "element_types": [ + { + "create_element_url": "http:\/\/localhost:3000\/elements?list=Lists%3A%3ACategories&type=Elements%3A%3ACategory", + "essential_attributes": [ + ], + "name": "Rubrik", + "ask_for_email": false, + "id": "Elements::Category" + } + ], + "writable": true + }, + { + "type": "List", + "sort_keys": { + "options": [ + { + "name": "Standardsortierung", + "id": null + } + ] + }, + "uri": "http:\/\/localhost:3000\/lists\/Lists::ArticlesList\/elements.json", + "sort_key_uri": "http:\/\/localhost:3000\/lists\/Lists::ArticlesList\/sort_key", + "name": "Artikel", + "readable": true, + "id": "Lists::ArticlesList", + "element_types": [ + { + "create_element_url": "http:\/\/localhost:3000\/elements?list=Lists%3A%3AArticlesList&type=Elements%3A%3AArticle", + "essential_attributes": [ + ], + "name": "Artikel", + "ask_for_email": false, + "id": "Elements::Article" + } + ], + "writable": true + }, + { + "type": "List", + "sort_keys": { + "options": [ + { + "name": "Standardsortierung", + "id": null + }, + { + "name": "Bestelldatum", + "id": "Date" + }, + { + "name": "bestellt von", + "id": "OrderedBy" + }, + { + "name": "Summe", + "id": "Total" + } + ] + }, + "uri": "http:\/\/localhost:3000\/lists\/Lists::Orders\/elements.json", + "sort_key_uri": "http:\/\/localhost:3000\/lists\/Lists::Orders\/sort_key", + "name": "Bestellungen", + "readable": true, + "id": "Lists::Orders", + "element_types": [ + { + "create_element_url": "http:\/\/localhost:3000\/elements?list=Lists%3A%3AOrders&type=Elements%3A%3AOrder", + "essential_attributes": [ + ], + "name": "Bestellung", + "ask_for_email": false, + "id": "Elements::Order" + } + ], + "writable": true + } + ], + "release_export_lock_url": "http:\/\/localhost:3000\/neighbourhoods\/Neighbourhoods::Storage\/release_export_lock", + "readable": true, + "replay_latest_snapshot_url": "http:\/\/localhost:3000\/snapshots\/replay_latest", + "id": "Neighbourhoods::Storage", + "writable": true + }, + { + "import_url": "http:\/\/localhost:3000\/neighbourhoods\/Neighbourhoods::Administration\/import", + "type": "Neighbourhood", + "reflected": true, + "selected": false, + "export_url": "http:\/\/localhost:3000\/neighbourhoods\/Neighbourhoods::Administration\/export", + "snapshots_url": "http:\/\/localhost:3000\/snapshots", + "uri": "http:\/\/localhost:3000\/neighbourhoods\/Neighbourhoods::Administration\/lists", + "print_url": "http:\/\/localhost:3000\/neighbourhoods\/Neighbourhoods::Administration\/print", + "locked": false, + "name": "Verwaltung", + "lists": [ + { + "type": "List", + "sort_keys": { + "options": [ + { + "name": "Standardsortierung", + "id": null + } + ] + }, + "uri": "http:\/\/localhost:3000\/lists\/Lists::Employees\/elements.json", + "sort_key_uri": "http:\/\/localhost:3000\/lists\/Lists::Employees\/sort_key", + "name": "Mitarbeiter", + "readable": true, + "id": "Lists::Employees", + "element_types": [ + { + "create_element_url": "http:\/\/localhost:3000\/elements?list=Lists%3A%3AEmployees&type=Elements%3A%3APerson", + "essential_attributes": [ + ], + "name": "Person", + "ask_for_email": true, + "id": "Elements::Person" + } + ], + "writable": true + }, + { + "type": "List", + "sort_keys": { + "options": [ + { + "name": "Standardsortierung", + "id": null + } + ] + }, + "uri": "http:\/\/localhost:3000\/lists\/Lists::Departments\/elements.json", + "sort_key_uri": "http:\/\/localhost:3000\/lists\/Lists::Departments\/sort_key", + "name": "Abteilungen", + "readable": true, + "id": "Lists::Departments", + "element_types": [ + { + "create_element_url": "http:\/\/localhost:3000\/elements?list=Lists%3A%3ADepartments&type=Elements%3A%3ADepartment", + "essential_attributes": [ + ], + "name": "Abteilung", + "ask_for_email": false, + "id": "Elements::Department" + } + ], + "writable": true + }, + { + "type": "List", + "sort_keys": { + "options": [ + { + "name": "Standardsortierung", + "id": null + } + ] + }, + "uri": "http:\/\/localhost:3000\/lists\/Lists::Locations\/elements.json", + "sort_key_uri": "http:\/\/localhost:3000\/lists\/Lists::Locations\/sort_key", + "name": "Standorte", + "readable": true, + "id": "Lists::Locations", + "element_types": [ + { + "create_element_url": "http:\/\/localhost:3000\/elements?list=Lists%3A%3ALocations&type=Elements%3A%3ALocation", + "essential_attributes": [ + ], + "name": "Standort", + "ask_for_email": false, + "id": "Elements::Location" + } + ], + "writable": true + }, + { + "type": "List", + "sort_keys": { + "options": [ + { + "name": "Standardsortierung", + "id": null + } + ] + }, + "uri": "http:\/\/localhost:3000\/lists\/Lists::Stocktakings\/elements.json", + "sort_key_uri": "http:\/\/localhost:3000\/lists\/Lists::Stocktakings\/sort_key", + "name": "Inventuren", + "readable": true, + "id": "Lists::Stocktakings", + "element_types": [ + { + "create_element_url": "http:\/\/localhost:3000\/elements?list=Lists%3A%3AStocktakings&type=Elements%3A%3AStocktaking", + "essential_attributes": [ + ], + "name": "Inventur", + "ask_for_email": false, + "id": "Elements::Stocktaking" + } + ], + "writable": true + }, + { + "type": "List", + "sort_keys": { + "options": [ + { + "name": "Standardsortierung", + "id": null + } + ] + }, + "uri": "http:\/\/localhost:3000\/lists\/Lists::Invoices\/elements.json", + "sort_key_uri": "http:\/\/localhost:3000\/lists\/Lists::Invoices\/sort_key", + "name": "Abrechnungen", + "readable": true, + "id": "Lists::Invoices", + "element_types": [ + { + "create_element_url": "http:\/\/localhost:3000\/elements?list=Lists%3A%3AInvoices&type=Elements%3A%3AInvoice", + "essential_attributes": [ + ], + "name": "Abrechnung", + "ask_for_email": false, + "id": "Elements::Invoice" + } + ], + "writable": true + } + ], + "release_export_lock_url": "http:\/\/localhost:3000\/neighbourhoods\/Neighbourhoods::Administration\/release_export_lock", + "readable": true, + "replay_latest_snapshot_url": "http:\/\/localhost:3000\/snapshots\/replay_latest", + "id": "Neighbourhoods::Administration", + "writable": true + } +] \ No newline at end of file diff --git a/test/scanners/json/big2.expected.raydebug b/test/scanners/json/big2.expected.raydebug new file mode 100644 index 0000000..9014536 --- /dev/null +++ b/test/scanners/json/big2.expected.raydebug @@ -0,0 +1,267 @@ +operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) stringClovis Schwenger<)char(\\/)content(strong> ()char(\\u20ac)content( 12.10, 2008-10-08\))delimiter(")>operator(,) + keyoperator(:) operator([) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) operator([) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) string + operator(})operator(,) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) string + operator(})operator(,) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) string + operator(})operator(,) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) string + operator(}) + operator(])operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) operator([) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(true) + operator(}) + operator(])operator(,) + keyoperator(:) reserved(false) + operator(})operator(,) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(false)operator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(false)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) integer(5217)operator(,) + keyoperator(:) reserved(true) + operator(})operator(,) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(false)operator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(false)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) integer(5218)operator(,) + keyoperator(:) reserved(false) + operator(})operator(,) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(false)operator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(false)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) integer(5219)operator(,) + keyoperator(:) reserved(false) + operator(})operator(,) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) reserved(false)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) integer(5220)operator(,) + keyoperator(:) reserved(false) + operator(})operator(,) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) operator([) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) operator([) + operator(])operator(,) + keyoperator(:) operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) string + operator(})operator(,) + keyoperator(:) reserved(true) + operator(}) + operator(])operator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) operator({) + keyoperator(:) reserved(null)operator(,) + keyoperator(:) reserved(null)operator(,) + keyoperator(:) integer(1)operator(,) + keyoperator(:) operator([) + string + operator(])operator(,) + keyoperator(:) reserved(null)operator(,) + keyoperator(:) reserved(null) + operator(})operator(,) + keyoperator(:) operator([) + operator(])operator(,) + keyoperator(:) reserved(false)operator(,) + keyoperator(:) reserved(false)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) operator({) + keyoperator(:) operator([) + operator({) + keyoperator(:) reserved(null)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(false)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(null)operator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) integer(582)operator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) string + operator(}) + operator(]) + operator(})operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) integer(5221)operator(,) + keyoperator(:) reserved(false) + operator(})operator(,) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(false)operator(,) + keyoperator(:) reserved(false)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) operator({) + keyoperator(:) reserved(null)operator(,) + keyoperator(:) integer(0)operator(,) + keyoperator(:) string + operator(})operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) integer(5222)operator(,) + keyoperator(:) operator([) + operator(])operator(,) + keyoperator(:) reserved(true) + operator(})operator(,) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) operator([) + operator(])operator(,) + keyoperator(:) reserved(null)operator(,) + keyoperator(:) operator({) + keyoperator(:) reserved(null)operator(,) + keyoperator(:) reserved(null)operator(,) + keyoperator(:) reserved(null)operator(,) + keyoperator(:) operator([) + string + operator(])operator(,) + keyoperator(:) reserved(null)operator(,) + keyoperator(:) string + operator(})operator(,) + keyoperator(:) operator([) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) integer(1)operator(,) + keyoperator(:) string + operator(}) + operator(])operator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) reserved(false)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) operator({) + keyoperator(:) operator([) + operator({) + keyoperator(:) reserved(null)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) string<)char(\\/)content(div>#005 Stressball)delimiter(")>operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(null)operator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) integer(627)operator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) string + operator(})operator(,) + operator({) + keyoperator(:) reserved(null)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) string<)char(\\/)content(div>#011 Post-It Block)delimiter(")>operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(null)operator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) integer(628)operator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) string + operator(}) + operator(]) + operator(})operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) integer(5223)operator(,) + keyoperator(:) reserved(true) + operator(})operator(,) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(false)operator(,) + keyoperator(:) reserved(false)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) integer(5224)operator(,) + keyoperator(:) reserved(false) + operator(})operator(,) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) operator([) + operator(])operator(,) + keyoperator(:) reserved(false)operator(,) + keyoperator(:) reserved(false)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) integer(5225)operator(,) + keyoperator(:) reserved(false) + operator(})operator(,) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) operator([) + operator(])operator(,) + keyoperator(:) reserved(false)operator(,) + keyoperator(:) reserved(false)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) integer(5226)operator(,) + keyoperator(:) reserved(false) + operator(}) + operator(])operator(,) + keyoperator(:) reserved(true) +operator(}) \ No newline at end of file diff --git a/test/scanners/json/big2.in.json b/test/scanners/json/big2.in.json new file mode 100644 index 0000000..3a81cd7 --- /dev/null +++ b/test/scanners/json/big2.in.json @@ -0,0 +1,267 @@ +{ + "url": "http:\/\/localhost:3000\/elements\/633\/attributes", + "name": "Bestellung: 3 Clovis Schwenger<\/strong> (\u20ac 12.10, 2008-10-08)", + "attributes": [ + { + "color": "red", + "type": "state", + "uri": "http:\/\/localhost:3000\/elements\/633\/state", + "options": [ + { + "color": "red", + "name": "neu", + "id": "new" + }, + { + "color": "orange", + "name": "abgeschlossen", + "id": "closed" + }, + { + "color": "green", + "name": "freigegeben", + "id": "approved" + }, + { + "color": "", + "name": "verschickt", + "id": "shipped" + } + ], + "name": "Zustand", + "value": "new", + "readable": true, + "journals": [ + { + "user": "CS", + "timestamp": "17:05 10\/07\/08", + "created": true + } + ], + "writable": false + }, + { + "type": "boolean", + "mandatory": false, + "confirm": true, + "uri": "http:\/\/localhost:3000\/attributes\/5217", + "value": false, + "name": "abgeschlossen", + "readable": true, + "id": 5217, + "writable": true + }, + { + "type": "boolean", + "mandatory": false, + "confirm": true, + "uri": "http:\/\/localhost:3000\/attributes\/5218", + "value": false, + "name": "freigegeben", + "readable": true, + "id": 5218, + "writable": false + }, + { + "type": "boolean", + "mandatory": false, + "confirm": true, + "uri": "http:\/\/localhost:3000\/attributes\/5219", + "value": false, + "name": "verschickt", + "readable": true, + "id": 5219, + "writable": false + }, + { + "type": "date", + "mandatory": true, + "confirm": false, + "uri": "http:\/\/localhost:3000\/attributes\/5220", + "value": "2008-10-08", + "name": "Bestelldatum", + "readable": true, + "id": 5220, + "writable": false + }, + { + "type": "references", + "create_options": [ + { + "create_element_url": "http:\/\/localhost:3000\/elements?list=Lists%3A%3AEmployees&source_id=5221&type=Elements%3A%3APerson", + "essential_attributes": [ + ], + "names": { + "type": "Person", + "list": "Mitarbeiter" + }, + "ask_for_email": true + } + ], + "maximum_reached": true, + "constraints": { + "neighbourhood": null, + "attribute": null, + "maximum": 1, + "element": [ + "Elements::Person" + ], + "list": null, + "follow": null + }, + "essential_attributes": [ + ], + "mandatory": false, + "confirm": false, + "uri": "http:\/\/localhost:3000\/attributes\/5221", + "value": { + "elements": [ + { + "color": null, + "type": "Elements::Person", + "has_predecessors": false, + "successors": "http:\/\/localhost:3000\/elements\/582\/successors", + "uri": "http:\/\/localhost:3000\/elements\/582", + "name": "Clovis Schwenger", + "attributes": "http:\/\/localhost:3000\/elements\/582\/attributes", + "link_url": "http:\/\/localhost:3000\/inbound_references\/457", + "state": null, + "readable": true, + "list": "Lists::Employees", + "id": 582, + "writable": true, + "family": "http:\/\/localhost:3000\/elements\/582\/family" + } + ] + }, + "name": "bestellt von", + "candidates_uri": "http:\/\/localhost:3000\/attributes\/5221\/candidates", + "create_reference_uri": "http:\/\/localhost:3000\/inbound_references", + "readable": true, + "id": 5221, + "writable": false + }, + { + "type": "text", + "mandatory": false, + "confirm": false, + "uri": "http:\/\/localhost:3000\/attributes\/5222", + "value": { + "language": null, + "version": 0, + "text": "" + }, + "name": "Verwendungszweck", + "multiline": true, + "readable": true, + "id": 5222, + "languages": [ + ], + "writable": true + }, + { + "type": "references", + "create_options": [ + ], + "maximum_reached": null, + "constraints": { + "neighbourhood": null, + "attribute": null, + "maximum": null, + "element": [ + "Elements::Merchandise" + ], + "list": null, + "follow": "Article" + }, + "essential_attributes": [ + { + "name": "Menge", + "default": 1, + "id": "Amount" + } + ], + "mandatory": true, + "confirm": false, + "uri": "http:\/\/localhost:3000\/attributes\/5223", + "value": { + "elements": [ + { + "color": null, + "type": "Elements::Merchandise", + "has_predecessors": true, + "successors": "http:\/\/localhost:3000\/elements\/627\/successors", + "uri": "http:\/\/localhost:3000\/elements\/627", + "name": "8 x
<\/div>#005 Stressball", + "attributes": "http:\/\/localhost:3000\/elements\/627\/attributes", + "link_url": "http:\/\/localhost:3000\/inbound_references\/458", + "state": null, + "readable": true, + "list": "Lists::OrderItems", + "id": 627, + "writable": true, + "family": "http:\/\/localhost:3000\/elements\/627\/family" + }, + { + "color": null, + "type": "Elements::Merchandise", + "has_predecessors": true, + "successors": "http:\/\/localhost:3000\/elements\/628\/successors", + "uri": "http:\/\/localhost:3000\/elements\/628", + "name": "3 x
<\/div>#011 Post-It Block", + "attributes": "http:\/\/localhost:3000\/elements\/628\/attributes", + "link_url": "http:\/\/localhost:3000\/inbound_references\/459", + "state": null, + "readable": true, + "list": "Lists::OrderItems", + "id": 628, + "writable": true, + "family": "http:\/\/localhost:3000\/elements\/628\/family" + } + ] + }, + "name": "Bestellpositionen", + "candidates_uri": "http:\/\/localhost:3000\/attributes\/5223\/candidates", + "create_reference_uri": "http:\/\/localhost:3000\/inbound_references", + "readable": true, + "id": 5223, + "writable": true + }, + { + "type": "float", + "mandatory": false, + "confirm": false, + "uri": "http:\/\/localhost:3000\/attributes\/5224", + "value": "12,10", + "name": "Summe", + "readable": true, + "id": 5224, + "writable": false + }, + { + "type": "document", + "files": [ + ], + "mandatory": false, + "confirm": false, + "uri": "http:\/\/localhost:3000\/attributes\/5225", + "name": "Bestellschein", + "readable": true, + "id": 5225, + "writable": false + }, + { + "type": "document", + "files": [ + ], + "mandatory": false, + "confirm": false, + "uri": "http:\/\/localhost:3000\/attributes\/5226", + "name": "Empf\u00e4ngernachweis", + "readable": true, + "id": 5226, + "writable": false + } + ], + "writable": true +} \ No newline at end of file diff --git a/test/scanners/json/example.expected.raydebug b/test/scanners/json/example.expected.raydebug new file mode 100644 index 0000000..20a1560 --- /dev/null +++ b/test/scanners/json/example.expected.raydebug @@ -0,0 +1,22 @@ +operator([) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) float(37.7668)operator(,) + keyoperator(:) float(-122.3959)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) string + operator(})operator(,) + operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) float(37.371991)operator(,) + keyoperator(:) float(-122.026020)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) string + operator(}) +operator(]) diff --git a/test/scanners/json/example.in.json b/test/scanners/json/example.in.json new file mode 100644 index 0000000..2a0cb68 --- /dev/null +++ b/test/scanners/json/example.in.json @@ -0,0 +1,22 @@ +[ + { + "precision": "zip", + "Latitude": 37.7668, + "Longitude": -122.3959, + "Address": "", + "City": "SAN FRANCISCO", + "State": "CA", + "Zip": "94107", + "Country": "US" + }, + { + "precision": "zip", + "Latitude": 37.371991, + "Longitude": -122.026020, + "Address": "", + "City": "SUNNYVALE", + "State": "CA", + "Zip": "94085", + "Country": "US" + } +] diff --git a/test/scanners/json/json-lib.expected.raydebug b/test/scanners/json/json-lib.expected.raydebug new file mode 100644 index 0000000..cb2b188 --- /dev/null +++ b/test/scanners/json/json-lib.expected.raydebug @@ -0,0 +1,73 @@ +operator([) + stringoperator(,) + operator({)keyoperator(:)operator([)stringoperator(])operator(})operator(,) + operator({)operator(})operator(,) + operator([)operator(])operator(,) + integer(-42)operator(,) + reserved(true)operator(,) + reserved(false)operator(,) + reserved(null)operator(,) + operator({) + keyoperator(:) integer(1234567890)operator(,) + keyoperator(:) float(-9876.543210)operator(,) + keyoperator(:) float(0.123456789e-12)operator(,) + keyoperator(:) float(1.234567890E+34)operator(,) + keyoperator(:) float(23456789012E666)operator(,) + keyoperator(:) integer(0)operator(,) + keyoperator(:) integer(1)operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) string?)delimiter(")>operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) reserved(true)operator(,) + keyoperator(:) reserved(false)operator(,) + keyoperator(:) reserved(null)operator(,) + keyoperator(:)operator([) operator(])operator(,) + keyoperator(:)operator({) operator(})operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + key */)delimiter(")>operator(:) stringoperator(,) + key operator(:)operator([)integer(1)operator(,)integer(2) operator(,) integer(3) + +operator(,) + +integer(4) operator(,) integer(5) operator(,) integer(6) operator(,)integer(7) operator(])operator(,) + keyoperator(:) operator([)integer(1)operator(,)integer(2)operator(,)integer(3)operator(,)integer(4)operator(,)integer(5)operator(,)integer(6)operator(,)integer(7)operator(])operator(,) + keyoperator(:) stringoperator(,) + keyoperator(:) stringoperator(,) + key?)delimiter(")> +operator(:) string + operator(})operator(,) + float(0.5) operator(,)float(98.6) +operator(,) +float(99.44) +operator(,) + +integer(1066) + + +operator(,)stringoperator(]) + +operator([)stringoperator(]) + +operator([)stringoperator(]) + +operator([)stringoperator(]) + +operator([)operator([)operator([)operator([)operator([)operator([)operator([)operator([)operator([)operator([)operator([)operator([)operator([)operator([)operator([)operator([)operator([)operator([)operator([)stringoperator(])operator(])operator(])operator(])operator(])operator(])operator(])operator(])operator(])operator(])operator(])operator(])operator(])operator(])operator(])operator(])operator(])operator(])operator(]) + +operator([)stringoperator(]) + +operator({) + keyoperator(:) operator({) + keyoperator(:) stringoperator(,) + keyoperator(:) string + operator(}) +operator(}) diff --git a/test/scanners/json/json-lib.in.json b/test/scanners/json/json-lib.in.json new file mode 100644 index 0000000..b007f5a --- /dev/null +++ b/test/scanners/json/json-lib.in.json @@ -0,0 +1,73 @@ +[ + "JSON Test Pattern pass1", + {"object with 1 member":["array with 1 element"]}, + {}, + [], + -42, + true, + false, + null, + { + "integer": 1234567890, + "real": -9876.543210, + "e": 0.123456789e-12, + "E": 1.234567890E+34, + "": 23456789012E666, + "zero": 0, + "one": 1, + "space": " ", + "quote": "\"", + "backslash": "\\", + "controls": "\b\f\n\r\t", + "slash": "/ & \/", + "alpha": "abcdefghijklmnopqrstuvwyz", + "ALPHA": "ABCDEFGHIJKLMNOPQRSTUVWYZ", + "digit": "0123456789", + "special": "`1~!@#$%^&*()_+-={':[,]}|;.?", + "hex": "\u0123\u4567\u89AB\uCDEF\uabcd\uef4A", + "true": true, + "false": false, + "null": null, + "array":[ ], + "object":{ }, + "address": "50 St. James Street", + "url": "http://www.JSON.org/", + "comment": "// /* */": " ", + " s p a c e d " :[1,2 , 3 + +, + +4 , 5 , 6 ,7 ], + "compact": [1,2,3,4,5,6,7], + "jsontext": "{\"object with 1 member\":[\"array with 1 element\"]}", + "quotes": "" \u0022 %22 0x22 034 "", + "\/\\\"\uCAFE\uBABE\uAB98\uFCDE\ubcda\uef4A\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?" +: "A key can be any string" + }, + 0.5 ,98.6 +, +99.44 +, + +1066 + + +,"rosebud"] + +["Illegal backslash escape: \x15"] + +["Illegal backslash escape: \'"] + +["Illegal backslash escape: \017"] + +[[[[[[[[[[[[[[[[[[["Not too deep"]]]]]]]]]]]]]]]]]]] + +["tab\ character\ in\ string\ "] + +{ + "JSON Test Pattern pass3": { + "The outermost value": "must be an object or array.", + "In this test": "It is an object." + } +} diff --git a/test/scanners/json/suite.rb b/test/scanners/json/suite.rb new file mode 100644 index 0000000..3497d34 --- /dev/null +++ b/test/scanners/json/suite.rb @@ -0,0 +1,2 @@ +class JSON < CodeRay::TestCase +end -- cgit v1.2.1