File: traverse_spec.rb

package info (click to toggle)
ruby-regexp-parser 2.6.1-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 968 kB
  • sloc: ruby: 6,396; sh: 12; makefile: 6
file content (161 lines) | stat: -rw-r--r-- 4,063 bytes parent folder | download
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
require 'spec_helper'

RSpec.describe('Subexpression#traverse') do
  specify('Subexpression#traverse') do
    root = RP.parse(/a(b(c(d)))|g[h-i]j|klmn/)

    enters = 0
    visits = 0
    exits = 0

    root.traverse do |event, _exp, _index|
      enters = (enters + 1) if event == :enter
      visits = (visits + 1) if event == :visit
      exits = (exits + 1) if event == :exit
    end

    expect(enters).to eq 9
    expect(enters).to eq exits

    expect(visits).to eq 9
  end

  specify('Subexpression#traverse including self') do
    root = RP.parse(/a(b(c(d)))|g[h-i]j|klmn/)

    enters = 0
    visits = 0
    exits = 0

    root.traverse(true) do |event, _exp, _index|
      enters = (enters + 1) if event == :enter
      visits = (visits + 1) if event == :visit
      exits = (exits + 1) if event == :exit
    end

    expect(enters).to eq 10
    expect(enters).to eq exits

    expect(visits).to eq 9
  end

  specify('Subexpression#traverse without a block') do
    root = RP.parse(/abc/)
    enum = root.traverse

    expect(enum).to be_a(Enumerator)
    event, expr, idx = enum.next
    expect(event).to eq(:visit)
    expect(expr).to be_a(Regexp::Expression::Literal)
    expect(idx).to eq(0)
  end

  specify('Subexpression#walk alias') do
    root = RP.parse(/abc/)

    expect(root).to respond_to(:walk)
  end

  specify('Subexpression#each_expression') do
    root = RP.parse(/a(?x:b(c))|g[h-k]/)

    count = 0
    root.each_expression { count += 1 }

    expect(count).to eq 13
  end

  specify('Subexpression#each_expression including self') do
    root = RP.parse(/a(?x:b(c))|g[h-k]/)

    count = 0
    root.each_expression(true) { count += 1 }

    expect(count).to eq 14
  end

  specify('Subexpression#each_expression indices') do
    root = RP.parse(/a(b)c/)

    indices = []
    root.each_expression { |_exp, index| (indices << index) }

    expect(indices).to eq [0, 1, 0, 2]
  end

  specify('Subexpression#each_expression indices including self') do
    root = RP.parse(/a(b)c/)

    indices = []
    root.each_expression(true) { |_exp, index| (indices << index) }

    expect(indices).to eq [0, 0, 1, 0, 2]
  end

  specify('Subexpression#each_expression without a block') do
    root = RP.parse(/abc/)
    enum = root.each_expression

    expect(enum).to be_a(Enumerator)
    expr, idx = enum.next
    expect(expr).to be_a(Regexp::Expression::Literal)
    expect(idx).to eq(0)
  end

  specify('Subexpression#flat_map without block') do
    root = RP.parse(/a(b([c-e]+))?/)

    array = root.flat_map

    expect(array).to be_instance_of(Array)
    expect(array.length).to eq 8

    array.each do |item|
      expect(item).to be_instance_of(Array)
      expect(item.length).to eq 2
      expect(item.first).to be_a(Regexp::Expression::Base)
      expect(item.last).to be_a(Integer)
    end
  end

  specify('Subexpression#flat_map without block including self') do
    root = RP.parse(/a(b([c-e]+))?/)

    array = root.flat_map(true)

    expect(array).to be_instance_of(Array)
    expect(array.length).to eq 9
  end

  specify('Subexpression#flat_map indices') do
    root = RP.parse(/a(b([c-e]+))?f*g/)

    indices = root.flat_map { |_exp, index| index }

    expect(indices).to eq [0, 1, 0, 1, 0, 0, 0, 1, 2, 3]
  end

  specify('Subexpression#flat_map indices including self') do
    root = RP.parse(/a(b([c-e]+))?f*g/)

    indices = root.flat_map(true) { |_exp, index| index }

    expect(indices).to eq [0, 0, 1, 0, 1, 0, 0, 0, 1, 2, 3]
  end

  specify('Subexpression#flat_map expressions') do
    root = RP.parse(/a(b(c(d)))/)

    levels = root.flat_map { |exp, _index| [exp.level, exp.text] if exp.terminal? }.compact

    expect(levels).to eq [[0, 'a'], [1, 'b'], [2, 'c'], [3, 'd']]
  end

  specify('Subexpression#flat_map expressions including self') do
    root = RP.parse(/a(b(c(d)))/)

    levels = root.flat_map(true) { |exp, _index| [exp.level, exp.to_s] }.compact

    expect(levels).to eq [[0, 'a(b(c(d)))'], [0, 'a'], [0, '(b(c(d)))'], [1, 'b'], [1, '(c(d))'], [2, 'c'], [2, '(d)'], [3, 'd']]
  end
end