@@ -64,6 +64,54 @@ def test_json_coder_hash_key
6464 assert_equal "Integer not allowed as object key in JSON" , error . message
6565 end
6666
67+ def test_json_coder_rfc8785_converted_keys
68+ time = Time . utc ( 1999 )
69+ calls = [ ]
70+ coder = JSON ::Coder . new ( rfc8785 : true ) do |object , is_key |
71+ calls << [ object , is_key ]
72+ object . year . to_s
73+ end
74+ input = { time => 1 , '1999!' => 2 , Time . utc ( 2000 ) => 3 }
75+ assert_equal '{"1999":1,"1999!":2,"2000":3}' , coder . dump ( input )
76+ assert_equal [ [ time , true ] , [ Time . utc ( 2000 ) , true ] ] , calls
77+ assert_equal [ time , '1999!' , Time . utc ( 2000 ) ] , input . keys
78+ end
79+
80+ def test_json_coder_rfc8785_converted_key_validation
81+ object = Object . new
82+ coder = JSON ::Coder . new ( rfc8785 : true ) { 42 }
83+ error = assert_raise ( JSON ::GeneratorError ) { coder . dump ( object => 1 ) }
84+ assert_equal 'Integer not allowed as object key in JSON' , error . message
85+ assert_equal 42 , error . invalid_object
86+
87+ coder = JSON ::Coder . new ( rfc8785 : true ) { :a }
88+ assert_equal '{"a":1,"b":2}' , coder . dump ( 'b' => 2 , object => 1 )
89+
90+ invalid = "\xFF "
91+ calls = 0
92+ coder = JSON ::Coder . new ( rfc8785 : true ) { calls += 1 ; invalid }
93+ error = assert_raise ( JSON ::GeneratorError ) { coder . dump ( object => 1 ) }
94+ assert_same invalid , error . invalid_object
95+ assert_equal 1 , calls
96+ end
97+
98+ def test_json_coder_rfc8785_converted_key_collision
99+ coder = JSON ::Coder . new ( rfc8785 : true ) { 'a' }
100+ assert_raise ( JSON ::GeneratorError ) { coder . dump ( Object . new => 1 , 'a' => 2 ) }
101+ assert_raise ( JSON ::GeneratorError ) { coder . dump ( Object . new => 1 , Object . new => 2 ) }
102+ assert_raise ( JSON ::GeneratorError ) { coder . dump ( Object . new => 1 , :a => 2 ) }
103+ end
104+
105+ def test_json_coder_rfc8785_invalid_encoding_key
106+ calls = [ ]
107+ coder = JSON ::Coder . new ( rfc8785 : true ) do |object , is_key |
108+ calls << [ object , is_key ]
109+ 'a'
110+ end
111+ assert_equal '{"a":1,"b":2}' , coder . dump ( 'b' => 2 , "\xFF " => 1 )
112+ assert_equal [ [ "\xFF " , true ] ] , calls
113+ end
114+
67115 def test_json_coder_options
68116 coder = JSON ::Coder . new ( array_nl : "\n " ) do |object |
69117 42
0 commit comments