summaryrefslogtreecommitdiff
path: root/test/json
diff options
context:
space:
mode:
Diffstat (limited to 'test/json')
-rw-r--r--test/json/fixtures/fail4.json1
-rw-r--r--test/json/fixtures/fail9.json1
-rw-r--r--test/json/json_common_interface_test.rb4
-rw-r--r--test/json/json_ext_parser_test.rb74
-rwxr-xr-xtest/json/json_generator_test.rb48
-rw-r--r--test/json/json_parser_test.rb92
-rw-r--r--test/json/test_helper.rb24
7 files changed, 158 insertions, 86 deletions
diff --git a/test/json/fixtures/fail4.json b/test/json/fixtures/fail4.json
deleted file mode 100644
index 9de168bf34..0000000000
--- a/test/json/fixtures/fail4.json
+++ /dev/null
@@ -1 +0,0 @@
-["extra comma",] \ No newline at end of file
diff --git a/test/json/fixtures/fail9.json b/test/json/fixtures/fail9.json
deleted file mode 100644
index 5815574f36..0000000000
--- a/test/json/fixtures/fail9.json
+++ /dev/null
@@ -1 +0,0 @@
-{"Extra comma": true,} \ No newline at end of file
diff --git a/test/json/json_common_interface_test.rb b/test/json/json_common_interface_test.rb
index e552412bfd..6165cc0411 100644
--- a/test/json/json_common_interface_test.rb
+++ b/test/json/json_common_interface_test.rb
@@ -52,11 +52,11 @@ class JSONCommonInterfaceTest < Test::Unit::TestCase
end
def test_generator
- assert_match(/::Generator\z/, JSON.generator.name)
+ assert_match(/::(TruffleRuby)?Generator\z/, JSON.generator.name)
end
def test_state
- assert_match(/::Generator::State\z/, JSON.state.name)
+ assert_match(/::(TruffleRuby)?Generator::State\z/, JSON.state.name)
end
def test_create_id
diff --git a/test/json/json_ext_parser_test.rb b/test/json/json_ext_parser_test.rb
index 9db8ae772f..da61504989 100644
--- a/test/json/json_ext_parser_test.rb
+++ b/test/json/json_ext_parser_test.rb
@@ -2,53 +2,51 @@
require_relative 'test_helper'
class JSONExtParserTest < Test::Unit::TestCase
- if defined?(JSON::Ext::Parser)
- include JSON
-
- 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
+ include JSON
- def test_error_messages
- ex = assert_raise(ParserError) { parse('Infinity') }
- assert_equal "unexpected token at 'Infinity'", ex.message
+ 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
- unless RUBY_PLATFORM =~ /java/
- ex = assert_raise(ParserError) { parse('-Infinity') }
- assert_equal "unexpected token at '-Infinity'", ex.message
- end
+ def test_error_messages
+ ex = assert_raise(ParserError) { parse('Infinity') }
+ assert_equal "unexpected token at 'Infinity'", ex.message
- ex = assert_raise(ParserError) { parse('NaN') }
- assert_equal "unexpected token at 'NaN'", ex.message
+ unless RUBY_PLATFORM =~ /java/
+ ex = assert_raise(ParserError) { parse('-Infinity') }
+ assert_equal "unexpected token at '-Infinity'", ex.message
end
- if GC.respond_to?(:stress=)
- def test_gc_stress_parser_new
- payload = JSON.dump([{ foo: 1, bar: 2, baz: 3, egg: { spam: 4 } }] * 10)
-
- previous_stress = GC.stress
- JSON::Parser.new(payload).parse
- ensure
- GC.stress = previous_stress
- end
+ ex = assert_raise(ParserError) { parse('NaN') }
+ assert_equal "unexpected token at 'NaN'", ex.message
+ end
- def test_gc_stress
- payload = JSON.dump([{ foo: 1, bar: 2, baz: 3, egg: { spam: 4 } }] * 10)
+ if GC.respond_to?(:stress=)
+ def test_gc_stress_parser_new
+ payload = JSON.dump([{ foo: 1, bar: 2, baz: 3, egg: { spam: 4 } }] * 10)
- previous_stress = GC.stress
- JSON.parse(payload)
- ensure
- GC.stress = previous_stress
- end
+ previous_stress = GC.stress
+ JSON::Parser.new(payload).parse
+ ensure
+ GC.stress = previous_stress
end
- def parse(json)
- JSON::Ext::Parser.new(json).parse
+ def test_gc_stress
+ payload = JSON.dump([{ foo: 1, bar: 2, baz: 3, egg: { spam: 4 } }] * 10)
+
+ previous_stress = GC.stress
+ JSON.parse(payload)
+ ensure
+ GC.stress = previous_stress
end
end
+
+ def parse(json)
+ JSON::Ext::Parser.new(json).parse
+ end
end
diff --git a/test/json/json_generator_test.rb b/test/json/json_generator_test.rb
index 112c03b220..700220a152 100755
--- a/test/json/json_generator_test.rb
+++ b/test/json/json_generator_test.rb
@@ -343,27 +343,25 @@ class JSONGeneratorTest < Test::Unit::TestCase
assert_equal '2', state.indent
end
- if defined?(JSON::Ext::Generator)
- def test_broken_bignum # [ruby-core:38867]
- pid = fork do
- x = 1 << 64
- x.class.class_eval do
- def to_s
- end
- end
- begin
- JSON::Ext::Generator::State.new.generate(x)
- exit 1
- rescue TypeError
- exit 0
+ def test_broken_bignum # [ruby-core:38867]
+ pid = fork do
+ x = 1 << 64
+ x.class.class_eval do
+ def to_s
end
end
- _, status = Process.waitpid2(pid)
- assert status.success?
- rescue NotImplementedError
- # forking to avoid modifying core class of a parent process and
- # introducing race conditions of tests are run in parallel
+ begin
+ JSON::Ext::Generator::State.new.generate(x)
+ exit 1
+ rescue TypeError
+ exit 0
+ end
end
+ _, status = Process.waitpid2(pid)
+ assert status.success?
+ rescue NotImplementedError
+ # forking to avoid modifying core class of a parent process and
+ # introducing race conditions of tests are run in parallel
end
def test_hash_likeness_set_symbol
@@ -477,12 +475,20 @@ class JSONGeneratorTest < Test::Unit::TestCase
end
assert_includes error.message, "source sequence is illegal/malformed utf-8"
- assert_raise(Encoding::UndefinedConversionError) do
+ assert_raise(JSON::GeneratorError) do
+ JSON.dump("\x82\xAC\xEF".b)
+ end
+
+ assert_raise(JSON::GeneratorError) do
"\x82\xAC\xEF".b.to_json
end
- assert_raise(Encoding::UndefinedConversionError) do
- JSON.dump("\x82\xAC\xEF".b)
+ assert_raise(JSON::GeneratorError) do
+ ["\x82\xAC\xEF".b].to_json
+ end
+
+ assert_raise(JSON::GeneratorError) do
+ { foo: "\x82\xAC\xEF".b }.to_json
end
end
diff --git a/test/json/json_parser_test.rb b/test/json/json_parser_test.rb
index adff91674d..8759ccd262 100644
--- a/test/json/json_parser_test.rb
+++ b/test/json/json_parser_test.rb
@@ -40,7 +40,7 @@ class JSONParserTest < Test::Unit::TestCase
}
assert_equal(Encoding::UTF_8, e.message.encoding, bug10705)
assert_include(e.message, json, bug10705)
- end if defined?(JSON::Ext::Parser)
+ end
def test_parsing
parser = JSON::Parser.new('"test"')
@@ -180,7 +180,93 @@ class JSONParserTest < Test::Unit::TestCase
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_arrays_with_allow_trailing_comma
+ assert_equal([], parse('[]', allow_trailing_comma: true))
+ assert_equal([], parse('[]', allow_trailing_comma: false))
+ assert_raise(JSON::ParserError) { parse('[,]', allow_trailing_comma: true) }
+ assert_raise(JSON::ParserError) { parse('[,]', allow_trailing_comma: false) }
+
+ assert_equal([1], parse('[1]', allow_trailing_comma: true))
+ assert_equal([1], parse('[1]', allow_trailing_comma: false))
+ assert_equal([1], parse('[1,]', allow_trailing_comma: true))
+ assert_raise(JSON::ParserError) { parse('[1,]', allow_trailing_comma: false) }
+
+ assert_equal([1, 2, 3], parse('[1,2,3]', allow_trailing_comma: true))
+ assert_equal([1, 2, 3], parse('[1,2,3]', allow_trailing_comma: false))
+ assert_equal([1, 2, 3], parse('[1,2,3,]', allow_trailing_comma: true))
+ assert_raise(JSON::ParserError) { parse('[1,2,3,]', allow_trailing_comma: false) }
+
+ assert_equal([1, 2, 3], parse('[ 1 , 2 , 3 ]', allow_trailing_comma: true))
+ assert_equal([1, 2, 3], parse('[ 1 , 2 , 3 ]', allow_trailing_comma: false))
+ assert_equal([1, 2, 3], parse('[ 1 , 2 , 3 , ]', allow_trailing_comma: true))
+ assert_raise(JSON::ParserError) { parse('[ 1 , 2 , 3 , ]', allow_trailing_comma: false) }
+
+ assert_equal({'foo' => [1, 2, 3]}, parse('{ "foo": [1,2,3] }', allow_trailing_comma: true))
+ assert_equal({'foo' => [1, 2, 3]}, parse('{ "foo": [1,2,3] }', allow_trailing_comma: false))
+ assert_equal({'foo' => [1, 2, 3]}, parse('{ "foo": [1,2,3,] }', allow_trailing_comma: true))
+ assert_raise(JSON::ParserError) { parse('{ "foo": [1,2,3,] }', allow_trailing_comma: false) }
+ end
+
+ def test_parse_object_with_allow_trailing_comma
+ assert_equal({}, parse('{}', allow_trailing_comma: true))
+ assert_equal({}, parse('{}', allow_trailing_comma: false))
+ assert_raise(JSON::ParserError) { parse('{,}', allow_trailing_comma: true) }
+ assert_raise(JSON::ParserError) { parse('{,}', allow_trailing_comma: false) }
+
+ assert_equal({'foo'=>'bar'}, parse('{"foo":"bar"}', allow_trailing_comma: true))
+ assert_equal({'foo'=>'bar'}, parse('{"foo":"bar"}', allow_trailing_comma: false))
+ assert_equal({'foo'=>'bar'}, parse('{"foo":"bar",}', allow_trailing_comma: true))
+ assert_raise(JSON::ParserError) { parse('{"foo":"bar",}', allow_trailing_comma: false) }
+
+ assert_equal(
+ {'foo'=>'bar', 'baz'=>'qux', 'quux'=>'garply'},
+ parse('{"foo":"bar","baz":"qux","quux":"garply"}', allow_trailing_comma: true)
+ )
+ assert_equal(
+ {'foo'=>'bar', 'baz'=>'qux', 'quux'=>'garply'},
+ parse('{"foo":"bar","baz":"qux","quux":"garply"}', allow_trailing_comma: false)
+ )
+ assert_equal(
+ {'foo'=>'bar', 'baz'=>'qux', 'quux'=>'garply'},
+ parse('{"foo":"bar","baz":"qux","quux":"garply",}', allow_trailing_comma: true)
+ )
+ assert_raise(JSON::ParserError) {
+ parse('{"foo":"bar","baz":"qux","quux":"garply",}', allow_trailing_comma: false)
+ }
+
+ assert_equal(
+ {'foo'=>'bar', 'baz'=>'qux', 'quux'=>'garply'},
+ parse('{ "foo":"bar" , "baz":"qux" , "quux":"garply" }', allow_trailing_comma: true)
+ )
+ assert_equal(
+ {'foo'=>'bar', 'baz'=>'qux', 'quux'=>'garply'},
+ parse('{ "foo":"bar" , "baz":"qux" , "quux":"garply" }', allow_trailing_comma: false)
+ )
+ assert_equal(
+ {'foo'=>'bar', 'baz'=>'qux', 'quux'=>'garply'},
+ parse('{ "foo":"bar" , "baz":"qux" , "quux":"garply" , }', allow_trailing_comma: true)
+ )
+ assert_raise(JSON::ParserError) {
+ parse('{ "foo":"bar" , "baz":"qux" , "quux":"garply" , }', allow_trailing_comma: false)
+ }
+
+ assert_equal(
+ [{'foo'=>'bar', 'baz'=>'qux', 'quux'=>'garply'}],
+ parse('[{"foo":"bar","baz":"qux","quux":"garply"}]', allow_trailing_comma: true)
+ )
+ assert_equal(
+ [{'foo'=>'bar', 'baz'=>'qux', 'quux'=>'garply'}],
+ parse('[{"foo":"bar","baz":"qux","quux":"garply"}]', allow_trailing_comma: false)
+ )
+ assert_equal(
+ [{'foo'=>'bar', 'baz'=>'qux', 'quux'=>'garply'}],
+ parse('[{"foo":"bar","baz":"qux","quux":"garply",}]', allow_trailing_comma: true)
+ )
+ assert_raise(JSON::ParserError) {
+ parse('[{"foo":"bar","baz":"qux","quux":"garply",}]', allow_trailing_comma: false)
+ }
end
def test_parse_some_strings
@@ -533,7 +619,7 @@ class JSONParserTest < Test::Unit::TestCase
error = assert_raise(JSON::ParserError) do
JSON.parse('{"input":{"firstName":"Bob","lastName":"Mob","email":"[email protected]"}')
end
- if RUBY_ENGINE == "ruby" && defined?(JSON::Ext)
+ if RUBY_ENGINE == "ruby"
assert_equal %(unexpected token at '{"input":{"firstName":"Bob","las'), error.message
end
end
diff --git a/test/json/test_helper.rb b/test/json/test_helper.rb
index 6fcb76edf8..11bb8ba8c2 100644
--- a/test/json/test_helper.rb
+++ b/test/json/test_helper.rb
@@ -1,30 +1,14 @@
-case ENV['JSON']
-when 'pure'
- $LOAD_PATH.unshift(File.expand_path('../../../lib', __FILE__))
- $stderr.puts("Testing JSON::Pure")
- require 'json/pure'
-when 'ext'
- $stderr.puts("Testing JSON::Ext")
- $LOAD_PATH.unshift(File.expand_path('../../../ext', __FILE__), File.expand_path('../../../lib', __FILE__))
- require 'json/ext'
-else
- $LOAD_PATH.unshift(File.expand_path('../../../ext', __FILE__), File.expand_path('../../../lib', __FILE__))
- $stderr.puts("Testing JSON")
- require 'json'
-end
+$LOAD_PATH.unshift(File.expand_path('../../../ext', __FILE__), File.expand_path('../../../lib', __FILE__))
+require 'json'
require 'test/unit'
-begin
- require 'byebug'
-rescue LoadError
-end
if GC.respond_to?(:verify_compaction_references)
# This method was added in Ruby 3.0.0. Calling it this way asks the GC to
# move objects around, helping to find object movement bugs.
begin
- GC.verify_compaction_references(double_heap: true, toward: :empty)
- rescue NotImplementedError
+ GC.verify_compaction_references(expand_heap: true, toward: :empty)
+ rescue NotImplementedError, ArgumentError
# Some platforms don't support compaction
end
end