From f37e73cf44556b0c3fef4b9b47e5baf2181cba22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Barri=C3=A9?= Date: Mon, 8 Sep 2025 12:11:22 +0200 Subject: [PATCH 1/8] Enable test coverage when simplecov is available Co-authored-by: Jean Boussier --- Gemfile | 1 + test/json/test_helper.rb | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/Gemfile b/Gemfile index f93eed212..c02e4d494 100644 --- a/Gemfile +++ b/Gemfile @@ -10,6 +10,7 @@ group :development do gem "test-unit" gem "test-unit-ruby-core" gem "all_images", "~> 0" unless RUBY_PLATFORM =~ /java/ + gem "simplecov", require: false end group :release do diff --git a/test/json/test_helper.rb b/test/json/test_helper.rb index d849e28b9..cf592debf 100644 --- a/test/json/test_helper.rb +++ b/test/json/test_helper.rb @@ -1,5 +1,13 @@ $LOAD_PATH.unshift(File.expand_path('../../../ext', __FILE__), File.expand_path('../../../lib', __FILE__)) +begin + require 'simplecov' +rescue LoadError + # Don't fail Ruby's test suite +else + SimpleCov.start +end + require 'json' require 'test/unit' From 1397bf8cc9459859b0467128e13b5199575cc824 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Barri=C3=A9?= Date: Mon, 8 Sep 2025 12:14:14 +0200 Subject: [PATCH 2/8] Don't call json_create if json_creatable? returns false Fix f411ddf1ceaf1ea82c8470c94da522919a4fb3c9 Co-authored-by: Jean Boussier --- lib/json/common.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/json/common.rb b/lib/json/common.rb index ae9b787a0..1f82c4624 100644 --- a/lib/json/common.rb +++ b/lib/json/common.rb @@ -73,7 +73,7 @@ def create_additions_proc(opts) if opts[:create_additions] != false if class_name = object[JSON.create_id] klass = JSON.deep_const_get(class_name) - if (klass.respond_to?(:json_creatable?) && klass.json_creatable?) || klass.respond_to?(:json_create) + if klass.respond_to?(:json_creatable?) ? klass.json_creatable? : klass.respond_to?(:json_create) create_additions_warning if create_additions.nil? object = klass.json_create(object) end From 7a2a24d663887a765388b107f3ec9b4dab12413c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Barri=C3=A9?= Date: Mon, 8 Sep 2025 12:12:55 +0200 Subject: [PATCH 3/8] Fix JSON::GenericObject tests Co-authored-by: Jean Boussier --- test/json/json_generic_object_test.rb | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/test/json/json_generic_object_test.rb b/test/json/json_generic_object_test.rb index 471534192..333da7047 100644 --- a/test/json/json_generic_object_test.rb +++ b/test/json/json_generic_object_test.rb @@ -4,7 +4,7 @@ class JSONGenericObjectTest < Test::Unit::TestCase def setup - if defined?(GenericObject) + if defined?(JSON::GenericObject) @go = JSON::GenericObject[ :a => 1, :b => 2 ] else omit("JSON::GenericObject is not available") @@ -40,10 +40,10 @@ def test_parse_json ) assert_equal 1, l.a assert_equal @go, - l = JSON('{ "a": 1, "b": 2 }', :object_class => GenericObject) + l = JSON('{ "a": 1, "b": 2 }', :object_class => JSON::GenericObject) assert_equal 1, l.a - assert_equal GenericObject[:a => GenericObject[:b => 2]], - l = JSON('{ "a": { "b": 2 } }', :object_class => GenericObject) + assert_equal JSON::GenericObject[:a => JSON::GenericObject[:b => 2]], + l = JSON('{ "a": { "b": 2 } }', :object_class => JSON::GenericObject) assert_equal 2, l.a.b end end @@ -51,12 +51,12 @@ def test_parse_json def test_from_hash result = JSON::GenericObject.from_hash( :foo => { :bar => { :baz => true }, :quux => [ { :foobar => true } ] }) - assert_kind_of GenericObject, result.foo - assert_kind_of GenericObject, result.foo.bar + assert_kind_of JSON::GenericObject, result.foo + assert_kind_of JSON::GenericObject, result.foo.bar assert_equal true, result.foo.bar.baz - assert_kind_of GenericObject, result.foo.quux.first + assert_kind_of JSON::GenericObject, result.foo.quux.first assert_equal true, result.foo.quux.first.foobar - assert_equal true, GenericObject.from_hash(true) + assert_equal true, JSON::GenericObject.from_hash(true) end def test_json_generic_object_load From 2ec31a736375b5b1f63dc447c82a5e10034aa812 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Barri=C3=A9?= Date: Mon, 8 Sep 2025 12:17:24 +0200 Subject: [PATCH 4/8] Fix deprecation warning backtrace The gem root was including the test/ directory, so lines from tests were skipped, and the deprecation warnings were shown as coming from the test framework. Co-authored-by: Jean Boussier --- lib/json/common.rb | 2 +- test/json/json_parser_test.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/json/common.rb b/lib/json/common.rb index 1f82c4624..60178c2a5 100644 --- a/lib/json/common.rb +++ b/lib/json/common.rb @@ -97,7 +97,7 @@ def create_additions_warning class << self def deprecation_warning(message, uplevel = 3) # :nodoc: - gem_root = File.expand_path("../../../", __FILE__) + "/" + gem_root = File.expand_path("..", __dir__) + "/" caller_locations(uplevel, 10).each do |frame| if frame.path.nil? || frame.path.start_with?(gem_root) || frame.path.end_with?("/truffle/cext_ruby.rb", ".c") uplevel += 1 diff --git a/test/json/json_parser_test.rb b/test/json/json_parser_test.rb index 3c60fec87..45474c982 100644 --- a/test/json/json_parser_test.rb +++ b/test/json/json_parser_test.rb @@ -347,7 +347,7 @@ def test_parse_duplicate_key assert_equal expected_sym, parse('{"a": 1, "a": 2}', symbolize_names: true) end - if RUBY_ENGINE == 'RUBY_ENGINE' + if RUBY_ENGINE == 'ruby' assert_deprecated_warning(/#{File.basename(__FILE__)}\:#{__LINE__ + 1}/) do assert_equal expected, parse('{"a": 1, "a": 2}') end From efc61682eec8a19d9c21c381a703f5ae25ccd8b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Barri=C3=A9?= Date: Mon, 8 Sep 2025 14:50:18 +0200 Subject: [PATCH 5/8] Change invalid encoding test to use assert_raise Co-authored-by: Jean Boussier --- test/json/json_encoding_test.rb | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/test/json/json_encoding_test.rb b/test/json/json_encoding_test.rb index 873e96fdd..caf335d52 100644 --- a/test/json/json_encoding_test.rb +++ b/test/json/json_encoding_test.rb @@ -145,19 +145,11 @@ def test_very_large_json_strings end def test_invalid_utf8_sequences - # Create strings with invalid UTF-8 sequences invalid_utf8 = "\xFF\xFF" - - # Test that generating JSON with invalid UTF-8 raises an error - # Different JSON implementations may handle this differently, - # so we'll check if any exception is raised - begin + error = assert_raise(JSON::GeneratorError) do generate(invalid_utf8) - raise "Expected an exception when generating JSON with invalid UTF8" - rescue StandardError => e - assert true - assert_match(%r{source sequence is illegal/malformed utf-8}, e.message) end + assert_match(%r{source sequence is illegal/malformed utf-8}, error.message) end def test_surrogate_pair_handling From a9e05d6ff348360bb0fdba934c2580c95f875d9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Barri=C3=A9?= Date: Mon, 8 Sep 2025 15:22:21 +0200 Subject: [PATCH 6/8] Stop checking for String#@- Co-authored-by: Jean Boussier --- test/json/json_parser_test.rb | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/test/json/json_parser_test.rb b/test/json/json_parser_test.rb index 45474c982..2217f2b9e 100644 --- a/test/json/json_parser_test.rb +++ b/test/json/json_parser_test.rb @@ -397,10 +397,8 @@ def test_freeze assert_predicate parse('[]', :freeze => true), :frozen? assert_predicate parse('"foo"', :freeze => true), :frozen? - if string_deduplication_available? - assert_same(-'foo', parse('"foo"', :freeze => true)) - assert_same(-'foo', parse('{"foo": 1}', :freeze => true).keys.first) - end + assert_same(-'foo', parse('"foo"', :freeze => true)) + assert_same(-'foo', parse('{"foo": 1}', :freeze => true).keys.first) end def test_parse_comments @@ -794,16 +792,6 @@ def test_parse_leading_slash private - def string_deduplication_available? - r1 = rand.to_s - r2 = r1.dup - begin - (-r1).equal?(-r2) - rescue NoMethodError - false # No String#-@ - end - end - def assert_equal_float(expected, actual, delta = 1e-2) Array === expected and expected = expected.first Array === actual and actual = actual.first From 3232e8df4153edfa988b5e2189410d76a58d776c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Barri=C3=A9?= Date: Mon, 8 Sep 2025 15:26:25 +0200 Subject: [PATCH 7/8] Stop checking for OpenStruct#[] and #[]= Co-authored-by: Jean Boussier --- lib/json/generic_object.rb | 8 -------- 1 file changed, 8 deletions(-) diff --git a/lib/json/generic_object.rb b/lib/json/generic_object.rb index ec5aa9dcb..5c8ace354 100644 --- a/lib/json/generic_object.rb +++ b/lib/json/generic_object.rb @@ -52,14 +52,6 @@ def to_hash table end - def [](name) - __send__(name) - end unless method_defined?(:[]) - - def []=(name, value) - __send__("#{name}=", value) - end unless method_defined?(:[]=) - def |(other) self.class[other.to_hash.merge(to_hash)] end From bae760aa195bdc59006c76802bafcaea563ea6f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Barri=C3=A9?= Date: Mon, 8 Sep 2025 15:27:02 +0200 Subject: [PATCH 8/8] Improve test coverage Test SubArrayWrapper#[] and SubOpenStruct#[] Co-authored-by: Jean Boussier --- test/json/json_parser_test.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/json/json_parser_test.rb b/test/json/json_parser_test.rb index 2217f2b9e..a9b0624f6 100644 --- a/test/json/json_parser_test.rb +++ b/test/json/json_parser_test.rb @@ -635,6 +635,7 @@ def test_parse_array_custom_array_derived_class def test_parse_array_custom_non_array_derived_class res = parse('[1,2]', :array_class => SubArrayWrapper) assert_equal([1,2], res.data) + assert_equal(1, res[0]) assert_equal(SubArrayWrapper, res.class) assert res.shifted? end @@ -696,6 +697,7 @@ def item_set? def test_parse_object_custom_non_hash_derived_class res = parse('{"foo":"bar"}', :object_class => SubOpenStruct) assert_equal "bar", res.foo + assert_equal "bar", res[:foo] assert_equal(SubOpenStruct, res.class) assert res.item_set? end