summaryrefslogtreecommitdiff
path: root/test/psych/test_coder.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/psych/test_coder.rb')
-rw-r--r--test/psych/test_coder.rb334
1 files changed, 334 insertions, 0 deletions
diff --git a/test/psych/test_coder.rb b/test/psych/test_coder.rb
new file mode 100644
index 0000000000..a6f5ad7f36
--- /dev/null
+++ b/test/psych/test_coder.rb
@@ -0,0 +1,334 @@
+# frozen_string_literal: true
+require_relative 'helper'
+
+module Psych
+ class TestCoder < TestCase
+ class InitApi
+ attr_accessor :implicit
+ attr_accessor :style
+ attr_accessor :tag
+ attr_accessor :a, :b, :c
+
+ def initialize
+ @a = 1
+ @b = 2
+ @c = 3
+ end
+
+ def init_with coder
+ @a = coder['aa']
+ @b = coder['bb']
+ @implicit = coder.implicit
+ @tag = coder.tag
+ @style = coder.style
+ end
+
+ def encode_with coder
+ coder['aa'] = @a
+ coder['bb'] = @b
+ end
+ end
+
+ class TaggingCoder < InitApi
+ def encode_with coder
+ super
+ coder.tag = coder.tag.sub(/!/, '!hello')
+ coder.implicit = false
+ coder.style = Psych::Nodes::Mapping::FLOW
+ end
+ end
+
+ class ScalarCoder
+ def encode_with coder
+ coder.scalar = "foo"
+ end
+ end
+
+ class Represent
+ yaml_tag 'foo'
+ def encode_with coder
+ coder.represent_scalar 'foo', 'bar'
+ end
+ end
+
+ class RepresentWithInit
+ yaml_tag name
+ attr_accessor :str
+
+ def init_with coder
+ @str = coder.scalar
+ end
+
+ def encode_with coder
+ coder.represent_scalar self.class.name, 'bar'
+ end
+ end
+
+ class RepresentWithSeq
+ yaml_tag name
+ attr_accessor :seq
+
+ def init_with coder
+ @seq = coder.seq
+ end
+
+ def encode_with coder
+ coder.represent_seq self.class.name, %w{ foo bar }
+ end
+ end
+
+ class RepresentWithMap
+ yaml_tag name
+ attr_accessor :map
+
+ def init_with coder
+ @map = coder.map
+ end
+
+ def encode_with coder
+ coder.represent_map self.class.name, { "string" => 'a', :symbol => 'b' }
+ end
+ end
+
+ class RepresentWithObject
+ def encode_with coder
+ coder.represent_object self.class.name, 20
+ end
+ end
+
+ class Referential
+ attr_reader :a
+
+ def initialize
+ @a = self
+ end
+
+ def encode_with(c)
+ c['a'] = @a
+ end
+
+ def init_with(c)
+ @a = c['a']
+ end
+ end
+
+ class CustomEncode
+ def initialize(**opts)
+ @opts = opts
+ end
+
+ def encode_with(coder)
+ @opts.each { |k,v| coder.public_send :"#{k}=", v }
+ end
+ end
+
+ def test_self_referential
+ x = Referential.new
+ copy = Psych.unsafe_load Psych.dump x
+ assert_equal copy, copy.a
+ end
+
+ def test_represent_with_object
+ thing = Psych.load(Psych.dump(RepresentWithObject.new))
+ assert_equal 20, thing
+ end
+
+ def test_json_dump_exclude_tag
+ refute_match('TestCoder::InitApi', Psych.to_json(InitApi.new))
+ end
+
+ def test_map_takes_block
+ coder = Psych::Coder.new 'foo'
+ tag = coder.tag
+ style = coder.style
+ coder.map { |map| map.add 'foo', 'bar' }
+ assert_equal 'bar', coder['foo']
+ assert_equal tag, coder.tag
+ assert_equal style, coder.style
+ end
+
+ def test_map_with_tag
+ coder = Psych::Coder.new 'foo'
+ coder.map('hello') { |map| map.add 'foo', 'bar' }
+ assert_equal 'bar', coder['foo']
+ assert_equal 'hello', coder.tag
+ end
+
+ def test_map_with_tag_and_style
+ coder = Psych::Coder.new 'foo'
+ coder.map('hello', 'world') { |map| map.add 'foo', 'bar' }
+ assert_equal 'bar', coder['foo']
+ assert_equal 'hello', coder.tag
+ assert_equal 'world', coder.style
+ end
+
+ def test_represent_map
+ thing = Psych.unsafe_load(Psych.dump(RepresentWithMap.new))
+ assert_equal({ "string" => 'a', :symbol => 'b' }, thing.map)
+ end
+
+ def test_represent_sequence
+ thing = Psych.unsafe_load(Psych.dump(RepresentWithSeq.new))
+ assert_equal %w{ foo bar }, thing.seq
+ end
+
+ def test_represent_with_init
+ thing = Psych.unsafe_load(Psych.dump(RepresentWithInit.new))
+ assert_equal 'bar', thing.str
+ end
+
+ def test_represent!
+ assert_match(/foo/, Psych.dump(Represent.new))
+ assert_instance_of(Represent, Psych.unsafe_load(Psych.dump(Represent.new)))
+ end
+
+ def test_scalar_coder
+ foo = Psych.load(Psych.dump(ScalarCoder.new))
+ assert_equal 'foo', foo
+ end
+
+ def test_load_dumped_tagging
+ foo = InitApi.new
+ bar = Psych.unsafe_load(Psych.dump(foo))
+ assert_equal false, bar.implicit
+ assert_equal "!ruby/object:Psych::TestCoder::InitApi", bar.tag
+ assert_equal Psych::Nodes::Mapping::BLOCK, bar.style
+ end
+
+ def test_dump_with_tag
+ foo = TaggingCoder.new
+ assert_match(/hello/, Psych.dump(foo))
+ assert_match(/\{aa/, Psych.dump(foo))
+ end
+
+ def test_dump_encode_with
+ foo = InitApi.new
+ assert_match(/aa/, Psych.dump(foo))
+ end
+
+ def test_dump_init_with
+ foo = InitApi.new
+ bar = Psych.unsafe_load(Psych.dump(foo))
+ assert_equal foo.a, bar.a
+ assert_equal foo.b, bar.b
+ assert_nil bar.c
+ end
+
+ def test_coder_style_map_default
+ foo = Psych.dump a: 1, b: 2
+ assert_equal "---\n:a: 1\n:b: 2\n", foo
+ end
+
+ def test_coder_style_map_any
+ pend "Failing on JRuby" if RUBY_PLATFORM =~ /java/
+
+ foo = Psych.dump CustomEncode.new \
+ map: {a: 1, b: 2},
+ style: Psych::Nodes::Mapping::ANY,
+ tag: nil
+ assert_equal "---\n:a: 1\n:b: 2\n", foo
+ end
+
+ def test_coder_style_map_block
+ pend "Failing on JRuby" if RUBY_PLATFORM =~ /java/
+
+ foo = Psych.dump CustomEncode.new \
+ map: {a: 1, b: 2},
+ style: Psych::Nodes::Mapping::BLOCK,
+ tag: nil
+ assert_equal "---\n:a: 1\n:b: 2\n", foo
+ end
+
+ def test_coder_style_map_flow
+ pend "Failing on JRuby" if RUBY_PLATFORM =~ /java/
+
+ foo = Psych.dump CustomEncode.new \
+ map: { a: 1, b: 2 },
+ style: Psych::Nodes::Mapping::FLOW,
+ tag: nil
+ assert_equal "--- {! ':a': 1, ! ':b': 2}\n", foo
+ end
+
+ def test_coder_style_seq_default
+ foo = Psych.dump [ 1, 2, 3 ]
+ assert_equal "---\n- 1\n- 2\n- 3\n", foo
+ end
+
+ def test_coder_style_seq_any
+ foo = Psych.dump CustomEncode.new \
+ seq: [ 1, 2, 3 ],
+ style: Psych::Nodes::Sequence::ANY,
+ tag: nil
+ assert_equal "---\n- 1\n- 2\n- 3\n", foo
+ end
+
+ def test_coder_style_seq_block
+ foo = Psych.dump CustomEncode.new \
+ seq: [ 1, 2, 3 ],
+ style: Psych::Nodes::Sequence::BLOCK,
+ tag: nil
+ assert_equal "---\n- 1\n- 2\n- 3\n", foo
+ end
+
+ def test_coder_style_seq_flow
+ foo = Psych.dump CustomEncode.new \
+ seq: [ 1, 2, 3 ],
+ style: Psych::Nodes::Sequence::FLOW,
+ tag: nil
+ assert_equal "--- [1, 2, 3]\n", foo
+ end
+
+ def test_coder_style_scalar_default
+ foo = Psych.dump 'some scalar'
+ assert_match(/\A--- some scalar\n(?:\.\.\.\n)?\z/, foo)
+ end
+
+ def test_coder_style_scalar_any
+ foo = Psych.dump CustomEncode.new \
+ scalar: 'some scalar',
+ style: Psych::Nodes::Scalar::ANY,
+ tag: nil
+ assert_match(/\A--- some scalar\n(?:\.\.\.\n)?\z/, foo)
+ end
+
+ def test_coder_style_scalar_plain
+ foo = Psych.dump CustomEncode.new \
+ scalar: 'some scalar',
+ style: Psych::Nodes::Scalar::PLAIN,
+ tag: nil
+ assert_match(/\A--- some scalar\n(?:\.\.\.\n)?\z/, foo)
+ end
+
+ def test_coder_style_scalar_single_quoted
+ foo = Psych.dump CustomEncode.new \
+ scalar: 'some scalar',
+ style: Psych::Nodes::Scalar::SINGLE_QUOTED,
+ tag: nil
+ assert_equal "--- ! 'some scalar'\n", foo
+ end
+
+ def test_coder_style_scalar_double_quoted
+ foo = Psych.dump CustomEncode.new \
+ scalar: 'some scalar',
+ style: Psych::Nodes::Scalar::DOUBLE_QUOTED,
+ tag: nil
+ assert_equal %Q'--- ! "some scalar"\n', foo
+ end
+
+ def test_coder_style_scalar_literal
+ foo = Psych.dump CustomEncode.new \
+ scalar: 'some scalar',
+ style: Psych::Nodes::Scalar::LITERAL,
+ tag: nil
+ assert_equal "--- ! |-\n some scalar\n", foo
+ end
+
+ def test_coder_style_scalar_folded
+ foo = Psych.dump CustomEncode.new \
+ scalar: 'some scalar',
+ style: Psych::Nodes::Scalar::FOLDED,
+ tag: nil
+ assert_equal "--- ! >-\n some scalar\n", foo
+ end
+ end
+end