Feature #12960 » 0009-feat-psych-add-test-script.patch
test/psych/visitors/test_custom_class.rb | ||
---|---|---|
# coding: US-ASCII
|
||
# frozen_string_literal: false
|
||
require 'psych/helper'
|
||
require 'psych/visitors/custom_class'
|
||
module Psych
|
||
module Visitors
|
||
class TestCustomClass < TestCase
|
||
INPUT_STRING = <<-'END'
|
||
teams:
|
||
- name: SOS Brigade
|
||
members:
|
||
- {name: Haruhi, gender: F}
|
||
- {name: Kyon, gender: M}
|
||
- {name: Mikuru, gender: F}
|
||
- {name: Itsuki, gender: M}
|
||
- {name: Yuki, gender: F}
|
||
END
|
||
def test_custom_classes
|
||
classmap = {
|
||
"teams" => Struct.new('Team', 'name', 'members'),
|
||
"members" => Struct.new('Member', 'name', 'gender'),
|
||
}
|
||
#
|
||
visitor = Psych::Visitors::CustomClassVisitor.create(classmap)
|
||
tree = Psych.parse(INPUT_STRING)
|
||
ydoc = visitor.accept(tree)
|
||
#
|
||
assert_kind_of Hash, ydoc
|
||
assert_kind_of classmap["teams"], ydoc['teams'][0]
|
||
assert_kind_of classmap["members"], ydoc['teams'][0]['members'][0]
|
||
#
|
||
team = ydoc['teams'][0]
|
||
assert_equal 'SOS Brigade', team.name
|
||
assert_equal 'Haruhi', team.members[0].name
|
||
assert_equal 'F', team.members[0].gender
|
||
end
|
||
def test_default_class
|
||
magic_hash_cls = Class.new(Hash) do
|
||
def method_missing(method, *args)
|
||
return super unless args.empty?
|
||
return self[method.to_s]
|
||
end
|
||
end
|
||
classmap = {'*' => magic_hash_cls}
|
||
#
|
||
visitor = Psych::Visitors::CustomClassVisitor.create(classmap)
|
||
tree = Psych.parse(INPUT_STRING)
|
||
ydoc = visitor.accept(tree)
|
||
#
|
||
assert_kind_of magic_hash_cls, ydoc
|
||
assert_kind_of magic_hash_cls, ydoc['teams'][0]
|
||
assert_kind_of magic_hash_cls, ydoc['teams'][0]['members'][0]
|
||
#
|
||
team = ydoc['teams'][0]
|
||
assert_equal "SOS Brigade", team.name
|
||
assert_equal "Haruhi", team.members[0].name
|
||
assert_equal "F", team.members[0].gender
|
||
end
|
||
end
|
||
end
|
||
end
|