@@ -1253,6 +1253,62 @@ def test_large_depth_raises
12531253 end
12541254 end
12551255
1256+ {
1257+ indent : ' ' , space : ' ' , space_before : ' ' , object_nl : "\n " , array_nl : "\n " ,
1258+ ascii_only : true , script_safe : true , allow_nan : true ,
1259+ } . each do |option , value |
1260+ define_method ( "test_rfc8785_rejects_#{ option } " ) do
1261+ options = { rfc8785 : true , option => value }
1262+ error = assert_raise ( ArgumentError ) { JSON . generate ( { 'a' => [ 1 ] } , options ) }
1263+ assert_equal "#{ option } cannot be used with rfc8785" , error . message
1264+ assert_raise ( ArgumentError ) { JSON . generate ( nil , options . to_a . reverse . to_h ) }
1265+ assert_raise ( ArgumentError ) { [ 1 ] . to_json ( options ) }
1266+ assert_raise ( ArgumentError ) { { 'a' => 1 } . to_json ( options ) }
1267+ assert_raise ( ArgumentError ) { JSON ::Coder . new ( **options ) . dump ( [ 1 ] ) }
1268+
1269+ state = JSON ::State . new ( option => value )
1270+ state . rfc8785 = true
1271+ io = StringIO . new
1272+ assert_raise ( ArgumentError ) { state . generate ( [ 1 ] , io ) }
1273+ assert_equal '' , io . string
1274+ assert_raise ( ArgumentError ) { [ 1 ] . to_json ( state ) }
1275+ assert_equal 0 , state . depth
1276+ assert_raise ( ArgumentError ) { state . freeze . generate ( [ 1 ] ) }
1277+ end
1278+ end
1279+
1280+ def test_rfc8785_accepts_disabled_options
1281+ options = { rfc8785 : true , indent : '' , space : '' , space_before : '' ,
1282+ object_nl : '' , array_nl : '' , ascii_only : false ,
1283+ script_safe : false , allow_nan : false }
1284+ assert_equal '["é/",1]' , JSON . generate ( [ 'é/' , 1 ] , options )
1285+ end
1286+
1287+ def test_rfc8785_rejects_pretty_generation
1288+ assert_raise ( ArgumentError ) { JSON . pretty_generate ( { 'a' => 1 } , rfc8785 : true ) }
1289+ end
1290+
1291+ def test_rfc8785_dump_disables_allow_nan_by_default
1292+ assert_equal '[1]' , JSON . dump ( [ 1 ] , rfc8785 : true )
1293+ [ Float ::NAN , Float ::INFINITY , -Float ::INFINITY ] . each do |number |
1294+ assert_raise ( JSON ::GeneratorError ) { JSON . dump ( [ number ] , rfc8785 : true ) }
1295+ end
1296+ assert_raise ( ArgumentError ) { JSON . dump ( [ 1 ] , rfc8785 : true , allow_nan : true ) }
1297+ end
1298+
1299+ def test_rfc8785_fragments
1300+ fragment = JSON ::Fragment . new ( '[1,2]' )
1301+ assert_rfc8785 '[1,2]' , fragment
1302+ assert_rfc8785 '[[1,2]]' , [ fragment ]
1303+ assert_rfc8785 '{"a":[1,2]}' , { 'a' => fragment }
1304+ assert_equal '[[1,2]]' , JSON . generate ( [ fragment ] , rfc8785 : true , max_nesting : false )
1305+ assert_equal '[1,2]' , JSON ::Coder . new ( rfc8785 : true ) . dump ( fragment )
1306+ assert_equal '[1,2]' , fragment . to_json ( rfc8785 : true )
1307+
1308+ # Fragment contents are the caller's responsibility and are inserted as is.
1309+ assert_rfc8785 '[1, 2]' , JSON ::Fragment . new ( '[1, 2]' )
1310+ end
1311+
12561312 def test_rfc8785_numbers
12571313 assert_rfc8785 '-9007199254740992' , -9007199254740992
12581314 assert_rfc8785 '0' , 0
0 commit comments