From 3628243bc0af1eb19f1844c7e22da6aa6d46e074 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Wed, 20 Dec 2017 09:22:15 -0800 Subject: Add a predicate method to each node This allows the AST to be searched via a predicate method rather than hardcoding the class name and doing is_a? checks. For example, rather than: ``` ast.grep(Psych::Nodes::Scalar).each do |node| # .. do something end ``` Now you can do: ``` ast.find_all(&:scalar?).each do |node| # .. do something end ``` Your code no longer needs to know the exact class used in the AST. --- test/psych/test_stream.rb | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'test') diff --git a/test/psych/test_stream.rb b/test/psych/test_stream.rb index 3bd557c..9b71c6d 100644 --- a/test/psych/test_stream.rb +++ b/test/psych/test_stream.rb @@ -3,6 +3,22 @@ require_relative 'helper' module Psych class TestStream < TestCase + [ + [Psych::Nodes::Alias, :alias?], + [Psych::Nodes::Document, :document?], + [Psych::Nodes::Mapping, :mapping?], + [Psych::Nodes::Scalar, :scalar?], + [Psych::Nodes::Sequence, :sequence?], + [Psych::Nodes::Stream, :stream?], + ].each do |klass, block| + define_method :"test_predicate_#{block}" do + rb = Psych.parse_stream("---\n- foo: bar\n- &a !!str Anchored\n- *a") + nodes = rb.grep(klass) + assert_operator nodes.length, :>, 0 + assert_equal nodes, rb.find_all(&block) + end + end + def test_parse_partial rb = Psych.parse("--- foo\n...\n--- `").to_ruby assert_equal 'foo', rb -- cgit v1.2.3