regexp_parser 1.4.0 → 1.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +27 -1
- data/Gemfile +1 -1
- data/README.md +9 -13
- data/lib/regexp_parser/expression.rb +33 -21
- data/lib/regexp_parser/expression/classes/backref.rb +18 -10
- data/lib/regexp_parser/expression/classes/conditional.rb +4 -0
- data/lib/regexp_parser/expression/classes/group.rb +4 -2
- data/lib/regexp_parser/expression/classes/keep.rb +1 -3
- data/lib/regexp_parser/expression/methods/match_length.rb +172 -0
- data/lib/regexp_parser/expression/quantifier.rb +2 -2
- data/lib/regexp_parser/expression/sequence.rb +0 -4
- data/lib/regexp_parser/expression/subexpression.rb +3 -5
- data/lib/regexp_parser/lexer.rb +31 -24
- data/lib/regexp_parser/parser.rb +25 -3
- data/lib/regexp_parser/syntax/tokens.rb +2 -10
- data/lib/regexp_parser/version.rb +1 -1
- data/regexp_parser.gemspec +2 -2
- data/spec/expression/base_spec.rb +80 -0
- data/spec/expression/clone_spec.rb +120 -0
- data/spec/expression/conditional_spec.rb +89 -0
- data/spec/expression/free_space_spec.rb +27 -0
- data/spec/expression/methods/match_length_spec.rb +141 -0
- data/spec/expression/methods/strfregexp_spec.rb +224 -0
- data/spec/expression/methods/tests_spec.rb +97 -0
- data/spec/expression/methods/traverse_spec.rb +140 -0
- data/spec/expression/subexpression_spec.rb +50 -0
- data/spec/expression/to_h_spec.rb +26 -0
- data/spec/expression/to_s_spec.rb +100 -0
- data/spec/lexer/all_spec.rb +22 -0
- data/{test/lexer/test_conditionals.rb → spec/lexer/conditionals_spec.rb} +31 -35
- data/spec/lexer/escapes_spec.rb +38 -0
- data/spec/lexer/keep_spec.rb +22 -0
- data/{test/lexer/test_literals.rb → spec/lexer/literals_spec.rb} +20 -24
- data/{test/lexer/test_nesting.rb → spec/lexer/nesting_spec.rb} +11 -13
- data/spec/lexer/refcalls_spec.rb +54 -0
- data/spec/parser/all_spec.rb +31 -0
- data/spec/parser/alternation_spec.rb +88 -0
- data/{test/parser/test_anchors.rb → spec/parser/anchors_spec.rb} +7 -10
- data/spec/parser/conditionals_spec.rb +179 -0
- data/spec/parser/errors_spec.rb +51 -0
- data/spec/parser/escapes_spec.rb +132 -0
- data/spec/parser/free_space_spec.rb +130 -0
- data/spec/parser/groups_spec.rb +267 -0
- data/spec/parser/keep_spec.rb +19 -0
- data/spec/parser/posix_classes_spec.rb +27 -0
- data/spec/parser/properties_spec.rb +127 -0
- data/spec/parser/quantifiers_spec.rb +293 -0
- data/spec/parser/refcalls_spec.rb +237 -0
- data/spec/parser/set/intersections_spec.rb +127 -0
- data/spec/parser/set/ranges_spec.rb +111 -0
- data/spec/parser/sets_spec.rb +178 -0
- data/{test/parser/test_types.rb → spec/parser/types_spec.rb} +13 -20
- data/spec/scanner/all_spec.rb +18 -0
- data/{test/scanner/test_anchors.rb → spec/scanner/anchors_spec.rb} +8 -10
- data/{test/scanner/test_conditionals.rb → spec/scanner/conditionals_spec.rb} +49 -53
- data/spec/scanner/errors_spec.rb +90 -0
- data/{test/scanner/test_escapes.rb → spec/scanner/escapes_spec.rb} +8 -10
- data/{test/scanner/test_free_space.rb → spec/scanner/free_space_spec.rb} +48 -52
- data/{test/scanner/test_groups.rb → spec/scanner/groups_spec.rb} +33 -41
- data/spec/scanner/keep_spec.rb +33 -0
- data/{test/scanner/test_literals.rb → spec/scanner/literals_spec.rb} +8 -12
- data/{test/scanner/test_meta.rb → spec/scanner/meta_spec.rb} +8 -10
- data/{test/scanner/test_properties.rb → spec/scanner/properties_spec.rb} +14 -19
- data/{test/scanner/test_quantifiers.rb → spec/scanner/quantifiers_spec.rb} +7 -9
- data/{test/scanner/test_refcalls.rb → spec/scanner/refcalls_spec.rb} +9 -9
- data/{test/scanner/test_scripts.rb → spec/scanner/scripts_spec.rb} +8 -12
- data/{test/scanner/test_sets.rb → spec/scanner/sets_spec.rb} +14 -17
- data/spec/scanner/types_spec.rb +29 -0
- data/spec/scanner/unicode_blocks_spec.rb +28 -0
- data/spec/spec_helper.rb +14 -0
- data/{test → spec}/support/runner.rb +9 -8
- data/{test → spec}/support/warning_extractor.rb +5 -7
- data/spec/syntax/syntax_spec.rb +44 -0
- data/spec/syntax/syntax_token_map_spec.rb +23 -0
- data/spec/syntax/versions/1.8.6_spec.rb +38 -0
- data/spec/syntax/versions/1.9.1_spec.rb +23 -0
- data/spec/syntax/versions/1.9.3_spec.rb +22 -0
- data/spec/syntax/versions/2.0.0_spec.rb +28 -0
- data/spec/syntax/versions/2.2.0_spec.rb +22 -0
- data/spec/syntax/versions/aliases_spec.rb +119 -0
- data/spec/token/token_spec.rb +85 -0
- metadata +131 -140
- data/test/expression/test_all.rb +0 -12
- data/test/expression/test_base.rb +0 -90
- data/test/expression/test_clone.rb +0 -89
- data/test/expression/test_conditionals.rb +0 -113
- data/test/expression/test_free_space.rb +0 -35
- data/test/expression/test_set.rb +0 -84
- data/test/expression/test_strfregexp.rb +0 -230
- data/test/expression/test_subexpression.rb +0 -58
- data/test/expression/test_tests.rb +0 -99
- data/test/expression/test_to_h.rb +0 -59
- data/test/expression/test_to_s.rb +0 -104
- data/test/expression/test_traverse.rb +0 -161
- data/test/helpers.rb +0 -10
- data/test/lexer/test_all.rb +0 -41
- data/test/lexer/test_keep.rb +0 -24
- data/test/lexer/test_refcalls.rb +0 -56
- data/test/parser/set/test_intersections.rb +0 -127
- data/test/parser/set/test_ranges.rb +0 -111
- data/test/parser/test_all.rb +0 -64
- data/test/parser/test_alternation.rb +0 -92
- data/test/parser/test_conditionals.rb +0 -187
- data/test/parser/test_errors.rb +0 -63
- data/test/parser/test_escapes.rb +0 -134
- data/test/parser/test_free_space.rb +0 -139
- data/test/parser/test_groups.rb +0 -289
- data/test/parser/test_keep.rb +0 -21
- data/test/parser/test_posix_classes.rb +0 -27
- data/test/parser/test_properties.rb +0 -134
- data/test/parser/test_quantifiers.rb +0 -301
- data/test/parser/test_refcalls.rb +0 -186
- data/test/parser/test_sets.rb +0 -179
- data/test/scanner/test_all.rb +0 -38
- data/test/scanner/test_errors.rb +0 -91
- data/test/scanner/test_keep.rb +0 -35
- data/test/scanner/test_types.rb +0 -35
- data/test/scanner/test_unicode_blocks.rb +0 -30
- data/test/support/disable_autotest.rb +0 -8
- data/test/syntax/test_all.rb +0 -6
- data/test/syntax/test_syntax.rb +0 -61
- data/test/syntax/test_syntax_token_map.rb +0 -25
- data/test/syntax/versions/test_1.8.rb +0 -55
- data/test/syntax/versions/test_1.9.1.rb +0 -36
- data/test/syntax/versions/test_1.9.3.rb +0 -32
- data/test/syntax/versions/test_2.0.0.rb +0 -37
- data/test/syntax/versions/test_2.2.0.rb +0 -32
- data/test/syntax/versions/test_aliases.rb +0 -129
- data/test/syntax/versions/test_all.rb +0 -5
- data/test/test_all.rb +0 -5
- data/test/token/test_all.rb +0 -2
- data/test/token/test_token.rb +0 -107
@@ -1,7 +1,6 @@
|
|
1
|
-
require
|
2
|
-
|
3
|
-
class ScannerQuantifiers < Test::Unit::TestCase
|
1
|
+
require 'spec_helper'
|
4
2
|
|
3
|
+
RSpec.describe('Quantifier scanning') do
|
5
4
|
tests = {
|
6
5
|
'a?' => [:quantifier, :zero_or_one, '?'],
|
7
6
|
'a??' => [:quantifier, :zero_or_one_reluctant, '??'],
|
@@ -22,16 +21,15 @@ class ScannerQuantifiers < Test::Unit::TestCase
|
|
22
21
|
}
|
23
22
|
|
24
23
|
tests.each_with_index do |(pattern, (type, token, text)), count|
|
25
|
-
name =
|
24
|
+
name = token == :interval ? "interval_#{count}" : token
|
26
25
|
|
27
|
-
|
26
|
+
specify("scan_#{type}_#{name}") do
|
28
27
|
tokens = RS.scan(pattern)
|
29
28
|
result = tokens.last
|
30
29
|
|
31
|
-
|
32
|
-
|
33
|
-
|
30
|
+
expect(result[0]).to eq type
|
31
|
+
expect(result[1]).to eq token
|
32
|
+
expect(result[2]).to eq text
|
34
33
|
end
|
35
34
|
end
|
36
|
-
|
37
35
|
end
|
@@ -1,6 +1,6 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
|
-
|
3
|
+
RSpec.describe('RefCall scanning') do
|
4
4
|
tests = {
|
5
5
|
# Traditional numerical group back-reference
|
6
6
|
'(abc)\1' => [3, :backref, :number, '\1', 5, 7],
|
@@ -37,16 +37,16 @@ class ScannerRefCalls < Test::Unit::TestCase
|
|
37
37
|
}
|
38
38
|
|
39
39
|
tests.each_with_index do |(pattern, (index, type, token, text, ts, te)), count|
|
40
|
-
|
40
|
+
specify("scanner_#{type}_#{token}_#{count}") do
|
41
41
|
tokens = RS.scan(pattern)
|
42
42
|
result = tokens[index]
|
43
43
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
44
|
+
expect(result[0]).to eq type
|
45
|
+
expect(result[1]).to eq token
|
46
|
+
expect(result[2]).to eq text
|
47
|
+
expect(result[3]).to eq ts
|
48
|
+
expect(result[4]).to eq te
|
49
|
+
expect(pattern[ts, te]).to eq text
|
50
50
|
end
|
51
51
|
end
|
52
52
|
end
|
@@ -1,7 +1,6 @@
|
|
1
|
-
require
|
2
|
-
|
3
|
-
class ScannerUnicodeScripts < Test::Unit::TestCase
|
1
|
+
require 'spec_helper'
|
4
2
|
|
3
|
+
RSpec.describe('UnicodeScript scanning') do
|
5
4
|
tests = {
|
6
5
|
'Aghb' => :caucasian_albanian,
|
7
6
|
'Caucasian Albanian' => :caucasian_albanian,
|
@@ -33,21 +32,18 @@ class ScannerUnicodeScripts < Test::Unit::TestCase
|
|
33
32
|
}
|
34
33
|
|
35
34
|
tests.each_with_index do |(property, token), count|
|
36
|
-
|
35
|
+
specify("scanner_property_#{token}_#{count}") do
|
37
36
|
tokens = RS.scan("a\\p{#{property}}c")
|
38
37
|
result = tokens.at(1)
|
39
|
-
|
40
|
-
|
41
|
-
assert_equal token, result[1]
|
38
|
+
expect(result[0]).to eq :property
|
39
|
+
expect(result[1]).to eq token
|
42
40
|
end
|
43
41
|
|
44
|
-
|
42
|
+
specify("scanner_nonproperty_#{token}_#{count}") do
|
45
43
|
tokens = RS.scan("a\\P{#{property}}c")
|
46
44
|
result = tokens.at(1)
|
47
|
-
|
48
|
-
|
49
|
-
assert_equal token, result[1]
|
45
|
+
expect(result[0]).to eq :nonproperty
|
46
|
+
expect(result[1]).to eq token
|
50
47
|
end
|
51
48
|
end
|
52
|
-
|
53
49
|
end
|
@@ -1,9 +1,6 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require File.expand_path("../../helpers", __FILE__)
|
4
|
-
|
5
|
-
class ScannerSets < Test::Unit::TestCase
|
1
|
+
require 'spec_helper'
|
6
2
|
|
3
|
+
RSpec.describe('Set scanning') do
|
7
4
|
tests = {
|
8
5
|
'[a]' => [0, :set, :open, '[', 0, 1],
|
9
6
|
'[b]' => [2, :set, :close, ']', 2, 3],
|
@@ -95,25 +92,25 @@ class ScannerSets < Test::Unit::TestCase
|
|
95
92
|
}
|
96
93
|
|
97
94
|
tests.each_with_index do |(pattern, (index, type, token, text, ts, te)), count|
|
98
|
-
|
95
|
+
specify("scanner_#{type}_#{token}_in_'#{pattern}'_#{count}") do
|
99
96
|
tokens = RS.scan(pattern)
|
100
97
|
result = tokens.at(index)
|
101
98
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
99
|
+
expect(result[0]).to eq type
|
100
|
+
expect(result[1]).to eq token
|
101
|
+
expect(result[2]).to eq text
|
102
|
+
expect(result[3]).to eq ts
|
103
|
+
expect(result[4]).to eq te
|
107
104
|
end
|
108
105
|
end
|
109
106
|
|
110
|
-
|
107
|
+
specify('set literal encoding') do
|
111
108
|
text = RS.scan('[a]')[1][2].to_s
|
112
|
-
|
113
|
-
|
109
|
+
expect(text).to eq 'a'
|
110
|
+
expect(text.encoding.to_s).to eq 'UTF-8'
|
114
111
|
|
115
|
-
text = RS.scan(
|
116
|
-
|
117
|
-
|
112
|
+
text = RS.scan("[\u{1F632}]")[1][2].to_s
|
113
|
+
expect(text).to eq "\u{1F632}"
|
114
|
+
expect(text.encoding.to_s).to eq 'UTF-8'
|
118
115
|
end
|
119
116
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe('Type scanning') do
|
4
|
+
tests = {
|
5
|
+
'a\\dc' => [1, :type, :digit, '\\d', 1, 3],
|
6
|
+
'a\\Dc' => [1, :type, :nondigit, '\\D', 1, 3],
|
7
|
+
'a\\hc' => [1, :type, :hex, '\\h', 1, 3],
|
8
|
+
'a\\Hc' => [1, :type, :nonhex, '\\H', 1, 3],
|
9
|
+
'a\\sc' => [1, :type, :space, '\\s', 1, 3],
|
10
|
+
'a\\Sc' => [1, :type, :nonspace, '\\S', 1, 3],
|
11
|
+
'a\\wc' => [1, :type, :word, '\\w', 1, 3],
|
12
|
+
'a\\Wc' => [1, :type, :nonword, '\\W', 1, 3],
|
13
|
+
'a\\Rc' => [1, :type, :linebreak, '\\R', 1, 3],
|
14
|
+
'a\\Xc' => [1, :type, :xgrapheme, '\\X', 1, 3],
|
15
|
+
}
|
16
|
+
|
17
|
+
tests.each do |(pattern, (index, type, token, text, ts, te))|
|
18
|
+
specify("scanner_#{type}_#{token}") do
|
19
|
+
tokens = RS.scan(pattern)
|
20
|
+
result = tokens.at(index)
|
21
|
+
|
22
|
+
expect(result[0]).to eq type
|
23
|
+
expect(result[1]).to eq token
|
24
|
+
expect(result[2]).to eq text
|
25
|
+
expect(result[3]).to eq ts
|
26
|
+
expect(result[4]).to eq te
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe('UnicodeBlock scanning') do
|
4
|
+
tests = {
|
5
|
+
'InArabic' => :in_arabic,
|
6
|
+
'InCJK_Unified_Ideographs_Extension_A' => :in_cjk_unified_ideographs_extension_a,
|
7
|
+
'In Letterlike Symbols' => :in_letterlike_symbols,
|
8
|
+
'InMiscellaneous_Mathematical_Symbols-A' => :in_miscellaneous_mathematical_symbols_a
|
9
|
+
}
|
10
|
+
|
11
|
+
tests.each_with_index do |(property, token), count|
|
12
|
+
specify("scanner_property_#{token}_#{count}") do
|
13
|
+
tokens = RS.scan("a\\p{#{property}}c")
|
14
|
+
result = tokens.at(1)
|
15
|
+
|
16
|
+
expect(result[0]).to eq :property
|
17
|
+
expect(result[1]).to eq token
|
18
|
+
end
|
19
|
+
|
20
|
+
specify("scanner_nonproperty_#{token}_#{count}") do
|
21
|
+
tokens = RS.scan("a\\P{#{property}}c")
|
22
|
+
result = tokens.at(1)
|
23
|
+
|
24
|
+
expect(result[0]).to eq :nonproperty
|
25
|
+
expect(result[1]).to eq token
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'regexp_parser'
|
2
|
+
require 'regexp_property_values'
|
3
|
+
|
4
|
+
RS = Regexp::Scanner
|
5
|
+
RL = Regexp::Lexer
|
6
|
+
RP = Regexp::Parser
|
7
|
+
RE = Regexp::Expression
|
8
|
+
T = Regexp::Syntax::Token
|
9
|
+
|
10
|
+
include Regexp::Expression
|
11
|
+
|
12
|
+
def ruby_version_at_least(version)
|
13
|
+
Gem::Version.new(RUBY_VERSION.dup) >= Gem::Version.new(version)
|
14
|
+
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'pathname'
|
2
|
+
require 'rspec'
|
2
3
|
|
3
|
-
module
|
4
|
+
module RegexpParserSpec
|
4
5
|
class Runner
|
5
6
|
def initialize(arguments, warning_whitelist)
|
6
7
|
@arguments = arguments
|
@@ -8,14 +9,14 @@ module RegexpParserTest
|
|
8
9
|
end
|
9
10
|
|
10
11
|
def run
|
11
|
-
|
12
|
+
spec_status = nil
|
12
13
|
|
13
14
|
Warning::Filter.new(warning_whitelist).assert_expected_warnings_only do
|
14
15
|
setup
|
15
|
-
|
16
|
+
spec_status = run_rspec
|
16
17
|
end
|
17
18
|
|
18
|
-
|
19
|
+
spec_status
|
19
20
|
end
|
20
21
|
|
21
22
|
private
|
@@ -23,14 +24,14 @@ module RegexpParserTest
|
|
23
24
|
def setup
|
24
25
|
$VERBOSE = true
|
25
26
|
|
26
|
-
|
27
|
+
spec_files.each(&method(:require))
|
27
28
|
end
|
28
29
|
|
29
|
-
def
|
30
|
-
|
30
|
+
def run_rspec
|
31
|
+
RSpec::Core::Runner.run([])
|
31
32
|
end
|
32
33
|
|
33
|
-
def
|
34
|
+
def spec_files
|
34
35
|
arguments
|
35
36
|
.map { |path| Pathname.new(path).expand_path.freeze }
|
36
37
|
.select(&:file?)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'set'
|
2
2
|
require 'delegate'
|
3
3
|
|
4
|
-
module
|
4
|
+
module RegexpParserSpec
|
5
5
|
class Warning
|
6
6
|
class UnexpectedWarnings < StandardError
|
7
7
|
MSG = 'Unexpected warnings: %s'.freeze
|
@@ -22,22 +22,20 @@ module RegexpParserTest
|
|
22
22
|
|
23
23
|
yield
|
24
24
|
|
25
|
-
|
26
|
-
assert_no_warnings($stderr.warnings)
|
27
|
-
end
|
25
|
+
assert_no_warnings($stderr.warnings)
|
28
26
|
ensure
|
29
27
|
$stderr = original
|
30
28
|
end
|
31
29
|
|
32
|
-
|
30
|
+
private
|
33
31
|
|
34
32
|
def assert_no_warnings(warnings)
|
35
|
-
|
33
|
+
raise UnexpectedWarnings, warnings.to_a if warnings.any?
|
36
34
|
end
|
37
35
|
end
|
38
36
|
|
39
37
|
class Extractor < DelegateClass(IO)
|
40
|
-
PATTERN = /\A(?:.+):(?:\d+): warning: (?:.+)\n\z
|
38
|
+
PATTERN = /\A(?:.+):(?:\d+): warning: (?:.+)\n\z/
|
41
39
|
|
42
40
|
def initialize(io, whitelist)
|
43
41
|
@whitelist = whitelist
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe(Regexp::Syntax) do
|
4
|
+
specify('unknown name') do
|
5
|
+
expect { Regexp::Syntax.new('ruby/1.0') }.to raise_error(Regexp::Syntax::UnknownSyntaxNameError)
|
6
|
+
end
|
7
|
+
|
8
|
+
specify('new') do
|
9
|
+
expect(Regexp::Syntax.new('ruby/1.9.3')).to be_instance_of(Regexp::Syntax::V1_9_3)
|
10
|
+
end
|
11
|
+
|
12
|
+
specify('new any') do
|
13
|
+
expect(Regexp::Syntax.new('any')).to be_instance_of(Regexp::Syntax::Any)
|
14
|
+
expect(Regexp::Syntax.new('*')).to be_instance_of(Regexp::Syntax::Any)
|
15
|
+
end
|
16
|
+
|
17
|
+
specify('not implemented') do
|
18
|
+
expect { RP.parse('\\p{alpha}', 'ruby/1.8') }.to raise_error(Regexp::Syntax::NotImplementedError)
|
19
|
+
end
|
20
|
+
|
21
|
+
specify('supported?') do
|
22
|
+
expect(Regexp::Syntax.supported?('ruby/1.1.1')).to be false
|
23
|
+
expect(Regexp::Syntax.supported?('ruby/2.4.3')).to be true
|
24
|
+
expect(Regexp::Syntax.supported?('ruby/2.5')).to be true
|
25
|
+
end
|
26
|
+
|
27
|
+
specify('invalid version') do
|
28
|
+
expect { Regexp::Syntax.version_class('2.0.0') }.to raise_error(Regexp::Syntax::InvalidVersionNameError)
|
29
|
+
|
30
|
+
expect { Regexp::Syntax.version_class('ruby/20') }.to raise_error(Regexp::Syntax::InvalidVersionNameError)
|
31
|
+
end
|
32
|
+
|
33
|
+
specify('version class tiny version') do
|
34
|
+
expect(Regexp::Syntax.version_class('ruby/1.9.3')).to eq Regexp::Syntax::V1_9_3
|
35
|
+
|
36
|
+
expect(Regexp::Syntax.version_class('ruby/2.3.1')).to eq Regexp::Syntax::V2_3_1
|
37
|
+
end
|
38
|
+
|
39
|
+
specify('version class minor version') do
|
40
|
+
expect(Regexp::Syntax.version_class('ruby/1.9')).to eq Regexp::Syntax::V1_9
|
41
|
+
|
42
|
+
expect(Regexp::Syntax.version_class('ruby/2.3')).to eq Regexp::Syntax::V2_3
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe(Regexp::Syntax::Token::Map) do
|
4
|
+
let(:map) { Regexp::Syntax::Token::Map }
|
5
|
+
|
6
|
+
specify('is complete') do
|
7
|
+
latest_syntax = Regexp::Syntax.new('ruby/2.9')
|
8
|
+
|
9
|
+
latest_syntax.features.each do |type, tokens|
|
10
|
+
tokens.each { |token| expect(map[type]).to include(token) }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
specify('contains no duplicate type/token combinations') do
|
15
|
+
combinations = map.flat_map do |type, tokens|
|
16
|
+
tokens.map { |token| "#{type} #{token}" }
|
17
|
+
end
|
18
|
+
|
19
|
+
non_uniq = combinations.group_by { |str| str }.select { |_, v| v.count > 1 }
|
20
|
+
|
21
|
+
expect(non_uniq.keys).to be_empty
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe(Regexp::Syntax::V1_8_6) do
|
4
|
+
let(:syntax) { Regexp::Syntax.new('ruby/1.8.6') }
|
5
|
+
|
6
|
+
tests = {
|
7
|
+
implements: {
|
8
|
+
assertion: T::Assertion::Lookahead,
|
9
|
+
backref: [:number],
|
10
|
+
escape: T::Escape::Basic + T::Escape::ASCII + T::Escape::Meta + T::Escape::Control,
|
11
|
+
group: T::Group::V1_8_6,
|
12
|
+
quantifier: T::Quantifier::Greedy + T::Quantifier::Reluctant + T::Quantifier::Interval + T::Quantifier::IntervalReluctant
|
13
|
+
},
|
14
|
+
excludes: {
|
15
|
+
assertion: T::Assertion::Lookbehind,
|
16
|
+
backref: T::Backreference::All - [:number] + T::SubexpressionCall::All,
|
17
|
+
quantifier: T::Quantifier::Possessive
|
18
|
+
}
|
19
|
+
}
|
20
|
+
|
21
|
+
tests.each do |method, types|
|
22
|
+
expected = method != :excludes
|
23
|
+
|
24
|
+
types.each do |type, tokens|
|
25
|
+
if tokens.nil? || tokens.empty?
|
26
|
+
specify("syntax_V1_8_#{method}_#{type}") do
|
27
|
+
expect(syntax.implements?(type, nil)).to eq expected
|
28
|
+
end
|
29
|
+
else
|
30
|
+
tokens.each do |token|
|
31
|
+
specify("syntax_V1_8_#{method}_#{type}_#{token}") do
|
32
|
+
expect(syntax.implements?(type, token)).to eq expected
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe(Regexp::Syntax::V1_9_1) do
|
4
|
+
let(:syntax) { Regexp::Syntax.new('ruby/1.9.1') }
|
5
|
+
|
6
|
+
tests = {
|
7
|
+
implements: {
|
8
|
+
escape: T::Escape::Hex + T::Escape::Octal + T::Escape::Unicode,
|
9
|
+
type: T::CharacterType::Hex,
|
10
|
+
quantifier: T::Quantifier::Greedy + T::Quantifier::Reluctant + T::Quantifier::Possessive
|
11
|
+
}
|
12
|
+
}
|
13
|
+
|
14
|
+
tests.each do |method, types|
|
15
|
+
types.each do |type, tokens|
|
16
|
+
tokens.each do |token|
|
17
|
+
specify("syntax_V1_9_1_#{method}_#{type}_#{token}") do
|
18
|
+
expect(syntax.implements?(type, token)).to be true
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe(Regexp::Syntax::V1_9_3) do
|
4
|
+
let(:syntax) { Regexp::Syntax.new('ruby/1.9.3') }
|
5
|
+
|
6
|
+
tests = {
|
7
|
+
implements: {
|
8
|
+
property: T::UnicodeProperty::Script_V1_9_3 + T::UnicodeProperty::Age_V1_9_3,
|
9
|
+
nonproperty: T::UnicodeProperty::Script_V1_9_3 + T::UnicodeProperty::Age_V1_9_3
|
10
|
+
}
|
11
|
+
}
|
12
|
+
|
13
|
+
tests.each do |method, types|
|
14
|
+
types.each do |type, tokens|
|
15
|
+
tokens.each do |token|
|
16
|
+
specify("syntax_V1_9_3_#{method}_#{type}_#{token}") do
|
17
|
+
expect(syntax.implements?(type, token)).to be true
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|