regexp_parser 0.1.1 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/ChangeLog +45 -0
- data/Rakefile +12 -44
- data/VERSION.yml +5 -0
- data/lib/regexp_parser.rb +5 -38
- data/lib/regexp_parser/expression.rb +68 -221
- data/lib/regexp_parser/expression/classes/alternation.rb +47 -0
- data/lib/regexp_parser/expression/classes/anchor.rb +26 -0
- data/lib/regexp_parser/expression/classes/backref.rb +42 -0
- data/lib/regexp_parser/expression/classes/escape.rb +27 -0
- data/lib/regexp_parser/expression/classes/group.rb +67 -0
- data/lib/regexp_parser/expression/classes/literal.rb +7 -0
- data/lib/regexp_parser/expression/{property.rb → classes/property.rb} +1 -1
- data/lib/regexp_parser/expression/classes/root.rb +26 -0
- data/lib/regexp_parser/expression/classes/set.rb +100 -0
- data/lib/regexp_parser/expression/classes/type.rb +17 -0
- data/lib/regexp_parser/expression/quantifier.rb +26 -0
- data/lib/regexp_parser/expression/subexpression.rb +69 -0
- data/lib/regexp_parser/lexer.rb +4 -4
- data/lib/regexp_parser/parser.rb +31 -13
- data/lib/regexp_parser/scanner.rb +1849 -1488
- data/lib/regexp_parser/scanner/property.rl +7 -2
- data/lib/regexp_parser/scanner/scanner.rl +377 -191
- data/lib/regexp_parser/syntax.rb +7 -0
- data/lib/regexp_parser/syntax/ruby/1.8.6.rb +4 -4
- data/lib/regexp_parser/syntax/ruby/1.9.1.rb +9 -9
- data/lib/regexp_parser/syntax/ruby/2.0.0.rb +16 -0
- data/lib/regexp_parser/syntax/ruby/2.1.0.rb +13 -0
- data/lib/regexp_parser/syntax/tokens.rb +21 -320
- data/lib/regexp_parser/syntax/tokens/anchor.rb +17 -0
- data/lib/regexp_parser/syntax/tokens/assertion.rb +15 -0
- data/lib/regexp_parser/syntax/tokens/backref.rb +26 -0
- data/lib/regexp_parser/syntax/tokens/character_set.rb +48 -0
- data/lib/regexp_parser/syntax/tokens/character_type.rb +16 -0
- data/lib/regexp_parser/syntax/tokens/escape.rb +29 -0
- data/lib/regexp_parser/syntax/tokens/group.rb +22 -0
- data/lib/regexp_parser/syntax/tokens/meta.rb +15 -0
- data/lib/regexp_parser/syntax/tokens/quantifier.rb +37 -0
- data/lib/regexp_parser/syntax/tokens/unicode_property.rb +204 -0
- data/lib/regexp_parser/token.rb +37 -0
- data/test/expression/test_all.rb +7 -0
- data/test/expression/test_base.rb +72 -0
- data/test/expression/test_clone.rb +144 -0
- data/test/{parser/test_expression.rb → expression/test_to_s.rb} +10 -10
- data/test/helpers.rb +1 -0
- data/test/parser/test_all.rb +1 -1
- data/test/parser/test_alternation.rb +35 -0
- data/test/parser/test_anchors.rb +2 -2
- data/test/parser/test_refcalls.rb +1 -1
- data/test/parser/test_sets.rb +54 -8
- data/test/scanner/test_anchors.rb +2 -2
- data/test/scanner/test_conditionals.rb +31 -0
- data/test/scanner/test_errors.rb +88 -8
- data/test/scanner/test_escapes.rb +4 -4
- data/test/scanner/test_groups.rb +7 -0
- data/test/scanner/test_quoting.rb +29 -0
- data/test/scanner/test_sets.rb +1 -0
- data/test/syntax/ruby/test_1.8.rb +3 -3
- data/test/test_all.rb +1 -1
- metadata +62 -48
- data/lib/regexp_parser/expression/set.rb +0 -59
@@ -0,0 +1,72 @@
|
|
1
|
+
require File.expand_path("../../helpers", __FILE__)
|
2
|
+
|
3
|
+
class ExpressionBase < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_expression_to_re
|
6
|
+
re_text = '^a*(b([cde]+))+f?$'
|
7
|
+
|
8
|
+
re = RP.parse(re_text).to_re
|
9
|
+
|
10
|
+
assert( re.is_a?(::Regexp),
|
11
|
+
'Not a Regexp, but should be')
|
12
|
+
|
13
|
+
assert_equal( re.source, re_text )
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_expression_terminal?
|
17
|
+
root = RP.parse('^a([b]+)c$')
|
18
|
+
|
19
|
+
assert_equal( false, root.terminal? )
|
20
|
+
|
21
|
+
assert_equal( true, root[0].terminal? )
|
22
|
+
assert_equal( true, root[1].terminal? )
|
23
|
+
assert_equal( false, root[2].terminal? )
|
24
|
+
assert_equal( true, root[2][0].terminal? )
|
25
|
+
assert_equal( true, root[3].terminal? )
|
26
|
+
assert_equal( true, root[4].terminal? )
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_expression_alt_terminal?
|
30
|
+
root = RP.parse('^(ab|cd)$')
|
31
|
+
|
32
|
+
assert_equal( false, root.terminal? )
|
33
|
+
|
34
|
+
assert_equal( true, root[0].terminal? )
|
35
|
+
assert_equal( false, root[1].terminal? )
|
36
|
+
assert_equal( false, root[1][0].terminal? )
|
37
|
+
assert_equal( false, root[1][0][0].terminal? )
|
38
|
+
assert_equal( true, root[1][0][0][0].terminal? )
|
39
|
+
assert_equal( false, root[1][0][1].terminal? )
|
40
|
+
assert_equal( true, root[1][0][1][0].terminal? )
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_expression_coded_offset
|
44
|
+
root = RP.parse('^a*(b+(c?))$')
|
45
|
+
|
46
|
+
assert_equal( '@0+12', root.coded_offset )
|
47
|
+
|
48
|
+
# All top level offsets
|
49
|
+
checks = [
|
50
|
+
[ '@0+1', '^' ],
|
51
|
+
[ '@1+2', 'a*' ],
|
52
|
+
[ '@3+8', '(b+(c?))' ],
|
53
|
+
['@11+1', '$' ],
|
54
|
+
].each_with_index do |check, i|
|
55
|
+
against = [ root[i].coded_offset, root[i].to_s ]
|
56
|
+
assert_equal( check, against )
|
57
|
+
end
|
58
|
+
|
59
|
+
# Nested expression
|
60
|
+
assert_equal(['@4+2', 'b+'],
|
61
|
+
[root[2][0].coded_offset, root[2][0].to_s])
|
62
|
+
|
63
|
+
# Nested subexpression
|
64
|
+
assert_equal(['@6+4', '(c?)'],
|
65
|
+
[root[2][1].coded_offset, root[2][1].to_s])
|
66
|
+
|
67
|
+
# Nested subexpression expression
|
68
|
+
assert_equal(['@7+2', 'c?'],
|
69
|
+
[root[2][1][0].coded_offset, root[2][1][0].to_s])
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
@@ -0,0 +1,144 @@
|
|
1
|
+
require File.expand_path("../../helpers", __FILE__)
|
2
|
+
|
3
|
+
class ExpressionClone < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_expression_clone_base
|
6
|
+
root = RP.parse(/^(?i:a)b+$/i)
|
7
|
+
copy = root.clone
|
8
|
+
|
9
|
+
assert_not_equal(copy.object_id, root.object_id)
|
10
|
+
|
11
|
+
# The text content is equal but the objects are not.
|
12
|
+
assert_equal(copy.text, root.text)
|
13
|
+
assert_not_equal(copy.text.object_id, root.text.object_id)
|
14
|
+
|
15
|
+
root_1 = root.expressions[1]
|
16
|
+
copy_1 = copy.expressions[1]
|
17
|
+
|
18
|
+
# The options hash contents are equal but the objects are not.
|
19
|
+
assert_equal(copy_1.options, root_1.options)
|
20
|
+
assert_not_equal(copy_1.options.object_id,
|
21
|
+
root_1.options.object_id)
|
22
|
+
|
23
|
+
root_2 = root.expressions[2]
|
24
|
+
copy_2 = copy.expressions[2]
|
25
|
+
|
26
|
+
assert( root_2.quantified? )
|
27
|
+
assert( copy_2.quantified? )
|
28
|
+
|
29
|
+
# The quantifier contents are equal but the objects are not.
|
30
|
+
assert_equal(copy_2.quantifier.text, root_2.quantifier.text)
|
31
|
+
|
32
|
+
assert_not_equal(copy_2.quantifier.text.object_id,
|
33
|
+
root_2.quantifier.text.object_id)
|
34
|
+
|
35
|
+
assert_not_equal(copy_2.quantifier.object_id,
|
36
|
+
root_2.quantifier.object_id)
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_expression_clone_subexpression
|
40
|
+
root = RP.parse(/^a(b([cde])f)g$/)
|
41
|
+
copy = root.clone
|
42
|
+
|
43
|
+
assert( root.respond_to?(:expressions) )
|
44
|
+
assert( copy.respond_to?(:expressions) )
|
45
|
+
|
46
|
+
# The expressions arrays are not equal.
|
47
|
+
assert_not_equal(copy.expressions.object_id,
|
48
|
+
root.expressions.object_id)
|
49
|
+
|
50
|
+
# The expressions in the arrays are not equal.
|
51
|
+
copy.expressions.each_with_index do |e, ei|
|
52
|
+
assert_not_equal(e.object_id,
|
53
|
+
root.expressions[ei].object_id)
|
54
|
+
end
|
55
|
+
|
56
|
+
# The expressions in nested expressions are not equal.
|
57
|
+
copy.expressions[2].each_with_index do |e, ei|
|
58
|
+
assert_not_equal(e.object_id,
|
59
|
+
root.expressions[2][ei].object_id)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# ruby 1.8 does not implement named groups
|
64
|
+
def test_expression_clone_named_group
|
65
|
+
root = RP.parse('^(?<somename>a)+bc$')
|
66
|
+
copy = root.clone
|
67
|
+
|
68
|
+
root_1 = root.expressions[1]
|
69
|
+
copy_1 = copy.expressions[1]
|
70
|
+
|
71
|
+
# The names are equal but their objects are not.
|
72
|
+
assert_equal(copy_1.name, root_1.name)
|
73
|
+
assert_not_equal(copy_1.name.object_id,
|
74
|
+
root_1.name.object_id)
|
75
|
+
|
76
|
+
# Verify super: text objects should be different.
|
77
|
+
assert_equal(copy_1.text, root_1.text)
|
78
|
+
|
79
|
+
# Verify super: expressions arrays are not equal.
|
80
|
+
assert_not_equal(copy_1.expressions.object_id,
|
81
|
+
root_1.expressions.object_id)
|
82
|
+
|
83
|
+
# Verify super: expressions in the arrays are not equal.
|
84
|
+
copy_1.expressions.each_with_index do |e, ei|
|
85
|
+
assert_not_equal(e.object_id,
|
86
|
+
root_1.expressions[ei].object_id)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_expression_clone_set
|
91
|
+
root = RP.parse(/^a(b([cde])f)g$/)
|
92
|
+
copy = root.clone
|
93
|
+
|
94
|
+
root_2_1 = root.expressions[2][1]
|
95
|
+
|
96
|
+
copy.expressions[2][1].each_with_index do |e, ei|
|
97
|
+
assert( e.respond_to?(:members) )
|
98
|
+
|
99
|
+
# The members arrays are not equal.
|
100
|
+
assert_not_equal( e.members.object_id, root_2_1[ei].members.object_id )
|
101
|
+
|
102
|
+
# The members in the arrays are not equal.
|
103
|
+
e.members.each_with_index do |m, mi|
|
104
|
+
assert_not_equal( m.object_id, root_2_1[ei].members[mi].object_id )
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_expression_clone_subset
|
110
|
+
# Explicitly set syntax to ruby 1.9 because 1.8 does not
|
111
|
+
# implement subsets.
|
112
|
+
root = RP.parse('^a(b([c[def]g])h)i$', 'ruby/1.9')
|
113
|
+
copy = root.clone
|
114
|
+
|
115
|
+
root_set = root.expressions[2][1][0]
|
116
|
+
copy_set = copy.expressions[2][1][0]
|
117
|
+
|
118
|
+
root_subset = root_set.members[1]
|
119
|
+
copy_subset = copy_set.members[1]
|
120
|
+
|
121
|
+
# Sanity checks
|
122
|
+
assert( root_set.respond_to?(:members) )
|
123
|
+
assert( copy_set.respond_to?(:members) )
|
124
|
+
|
125
|
+
assert( root_subset.respond_to?(:members) )
|
126
|
+
assert( copy_subset.respond_to?(:members) )
|
127
|
+
|
128
|
+
# The sets are not equal
|
129
|
+
assert_not_equal(copy_set.object_id, root_set.object_id)
|
130
|
+
|
131
|
+
# The subsets are not equal
|
132
|
+
assert_not_equal(copy_subset.object_id, root_subset.object_id)
|
133
|
+
|
134
|
+
# The subsets' members arrays are not equal.
|
135
|
+
assert_not_equal( copy_subset.members.object_id,
|
136
|
+
root_subset.members.object_id )
|
137
|
+
|
138
|
+
# The subsets' members are not equal
|
139
|
+
copy_subset.members.each_with_index do |m, mi|
|
140
|
+
assert_not_equal(m.object_id, root_subset.members[mi].object_id)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
end
|
@@ -1,48 +1,48 @@
|
|
1
1
|
require File.expand_path("../../helpers", __FILE__)
|
2
2
|
|
3
|
-
class
|
3
|
+
class ExpressionToS < Test::Unit::TestCase
|
4
4
|
|
5
|
-
def
|
5
|
+
def test_expression_to_s_literal_alternation
|
6
6
|
pattern = 'abcd|ghij|klmn|pqur'
|
7
7
|
assert_equal( pattern, RP.parse(pattern).to_s )
|
8
8
|
end
|
9
9
|
|
10
|
-
def
|
10
|
+
def test_expression_to_s_quantified_alternations
|
11
11
|
pattern = '(?:a?[b]+(c){2}|d+[e]*(f)?)|(?:g+[h]?(i){2,3}|j*[k]{3,5}(l)?)'
|
12
12
|
assert_equal( pattern, RP.parse(pattern).to_s )
|
13
13
|
end
|
14
14
|
|
15
|
-
def
|
15
|
+
def test_expression_to_s_quantified_sets
|
16
16
|
pattern = '[abc]+|[^def]{3,6}'
|
17
17
|
assert_equal( pattern, RP.parse(pattern).to_s )
|
18
18
|
end
|
19
19
|
|
20
|
-
def
|
20
|
+
def test_expression_to_s_property_sets
|
21
21
|
pattern = '[\a\b\p{Lu}\P{Z}\c\d]+'
|
22
22
|
assert_equal( pattern, RP.parse(pattern, 'ruby/1.9').to_s )
|
23
23
|
end
|
24
24
|
|
25
|
-
def
|
25
|
+
def test_expression_to_s_groups
|
26
26
|
pattern = "(a(?>b(?:c(?<n>d(?'N'e)??f)+g)*+h)*i)++"
|
27
27
|
assert_equal( pattern, RP.parse(pattern, 'ruby/1.9').to_s )
|
28
28
|
end
|
29
29
|
|
30
|
-
def
|
30
|
+
def test_expression_to_s_assertions
|
31
31
|
pattern = '(a+(?=b+(?!c+(?<=d+(?<!e+)?f+)?g+)?h+)?i+)?'
|
32
32
|
assert_equal( pattern, RP.parse(pattern, 'ruby/1.9').to_s )
|
33
33
|
end
|
34
34
|
|
35
|
-
def
|
35
|
+
def test_expression_to_s_comments
|
36
36
|
pattern = '(?#start)a(?#middle)b(?#end)'
|
37
37
|
assert_equal( pattern, RP.parse(pattern).to_s )
|
38
38
|
end
|
39
39
|
|
40
|
-
def
|
40
|
+
def test_expression_to_s_options
|
41
41
|
pattern = '(?mix:start)a(?-mix:middle)b(?i-mx:end)'
|
42
42
|
assert_equal( pattern, RP.parse(pattern).to_s )
|
43
43
|
end
|
44
44
|
|
45
|
-
def
|
45
|
+
def test_expression_to_s_url
|
46
46
|
pattern = '(^$)|(^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*'+
|
47
47
|
'\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$)'
|
48
48
|
assert_equal( pattern, RP.parse(pattern).to_s )
|
data/test/helpers.rb
CHANGED
data/test/parser/test_all.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require File.expand_path("../../helpers", __FILE__)
|
2
2
|
|
3
3
|
%w{
|
4
|
-
alternation anchors errors escapes
|
4
|
+
alternation anchors errors escapes groups properties
|
5
5
|
quantifiers refcalls sets
|
6
6
|
}.each do|tc|
|
7
7
|
require File.expand_path("../test_#{tc}", __FILE__)
|
@@ -43,4 +43,39 @@ class ParserAlternation < Test::Unit::TestCase
|
|
43
43
|
assert_equal( 2, nested.expressions.length )
|
44
44
|
end
|
45
45
|
|
46
|
+
def test_parse_alternation_nested_groups
|
47
|
+
root = RP.parse('(i|ey|([ougfd]+)|(ney))')
|
48
|
+
|
49
|
+
alts = root.expressions[0][0].alternatives
|
50
|
+
assert_equal( 4, alts.length )
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_parse_alternation_grouped_alts
|
54
|
+
root = RP.parse('ca((n)|(t)|(ll)|(b))')
|
55
|
+
|
56
|
+
alts = root.expressions[1][0].alternatives
|
57
|
+
|
58
|
+
assert_equal( 4, alts.length )
|
59
|
+
assert_equal( true, alts[0].is_a?(Sequence) )
|
60
|
+
assert_equal( true, alts[1].is_a?(Sequence) )
|
61
|
+
assert_equal( true, alts[2].is_a?(Sequence) )
|
62
|
+
assert_equal( true, alts[3].is_a?(Sequence) )
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_parse_alternation_nested_grouped_alts
|
66
|
+
root = RP.parse('ca((n|t)|(ll|b))')
|
67
|
+
|
68
|
+
alts = root.expressions[1][0].alternatives
|
69
|
+
|
70
|
+
assert_equal( 2, alts.length )
|
71
|
+
assert_equal( true, alts[0].is_a?(Sequence) )
|
72
|
+
assert_equal( true, alts[1].is_a?(Sequence) )
|
73
|
+
|
74
|
+
subalts = root.expressions[1][0][0][0][0].alternatives
|
75
|
+
|
76
|
+
assert_equal( 2, alts.length )
|
77
|
+
assert_equal( true, subalts[0].is_a?(Sequence) )
|
78
|
+
assert_equal( true, subalts[1].is_a?(Sequence) )
|
79
|
+
end
|
80
|
+
|
46
81
|
end
|
data/test/parser/test_anchors.rb
CHANGED
@@ -3,8 +3,8 @@ require File.expand_path("../../helpers", __FILE__)
|
|
3
3
|
class TestParserAnchors < Test::Unit::TestCase
|
4
4
|
|
5
5
|
tests = {
|
6
|
-
'^a' => [0, :anchor, :
|
7
|
-
'a$' => [1, :anchor, :
|
6
|
+
'^a' => [0, :anchor, :bol, Anchor::BOL],
|
7
|
+
'a$' => [1, :anchor, :eol, Anchor::EOL],
|
8
8
|
|
9
9
|
'\Aa' => [0, :anchor, :bos, Anchor::BOS],
|
10
10
|
'a\z' => [1, :anchor, :eos, Anchor::EOS],
|
data/test/parser/test_sets.rb
CHANGED
@@ -23,10 +23,8 @@ class TestParserSets < Test::Unit::TestCase
|
|
23
23
|
|
24
24
|
assert_equal( true, exp.matches?("6") )
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
#assert_equal( true, exp.matches?("v") )
|
29
|
-
#assert_equal( false, exp.matches?("\x48") )
|
26
|
+
assert_equal( true, exp.matches?("v") )
|
27
|
+
assert_equal( false, exp.matches?("\x48") )
|
30
28
|
end
|
31
29
|
|
32
30
|
def test_parse_set_members
|
@@ -67,16 +65,64 @@ class TestParserSets < Test::Unit::TestCase
|
|
67
65
|
assert_equal( true, exp.include?('c') )
|
68
66
|
end
|
69
67
|
|
68
|
+
def test_parse_set_nesting_include_at_depth
|
69
|
+
exp = RP.parse('[a[b]c]', 'ruby/1.9')[0]
|
70
|
+
|
71
|
+
assert_equal( true, exp.is_a?(CharacterSet) )
|
72
|
+
assert_equal( true, exp.include?('a') )
|
73
|
+
assert_equal( true, exp.include?('b') )
|
74
|
+
assert_equal( false, exp.include?('b', true) ) # should not include b directly
|
75
|
+
|
76
|
+
sub = exp.members[1]
|
77
|
+
assert_equal( false, sub.include?('a') )
|
78
|
+
assert_equal( true, sub.include?('b') )
|
79
|
+
assert_equal( true, sub.include?('b', true) )
|
80
|
+
assert_equal( false, sub.include?('c') )
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_parse_set_nesting_include_at_depth_2
|
84
|
+
exp = RP.parse('[a[b[c[d]e]f]g]', 'ruby/1.9')[0]
|
85
|
+
|
86
|
+
assert_equal( true, exp.is_a?(CharacterSet) )
|
87
|
+
assert_equal( true, exp.include?('a') )
|
88
|
+
assert_equal( true, exp.include?('b') )
|
89
|
+
assert_equal( false, exp.include?('b', true) ) # should not include b directly
|
90
|
+
|
91
|
+
sub = exp.members[1]
|
92
|
+
assert_equal( false, sub.include?('a') )
|
93
|
+
assert_equal( true, sub.include?('b') )
|
94
|
+
assert_equal( true, sub.include?('b', true) )
|
95
|
+
assert_equal( true, sub.include?('f', true) )
|
96
|
+
assert_equal( true, sub.include?('c') )
|
97
|
+
assert_equal( false, sub.include?('c', true) )
|
98
|
+
|
99
|
+
sub2 = sub.members[1]
|
100
|
+
assert_equal( false, sub2.include?('a') )
|
101
|
+
assert_equal( false, sub2.include?('b') )
|
102
|
+
assert_equal( true, sub2.include?('c') )
|
103
|
+
assert_equal( true, sub2.include?('c', true) )
|
104
|
+
assert_equal( true, sub2.include?('e', true) )
|
105
|
+
assert_equal( true, sub2.include?('d') )
|
106
|
+
assert_equal( false, sub2.include?('d', true) )
|
107
|
+
|
108
|
+
sub3 = sub2.members[1]
|
109
|
+
assert_equal( false, sub3.include?('a') )
|
110
|
+
assert_equal( false, sub3.include?('g') )
|
111
|
+
assert_equal( false, sub3.include?('b') )
|
112
|
+
assert_equal( false, sub3.include?('f') )
|
113
|
+
assert_equal( false, sub3.include?('c') )
|
114
|
+
assert_equal( false, sub3.include?('e') )
|
115
|
+
assert_equal( true, sub3.include?('d') )
|
116
|
+
assert_equal( true, sub3.include?('d', true) )
|
117
|
+
end
|
118
|
+
|
70
119
|
# character subsets and negated posix classes are not available in ruby 1.8
|
71
120
|
if RUBY_VERSION >= '1.9'
|
72
121
|
def test_parse_set_nesting_matches
|
73
122
|
exp = RP.parse('[a[b[^c]]]', 'ruby/1.9')[0]
|
74
123
|
|
75
124
|
assert_equal( true, exp.matches?("b") )
|
76
|
-
|
77
|
-
# TODO: figure out why this generate wrong string, but only after
|
78
|
-
# the assertion above (to_s "piles up")
|
79
|
-
#assert_equal( false, exp.matches?("c") )
|
125
|
+
assert_equal( false, exp.matches?("c") )
|
80
126
|
end
|
81
127
|
|
82
128
|
def test_parse_set_nesting_not_matches
|