diff options
Diffstat (limited to 'test/psych')
| -rw-r--r-- | test/psych/helper.rb | 1 | ||||
| -rw-r--r-- | test/psych/test_data.rb | 93 | ||||
| -rw-r--r-- | test/psych/test_date_time.rb | 16 | ||||
| -rw-r--r-- | test/psych/test_exception.rb | 13 | ||||
| -rw-r--r-- | test/psych/test_object_references.rb | 5 | ||||
| -rw-r--r-- | test/psych/test_parser.rb | 42 | ||||
| -rw-r--r-- | test/psych/test_psych.rb | 11 | ||||
| -rw-r--r-- | test/psych/test_psych_set.rb | 57 | ||||
| -rw-r--r-- | test/psych/test_ractor.rb | 6 | ||||
| -rw-r--r-- | test/psych/test_safe_load.rb | 32 | ||||
| -rw-r--r-- | test/psych/test_scalar_scanner.rb | 6 | ||||
| -rw-r--r-- | test/psych/test_serialize_subclasses.rb | 18 | ||||
| -rw-r--r-- | test/psych/test_set.rb | 61 | ||||
| -rw-r--r-- | test/psych/test_stream.rb | 8 | ||||
| -rw-r--r-- | test/psych/test_string.rb | 10 | ||||
| -rw-r--r-- | test/psych/test_stringio.rb | 14 | ||||
| -rw-r--r-- | test/psych/test_yaml.rb | 58 | ||||
| -rw-r--r-- | test/psych/test_yaml_special_cases.rb | 12 | ||||
| -rw-r--r-- | test/psych/test_yamlstore.rb | 16 | ||||
| -rw-r--r-- | test/psych/visitors/test_to_ruby.rb | 6 | ||||
| -rw-r--r-- | test/psych/visitors/test_yaml_tree.rb | 21 |
21 files changed, 449 insertions, 57 deletions
diff --git a/test/psych/helper.rb b/test/psych/helper.rb index 4e82887c6d..639f6055ff 100644 --- a/test/psych/helper.rb +++ b/test/psych/helper.rb @@ -2,7 +2,6 @@ require 'test/unit' require 'stringio' require 'tempfile' -require 'date' require 'psych' diff --git a/test/psych/test_data.rb b/test/psych/test_data.rb new file mode 100644 index 0000000000..5e340c580a --- /dev/null +++ b/test/psych/test_data.rb @@ -0,0 +1,93 @@ +# frozen_string_literal: true +require_relative 'helper' + +class PsychDataWithIvar < Data.define(:foo) + attr_reader :bar + def initialize(**) + @bar = 'hello' + super + end +end unless RUBY_VERSION < "3.2" + +module Psych + class TestData < TestCase + class SelfReferentialData < Data.define(:foo) + attr_accessor :ref + def initialize(foo:) + @ref = self + super + end + end unless RUBY_VERSION < "3.2" + + def setup + omit "Data requires ruby >= 3.2" if RUBY_VERSION < "3.2" + end + + # TODO: move to another test? + def test_dump_data + assert_equal <<~eoyml, Psych.dump(PsychDataWithIvar["bar"]) + --- !ruby/data-with-ivars:PsychDataWithIvar + members: + foo: bar + ivars: + "@bar": hello + eoyml + end + + def test_self_referential_data + circular = SelfReferentialData.new("foo") + + loaded = Psych.unsafe_load(Psych.dump(circular)) + assert_instance_of(SelfReferentialData, loaded.ref) + + assert_equal(circular, loaded) + assert_same(loaded, loaded.ref) + end + + def test_roundtrip + thing = PsychDataWithIvar.new("bar") + data = Psych.unsafe_load(Psych.dump(thing)) + + assert_equal "hello", data.bar + assert_equal "bar", data.foo + end + + def test_load + obj = Psych.unsafe_load(<<~eoyml) + --- !ruby/data-with-ivars:PsychDataWithIvar + members: + foo: bar + ivars: + "@bar": hello + eoyml + + assert_equal "hello", obj.bar + assert_equal "bar", obj.foo + end + + def test_members_must_be_identical + TestData.const_set :D, Data.define(:a, :b) + d = Psych.dump(TestData::D.new(1, 2)) + + # more members + TestData.send :remove_const, :D + TestData.const_set :D, Data.define(:a, :b, :c) + e = assert_raise(ArgumentError) { Psych.unsafe_load d } + assert_equal 'missing keyword: :c', e.message + + # less members + TestData.send :remove_const, :D + TestData.const_set :D, Data.define(:a) + e = assert_raise(ArgumentError) { Psych.unsafe_load d } + assert_equal 'unknown keyword: :b', e.message + + # completely different members + TestData.send :remove_const, :D + TestData.const_set :D, Data.define(:a, :c) + e = assert_raise(ArgumentError) { Psych.unsafe_load d } + assert_include e.message, 'keyword:' + ensure + TestData.send :remove_const, :D + end + end +end diff --git a/test/psych/test_date_time.rb b/test/psych/test_date_time.rb index 3379bd24bf..79a48e2472 100644 --- a/test/psych/test_date_time.rb +++ b/test/psych/test_date_time.rb @@ -1,6 +1,5 @@ # frozen_string_literal: true require_relative 'helper' -require 'date' module Psych class TestDateTime < TestCase @@ -86,5 +85,20 @@ module Psych assert_match('&', yaml) assert_match('*', yaml) end + + def test_overwritten_to_s + pend "Failing on JRuby" if RUBY_PLATFORM =~ /java/ + s = Psych.dump(Date.new(2023, 9, 2), permitted_classes: [Date]) + assert_separately(%W[-rpsych -rdate - #{s}], "#{<<~"begin;"}\n#{<<~'end;'}") + class Date + undef to_s + def to_s; strftime("%D"); end + end + expected = ARGV.shift + begin; + s = Psych.dump(Date.new(2023, 9, 2), permitted_classes: [Date]) + assert_equal(expected, s) + end; + end end end diff --git a/test/psych/test_exception.rb b/test/psych/test_exception.rb index c1e69ab18d..6fd92abf9d 100644 --- a/test/psych/test_exception.rb +++ b/test/psych/test_exception.rb @@ -82,6 +82,19 @@ module Psych assert_equal 'omg!', ex.file end + def test_safe_load_stream_takes_file + ex = assert_raise(Psych::SyntaxError) do + Psych.safe_load_stream '--- `' + end + assert_nil ex.file + assert_match '(<unknown>)', ex.message + + ex = assert_raise(Psych::SyntaxError) do + Psych.safe_load_stream '--- `', filename: 'omg!' + end + assert_equal 'omg!', ex.file + end + def test_parse_file_exception Tempfile.create(['parsefile', 'yml']) {|t| t.binmode diff --git a/test/psych/test_object_references.rb b/test/psych/test_object_references.rb index 86bb9034b9..0498d54eec 100644 --- a/test/psych/test_object_references.rb +++ b/test/psych/test_object_references.rb @@ -31,6 +31,11 @@ module Psych assert_reference_trip Struct.new(:foo).new(1) end + def test_data_has_references + omit "Data requires ruby >= 3.2" if RUBY_VERSION < "3.2" + assert_reference_trip Data.define(:foo).new(1) + end + def assert_reference_trip obj yml = Psych.dump([obj, obj]) assert_match(/\*-?\d+/, yml) diff --git a/test/psych/test_parser.rb b/test/psych/test_parser.rb index c1e0abb89d..4ca4d63d80 100644 --- a/test/psych/test_parser.rb +++ b/test/psych/test_parser.rb @@ -198,6 +198,48 @@ module Psych assert_called :end_stream end + def test_parse_io_returns_more_bytes_than_requested + # An IO-like source whose #read returns more bytes than the size it was + # asked for must not overflow libyaml's read buffer. + io = Object.new + def io.external_encoding; Encoding::UTF_8 end + def io.read len + return nil if @done + @done = true + "--- a\n" + ("#" * (len + (1 << 20))) + end + + # CRuby clamps the over-read and parses; JRuby's parser rejects the + # over-reading IO with an IOError. Either way there is no overflow. + begin + @parser.parse io + rescue IOError + return + end + assert_called :start_stream + assert_called :scalar + assert_called :end_stream + end + + def test_parse_io_returns_more_bytes_than_requested_multibyte + # The over-read is rounded down to a character boundary so a multibyte + # character is never split when the copy is clamped. + io = Object.new + def io.external_encoding; Encoding::UTF_8 end + def io.read len + return nil if @done + @done = true + "--- a\n#" + ("あ" * (len + (1 << 20))) + end + + begin + @parser.parse io + rescue IOError + return + end + assert_called :scalar + end + def test_syntax_error assert_raise(Psych::SyntaxError) do @parser.parse("---\n\"foo\"\n\"bar\"\n") diff --git a/test/psych/test_psych.rb b/test/psych/test_psych.rb index 42586a8779..4455c471e7 100644 --- a/test/psych/test_psych.rb +++ b/test/psych/test_psych.rb @@ -89,6 +89,7 @@ class TestPsych < Psych::TestCase things = [22, "foo \n", {}] stream = Psych.dump_stream(*things) assert_equal things, Psych.load_stream(stream) + assert_equal things, Psych.safe_load_stream(stream) end def test_dump_file @@ -119,6 +120,8 @@ class TestPsych < Psych::TestCase def test_load_stream docs = Psych.load_stream("--- foo\n...\n--- bar\n...") assert_equal %w{ foo bar }, docs + safe_docs = Psych.safe_load_stream("--- foo\n...\n--- bar\n...") + assert_equal %w{ foo bar }, safe_docs end def test_load_stream_freeze @@ -138,10 +141,18 @@ class TestPsych < Psych::TestCase assert_equal [], Psych.load_stream("") end + def test_safe_load_stream_default_fallback + assert_equal [], Psych.safe_load_stream("") + end + def test_load_stream_raises_on_bad_input assert_raise(Psych::SyntaxError) { Psych.load_stream("--- `") } end + def test_safe_load_stream_raises_on_bad_input + assert_raise(Psych::SyntaxError) { Psych.safe_load_stream("--- `") } + end + def test_parse_stream docs = Psych.parse_stream("--- foo\n...\n--- bar\n...") assert_equal(%w[foo bar], docs.children.map(&:transform)) diff --git a/test/psych/test_psych_set.rb b/test/psych/test_psych_set.rb new file mode 100644 index 0000000000..c72cd73f18 --- /dev/null +++ b/test/psych/test_psych_set.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: true +require_relative 'helper' + +module Psych + class TestPsychSet < TestCase + def setup + super + @set = Psych::Set.new + @set['foo'] = 'bar' + @set['bar'] = 'baz' + end + + def test_dump + assert_match(/!set/, Psych.dump(@set)) + end + + def test_roundtrip + assert_cycle(@set) + end + + ### + # FIXME: Syck should also support !!set as shorthand + def test_load_from_yaml + loaded = Psych.unsafe_load(<<-eoyml) +--- !set +foo: bar +bar: baz + eoyml + assert_equal(@set, loaded) + end + + def test_loaded_class + assert_instance_of(Psych::Set, Psych.unsafe_load(Psych.dump(@set))) + end + + def test_set_shorthand + loaded = Psych.unsafe_load(<<-eoyml) +--- !!set +foo: bar +bar: baz + eoyml + assert_instance_of(Psych::Set, loaded) + end + + def test_set_self_reference + @set['self'] = @set + assert_cycle(@set) + end + + def test_stringify_names + @set[:symbol] = :value + + assert_match(/^:symbol: :value/, Psych.dump(@set)) + assert_match(/^symbol: :value/, Psych.dump(@set, stringify_names: true)) + end + end +end diff --git a/test/psych/test_ractor.rb b/test/psych/test_ractor.rb index 1b0d810609..f1c8327aa3 100644 --- a/test/psych/test_ractor.rb +++ b/test/psych/test_ractor.rb @@ -7,7 +7,7 @@ class TestPsychRactor < Test::Unit::TestCase obj = {foo: [42]} obj2 = Ractor.new(obj) do |obj| Psych.unsafe_load(Psych.dump(obj)) - end.take + end.value assert_equal obj, obj2 RUBY end @@ -33,7 +33,7 @@ class TestPsychRactor < Test::Unit::TestCase val * 2 end Psych.load('--- !!omap hello') - end.take + end.value assert_equal 'hellohello', r assert_equal 'hello', Psych.load('--- !!omap hello') RUBY @@ -43,7 +43,7 @@ class TestPsychRactor < Test::Unit::TestCase assert_ractor(<<~RUBY, require_relative: 'helper') r = Ractor.new do Psych.libyaml_version.join('.') == Psych::LIBYAML_VERSION - end.take + end.value assert_equal true, r RUBY end diff --git a/test/psych/test_safe_load.rb b/test/psych/test_safe_load.rb index a9ed737528..e6ca1e142b 100644 --- a/test/psych/test_safe_load.rb +++ b/test/psych/test_safe_load.rb @@ -114,6 +114,38 @@ module Psych end end + D = Data.define(:d) unless RUBY_VERSION < "3.2" + + def test_data_depends_on_sym + omit "Data requires ruby >= 3.2" if RUBY_VERSION < "3.2" + assert_safe_cycle(D.new(nil), permitted_classes: [D, Symbol]) + assert_raise(Psych::DisallowedClass) do + cycle D.new(nil), permitted_classes: [D] + end + end + + def test_anon_data + omit "Data requires ruby >= 3.2" if RUBY_VERSION < "3.2" + assert Psych.safe_load(<<-eoyml, permitted_classes: [Data, Symbol]) +--- !ruby/data + foo: bar + eoyml + + assert_raise(Psych::DisallowedClass) do + Psych.safe_load(<<-eoyml, permitted_classes: [Data]) +--- !ruby/data + foo: bar + eoyml + end + + assert_raise(Psych::DisallowedClass) do + Psych.safe_load(<<-eoyml, permitted_classes: [Symbol]) +--- !ruby/data + foo: bar + eoyml + end + end + def test_safe_load_default_fallback assert_nil Psych.safe_load("") end diff --git a/test/psych/test_scalar_scanner.rb b/test/psych/test_scalar_scanner.rb index 8907d1255a..bc6a74ad8b 100644 --- a/test/psych/test_scalar_scanner.rb +++ b/test/psych/test_scalar_scanner.rb @@ -1,6 +1,5 @@ # frozen_string_literal: true require_relative 'helper' -require 'date' module Psych class TestScalarScanner < TestCase @@ -139,6 +138,11 @@ module Psych assert_equal '-0b___', scanner.tokenize('-0b___') end + def test_scan_without_parse_symbols + scanner = Psych::ScalarScanner.new ClassLoader.new, parse_symbols: false + assert_equal ':foo', scanner.tokenize(':foo') + end + def test_scan_int_commas_and_underscores # NB: This test is to ensure backward compatibility with prior Psych versions, # not to test against any actual YAML specification. diff --git a/test/psych/test_serialize_subclasses.rb b/test/psych/test_serialize_subclasses.rb index 344c79b3ef..640c331337 100644 --- a/test/psych/test_serialize_subclasses.rb +++ b/test/psych/test_serialize_subclasses.rb @@ -35,5 +35,23 @@ module Psych so = StructSubclass.new('foo', [1,2,3]) assert_equal so, Psych.unsafe_load(Psych.dump(so)) end + + class DataSubclass < Data.define(:foo) + def initialize(foo:) + @bar = "hello #{foo}" + super(foo: foo) + end + + def == other + super(other) && @bar == other.instance_eval{ @bar } + end + end unless RUBY_VERSION < "3.2" + + def test_data_subclass + omit "Data requires ruby >= 3.2" if RUBY_VERSION < "3.2" + so = DataSubclass.new('foo') + assert_equal so, Psych.unsafe_load(Psych.dump(so)) + end + end end diff --git a/test/psych/test_set.rb b/test/psych/test_set.rb index b4968d3425..ccd591c626 100644 --- a/test/psych/test_set.rb +++ b/test/psych/test_set.rb @@ -1,57 +1,36 @@ +# encoding: UTF-8 # frozen_string_literal: true require_relative 'helper' +require 'set' unless defined?(Set) module Psych class TestSet < TestCase def setup - super - @set = Psych::Set.new - @set['foo'] = 'bar' - @set['bar'] = 'baz' + @set = ::Set.new([1, 2, 3]) end def test_dump - assert_match(/!set/, Psych.dump(@set)) + assert_equal <<~YAML, Psych.dump(@set) + --- !ruby/object:Set + hash: + 1: true + 2: true + 3: true + YAML end - def test_roundtrip - assert_cycle(@set) - end - - ### - # FIXME: Syck should also support !!set as shorthand - def test_load_from_yaml - loaded = Psych.unsafe_load(<<-eoyml) ---- !set -foo: bar -bar: baz - eoyml - assert_equal(@set, loaded) + def test_load + assert_equal @set, Psych.load(<<~YAML, permitted_classes: [::Set]) + --- !ruby/object:Set + hash: + 1: true + 2: true + 3: true + YAML end - def test_loaded_class - assert_instance_of(Psych::Set, Psych.unsafe_load(Psych.dump(@set))) - end - - def test_set_shorthand - loaded = Psych.unsafe_load(<<-eoyml) ---- !!set -foo: bar -bar: baz - eoyml - assert_instance_of(Psych::Set, loaded) - end - - def test_set_self_reference - @set['self'] = @set - assert_cycle(@set) - end - - def test_stringify_names - @set[:symbol] = :value - - assert_match(/^:symbol: :value/, Psych.dump(@set)) - assert_match(/^symbol: :value/, Psych.dump(@set, stringify_names: true)) + def test_roundtrip + assert_equal @set, Psych.load(Psych.dump(@set), permitted_classes: [::Set]) end end end diff --git a/test/psych/test_stream.rb b/test/psych/test_stream.rb index 9b71c6d996..ae940d1ee4 100644 --- a/test/psych/test_stream.rb +++ b/test/psych/test_stream.rb @@ -54,6 +54,14 @@ module Psych assert_equal %w{ foo bar }, list end + def test_safe_load_stream_yields_documents + list = [] + Psych.safe_load_stream("--- foo\n...\n--- bar") do |ruby| + list << ruby + end + assert_equal %w{ foo bar }, list + end + def test_load_stream_break list = [] Psych.load_stream("--- foo\n...\n--- `") do |ruby| diff --git a/test/psych/test_string.rb b/test/psych/test_string.rb index 84ae5cbb45..cfd235a519 100644 --- a/test/psych/test_string.rb +++ b/test/psych/test_string.rb @@ -50,6 +50,16 @@ module Psych assert_equal str, Psych.load(yaml) end + def test_single_quote_when_matching_date + pend "Failing on JRuby" if RUBY_PLATFORM =~ /java/ + + lib = File.expand_path("../../../lib", __FILE__) + assert_separately(["-I", lib, "-r", "psych"], __FILE__, __LINE__ + 1, <<~'RUBY') + yml = Psych.dump('2024-11-19') + assert_equal '2024-11-19', Psych.load(yml) + RUBY + end + def test_plain_when_shorten_than_line_width_and_no_final_line_break str = "Lorem ipsum" yaml = Psych.dump str, line_width: 12 diff --git a/test/psych/test_stringio.rb b/test/psych/test_stringio.rb new file mode 100644 index 0000000000..7fef1402a0 --- /dev/null +++ b/test/psych/test_stringio.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true +require_relative 'helper' + +module Psych + class TestStringIO < TestCase + # The superclass of StringIO before Ruby 3.0 was `Data`, + # which can interfere with the Ruby 3.2+ `Data` dumping. + def test_stringio + assert_nothing_raised do + Psych.dump(StringIO.new("foo")) + end + end + end +end diff --git a/test/psych/test_yaml.rb b/test/psych/test_yaml.rb index 812a15dfcc..134c346c90 100644 --- a/test/psych/test_yaml.rb +++ b/test/psych/test_yaml.rb @@ -2,11 +2,11 @@ # frozen_string_literal: true require_relative 'helper' -require 'ostruct' # [ruby-core:01946] module Psych_Tests StructTest = Struct::new( :c ) + DataTest = Data.define( :c ) unless RUBY_VERSION < "3.2" end class Psych_Unit_Tests < Psych::TestCase @@ -15,8 +15,14 @@ class Psych_Unit_Tests < Psych::TestCase end def test_y_method - assert_raise(NoMethodError) do - OpenStruct.new.y 1 + begin + require 'ostruct' + + assert_raise(NoMethodError) do + OpenStruct.new.y 1 + end + rescue LoadError + omit("OpenStruct is not available") end end @@ -30,6 +36,10 @@ class Psych_Unit_Tests < Psych::TestCase assert_cycle(Regexp.new("foo\nbar")) end + def test_regexp_with_slash + assert_cycle(Regexp.new('/')) + end + # [ruby-core:34969] def test_regexp_with_n assert_cycle(Regexp.new('',Regexp::NOENCODING)) @@ -1032,7 +1042,6 @@ EOY end def test_ruby_struct - Struct.send(:remove_const, :MyBookStruct) if Struct.const_defined?(:MyBookStruct) # Ruby structures book_struct = Struct::new( "MyBookStruct", :author, :title, :year, :isbn ) assert_to_yaml( @@ -1064,6 +1073,47 @@ EOY c: 123 EOY + ensure + Struct.__send__(:remove_const, :MyBookStruct) if book_struct + end + + def test_ruby_data + omit "Data requires ruby >= 3.2" if RUBY_VERSION < "3.2" + # Ruby Data value objects + book_class = Data.define(:author, :title, :year, :isbn) + Object.const_set(:MyBookData, book_class) + assert_to_yaml( + [ book_class.new( "Yukihiro Matsumoto", "Ruby in a Nutshell", 2002, "0-596-00214-9" ), + book_class.new( [ 'Dave Thomas', 'Andy Hunt' ], "The Pickaxe", 2002, + book_class.new( "This should be the ISBN", "but I have more data here", 2002, "None" ) + ) + ], <<EOY +- !ruby/data:MyBookData + author: Yukihiro Matsumoto + title: Ruby in a Nutshell + year: 2002 + isbn: 0-596-00214-9 +- !ruby/data:MyBookData + author: + - Dave Thomas + - Andy Hunt + title: The Pickaxe + year: 2002 + isbn: !ruby/data:MyBookData + author: This should be the ISBN + title: but I have more data here + year: 2002 + isbn: None +EOY + ) + + assert_to_yaml( Psych_Tests::DataTest.new( 123 ), <<EOY ) +--- !ruby/data:Psych_Tests::DataTest +c: 123 +EOY + + ensure + Object.__send__(:remove_const, :MyBookData) if book_class end def test_ruby_rational diff --git a/test/psych/test_yaml_special_cases.rb b/test/psych/test_yaml_special_cases.rb index 205457bcae..f1a607783e 100644 --- a/test/psych/test_yaml_special_cases.rb +++ b/test/psych/test_yaml_special_cases.rb @@ -15,6 +15,7 @@ module Psych s = "" assert_equal false, Psych.unsafe_load(s) assert_equal [], Psych.load_stream(s) + assert_equal [], Psych.safe_load_stream(s) assert_equal false, Psych.parse(s) assert_equal [], Psych.parse_stream(s).transform assert_nil Psych.safe_load(s) @@ -24,6 +25,7 @@ module Psych s = "false" assert_equal false, Psych.load(s) assert_equal [false], Psych.load_stream(s) + assert_equal [false], Psych.safe_load_stream(s) assert_equal false, Psych.parse(s).transform assert_equal [false], Psych.parse_stream(s).transform assert_equal false, Psych.safe_load(s) @@ -33,6 +35,7 @@ module Psych s = "n" assert_equal "n", Psych.load(s) assert_equal ["n"], Psych.load_stream(s) + assert_equal ["n"], Psych.safe_load_stream(s) assert_equal "n", Psych.parse(s).transform assert_equal ["n"], Psych.parse_stream(s).transform assert_equal "n", Psych.safe_load(s) @@ -42,6 +45,7 @@ module Psych s = "off" assert_equal false, Psych.load(s) assert_equal [false], Psych.load_stream(s) + assert_equal [false], Psych.safe_load_stream(s) assert_equal false, Psych.parse(s).transform assert_equal [false], Psych.parse_stream(s).transform assert_equal false, Psych.safe_load(s) @@ -51,6 +55,7 @@ module Psych s = "-.inf" assert_equal(-Float::INFINITY, Psych.load(s)) assert_equal([-Float::INFINITY], Psych.load_stream(s)) + assert_equal([-Float::INFINITY], Psych.safe_load_stream(s)) assert_equal(-Float::INFINITY, Psych.parse(s).transform) assert_equal([-Float::INFINITY], Psych.parse_stream(s).transform) assert_equal(-Float::INFINITY, Psych.safe_load(s)) @@ -60,6 +65,7 @@ module Psych s = ".NaN" assert Psych.load(s).nan? assert Psych.load_stream(s).first.nan? + assert Psych.safe_load_stream(s).first.nan? assert Psych.parse(s).transform.nan? assert Psych.parse_stream(s).transform.first.nan? assert Psych.safe_load(s).nan? @@ -69,6 +75,7 @@ module Psych s = "0xC" assert_equal 12, Psych.load(s) assert_equal [12], Psych.load_stream(s) + assert_equal [12], Psych.safe_load_stream(s) assert_equal 12, Psych.parse(s).transform assert_equal [12], Psych.parse_stream(s).transform assert_equal 12, Psych.safe_load(s) @@ -78,6 +85,7 @@ module Psych s = "<<" assert_equal "<<", Psych.load(s) assert_equal ["<<"], Psych.load_stream(s) + assert_equal ["<<"], Psych.safe_load_stream(s) assert_equal "<<", Psych.parse(s).transform assert_equal ["<<"], Psych.parse_stream(s).transform assert_equal "<<", Psych.safe_load(s) @@ -87,6 +95,7 @@ module Psych s = "<<: {}" assert_equal({}, Psych.load(s)) assert_equal [{}], Psych.load_stream(s) + assert_equal [{}], Psych.safe_load_stream(s) assert_equal({}, Psych.parse(s).transform) assert_equal [{}], Psych.parse_stream(s).transform assert_equal({}, Psych.safe_load(s)) @@ -96,6 +105,7 @@ module Psych s = "- 1000\n- +1000\n- 1_000" assert_equal [1000, 1000, 1000], Psych.load(s) assert_equal [[1000, 1000, 1000]], Psych.load_stream(s) + assert_equal [[1000, 1000, 1000]], Psych.safe_load_stream(s) assert_equal [1000, 1000, 1000], Psych.parse(s).transform assert_equal [[1000, 1000, 1000]], Psych.parse_stream(s).transform assert_equal [1000, 1000, 1000], Psych.safe_load(s) @@ -105,6 +115,7 @@ module Psych s = "[8, 08, 0o10, 010]" assert_equal [8, "08", "0o10", 8], Psych.load(s) assert_equal [[8, "08", "0o10", 8]], Psych.load_stream(s) + assert_equal [[8, "08", "0o10", 8]], Psych.safe_load_stream(s) assert_equal [8, "08", "0o10", 8], Psych.parse(s).transform assert_equal [[8, "08", "0o10", 8]], Psych.parse_stream(s).transform assert_equal [8, "08", "0o10", 8], Psych.safe_load(s) @@ -114,6 +125,7 @@ module Psych s = "null" assert_nil Psych.load(s) assert_equal [nil], Psych.load_stream(s) + assert_equal [nil], Psych.safe_load_stream(s) assert_nil Psych.parse(s).transform assert_equal [nil], Psych.parse_stream(s).transform assert_nil Psych.safe_load(s) diff --git a/test/psych/test_yamlstore.rb b/test/psych/test_yamlstore.rb index 1a1be3700e..c2721c41ea 100644 --- a/test/psych/test_yamlstore.rb +++ b/test/psych/test_yamlstore.rb @@ -23,14 +23,18 @@ module Psych class YAMLStoreTest < TestCase def setup - @dir = Dir.mktmpdir("rubytest-file") - File.chown(-1, Process.gid, @dir) - @yamlstore_file = make_tmp_filename("yamlstore") - @yamlstore = YAML::Store.new(@yamlstore_file) + if defined?(::PStore) + @dir = Dir.mktmpdir("rubytest-file") + File.chown(-1, Process.gid, @dir) + @yamlstore_file = make_tmp_filename("yamlstore") + @yamlstore = YAML::Store.new(@yamlstore_file) + else + omit "PStore is not available" + end end def teardown - FileUtils.remove_entry_secure @dir + FileUtils.remove_entry_secure(@dir) if @dir end def make_tmp_filename(prefix) @@ -97,5 +101,5 @@ module Psych end end end - end + end if defined?(::PStore) end if defined?(Psych) diff --git a/test/psych/visitors/test_to_ruby.rb b/test/psych/visitors/test_to_ruby.rb index 89c3676651..c9b501dfa2 100644 --- a/test/psych/visitors/test_to_ruby.rb +++ b/test/psych/visitors/test_to_ruby.rb @@ -328,6 +328,12 @@ description: mapping.children << Nodes::Scalar.new('bar') assert_equal({'foo' => 'bar'}, mapping.to_ruby) end + + def test_parse_symbols + node = Nodes::Scalar.new(':foo') + assert_equal :foo, node.to_ruby + assert_equal ':foo', node.to_ruby(parse_symbols: false) + end end end end diff --git a/test/psych/visitors/test_yaml_tree.rb b/test/psych/visitors/test_yaml_tree.rb index 01e685134a..bd3919f83d 100644 --- a/test/psych/visitors/test_yaml_tree.rb +++ b/test/psych/visitors/test_yaml_tree.rb @@ -73,6 +73,27 @@ module Psych assert_equal s.method, obj.method end + D = Data.define(:foo) unless RUBY_VERSION < "3.2" + + def test_data + omit "Data requires ruby >= 3.2" if RUBY_VERSION < "3.2" + assert_cycle D.new('bar') + end + + def test_data_anon + omit "Data requires ruby >= 3.2" if RUBY_VERSION < "3.2" + d = Data.define(:foo).new('bar') + obj = Psych.unsafe_load(Psych.dump(d)) + assert_equal d.foo, obj.foo + end + + def test_data_override_method + omit "Data requires ruby >= 3.2" if RUBY_VERSION < "3.2" + d = Data.define(:method).new('override') + obj = Psych.unsafe_load(Psych.dump(d)) + assert_equal d.method, obj.method + end + def test_exception ex = Exception.new 'foo' loaded = Psych.unsafe_load(Psych.dump(ex)) |
