summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorhsbt <hsbt@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-07-05 11:49:39 +0000
committerhsbt <hsbt@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-07-05 11:49:39 +0000
commit11306587383f345d54752f262bee5f67adaae2f0 (patch)
treed63e457298a3c27b345fd674c1557e1cb390248c /test
parent5eff15d1bdda4efcdd8aa59c91c804e345394a1c (diff)
* ext/json/*, test/json/*: Update json-2.0.1.
Changes of 2.0.0: https://github.com/flori/json/blob/f679ebd0c69a94e3e70a897ac9a229f5779c2ee1/CHANGES.md#2015-09-11-200 Changes of 2.0.1: https://github.com/flori/json/blob/f679ebd0c69a94e3e70a897ac9a229f5779c2ee1/CHANGES.md#2016-07-01-201 [Feature #12542][ruby-dev:49706][fix GH-1395] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55576 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test')
-rw-r--r--test/json/fixtures/fail1.json1
-rw-r--r--test/json/fixtures/obsolete_fail1.json1
-rw-r--r--test/json/test_helper.rb (renamed from test/json/setup_variant.rb)10
-rwxr-xr-xtest/json/test_json.rb577
-rw-r--r--test/json/test_json_addition.rb38
-rw-r--r--test/json/test_json_common_interface.rb126
-rw-r--r--test/json/test_json_encoding.rb103
-rw-r--r--test/json/test_json_ext_parser.rb28
-rw-r--r--test/json/test_json_fixtures.rb8
-rw-r--r--test/json/test_json_generator.rb (renamed from test/json/test_json_generate.rb)78
-rw-r--r--test/json/test_json_generic_object.rb20
-rw-r--r--test/json/test_json_parser.rb448
-rw-r--r--test/json/test_json_string_matching.rb24
-rw-r--r--test/json/test_json_unicode.rb73
14 files changed, 780 insertions, 755 deletions
diff --git a/test/json/fixtures/fail1.json b/test/json/fixtures/fail1.json
deleted file mode 100644
index 6216b865f1..0000000000
--- a/test/json/fixtures/fail1.json
+++ /dev/null
@@ -1 +0,0 @@
-"A JSON payload should be an object or array, not a string." \ No newline at end of file
diff --git a/test/json/fixtures/obsolete_fail1.json b/test/json/fixtures/obsolete_fail1.json
new file mode 100644
index 0000000000..98b77de6a8
--- /dev/null
+++ b/test/json/fixtures/obsolete_fail1.json
@@ -0,0 +1 @@
+"A JSON payload should be an object or array, not a string."
diff --git a/test/json/setup_variant.rb b/test/json/test_helper.rb
index f7fb2a1d56..69edb627e8 100644
--- a/test/json/setup_variant.rb
+++ b/test/json/test_helper.rb
@@ -10,3 +10,13 @@ else
$:.unshift 'ext', 'lib'
require 'json'
end
+
+require 'test/unit'
+begin
+ require 'byebug'
+rescue LoadError
+end
+if ENV['START_SIMPLECOV'].to_i == 1
+ require 'simplecov'
+ SimpleCov.start
+end
diff --git a/test/json/test_json.rb b/test/json/test_json.rb
deleted file mode 100755
index 8fe9459978..0000000000
--- a/test/json/test_json.rb
+++ /dev/null
@@ -1,577 +0,0 @@
-#!/usr/bin/env ruby
-# encoding: utf-8
-# frozen_string_literal: false
-
-require 'test/unit'
-require File.join(File.dirname(__FILE__), 'setup_variant')
-require 'stringio'
-require 'tempfile'
-require 'ostruct'
-
-unless Array.method_defined?(:permutation)
- begin
- require 'enumerator'
- require 'permutation'
- class Array
- def permutation
- Permutation.for(self).to_enum.map { |x| x.project }
- end
- end
- rescue LoadError
- warn "Skipping permutation tests."
- end
-end
-
-class TestJSON < Test::Unit::TestCase
- include JSON
-
- def setup
- @ary = [1, "foo", 3.14, 4711.0, 2.718, nil, [1,-2,3], false, true].map do
- |x| [x]
- end
- @ary_to_parse = ["1", '"foo"', "3.14", "4711.0", "2.718", "null",
- "[1,-2,3]", "false", "true"].map do
- |x| "[#{x}]"
- end
- @hash = {
- 'a' => 2,
- 'b' => 3.141,
- 'c' => 'c',
- 'd' => [ 1, "b", 3.14 ],
- 'e' => { 'foo' => 'bar' },
- 'g' => "\"\0\037",
- 'h' => 1000.0,
- 'i' => 0.001
- }
- @json = '{"a":2,"b":3.141,"c":"c","d":[1,"b",3.14],"e":{"foo":"bar"},'\
- '"g":"\\"\\u0000\\u001f","h":1.0E3,"i":1.0E-3}'
- end
-
- def test_construction
- parser = JSON::Parser.new('test')
- assert_equal 'test', parser.source
- end
-
- def assert_equal_float(expected, is)
- assert_in_delta(expected.first, is.first, 1e-2)
- end
-
- def test_parse_simple_arrays
- assert_equal([], parse('[]'))
- assert_equal([], parse(' [ ] '))
- assert_equal([nil], parse('[null]'))
- assert_equal([false], parse('[false]'))
- assert_equal([true], parse('[true]'))
- assert_equal([-23], parse('[-23]'))
- assert_equal([23], parse('[23]'))
- assert_equal([0.23], parse('[0.23]'))
- assert_equal([0.0], parse('[0e0]'))
- assert_raise(JSON::ParserError) { parse('[+23.2]') }
- assert_raise(JSON::ParserError) { parse('[+23]') }
- assert_raise(JSON::ParserError) { parse('[.23]') }
- assert_raise(JSON::ParserError) { parse('[023]') }
- assert_equal_float [3.141], parse('[3.141]')
- assert_equal_float [-3.141], parse('[-3.141]')
- assert_equal_float [3.141], parse('[3141e-3]')
- assert_equal_float [3.141], parse('[3141.1e-3]')
- assert_equal_float [3.141], parse('[3141E-3]')
- assert_equal_float [3.141], parse('[3141.0E-3]')
- assert_equal_float [-3.141], parse('[-3141.0e-3]')
- assert_equal_float [-3.141], parse('[-3141e-3]')
- assert_raise(ParserError) { parse('[NaN]') }
- assert parse('[NaN]', :allow_nan => true).first.nan?
- assert_raise(ParserError) { parse('[Infinity]') }
- assert_equal [1.0/0], parse('[Infinity]', :allow_nan => true)
- assert_raise(ParserError) { parse('[-Infinity]') }
- assert_equal [-1.0/0], parse('[-Infinity]', :allow_nan => true)
- assert_equal([""], parse('[""]'))
- assert_equal(["foobar"], parse('["foobar"]'))
- assert_equal([{}], parse('[{}]'))
- end
-
- def test_parse_simple_objects
- assert_equal({}, parse('{}'))
- assert_equal({}, parse(' { } '))
- assert_equal({ "a" => nil }, parse('{ "a" : null}'))
- assert_equal({ "a" => nil }, parse('{"a":null}'))
- assert_equal({ "a" => false }, parse('{ "a" : false } '))
- assert_equal({ "a" => false }, parse('{"a":false}'))
- assert_raise(JSON::ParserError) { parse('{false}') }
- assert_equal({ "a" => true }, parse('{"a":true}'))
- assert_equal({ "a" => true }, parse(' { "a" : true } '))
- assert_equal({ "a" => -23 }, parse(' { "a" : -23 } '))
- assert_equal({ "a" => -23 }, parse(' { "a" : -23 } '))
- assert_equal({ "a" => 23 }, parse('{"a":23 } '))
- assert_equal({ "a" => 23 }, parse(' { "a" : 23 } '))
- assert_equal({ "a" => 0.23 }, parse(' { "a" : 0.23 } '))
- assert_equal({ "a" => 0.23 }, parse(' { "a" : 0.23 } '))
- end
-
- def test_parse_json_primitive_values
- assert_raise(JSON::ParserError) { JSON.parse('') }
- assert_raise(JSON::ParserError) { JSON.parse('', :quirks_mode => true) }
- assert_raise(TypeError) { JSON::Parser.new(nil).parse }
- assert_raise(TypeError) { JSON::Parser.new(nil, :quirks_mode => true).parse }
- assert_raise(TypeError) { JSON.parse(nil) }
- assert_raise(TypeError) { JSON.parse(nil, :quirks_mode => true) }
- assert_raise(JSON::ParserError) { JSON.parse(' /* foo */ ') }
- assert_raise(JSON::ParserError) { JSON.parse(' /* foo */ ', :quirks_mode => true) }
- parser = JSON::Parser.new('null')
- assert_equal false, parser.quirks_mode?
- assert_raise(JSON::ParserError) { parser.parse }
- assert_raise(JSON::ParserError) { JSON.parse('null') }
- assert_equal nil, JSON.parse('null', :quirks_mode => true)
- parser = JSON::Parser.new('null', :quirks_mode => true)
- assert_equal true, parser.quirks_mode?
- assert_equal nil, parser.parse
- assert_raise(JSON::ParserError) { JSON.parse('false') }
- assert_equal false, JSON.parse('false', :quirks_mode => true)
- assert_raise(JSON::ParserError) { JSON.parse('true') }
- assert_equal true, JSON.parse('true', :quirks_mode => true)
- assert_raise(JSON::ParserError) { JSON.parse('23') }
- assert_equal 23, JSON.parse('23', :quirks_mode => true)
- assert_raise(JSON::ParserError) { JSON.parse('1') }
- assert_equal 1, JSON.parse('1', :quirks_mode => true)
- assert_raise(JSON::ParserError) { JSON.parse('3.141') }
- assert_in_delta 3.141, JSON.parse('3.141', :quirks_mode => true), 1E-3
- assert_raise(JSON::ParserError) { JSON.parse('18446744073709551616') }
- assert_equal 2 ** 64, JSON.parse('18446744073709551616', :quirks_mode => true)
- assert_raise(JSON::ParserError) { JSON.parse('"foo"') }
- assert_equal 'foo', JSON.parse('"foo"', :quirks_mode => true)
- assert_raise(JSON::ParserError) { JSON.parse('NaN', :allow_nan => true) }
- assert JSON.parse('NaN', :quirks_mode => true, :allow_nan => true).nan?
- assert_raise(JSON::ParserError) { JSON.parse('Infinity', :allow_nan => true) }
- assert JSON.parse('Infinity', :quirks_mode => true, :allow_nan => true).infinite?
- assert_raise(JSON::ParserError) { JSON.parse('-Infinity', :allow_nan => true) }
- assert JSON.parse('-Infinity', :quirks_mode => true, :allow_nan => true).infinite?
- assert_raise(JSON::ParserError) { JSON.parse('[ 1, ]', :quirks_mode => true) }
- end
-
- if Array.method_defined?(:permutation)
- def test_parse_more_complex_arrays
- a = [ nil, false, true, "foßbar", [ "n€st€d", true ], { "nested" => true, "n€ßt€ð2" => {} }]
- a.permutation.each do |perm|
- json = pretty_generate(perm)
- assert_equal perm, parse(json)
- end
- end
-
- def test_parse_complex_objects
- a = [ nil, false, true, "foßbar", [ "n€st€d", true ], { "nested" => true, "n€ßt€ð2" => {} }]
- a.permutation.each do |perm|
- s = "a"
- orig_obj = perm.inject({}) { |h, x| h[s.dup] = x; s = s.succ; h }
- json = pretty_generate(orig_obj)
- assert_equal orig_obj, parse(json)
- end
- end
- end
-
- def test_parse_arrays
- assert_equal([1,2,3], parse('[1,2,3]'))
- assert_equal([1.2,2,3], parse('[1.2,2,3]'))
- assert_equal([[],[[],[]]], parse('[[],[[],[]]]'))
- end
-
- def test_parse_values
- assert_equal([""], parse('[""]'))
- assert_equal(["\\"], parse('["\\\\"]'))
- assert_equal(['"'], parse('["\""]'))
- assert_equal(['\\"\\'], parse('["\\\\\\"\\\\"]'))
- assert_equal(["\"\b\n\r\t\0\037"],
- parse('["\"\b\n\r\t\u0000\u001f"]'))
- for i in 0 ... @ary.size
- assert_equal(@ary[i], parse(@ary_to_parse[i]))
- end
- end
-
- def test_parse_array
- assert_equal([], parse('[]'))
- assert_equal([], parse(' [ ] '))
- assert_equal([1], parse('[1]'))
- assert_equal([1], parse(' [ 1 ] '))
- assert_equal(@ary,
- parse('[[1],["foo"],[3.14],[47.11e+2],[2718.0E-3],[null],[[1,-2,3]]'\
- ',[false],[true]]'))
- assert_equal(@ary, parse(%Q{ [ [1] , ["foo"] , [3.14] \t , [47.11e+2]\s
- , [2718.0E-3 ],\r[ null] , [[1, -2, 3 ]], [false ],[ true]\n ] }))
- end
-
- class SubArray < Array
- def <<(v)
- @shifted = true
- super
- end
-
- def shifted?
- @shifted
- end
- end
-
- class SubArray2 < Array
- def to_json(*a)
- {
- JSON.create_id => self.class.name,
- 'ary' => to_a,
- }.to_json(*a)
- end
-
- def self.json_create(o)
- o.delete JSON.create_id
- o['ary']
- end
- end
-
- class SubArrayWrapper
- def initialize
- @data = []
- end
-
- attr_reader :data
-
- def [](index)
- @data[index]
- end
-
- def <<(value)
- @data << value
- @shifted = true
- end
-
- def shifted?
- @shifted
- end
- end
-
- def test_parse_array_custom_array_derived_class
- res = parse('[1,2]', :array_class => SubArray)
- assert_equal([1,2], res)
- assert_equal(SubArray, res.class)
- assert res.shifted?
- end
-
- def test_parse_array_custom_non_array_derived_class
- res = parse('[1,2]', :array_class => SubArrayWrapper)
- assert_equal([1,2], res.data)
- assert_equal(SubArrayWrapper, res.class)
- assert res.shifted?
- end
-
- def test_parse_object
- assert_equal({}, parse('{}'))
- assert_equal({}, parse(' { } '))
- assert_equal({'foo'=>'bar'}, parse('{"foo":"bar"}'))
- assert_equal({'foo'=>'bar'}, parse(' { "foo" : "bar" } '))
- end
-
- class SubHash < Hash
- def []=(k, v)
- @item_set = true
- super
- end
-
- def item_set?
- @item_set
- end
- end
-
- class SubHash2 < Hash
- def to_json(*a)
- {
- JSON.create_id => self.class.name,
- }.merge(self).to_json(*a)
- end
-
- def self.json_create(o)
- o.delete JSON.create_id
- self[o]
- end
- end
-
- class SubOpenStruct < OpenStruct
- def [](k)
- __send__(k)
- end
-
- def []=(k, v)
- @item_set = true
- __send__("#{k}=", v)
- end
-
- def item_set?
- @item_set
- end
- end
-
- def test_parse_object_custom_hash_derived_class
- res = parse('{"foo":"bar"}', :object_class => SubHash)
- assert_equal({"foo" => "bar"}, res)
- assert_equal(SubHash, res.class)
- assert res.item_set?
- end
-
- def test_parse_object_custom_non_hash_derived_class
- res = parse('{"foo":"bar"}', :object_class => SubOpenStruct)
- assert_equal "bar", res.foo
- assert_equal(SubOpenStruct, res.class)
- assert res.item_set?
- end
-
- def test_parse_generic_object
- res = parse('{"foo":"bar", "baz":{}}', :object_class => JSON::GenericObject)
- assert_equal(JSON::GenericObject, res.class)
- assert_equal "bar", res.foo
- assert_equal "bar", res["foo"]
- assert_equal "bar", res[:foo]
- assert_equal "bar", res.to_hash[:foo]
- assert_equal(JSON::GenericObject, res.baz.class)
- end
-
- def test_generate_core_subclasses_with_new_to_json
- obj = SubHash2["foo" => SubHash2["bar" => true]]
- obj_json = JSON(obj)
- obj_again = JSON.parse(obj_json, :create_additions => true)
- assert_kind_of SubHash2, obj_again
- assert_kind_of SubHash2, obj_again['foo']
- assert obj_again['foo']['bar']
- assert_equal obj, obj_again
- assert_equal ["foo"], JSON(JSON(SubArray2["foo"]), :create_additions => true)
- end
-
- def test_generate_core_subclasses_with_default_to_json
- assert_equal '{"foo":"bar"}', JSON(SubHash["foo" => "bar"])
- assert_equal '["foo"]', JSON(SubArray["foo"])
- end
-
- def test_generate_of_core_subclasses
- obj = SubHash["foo" => SubHash["bar" => true]]
- obj_json = JSON(obj)
- obj_again = JSON(obj_json)
- assert_kind_of Hash, obj_again
- assert_kind_of Hash, obj_again['foo']
- assert obj_again['foo']['bar']
- assert_equal obj, obj_again
- end
-
- def test_parser_reset
- parser = Parser.new(@json)
- assert_equal(@hash, parser.parse)
- assert_equal(@hash, parser.parse)
- end
-
- def test_comments
- json = <<EOT
-{
- "key1":"value1", // eol comment
- "key2":"value2" /* multi line
- * comment */,
- "key3":"value3" /* multi line
- // nested eol comment
- * comment */
-}
-EOT
- assert_equal(
- { "key1" => "value1", "key2" => "value2", "key3" => "value3" },
- parse(json))
- json = <<EOT
-{
- "key1":"value1" /* multi line
- // nested eol comment
- /* illegal nested multi line comment */
- * comment */
-}
-EOT
- assert_raise(ParserError) { parse(json) }
- json = <<EOT
-{
- "key1":"value1" /* multi line
- // nested eol comment
- closed multi comment */
- and again, throw an Error */
-}
-EOT
- assert_raise(ParserError) { parse(json) }
- json = <<EOT
-{
- "key1":"value1" /*/*/
-}
-EOT
- assert_equal({ "key1" => "value1" }, parse(json))
- end
-
- def test_backslash
- data = [ '\\.(?i:gif|jpe?g|png)$' ]
- json = '["\\\\.(?i:gif|jpe?g|png)$"]'
- assert_equal json, JSON.generate(data)
- assert_equal data, JSON.parse(json)
- #
- data = [ '\\"' ]
- json = '["\\\\\""]'
- assert_equal json, JSON.generate(data)
- assert_equal data, JSON.parse(json)
- #
- json = '["/"]'
- data = JSON.parse(json)
- assert_equal ['/'], data
- assert_equal json, JSON.generate(data)
- #
- json = '["\""]'
- data = JSON.parse(json)
- assert_equal ['"'], data
- assert_equal json, JSON.generate(data)
- json = '["\\\'"]'
- data = JSON.parse(json)
- assert_equal ["'"], data
- assert_equal '["\'"]', JSON.generate(data)
- end
-
- def test_wrong_inputs
- assert_raise(ParserError) { JSON.parse('"foo"') }
- assert_raise(ParserError) { JSON.parse('123') }
- assert_raise(ParserError) { JSON.parse('[] bla') }
- assert_raise(ParserError) { JSON.parse('[] 1') }
- assert_raise(ParserError) { JSON.parse('[] []') }
- assert_raise(ParserError) { JSON.parse('[] {}') }
- assert_raise(ParserError) { JSON.parse('{} []') }
- assert_raise(ParserError) { JSON.parse('{} {}') }
- assert_raise(ParserError) { JSON.parse('[NULL]') }
- assert_raise(ParserError) { JSON.parse('[FALSE]') }
- assert_raise(ParserError) { JSON.parse('[TRUE]') }
- assert_raise(ParserError) { JSON.parse('[07] ') }
- assert_raise(ParserError) { JSON.parse('[0a]') }
- assert_raise(ParserError) { JSON.parse('[1.]') }
- assert_raise(ParserError) { JSON.parse(' ') }
- end
-
- def test_nesting
- assert_raise(JSON::NestingError) { JSON.parse '[[]]', :max_nesting => 1 }
- assert_raise(JSON::NestingError) { JSON.parser.new('[[]]', :max_nesting => 1).parse }
- assert_equal [[]], JSON.parse('[[]]', :max_nesting => 2)
- too_deep = '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'
- too_deep_ary = eval too_deep
- assert_raise(JSON::NestingError) { JSON.parse too_deep }
- assert_raise(JSON::NestingError) { JSON.parser.new(too_deep).parse }
- assert_raise(JSON::NestingError) { JSON.parse too_deep, :max_nesting => 100 }
- ok = JSON.parse too_deep, :max_nesting => 101
- assert_equal too_deep_ary, ok
- ok = JSON.parse too_deep, :max_nesting => nil
- assert_equal too_deep_ary, ok
- ok = JSON.parse too_deep, :max_nesting => false
- assert_equal too_deep_ary, ok
- ok = JSON.parse too_deep, :max_nesting => 0
- assert_equal too_deep_ary, ok
- assert_raise(JSON::NestingError) { JSON.generate [[]], :max_nesting => 1 }
- assert_equal '[[]]', JSON.generate([[]], :max_nesting => 2)
- assert_raise(JSON::NestingError) { JSON.generate too_deep_ary }
- assert_raise(JSON::NestingError) { JSON.generate too_deep_ary, :max_nesting => 100 }
- ok = JSON.generate too_deep_ary, :max_nesting => 101
- assert_equal too_deep, ok
- ok = JSON.generate too_deep_ary, :max_nesting => nil
- assert_equal too_deep, ok
- ok = JSON.generate too_deep_ary, :max_nesting => false
- assert_equal too_deep, ok
- ok = JSON.generate too_deep_ary, :max_nesting => 0
- assert_equal too_deep, ok
- end
-
- def test_symbolize_names
- assert_equal({ "foo" => "bar", "baz" => "quux" },
- JSON.parse('{"foo":"bar", "baz":"quux"}'))
- assert_equal({ :foo => "bar", :baz => "quux" },
- JSON.parse('{"foo":"bar", "baz":"quux"}', :symbolize_names => true))
- end
-
- def test_load
- assert_equal @hash, JSON.load(@json)
- tempfile = Tempfile.open('json')
- tempfile.write @json
- tempfile.rewind
- assert_equal @hash, JSON.load(tempfile)
- stringio = StringIO.new(@json)
- stringio.rewind
- assert_equal @hash, JSON.load(stringio)
- assert_equal nil, JSON.load(nil)
- assert_equal nil, JSON.load('')
- ensure
- tempfile.close!
- end
-
- def test_load_with_options
- small_hash = JSON("foo" => 'bar')
- symbol_hash = { :foo => 'bar' }
- assert_equal symbol_hash, JSON.load(small_hash, nil, :symbolize_names => true)
- end
-
- def test_dump
- too_deep = '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'
- assert_equal too_deep, JSON.dump(eval(too_deep))
- assert_kind_of String, Marshal.dump(eval(too_deep))
- assert_raise(ArgumentError) { JSON.dump(eval(too_deep), 100) }
- assert_raise(ArgumentError) { Marshal.dump(eval(too_deep), 100) }
- assert_equal too_deep, JSON.dump(eval(too_deep), 101)
- assert_kind_of String, Marshal.dump(eval(too_deep), 101)
- output = StringIO.new
- JSON.dump(eval(too_deep), output)
- assert_equal too_deep, output.string
- output = StringIO.new
- JSON.dump(eval(too_deep), output, 101)
- assert_equal too_deep, output.string
- end
-
- def test_dump_should_modify_defaults
- max_nesting = JSON.dump_default_options[:max_nesting]
- JSON.dump([], StringIO.new, 10)
- assert_equal max_nesting, JSON.dump_default_options[:max_nesting]
- end
-
- def test_big_integers
- json1 = JSON([orig = (1 << 31) - 1])
- assert_equal orig, JSON[json1][0]
- json2 = JSON([orig = 1 << 31])
- assert_equal orig, JSON[json2][0]
- json3 = JSON([orig = (1 << 62) - 1])
- assert_equal orig, JSON[json3][0]
- json4 = JSON([orig = 1 << 62])
- assert_equal orig, JSON[json4][0]
- json5 = JSON([orig = 1 << 64])
- assert_equal orig, JSON[json5][0]
- end
-
- if defined?(JSON::Ext::Parser)
- def test_allocate
- parser = JSON::Ext::Parser.new("{}")
- assert_raise(TypeError, '[ruby-core:35079]') {parser.__send__(:initialize, "{}")}
- parser = JSON::Ext::Parser.allocate
- assert_raise(TypeError, '[ruby-core:35079]') {parser.source}
- end
- end
-
- def test_argument_encoding
- source = "{}".force_encoding("ascii-8bit")
- JSON::Parser.new(source)
- assert_equal Encoding::ASCII_8BIT, source.encoding
- end if defined?(Encoding::ASCII_8BIT)
-
- def test_error_message_encoding
- bug10705 = '[ruby-core:67386] [Bug #10705]'
- json = "\"\xE2\x88\x9A\"".force_encoding(Encoding::UTF_8)
- e = assert_raise(JSON::ParserError) {
- JSON.parse(json)
- }
- assert_equal(Encoding::UTF_8, e.message.encoding, bug10705)
- assert_include(e.message, json, bug10705)
- end if defined?(Encoding::UTF_8)
-
- if EnvUtil.gc_stress_to_class?
- def assert_no_memory_leak(code, *rest, **opt)
- code = "8.times {20_000.times {begin #{code}; rescue NoMemoryError; end}; GC.start}"
- super(["-rjson/ext/parser"],
- "GC.add_stress_to_class(JSON::Ext::Parser); "\
- "#{code}", code, *rest, rss: true, limit: 1.1, **opt)
- end
-
- def test_no_memory_leak_allocate
- assert_no_memory_leak("JSON::Ext::Parser.allocate")
- end
- end
-end
diff --git a/test/json/test_json_addition.rb b/test/json/test_json_addition.rb
index f2059312de..7a49d62d73 100644
--- a/test/json/test_json_addition.rb
+++ b/test/json/test_json_addition.rb
@@ -1,9 +1,5 @@
-#!/usr/bin/env ruby
-# -*- coding:utf-8 -*-
# frozen_string_literal: false
-
-require 'test/unit'
-require File.join(File.dirname(__FILE__), 'setup_variant')
+require 'test_helper'
require 'json/add/core'
require 'json/add/complex'
require 'json/add/rational'
@@ -74,7 +70,7 @@ class TestJSONAddition < Test::Unit::TestCase
a = A.new(666)
assert A.json_creatable?
json = generate(a)
- a_again = JSON.parse(json, :create_additions => true)
+ a_again = parse(json, :create_additions => true)
assert_kind_of a.class, a_again
assert_equal a, a_again
end
@@ -83,7 +79,7 @@ class TestJSONAddition < Test::Unit::TestCase
a = A.new(666)
assert A.json_creatable?
json = generate(a)
- a_hash = JSON.parse(json)
+ a_hash = parse(json)
assert_kind_of Hash, a_hash
end
@@ -91,10 +87,10 @@ class TestJSONAddition < Test::Unit::TestCase
a = A.new(666)
assert A.json_creatable?
json = generate(a)
- a_again = JSON.parse(json, :create_additions => true)
+ a_again = parse(json, :create_additions => true)
assert_kind_of a.class, a_again
assert_equal a, a_again
- a_hash = JSON.parse(json, :create_additions => false)
+ a_hash = parse(json, :create_additions => false)
assert_kind_of Hash, a_hash
assert_equal(
{"args"=>[666], "json_class"=>"TestJSONAddition::A"}.sort_by { |k,| k },
@@ -106,14 +102,14 @@ class TestJSONAddition < Test::Unit::TestCase
b = B.new
assert !B.json_creatable?
json = generate(b)
- assert_equal({ "json_class"=>"TestJSONAddition::B" }, JSON.parse(json))
+ assert_equal({ "json_class"=>"TestJSONAddition::B" }, parse(json))
end
def test_extended_json_fail2
c = C.new
assert !C.json_creatable?
json = generate(c)
- assert_raise(ArgumentError, NameError) { JSON.parse(json, :create_additions => true) }
+ assert_raise(ArgumentError, NameError) { parse(json, :create_additions => true) }
end
def test_raw_strings
@@ -131,7 +127,7 @@ class TestJSONAddition < Test::Unit::TestCase
assert_match(/\A\{.*\}\z/, json)
assert_match(/"json_class":"String"/, json)
assert_match(/"raw":\[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255\]/, json)
- raw_again = JSON.parse(json, :create_additions => true)
+ raw_again = parse(json, :create_additions => true)
assert_equal raw, raw_again
end
@@ -168,19 +164,19 @@ class TestJSONAddition < Test::Unit::TestCase
def test_utc_datetime
now = Time.now
- d = DateTime.parse(now.to_s, :create_additions => true) # usual case
- assert_equal d, JSON.parse(d.to_json, :create_additions => true)
- d = DateTime.parse(now.utc.to_s) # of = 0
- assert_equal d, JSON.parse(d.to_json, :create_additions => true)
+ d = DateTime.parse(now.to_s, :create_additions => true) # usual case
+ assert_equal d, parse(d.to_json, :create_additions => true)
+ d = DateTime.parse(now.utc.to_s) # of = 0
+ assert_equal d, parse(d.to_json, :create_additions => true)
d = DateTime.civil(2008, 6, 17, 11, 48, 32, Rational(1,24))
- assert_equal d, JSON.parse(d.to_json, :create_additions => true)
+ assert_equal d, parse(d.to_json, :create_additions => true)
d = DateTime.civil(2008, 6, 17, 11, 48, 32, Rational(12,24))
- assert_equal d, JSON.parse(d.to_json, :create_additions => true)
+ assert_equal d, parse(d.to_json, :create_additions => true)
end
def test_rational_complex
- assert_equal Rational(2, 9), JSON.parse(JSON(Rational(2, 9)), :create_additions => true)
- assert_equal Complex(2, 9), JSON.parse(JSON(Complex(2, 9)), :create_additions => true)
+ assert_equal Rational(2, 9), parse(JSON(Rational(2, 9)), :create_additions => true)
+ assert_equal Complex(2, 9), parse(JSON(Complex(2, 9)), :create_additions => true)
end
def test_bigdecimal
@@ -192,6 +188,6 @@ class TestJSONAddition < Test::Unit::TestCase
o = OpenStruct.new
# XXX this won't work; o.foo = { :bar => true }
o.foo = { 'bar' => true }
- assert_equal o, JSON.parse(JSON(o), :create_additions => true)
+ assert_equal o, parse(JSON(o), :create_additions => true)
end
end
diff --git a/test/json/test_json_common_interface.rb b/test/json/test_json_common_interface.rb
new file mode 100644
index 0000000000..3b222b35e0
--- /dev/null
+++ b/test/json/test_json_common_interface.rb
@@ -0,0 +1,126 @@
+# frozen_string_literal: false
+require 'test_helper'
+require 'stringio'
+require 'tempfile'
+
+class TestJSONCommonInterface < Test::Unit::TestCase
+ include JSON
+
+ def setup
+ @hash = {
+ 'a' => 2,
+ 'b' => 3.141,
+ 'c' => 'c',
+ 'd' => [ 1, "b", 3.14 ],
+ 'e' => { 'foo' => 'bar' },
+ 'g' => "\"\0\037",
+ 'h' => 1000.0,
+ 'i' => 0.001
+ }
+ @json = '{"a":2,"b":3.141,"c":"c","d":[1,"b",3.14],"e":{"foo":"bar"},'\
+ '"g":"\\"\\u0000\\u001f","h":1000.0,"i":0.001}'
+ end
+
+ def test_index
+ assert_equal @json, JSON[@hash]
+ assert_equal @hash, JSON[@json]
+ end
+
+ def test_parser
+ assert_match /::Parser\z/, JSON.parser.name
+ end
+
+ def test_generator
+ assert_match /::Generator\z/, JSON.generator.name
+ end
+
+ def test_state
+ assert_match /::Generator::State\z/, JSON.state.name
+ end
+
+ def test_create_id
+ assert_equal 'json_class', JSON.create_id
+ JSON.create_id = 'foo_bar'
+ assert_equal 'foo_bar', JSON.create_id
+ ensure
+ JSON.create_id = 'json_class'
+ end
+
+ def test_deep_const_get
+ assert_raise(ArgumentError) { JSON.deep_const_get('Nix::Da') }
+ assert_equal File::SEPARATOR, JSON.deep_const_get('File::SEPARATOR')
+ end
+
+ def test_parse
+ assert_equal [ 1, 2, 3, ], JSON.parse('[ 1, 2, 3 ]')
+ end
+
+ def test_parse_bang
+ assert_equal [ 1, NaN, 3, ], JSON.parse!('[ 1, NaN, 3 ]')
+ end
+
+ def test_generate
+ assert_equal '[1,2,3]', JSON.generate([ 1, 2, 3 ])
+ end
+
+ def test_fast_generate
+ assert_equal '[1,2,3]', JSON.generate([ 1, 2, 3 ])
+ end
+
+ def test_pretty_generate
+ assert_equal "[\n 1,\n 2,\n 3\n]", JSON.pretty_generate([ 1, 2, 3 ])
+ end
+
+ def test_load
+ assert_equal @hash, JSON.load(@json)
+ tempfile = Tempfile.open('@json')
+ tempfile.write @json
+ tempfile.rewind
+ assert_equal @hash, JSON.load(tempfile)
+ stringio = StringIO.new(@json)
+ stringio.rewind
+ assert_equal @hash, JSON.load(stringio)
+ assert_equal nil, JSON.load(nil)
+ assert_equal nil, JSON.load('')
+ ensure
+ tempfile.close!
+ end
+
+ def test_load_with_options
+ json = '{ "foo": NaN }'
+ assert JSON.load(json, nil, :allow_nan => true)['foo'].nan?
+ end
+
+ def test_load_null
+ assert_equal nil, JSON.load(nil, nil, :allow_blank => true)
+ assert_raise(TypeError) { JSON.load(nil, nil, :allow_blank => false) }
+ assert_raise(JSON::ParserError) { JSON.load('', nil, :allow_blank => false) }
+ end
+
+ def test_dump
+ too_deep = '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'
+ assert_equal too_deep, dump(eval(too_deep))
+ assert_kind_of String, Marshal.dump(eval(too_deep))
+ assert_raise(ArgumentError) { dump(eval(too_deep), 100) }
+ assert_raise(ArgumentError) { Marshal.dump(eval(too_deep), 100) }
+ assert_equal too_deep, dump(eval(too_deep), 101)
+ assert_kind_of String, Marshal.dump(eval(too_deep), 101)
+ output = StringIO.new
+ dump(eval(too_deep), output)
+ assert_equal too_deep, output.string
+ output = StringIO.new
+ dump(eval(too_deep), output, 101)
+ assert_equal too_deep, output.string
+ end
+
+ def test_dump_should_modify_defaults
+ max_nesting = JSON.dump_default_options[:max_nesting]
+ dump([], StringIO.new, 10)
+ assert_equal max_nesting, JSON.dump_default_options[:max_nesting]
+ end
+
+ def test_JSON
+ assert_equal @json, JSON(@hash)
+ assert_equal @hash, JSON(@json)
+ end
+end
diff --git a/test/json/test_json_encoding.rb b/test/json/test_json_encoding.rb
index 50fb4ea279..ede6402842 100644
--- a/test/json/test_json_encoding.rb
+++ b/test/json/test_json_encoding.rb
@@ -1,44 +1,33 @@
-#!/usr/bin/env ruby
# encoding: utf-8
# frozen_string_literal: false
-
-require 'test/unit'
-require File.join(File.dirname(__FILE__), 'setup_variant')
+require 'test_helper'
class TestJSONEncoding < Test::Unit::TestCase
include JSON
def setup
- @utf_8 = '["© ≠ €!"]'
- @parsed = [ "© ≠ €!" ]
- @generated = '["\u00a9 \u2260 \u20ac!"]'
+ @utf_8 = '"© ≠ €!"'
+ @ascii_8bit = @utf_8.dup.force_encoding('ascii-8bit')
+ @parsed = "© ≠ €!"
+ @generated = '"\u00a9 \u2260 \u20ac!"'
if String.method_defined?(:encode)
- @utf_16_data = [@parsed.first.encode('utf-16be', 'utf-8')]
- @utf_8_ascii_8bit = @utf_8.dup.force_encoding(Encoding::ASCII_8BIT)
+ @utf_16_data = @parsed.encode('utf-16be', 'utf-8')
@utf_16be = @utf_8.encode('utf-16be', 'utf-8')
- @utf_16be_ascii_8bit = @utf_16be.dup.force_encoding(Encoding::ASCII_8BIT)
@utf_16le = @utf_8.encode('utf-16le', 'utf-8')
- @utf_16le_ascii_8bit = @utf_16le.dup.force_encoding(Encoding::ASCII_8BIT)
@utf_32be = @utf_8.encode('utf-32be', 'utf-8')
- @utf_32be_ascii_8bit = @utf_32be.dup.force_encoding(Encoding::ASCII_8BIT)
@utf_32le = @utf_8.encode('utf-32le', 'utf-8')
- @utf_32le_ascii_8bit = @utf_32le.dup.force_encoding(Encoding::ASCII_8BIT)
else
require 'iconv'
- @utf_16_data = Iconv.iconv('utf-16be', 'utf-8', @parsed.first)
- @utf_8_ascii_8bit = @utf_8.dup
+ @utf_16_data, = Iconv.iconv('utf-16be', 'utf-8', @parsed)
@utf_16be, = Iconv.iconv('utf-16be', 'utf-8', @utf_8)
- @utf_16be_ascii_8bit = @utf_16be.dup
@utf_16le, = Iconv.iconv('utf-16le', 'utf-8', @utf_8)
- @utf_16le_ascii_8bit = @utf_16le.dup
@utf_32be, = Iconv.iconv('utf-32be', 'utf-8', @utf_8)
- @utf_32be_ascii_8bit = @utf_32be.dup
@utf_32le, = Iconv.iconv('utf-32le', 'utf-8', @utf_8)
- @utf_32le_ascii_8bit = @utf_32le.dup
end
end
def test_parse
+ assert_equal @parsed, JSON.parse(@ascii_8bit)
assert_equal @parsed, JSON.parse(@utf_8)
assert_equal @parsed, JSON.parse(@utf_16be)
assert_equal @parsed, JSON.parse(@utf_16le)
@@ -46,21 +35,71 @@ class TestJSONEncoding < Test::Unit::TestCase
assert_equal @parsed, JSON.parse(@utf_32le)
end
- def test_parse_ascii_8bit
- assert_equal @parsed, JSON.parse(@utf_8_ascii_8bit)
- assert_equal @parsed, JSON.parse(@utf_16be_ascii_8bit)
- assert_equal @parsed, JSON.parse(@utf_16le_ascii_8bit)
- assert_equal @parsed, JSON.parse(@utf_32be_ascii_8bit)
- assert_equal @parsed, JSON.parse(@utf_32le_ascii_8bit)
- end
-
def test_generate
assert_equal @generated, JSON.generate(@parsed, :ascii_only => true)
- if defined?(::Encoding)
- assert_equal @generated, JSON.generate(@utf_16_data, :ascii_only => true)
- else
- # XXX checking of correct utf8 data is not as strict (yet?) without :ascii_only
- assert_raise(JSON::GeneratorError) { JSON.generate(@utf_16_data, :ascii_only => true) }
+ assert_equal @generated, JSON.generate(@utf_16_data, :ascii_only => true)
+ end
+
+ def test_unicode
+ assert_equal '""', ''.to_json
+ assert_equal '"\\b"', "\b".to_json
+ assert_equal '"\u0001"', 0x1.chr.to_json
+ assert_equal '"\u001f"', 0x1f.chr.to_json
+ assert_equal '" "', ' '.to_json
+ assert_equal "\"#{0x7f.chr}\"", 0x7f.chr.to_json
+ utf8 = [ "© ≠ €! \01" ]
+ json = '["© ≠ €! \u0001"]'
+ assert_equal json, utf8.to_json(:ascii_only => false)
+ assert_equal utf8, parse(json)
+ json = '["\u00a9 \u2260 \u20ac! \u0001"]'
+ assert_equal json, utf8.to_json(:ascii_only => true)
+ assert_equal utf8, parse(json)
+ utf8 = ["\343\201\202\343\201\204\343\201\206\343\201\210\343\201\212"]
+ json = "[\"\343\201\202\343\201\204\343\201\206\343\201\210\343\201\212\"]"
+ assert_equal utf8, parse(json)
+ assert_equal json, utf8.to_json(:ascii_only => false)
+ utf8 = ["\343\201\202\343\201\204\343\201\206\343\201\210\343\201\212"]
+ assert_equal utf8, parse(json)
+ json = "[\"\\u3042\\u3044\\u3046\\u3048\\u304a\"]"
+ assert_equal json, utf8.to_json(:ascii_only => true)
+ assert_equal utf8, parse(json)
+ utf8 = ['საქართველო']
+ json = '["საქართველო"]'
+ assert_equal json, utf8.to_json(:ascii_only => false)
+ json = "[\"\\u10e1\\u10d0\\u10e5\\u10d0\\u10e0\\u10d7\\u10d5\\u10d4\\u10da\\u10dd\"]"
+ assert_equal json, utf8.to_json(:ascii_only => true)
+ assert_equal utf8, parse(json)
+ assert_equal '["Ã"]', generate(["Ã"], :ascii_only => false)
+ assert_equal '["\\u00c3"]', generate(["Ã"], :ascii_only => true)
+ assert_equal ["€"], parse('["\u20ac"]')
+ utf8 = ["\xf0\xa0\x80\x81"]
+ json = "[\"\xf0\xa0\x80\x81\"]"
+ assert_equal json, generate(utf8, :ascii_only => false)
+ assert_equal utf8, parse(json)
+ json = '["\ud840\udc01"]'
+ assert_equal json, generate(utf8, :ascii_only => true)
+ assert_equal utf8, parse(json)
+ end
+
+ def test_chars
+ (0..0x7f).each do |i|
+ json = '["\u%04x"]' % i
+ if RUBY_VERSION >= "1.9."
+ i = i.chr
+ end
+ assert_equal i, parse(json).first[0]
+ if i == ?\b
+ generated = generate(["" << i])
+ assert '["\b"]' == generated || '["\10"]' == generated
+ elsif [?\n, ?\r, ?\t, ?\f].include?(i)
+ assert_equal '[' << ('' << i).dump << ']', generate(["" << i])
+ elsif i.chr < 0x20.chr
+ assert_equal json, generate(["" << i])
+ end
+ end
+ assert_raise(JSON::GeneratorError) do
+ generate(["\x80"], :ascii_only => true)
end
+ assert_equal "\302\200", parse('["\u0080"]').first
end
end
diff --git a/test/json/test_json_ext_parser.rb b/test/json/test_json_ext_parser.rb
new file mode 100644
index 0000000000..5cd12f0dcb
--- /dev/null
+++ b/test/json/test_json_ext_parser.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: false
+require 'test_helper'
+
+class TestJSONExtParser < Test::Unit::TestCase
+ if defined?(JSON::Ext::Parser)
+ def test_allocate
+ parser = JSON::Ext::Parser.new("{}")
+ assert_raise(TypeError, '[ruby-core:35079]') do
+ parser.__send__(:initialize, "{}")
+ end
+ parser = JSON::Ext::Parser.allocate
+ assert_raise(TypeError, '[ruby-core:35079]') { parser.source }
+ end
+ end
+
+ if EnvUtil.gc_stress_to_class?
+ def assert_no_memory_leak(code, *rest, **opt)
+ code = "8.times {20_000.times {begin #{code}; rescue NoMemoryError; end}; GC.start}"
+ super(["-rjson/ext/parser"],
+ "GC.add_stress_to_class(JSON::Ext::Parser); "\
+ "#{code}", code, *rest, rss: true, limit: 1.1, **opt)
+ end
+
+ def test_no_memory_leak_allocate
+ assert_no_memory_leak("JSON::Ext::Parser.allocate")
+ end
+ end
+end
diff --git a/test/json/test_json_fixtures.rb b/test/json/test_json_fixtures.rb
index e192706d6b..59bcb12637 100644
--- a/test/json/test_json_fixtures.rb
+++ b/test/json/test_json_fixtures.rb
@@ -1,13 +1,9 @@
-#!/usr/bin/env ruby
-# encoding: utf-8
# frozen_string_literal: false
-
-require 'test/unit'
-require File.join(File.dirname(__FILE__), 'setup_variant')
+require 'test_helper'
class TestJSONFixtures < Test::Unit::TestCase
def setup
- fixtures = File.join(File.dirname(__FILE__), 'fixtures/*.json')
+ fixtures = File.join(File.dirname(__FILE__), 'fixtures/{fail,pass}.json')
passed, failed = Dir[fixtures].partition { |f| f['pass'] }
@passed = passed.inject([]) { |a, f| a << [ f, File.read(f) ] }.sort
@failed = failed.inject([]) { |a, f| a << [ f, File.read(f) ] }.sort
diff --git a/test/json/test_json_generate.rb b/test/json/test_json_generator.rb
index e5ae3f4987..05235b39db 100644
--- a/test/json/test_json_generate.rb
+++ b/test/json/test_json_generator.rb
@@ -2,10 +2,9 @@
# encoding: utf-8
# frozen_string_literal: false
-require 'test/unit'
-require File.join(File.dirname(__FILE__), 'setup_variant')
+require 'test_helper'
-class TestJSONGenerate < Test::Unit::TestCase
+class TestJSONGenerator < Test::Unit::TestCase
include JSON
def setup
@@ -43,23 +42,23 @@ EOT
def test_generate
json = generate(@hash)
- assert_equal(JSON.parse(@json2), JSON.parse(json))
+ assert_equal(parse(@json2), parse(json))
json = JSON[@hash]
- assert_equal(JSON.parse(@json2), JSON.parse(json))
+ assert_equal(parse(@json2), parse(json))
parsed_json = parse(json)
assert_equal(@hash, parsed_json)
json = generate({1=>2})
assert_equal('{"1":2}', json)
parsed_json = parse(json)
assert_equal({"1"=>2}, parsed_json)
- assert_raise(GeneratorError) { generate(666) }
- assert_equal '666', generate(666, :quirks_mode => true)
+ assert_equal '666', generate(666)
end
def test_generate_pretty
json = pretty_generate(@hash)
- # hashes aren't (insertion) ordered on every ruby implementation assert_equal(@json3, json)
- assert_equal(JSON.parse(@json3), JSON.parse(json))
+ # hashes aren't (insertion) ordered on every ruby implementation
+ # assert_equal(@json3, json)
+ assert_equal(parse(@json3), parse(json))
parsed_json = parse(json)
assert_equal(@hash, parsed_json)
json = pretty_generate({1=>2})
@@ -70,8 +69,7 @@ EOT
EOT
parsed_json = parse(json)
assert_equal({"1"=>2}, parsed_json)
- assert_raise(GeneratorError) { pretty_generate(666) }
- assert_equal '666', pretty_generate(666, :quirks_mode => true)
+ assert_equal '666', pretty_generate(666)
end
def test_generate_custom
@@ -89,30 +87,26 @@ EOT
def test_fast_generate
json = fast_generate(@hash)
- assert_equal(JSON.parse(@json2), JSON.parse(json))
+ assert_equal(parse(@json2), parse(json))
parsed_json = parse(json)
assert_equal(@hash, parsed_json)
json = fast_generate({1=>2})
assert_equal('{"1":2}', json)
parsed_json = parse(json)
assert_equal({"1"=>2}, parsed_json)
- assert_raise(GeneratorError) { fast_generate(666) }
- assert_equal '666', fast_generate(666, :quirks_mode => true)
+ assert_equal '666', fast_generate(666)
end
def test_own_state
state = State.new
json = generate(@hash, state)
- assert_equal(JSON.parse(@json2), JSON.parse(json))
+ assert_equal(parse(@json2), parse(json))
parsed_json = parse(json)
assert_equal(@hash, parsed_json)
json = generate({1=>2}, state)
assert_equal('{"1":2}', json)
parsed_json = parse(json)
assert_equal({"1"=>2}, parsed_json)
- assert_raise(GeneratorError) { generate(666, state) }
- state.quirks_mode = true
- assert state.quirks_mode?
assert_equal '666', generate(666, state)
end
@@ -141,7 +135,6 @@ EOT
:array_nl => "\n",
:ascii_only => false,
:buffer_initial_length => 1024,
- :quirks_mode => false,
:depth => 0,
:indent => " ",
:max_nesting => 100,
@@ -158,7 +151,6 @@ EOT
:array_nl => "",
:ascii_only => false,
:buffer_initial_length => 1024,
- :quirks_mode => false,
:depth => 0,
:indent => "",
:max_nesting => 100,
@@ -175,7 +167,6 @@ EOT
:array_nl => "",
:ascii_only => false,
:buffer_initial_length => 1024,
- :quirks_mode => false,
:depth => 0,
:indent => "",
:max_nesting => 0,
@@ -206,7 +197,7 @@ EOT
def test_depth
ary = []; ary << ary
assert_equal 0, JSON::SAFE_STATE_PROTOTYPE.depth
- assert_raise(JSON::NestingError) { JSON.generate(ary) }
+ assert_raise(JSON::NestingError) { generate(ary) }
assert_equal 0, JSON::SAFE_STATE_PROTOTYPE.depth
assert_equal 0, JSON::PRETTY_STATE_PROTOTYPE.depth
assert_raise(JSON::NestingError) { JSON.pretty_generate(ary) }
@@ -286,7 +277,7 @@ EOT
if defined?(JSON::Ext::Generator)
def test_broken_bignum # [ruby-core:38867]
pid = fork do
- Integer.class_eval do
+ Bignum.class_eval do
def to_s
end
end
@@ -332,17 +323,54 @@ EOT
def test_json_generate
assert_raise JSON::GeneratorError do
- assert_equal true, JSON.generate(["\xea"])
+ assert_equal true, generate(["\xea"])
end
end
+ def test_nesting
+ too_deep = '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'
+ too_deep_ary = eval too_deep
+ assert_raise(JSON::NestingError) { generate too_deep_ary }
+ assert_raise(JSON::NestingError) { generate too_deep_ary, :max_nesting => 100 }
+ ok = generate too_deep_ary, :max_nesting => 101
+ assert_equal too_deep, ok
+ ok = generate too_deep_ary, :max_nesting => nil
+ assert_equal too_deep, ok
+ ok = generate too_deep_ary, :max_nesting => false
+ assert_equal too_deep, ok
+ ok = generate too_deep_ary, :max_nesting => 0
+ assert_equal too_deep, ok
+ end
+
+ def test_backslash
+ data = [ '\\.(?i:gif|jpe?g|png)$' ]
+ json = '["\\\\.(?i:gif|jpe?g|png)$"]'
+ assert_equal json, generate(data)
+ #
+ data = [ '\\"' ]
+ json = '["\\\\\""]'
+ assert_equal json, generate(data)
+ #
+ data = [ '/' ]
+ json = '["/"]'
+ assert_equal json, generate(data)
+ #
+ data = ['"']
+ json = '["\""]'
+ assert_equal json, generate(data)
+ #
+ data = ["'"]
+ json = '["\\\'"]'
+ assert_equal '["\'"]', generate(data)
+ end
+
def test_string_subclass
s = Class.new(String) do
def to_s; self; end
undef to_json
end
assert_nothing_raised(SystemStackError) do
- assert_equal '[""]', JSON.generate([s.new])
+ assert_equal '["foo"]', JSON.generate([s.new('foo')])
end
end
diff --git a/test/json/test_json_generic_object.rb b/test/json/test_json_generic_object.rb
index e04e1a1cb3..a3fd6b860a 100644
--- a/test/json/test_json_generic_object.rb
+++ b/test/json/test_json_generic_object.rb
@@ -1,9 +1,6 @@
-#!/usr/bin/env ruby
-# encoding: utf-8
# frozen_string_literal: false
+require 'test_helper'
-require 'test/unit'
-require File.join(File.dirname(__FILE__), 'setup_variant')
class TestJSONGenericObject < Test::Unit::TestCase
include JSON
@@ -27,11 +24,20 @@ class TestJSONGenericObject < Test::Unit::TestCase
end
def test_parse_json
- assert_kind_of Hash, JSON('{ "json_class": "JSON::GenericObject", "a": 1, "b": 2 }', :create_additions => true)
+ assert_kind_of Hash,
+ JSON(
+ '{ "json_class": "JSON::GenericObject", "a": 1, "b": 2 }',
+ :create_additions => true
+ )
switch_json_creatable do
- assert_equal @go, l = JSON('{ "json_class": "JSON::GenericObject", "a": 1, "b": 2 }', :create_additions => true)
+ assert_equal @go, l =
+ JSON(
+ '{ "json_class": "JSON::GenericObject", "a": 1, "b": 2 }',
+ :create_additions => true
+ )
assert_equal 1, l.a
- assert_equal @go, l = JSON('{ "a": 1, "b": 2 }', :object_class => GenericObject)
+ assert_equal @go,
+ l = JSON('{ "a": 1, "b": 2 }', :object_class => GenericObject)
assert_equal 1, l.a
assert_equal GenericObject[:a => GenericObject[:b => 2]],
l = JSON('{ "a": { "b": 2 } }', :object_class => GenericObject)
diff --git a/test/json/test_json_parser.rb b/test/json/test_json_parser.rb
new file mode 100644
index 0000000000..98193bfbf7
--- /dev/null
+++ b/test/json/test_json_parser.rb
@@ -0,0 +1,448 @@
+# encoding: utf-8
+# frozen_string_literal: false
+require 'test_helper'
+require 'stringio'
+require 'tempfile'
+require 'ostruct'
+
+class TestJSONParser < Test::Unit::TestCase
+ include JSON
+
+ def test_construction
+ parser = JSON::Parser.new('test')
+ assert_equal 'test', parser.source
+ end
+
+ def test_argument_encoding
+ source = "{}".encode("UTF-16")
+ JSON::Parser.new(source)
+ assert_equal Encoding::UTF_16, source.encoding
+ end if defined?(Encoding::UTF_16)
+
+ def test_error_message_encoding
+ bug10705 = '[ruby-core:67386] [Bug #10705]'
+ json = ".\"\xE2\x88\x9A\"".force_encoding(Encoding::UTF_8)
+ e = assert_raise(JSON::ParserError) {
+ JSON::Ext::Parser.new(json).parse
+ }
+ assert_equal(Encoding::UTF_8, e.message.encoding, bug10705)
+ assert_include(e.message, json, bug10705)
+ end if defined?(Encoding::UTF_8) and defined?(JSON::Ext::Parser)
+
+ def test_parsing
+ parser = JSON::Parser.new('"test"')
+ assert_equal 'test', parser.parse
+ end
+
+ def test_parser_reset
+ parser = Parser.new('{"a":"b"}')
+ assert_equal({ 'a' => 'b' }, parser.parse)
+ assert_equal({ 'a' => 'b' }, parser.parse)
+ end
+
+ def test_parse_simple_arrays
+ assert_equal([], parse('[]'))
+ assert_equal([], parse(' [ ] '))
+ assert_equal([ nil ], parse('[null]'))
+ assert_equal([ false ], parse('[false]'))
+ assert_equal([ true ], parse('[true]'))
+ assert_equal([ -23 ], parse('[-23]'))
+ assert_equal([ 23 ], parse('[23]'))
+ assert_equal_float([ 0.23 ], parse('[0.23]'))
+ assert_equal_float([ 0.0 ], parse('[0e0]'))
+ assert_equal([""], parse('[""]'))
+ assert_equal(["foobar"], parse('["foobar"]'))
+ assert_equal([{}], parse('[{}]'))
+ end
+
+ def test_parse_simple_objects
+ assert_equal({}, parse('{}'))
+ assert_equal({}, parse(' { } '))
+ assert_equal({ "a" => nil }, parse('{ "a" : null}'))
+ assert_equal({ "a" => nil }, parse('{"a":null}'))
+ assert_equal({ "a" => false }, parse('{ "a" : false } '))
+ assert_equal({ "a" => false }, parse('{"a":false}'))
+ assert_raise(JSON::ParserError) { parse('{false}') }
+ assert_equal({ "a" => true }, parse('{"a":true}'))
+ assert_equal({ "a" => true }, parse(' { "a" : true } '))
+ assert_equal({ "a" => -23 }, parse(' { "a" : -23 } '))
+ assert_equal({ "a" => -23 }, parse(' { "a" : -23 } '))
+ assert_equal({ "a" => 23 }, parse('{"a":23 } '))
+ assert_equal({ "a" => 23 }, parse(' { "a" : 23 } '))
+ assert_equal({ "a" => 0.23 }, parse(' { "a" : 0.23 } '))
+ assert_equal({ "a" => 0.23 }, parse(' { "a" : 0.23 } '))
+ end
+
+ def test_parse_numbers
+ assert_raise(JSON::ParserError) { parse('+23.2') }
+ assert_raise(JSON::ParserError) { parse('+23') }
+ assert_raise(JSON::ParserError) { parse('.23') }
+ assert_raise(JSON::ParserError) { parse('023') }
+ assert_equal 23, parse('23')
+ assert_equal -23, parse('-23')
+ assert_equal_float 3.141, parse('3.141')
+ assert_equal_float -3.141, parse('-3.141')
+ assert_equal_float 3.141, parse('3141e-3')
+ assert_equal_float 3.141, parse('3141.1e-3')
+ assert_equal_float 3.141, parse('3141E-3')
+ assert_equal_float 3.141, parse('3141.0E-3')
+ assert_equal_float -3.141, parse('-3141.0e-3')
+ assert_equal_float -3.141, parse('-3141e-3')
+ assert_raise(ParserError) { parse('NaN') }
+ assert parse('NaN', :allow_nan => true).nan?
+ assert_raise(ParserError) { parse('Infinity') }
+ assert_equal 1.0/0, parse('Infinity', :allow_nan => true)
+ assert_raise(ParserError) { parse('-Infinity') }
+ assert_equal -1.0/0, parse('-Infinity', :allow_nan => true)
+ end
+
+ if Array.method_defined?(:permutation)
+ def test_parse_more_complex_arrays
+ a = [ nil, false, true, "foßbar", [ "n€st€d", true ], { "nested" => true, "n€ßt€ð2" => {} }]
+ a.permutation.each do |perm|
+ json = pretty_generate(perm)
+ assert_equal perm, parse(json)
+ end
+ end
+
+ def test_parse_complex_objects
+ a = [ nil, false, true, "foßbar", [ "n€st€d", true ], { "nested" => true, "n€ßt€ð2" => {} }]
+ a.permutation.each do |perm|
+ s = "a"
+ orig_obj = perm.inject({}) { |h, x| h[s.dup] = x; s = s.succ; h }
+ json = pretty_generate(orig_obj)
+ assert_equal orig_obj, parse(json)
+ end
+ end
+ end
+
+ def test_parse_arrays
+ assert_equal([1,2,3], parse('[1,2,3]'))
+ assert_equal([1.2,2,3], parse('[1.2,2,3]'))
+ assert_equal([[],[[],[]]], parse('[[],[[],[]]]'))
+ assert_equal([], parse('[]'))
+ assert_equal([], parse(' [ ] '))
+ assert_equal([1], parse('[1]'))
+ assert_equal([1], parse(' [ 1 ] '))
+ ary = [[1], ["foo"], [3.14], [4711.0], [2.718], [nil],
+ [[1, -2, 3]], [false], [true]]
+ assert_equal(ary,
+ parse('[[1],["foo"],[3.14],[47.11e+2],[2718.0E-3],[null],[[1,-2,3]],[false],[true]]'))
+ assert_equal(ary, parse(%Q{ [ [1] , ["foo"] , [3.14] \t , [47.11e+2]\s
+ , [2718.0E-3 ],\r[ null] , [[1, -2, 3 ]], [false ],[ true]\n ] }))
+ end
+
+ def test_parse_json_primitive_values
+ assert_raise(JSON::ParserError) { parse('') }
+ assert_raise(TypeError) { parse(nil) }
+ assert_raise(JSON::ParserError) { parse(' /* foo */ ') }
+ assert_equal nil, parse('null')
+ assert_equal false, parse('false')
+ assert_equal true, parse('true')
+ assert_equal 23, parse('23')
+ assert_equal 1, parse('1')
+ assert_equal_float 3.141, parse('3.141'), 1E-3
+ assert_equal 2 ** 64, parse('18446744073709551616')
+ assert_equal 'foo', parse('"foo"')
+ assert parse('NaN', :allow_nan => true).nan?
+ assert parse('Infinity', :allow_nan => true).infinite?
+ assert parse('-Infinity', :allow_nan => true).infinite?
+ assert_raise(JSON::ParserError) { parse('[ 1, ]') }
+ end
+
+ def test_parse_some_strings
+ assert_equal([""], parse('[""]'))
+ assert_equal(["\\"], parse('["\\\\"]'))
+ assert_equal(['"'], parse('["\""]'))
+ assert_equal(['\\"\\'], parse('["\\\\\\"\\\\"]'))
+ assert_equal(
+ ["\"\b\n\r\t\0\037"],
+ parse('["\"\b\n\r\t\u0000\u001f"]')
+ )
+ end
+
+ def test_parse_big_integers
+ json1 = JSON(orig = (1 << 31) - 1)
+ assert_equal orig, parse(json1)
+ json2 = JSON(orig = 1 << 31)
+ assert_equal orig, parse(json2)
+ json3 = JSON(orig = (1 << 62) - 1)
+ assert_equal orig, parse(json3)
+ json4 = JSON(orig = 1 << 62)
+ assert_equal orig, parse(json4)
+ json5 = JSON(orig = 1 << 64)
+ assert_equal orig, parse(json5)
+ end
+
+ def test_some_wrong_inputs
+ assert_raise(ParserError) { parse('[] bla') }
+ assert_raise(ParserError) { parse('[] 1') }
+ assert_raise(ParserError) { parse('[] []') }
+ assert_raise(ParserError) { parse('[] {}') }
+ assert_raise(ParserError) { parse('{} []') }
+ assert_raise(ParserError) { parse('{} {}') }
+ assert_raise(ParserError) { parse('[NULL]') }
+ assert_raise(ParserError) { parse('[FALSE]') }
+ assert_raise(ParserError) { parse('[TRUE]') }
+ assert_raise(ParserError) { parse('[07] ') }
+ assert_raise(ParserError) { parse('[0a]') }
+ assert_raise(ParserError) { parse('[1.]') }
+ assert_raise(ParserError) { parse(' ') }
+ end
+
+ def test_symbolize_names
+ assert_equal({ "foo" => "bar", "baz" => "quux" },
+ parse('{"foo":"bar", "baz":"quux"}'))
+ assert_equal({ :foo => "bar", :baz => "quux" },
+ parse('{"foo":"bar", "baz":"quux"}', :symbolize_names => true))
+ assert_raise(ArgumentError) do
+ parse('{}', :symbolize_names => true, :create_additions => true)
+ end
+ end
+
+ def test_parse_comments
+ json = <<EOT
+{
+ "key1":"value1", // eol comment
+ "key2":"value2" /* multi line
+ * comment */,
+ "key3":"value3" /* multi line
+ // nested eol comment
+ * comment */
+}
+EOT
+ assert_equal(
+ { "key1" => "value1", "key2" => "value2", "key3" => "value3" },
+ parse(json))
+ json = <<EOT
+{
+ "key1":"value1" /* multi line
+ // nested eol comment
+ /* illegal nested multi line comment */
+ * comment */
+}
+EOT
+ assert_raise(ParserError) { parse(json) }
+ json = <<EOT
+{
+ "key1":"value1" /* multi line
+ // nested eol comment
+ closed multi comment */
+ and again, throw an Error */
+}
+EOT
+ assert_raise(ParserError) { parse(json) }
+ json = <<EOT
+{
+ "key1":"value1" /*/*/
+}
+EOT
+ assert_equal({ "key1" => "value1" }, parse(json))
+ end
+
+ def test_nesting
+ too_deep = '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'
+ too_deep_ary = eval too_deep
+ assert_raise(JSON::NestingError) { parse too_deep }
+ assert_raise(JSON::NestingError) { parse too_deep, :max_nesting => 100 }
+ ok = parse too_deep, :max_nesting => 101
+ assert_equal too_deep_ary, ok
+ ok = parse too_deep, :max_nesting => nil
+ assert_equal too_deep_ary, ok
+ ok = parse too_deep, :max_nesting => false
+ assert_equal too_deep_ary, ok
+ ok = parse too_deep, :max_nesting => 0
+ assert_equal too_deep_ary, ok
+ end
+
+ def test_backslash
+ data = [ '\\.(?i:gif|jpe?g|png)$' ]
+ json = '["\\\\.(?i:gif|jpe?g|png)$"]'
+ assert_equal data, parse(json)
+ #
+ data = [ '\\"' ]
+ json = '["\\\\\""]'
+ assert_equal data, parse(json)
+ #
+ json = '["/"]'
+ data = [ '/' ]
+ assert_equal data, parse(json)
+ #
+ json = '["\""]'
+ data = ['"']
+ assert_equal data, parse(json)
+ #
+ json = '["\\\'"]'
+ data = ["'"]
+ assert_equal data, parse(json)
+ end
+
+
+ class SubArray < Array
+ def <<(v)
+ @shifted = true
+ super
+ end
+
+ def shifted?
+ @shifted
+ end
+ end
+
+ class SubArray2 < Array
+ def to_json(*a)
+ {
+ JSON.create_id => self.class.name,
+ 'ary' => to_a,
+ }.to_json(*a)
+ end
+
+ def self.json_create(o)
+ o.delete JSON.create_id
+ o['ary']
+ end
+ end
+
+ class SubArrayWrapper
+ def initialize
+ @data = []
+ end
+
+ attr_reader :data
+
+ def [](index)
+ @data[index]
+ end
+
+ def <<(value)
+ @data << value
+ @shifted = true
+ end
+
+ def shifted?
+ @shifted
+ end
+ end
+
+ def test_parse_array_custom_array_derived_class
+ res = parse('[1,2]', :array_class => SubArray)
+ assert_equal([1,2], res)
+ assert_equal(SubArray, res.class)
+ assert res.shifted?
+ end
+
+ def test_parse_array_custom_non_array_derived_class
+ res = parse('[1,2]', :array_class => SubArrayWrapper)
+ assert_equal([1,2], res.data)
+ assert_equal(SubArrayWrapper, res.class)
+ assert res.shifted?
+ end
+
+ def test_parse_object
+ assert_equal({}, parse('{}'))
+ assert_equal({}, parse(' { } '))
+ assert_equal({'foo'=>'bar'}, parse('{"foo":"bar"}'))
+ assert_equal({'foo'=>'bar'}, parse(' { "foo" : "bar" } '))
+ end
+
+ class SubHash < Hash
+ def []=(k, v)
+ @item_set = true
+ super
+ end
+
+ def item_set?
+ @item_set
+ end
+ end
+
+ class SubHash2 < Hash
+ def to_json(*a)
+ {
+ JSON.create_id => self.class.name,
+ }.merge(self).to_json(*a)
+ end
+
+ def self.json_create(o)
+ o.delete JSON.create_id
+ self[o]
+ end
+ end
+
+ class SubOpenStruct < OpenStruct
+ def [](k)
+ __send__(k)
+ end
+
+ def []=(k, v)
+ @item_set = true
+ __send__("#{k}=", v)
+ end
+
+ def item_set?
+ @item_set
+ end
+ end
+
+ def test_parse_object_custom_hash_derived_class
+ res = parse('{"foo":"bar"}', :object_class => SubHash)
+ assert_equal({"foo" => "bar"}, res)
+ assert_equal(SubHash, res.class)
+ assert res.item_set?
+ end
+
+ def test_parse_object_custom_non_hash_derived_class
+ res = parse('{"foo":"bar"}', :object_class => SubOpenStruct)
+ assert_equal "bar", res.foo
+ assert_equal(SubOpenStruct, res.class)
+ assert res.item_set?
+ end
+
+ def test_parse_generic_object
+ res = parse(
+ '{"foo":"bar", "baz":{}}',
+ :object_class => JSON::GenericObject
+ )
+ assert_equal(JSON::GenericObject, res.class)
+ assert_equal "bar", res.foo
+ assert_equal "bar", res["foo"]
+ assert_equal "bar", res[:foo]
+ assert_equal "bar", res.to_hash[:foo]
+ assert_equal(JSON::GenericObject, res.baz.class)
+ end
+
+ def test_generate_core_subclasses_with_new_to_json
+ obj = SubHash2["foo" => SubHash2["bar" => true]]
+ obj_json = JSON(obj)
+ obj_again = parse(obj_json, :create_additions => true)
+ assert_kind_of SubHash2, obj_again
+ assert_kind_of SubHash2, obj_again['foo']
+ assert obj_again['foo']['bar']
+ assert_equal obj, obj_again
+ assert_equal ["foo"],
+ JSON(JSON(SubArray2["foo"]), :create_additions => true)
+ end
+
+ def test_generate_core_subclasses_with_default_to_json
+ assert_equal '{"foo":"bar"}', JSON(SubHash["foo" => "bar"])
+ assert_equal '["foo"]', JSON(SubArray["foo"])
+ end
+
+ def test_generate_of_core_subclasses
+ obj = SubHash["foo" => SubHash["bar" => true]]
+ obj_json = JSON(obj)
+ obj_again = JSON(obj_json)
+ assert_kind_of Hash, obj_again
+ assert_kind_of Hash, obj_again['foo']
+ assert obj_again['foo']['bar']
+ assert_equal obj, obj_again
+ end
+
+ private
+
+ def assert_equal_float(expected, actual, delta = 1e-2)
+ Array === expected and expected = expected.first
+ Array === actual and actual = actual.first
+ assert_in_delta(expected, actual, delta)
+ end
+end
diff --git a/test/json/test_json_string_matching.rb b/test/json/test_json_string_matching.rb
index 6158231103..530e3644fa 100644
--- a/test/json/test_json_string_matching.rb
+++ b/test/json/test_json_string_matching.rb
@@ -1,10 +1,5 @@
-#!/usr/bin/env ruby
-# encoding: utf-8
# frozen_string_literal: false
-
-require 'test/unit'
-require File.join(File.dirname(__FILE__), 'setup_variant')
-require 'stringio'
+require 'test_helper'
require 'time'
class TestJSONStringMatching < Test::Unit::TestCase
@@ -27,14 +22,17 @@ class TestJSONStringMatching < Test::Unit::TestCase
def test_match_date
t = TestTime.new
t_json = [ t ].to_json
+ time_regexp = /\A\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{4}\z/
assert_equal [ t ],
- JSON.parse(t_json, :create_additions => true,
- :match_string => { /\A\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{4}\z/ => TestTime })
- assert_equal [ t.strftime('%FT%T%z') ],
- JSON.parse(t_json, :create_additions => true,
- :match_string => { /\A\d{3}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{4}\z/ => TestTime })
+ parse(
+ t_json,
+ :create_additions => true,
+ :match_string => { time_regexp => TestTime }
+ )
assert_equal [ t.strftime('%FT%T%z') ],
- JSON.parse(t_json,
- :match_string => { /\A\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{4}\z/ => TestTime })
+ parse(
+ t_json,
+ :match_string => { time_regexp => TestTime }
+ )
end
end
diff --git a/test/json/test_json_unicode.rb b/test/json/test_json_unicode.rb
deleted file mode 100644
index 16234f0491..0000000000
--- a/test/json/test_json_unicode.rb
+++ /dev/null
@@ -1,73 +0,0 @@
-#!/usr/bin/env ruby
-# encoding: utf-8
-# frozen_string_literal: false
-
-require 'test/unit'
-require File.join(File.dirname(__FILE__), 'setup_variant')
-
-class TestJSONUnicode < Test::Unit::TestCase
- include JSON
-
- def test_unicode
- assert_equal '""', ''.to_json
- assert_equal '"\\b"', "\b".to_json
- assert_equal '"\u0001"', 0x1.chr.to_json
- assert_equal '"\u001f"', 0x1f.chr.to_json
- assert_equal '" "', ' '.to_json
- assert_equal "\"#{0x7f.chr}\"", 0x7f.chr.to_json
- utf8 = [ "© ≠ €! \01" ]
- json = '["© ≠ €! \u0001"]'
- assert_equal json, utf8.to_json(:ascii_only => false)
- assert_equal utf8, parse(json)
- json = '["\u00a9 \u2260 \u20ac! \u0001"]'
- assert_equal json, utf8.to_json(:ascii_only => true)
- assert_equal utf8, parse(json)
- utf8 = ["\343\201\202\343\201\204\343\201\206\343\201\210\343\201\212"]
- json = "[\"\343\201\202\343\201\204\343\201\206\343\201\210\343\201\212\"]"
- assert_equal utf8, parse(json)
- assert_equal json, utf8.to_json(:ascii_only => false)
- utf8 = ["\343\201\202\343\201\204\343\201\206\343\201\210\343\201\212"]
- assert_equal utf8, parse(json)
- json = "[\"\\u3042\\u3044\\u3046\\u3048\\u304a\"]"
- assert_equal json, utf8.to_json(:ascii_only => true)
- assert_equal utf8, parse(json)
- utf8 = ['საქართველო']
- json = '["საქართველო"]'
- assert_equal json, utf8.to_json(:ascii_only => false)
- json = "[\"\\u10e1\\u10d0\\u10e5\\u10d0\\u10e0\\u10d7\\u10d5\\u10d4\\u10da\\u10dd\"]"
- assert_equal json, utf8.to_json(:ascii_only => true)
- assert_equal utf8, parse(json)
- assert_equal '["Ã"]', JSON.generate(["Ã"], :ascii_only => false)
- assert_equal '["\\u00c3"]', JSON.generate(["Ã"], :ascii_only => true)
- assert_equal ["€"], JSON.parse('["\u20ac"]')
- utf8 = ["\xf0\xa0\x80\x81"]
- json = "[\"\xf0\xa0\x80\x81\"]"
- assert_equal json, JSON.generate(utf8, :ascii_only => false)
- assert_equal utf8, JSON.parse(json)
- json = '["\ud840\udc01"]'
- assert_equal json, JSON.generate(utf8, :ascii_only => true)
- assert_equal utf8, JSON.parse(json)
- end
-
- def test_chars
- (0..0x7f).each do |i|
- json = '["\u%04x"]' % i
- if RUBY_VERSION >= "1.9."
- i = i.chr
- end
- assert_equal i, JSON.parse(json).first[0]
- if i == ?\b
- generated = JSON.generate(["" << i])
- assert '["\b"]' == generated || '["\10"]' == generated
- elsif [?\n, ?\r, ?\t, ?\f].include?(i)
- assert_equal '[' << ('' << i).dump << ']', JSON.generate(["" << i])
- elsif i.chr < 0x20.chr
- assert_equal json, JSON.generate(["" << i])
- end
- end
- assert_raise(JSON::GeneratorError) do
- JSON.generate(["\x80"], :ascii_only => true)
- end
- assert_equal "\302\200", JSON.parse('["\u0080"]').first
- end
-end