summaryrefslogtreecommitdiff
path: root/test/psych/test_stream.rb
blob: 9b71c6d9965febdb0e9b1a2fe5007eec73c5eb16 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# frozen_string_literal: true
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
    end

    def test_load_partial
      rb = Psych.load("--- foo\n...\n--- `")
      assert_equal 'foo', rb
    end

    def test_parse_stream_yields_documents
      list = []
      Psych.parse_stream("--- foo\n...\n--- bar") do |doc|
        list << doc.to_ruby
      end
      assert_equal %w{ foo bar }, list
    end

    def test_parse_stream_break
      list = []
      Psych.parse_stream("--- foo\n...\n--- `") do |doc|
        list << doc.to_ruby
        break
      end
      assert_equal %w{ foo }, list
    end

    def test_load_stream_yields_documents
      list = []
      Psych.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|
        list << ruby
        break
      end
      assert_equal %w{ foo }, list
    end

    def test_explicit_documents
      io     = StringIO.new
      stream = Psych::Stream.new(io)
      stream.start
      stream.push({ 'foo' => 'bar' })

      assert !stream.finished?, 'stream not finished'
      stream.finish
      assert stream.finished?, 'stream finished'

      assert_match(/^---/, io.string)
      assert_match(/\.\.\.$/, io.string)
    end

    def test_start_takes_block
      io     = StringIO.new
      stream = Psych::Stream.new(io)
      stream.start do |emitter|
        emitter.push({ 'foo' => 'bar' })
      end

      assert stream.finished?, 'stream finished'
      assert_match(/^---/, io.string)
      assert_match(/\.\.\.$/, io.string)
    end

    def test_no_backreferences
      io     = StringIO.new
      stream = Psych::Stream.new(io)
      stream.start do |emitter|
        x = { 'foo' => 'bar' }
        emitter.push x
        emitter.push x
      end

      assert stream.finished?, 'stream finished'
      assert_match(/^---/, io.string)
      assert_match(/\.\.\.$/, io.string)
      assert_equal 2, io.string.scan('---').length
      assert_equal 2, io.string.scan('...').length
      assert_equal 2, io.string.scan('foo').length
      assert_equal 2, io.string.scan('bar').length
    end
  end
end