summaryrefslogtreecommitdiff
path: root/test/psych
diff options
context:
space:
mode:
Diffstat (limited to 'test/psych')
-rw-r--r--test/psych/helper.rb1
-rw-r--r--test/psych/test_data.rb93
-rw-r--r--test/psych/test_date_time.rb16
-rw-r--r--test/psych/test_exception.rb13
-rw-r--r--test/psych/test_object_references.rb5
-rw-r--r--test/psych/test_parser.rb42
-rw-r--r--test/psych/test_psych.rb11
-rw-r--r--test/psych/test_psych_set.rb57
-rw-r--r--test/psych/test_ractor.rb6
-rw-r--r--test/psych/test_safe_load.rb32
-rw-r--r--test/psych/test_scalar_scanner.rb19
-rw-r--r--test/psych/test_serialize_subclasses.rb18
-rw-r--r--test/psych/test_set.rb61
-rw-r--r--test/psych/test_stream.rb8
-rw-r--r--test/psych/test_string.rb10
-rw-r--r--test/psych/test_stringio.rb14
-rw-r--r--test/psych/test_yaml.rb58
-rw-r--r--test/psych/test_yaml_special_cases.rb12
-rw-r--r--test/psych/test_yamlstore.rb16
-rw-r--r--test/psych/visitors/test_to_ruby.rb6
-rw-r--r--test/psych/visitors/test_yaml_tree.rb21
21 files changed, 462 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 02b923afe2..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
@@ -126,6 +125,24 @@ module Psych
assert_equal '100_', ss.tokenize('100_')
end
+ def test_scan_strings_with_legacy_int_delimiters
+ assert_equal '0x_,_', ss.tokenize('0x_,_')
+ assert_equal '+0__,,', ss.tokenize('+0__,,')
+ assert_equal '-0b,_,', ss.tokenize('-0b,_,')
+ end
+
+ def test_scan_strings_with_strict_int_delimiters
+ scanner = Psych::ScalarScanner.new ClassLoader.new, strict_integer: true
+ assert_equal '0x___', scanner.tokenize('0x___')
+ assert_equal '+0____', scanner.tokenize('+0____')
+ 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))