summaryrefslogtreecommitdiff
path: root/test/strscan
diff options
context:
space:
mode:
Diffstat (limited to 'test/strscan')
-rw-r--r--test/strscan/test_ractor.rb2
-rw-r--r--test/strscan/test_stringscanner.rb186
2 files changed, 173 insertions, 15 deletions
diff --git a/test/strscan/test_ractor.rb b/test/strscan/test_ractor.rb
index 480c1ae8a6..a5de7e56ed 100644
--- a/test/strscan/test_ractor.rb
+++ b/test/strscan/test_ractor.rb
@@ -3,7 +3,7 @@ require 'test/unit'
class TestStringScannerRactor < Test::Unit::TestCase
def setup
- pend unless defined? Ractor
+ omit "Ractor not defined" unless defined? Ractor
end
def test_ractor
diff --git a/test/strscan/test_stringscanner.rb b/test/strscan/test_stringscanner.rb
index 6e30be1f7d..9b7b7910d0 100644
--- a/test/strscan/test_stringscanner.rb
+++ b/test/strscan/test_stringscanner.rb
@@ -7,9 +7,30 @@
require 'strscan'
require 'test/unit'
-class TestStringScanner < Test::Unit::TestCase
- def create_string_scanner(string, *args)
- StringScanner.new(string, *args)
+module StringScannerTests
+ def test_peek_byte
+ omit("not implemented on TruffleRuby") if RUBY_ENGINE == "truffleruby"
+ s = create_string_scanner('ab')
+ assert_equal 97, s.peek_byte
+ assert_equal 97, s.scan_byte
+ assert_equal 98, s.peek_byte
+ assert_equal 98, s.scan_byte
+ assert_nil s.peek_byte
+ assert_nil s.scan_byte
+ end
+
+ def test_scan_byte
+ omit("not implemented on TruffleRuby") if RUBY_ENGINE == "truffleruby"
+ s = create_string_scanner('ab')
+ assert_equal 97, s.scan_byte
+ assert_equal 98, s.scan_byte
+ assert_nil s.scan_byte
+
+ str = "\244\242".dup.force_encoding("euc-jp")
+ s = StringScanner.new(str)
+ assert_equal str.getbyte(s.pos), s.scan_byte
+ assert_equal str.getbyte(s.pos), s.scan_byte
+ assert_nil s.scan_byte
end
def test_s_new
@@ -155,8 +176,10 @@ class TestStringScanner < Test::Unit::TestCase
end
def test_string
- s = create_string_scanner('test')
- assert_equal 'test', s.string
+ s = create_string_scanner('test string')
+ assert_equal 'test string', s.string
+ s.scan(/test/)
+ assert_equal 'test string', s.string
s.string = 'a'
assert_equal 'a', s.string
s.scan(/a/)
@@ -207,6 +230,8 @@ class TestStringScanner < Test::Unit::TestCase
end
def test_charpos_not_use_string_methods
+ omit "not supported on TruffleRuby" if RUBY_ENGINE == "truffleruby"
+
string = +'abcädeföghi'
scanner = create_string_scanner(string)
@@ -237,7 +262,7 @@ class TestStringScanner < Test::Unit::TestCase
end
def test_scan
- s = create_string_scanner('stra strb strc', true)
+ s = create_string_scanner("stra strb\0strc", true)
tmp = s.scan(/\w+/)
assert_equal 'stra', tmp
@@ -245,7 +270,7 @@ class TestStringScanner < Test::Unit::TestCase
assert_equal ' ', tmp
assert_equal 'strb', s.scan(/\w+/)
- assert_equal ' ', s.scan(/\s+/)
+ assert_equal "\u0000", s.scan(/\0/)
tmp = s.scan(/\w+/)
assert_equal 'strc', tmp
@@ -287,11 +312,14 @@ class TestStringScanner < Test::Unit::TestCase
end
def test_scan_string
- s = create_string_scanner('stra strb strc')
+ s = create_string_scanner("stra strb\0strc")
assert_equal 'str', s.scan('str')
assert_equal 'str', s[0]
assert_equal 3, s.pos
assert_equal 'a ', s.scan('a ')
+ assert_equal 'strb', s.scan('strb')
+ assert_equal "\u0000", s.scan("\0")
+ assert_equal 'strc', s.scan('strc')
str = 'stra strb strc'.dup
s = create_string_scanner(str, false)
@@ -465,7 +493,10 @@ class TestStringScanner < Test::Unit::TestCase
assert_equal 'foo', s['a']
assert_equal 'bar', s['b']
assert_raise(IndexError) { s['c'] }
- assert_raise_with_message(IndexError, /\u{30c6 30b9 30c8}/) { s["\u{30c6 30b9 30c8}"] }
+ # see https://github.com/jruby/jruby/issues/7644
+ unless RUBY_ENGINE == "jruby" && RbConfig::CONFIG['host_os'] =~ /mswin|win32|mingw/
+ assert_raise_with_message(IndexError, /\u{30c6 30b9 30c8}/) { s["\u{30c6 30b9 30c8}"] }
+ end
end
def test_pre_match
@@ -555,6 +586,16 @@ class TestStringScanner < Test::Unit::TestCase
assert_nil s.matched_size
end
+ def test_empty_encoding_utf8
+ ss = create_string_scanner('')
+ assert_equal(Encoding::UTF_8, ss.rest.encoding)
+ end
+
+ def test_empty_encoding_ascii_8bit
+ ss = create_string_scanner(''.dup.force_encoding("ASCII-8BIT"))
+ assert_equal(Encoding::ASCII_8BIT, ss.rest.encoding)
+ end
+
def test_encoding
ss = create_string_scanner("\xA1\xA2".dup.force_encoding("euc-jp"))
assert_equal(Encoding::EUC_JP, ss.scan(/./e).encoding)
@@ -567,6 +608,8 @@ class TestStringScanner < Test::Unit::TestCase
end
def test_invalid_encoding_string
+ omit "no encoding check on TruffleRuby for scan(String)" if RUBY_ENGINE == "truffleruby"
+
str = "\xA1\xA2".dup.force_encoding("euc-jp")
ss = create_string_scanner(str)
assert_raise(Encoding::CompatibilityError) do
@@ -628,13 +671,47 @@ class TestStringScanner < Test::Unit::TestCase
assert_equal(nil, s.exist?(/e/))
end
- def test_exist_p_string
+ def test_exist_p_invalid_argument
s = create_string_scanner("test string")
assert_raise(TypeError) do
- s.exist?(" ")
+ s.exist?(1)
end
end
+ def test_exist_p_string
+ omit("not implemented on TruffleRuby") if RUBY_ENGINE == "truffleruby"
+ s = create_string_scanner("test string")
+ assert_equal(3, s.exist?("s"))
+ assert_equal(0, s.pos)
+ s.scan("test")
+ assert_equal(2, s.exist?("s"))
+ assert_equal(4, s.pos)
+ assert_equal(nil, s.exist?("e"))
+ end
+
+ def test_scan_until
+ s = create_string_scanner("Foo Bar\0Baz")
+ assert_equal("Foo", s.scan_until(/Foo/))
+ assert_equal(3, s.pos)
+ assert_equal(" Bar", s.scan_until(/Bar/))
+ assert_equal(7, s.pos)
+ assert_equal(nil, s.skip_until(/Qux/))
+ assert_equal("\u0000Baz", s.scan_until(/Baz/))
+ assert_equal(11, s.pos)
+ end
+
+ def test_scan_until_string
+ omit("not implemented on TruffleRuby") if RUBY_ENGINE == "truffleruby"
+ s = create_string_scanner("Foo Bar\0Baz")
+ assert_equal("Foo", s.scan_until("Foo"))
+ assert_equal(3, s.pos)
+ assert_equal(" Bar", s.scan_until("Bar"))
+ assert_equal(7, s.pos)
+ assert_equal(nil, s.skip_until("Qux"))
+ assert_equal("\u0000Baz", s.scan_until("Baz"))
+ assert_equal(11, s.pos)
+ end
+
def test_skip_until
s = create_string_scanner("Foo Bar Baz")
assert_equal(3, s.skip_until(/Foo/))
@@ -644,6 +721,16 @@ class TestStringScanner < Test::Unit::TestCase
assert_equal(nil, s.skip_until(/Qux/))
end
+ def test_skip_until_string
+ omit("not implemented on TruffleRuby") if RUBY_ENGINE == "truffleruby"
+ s = create_string_scanner("Foo Bar Baz")
+ assert_equal(3, s.skip_until("Foo"))
+ assert_equal(3, s.pos)
+ assert_equal(4, s.skip_until("Bar"))
+ assert_equal(7, s.pos)
+ assert_equal(nil, s.skip_until("Qux"))
+ end
+
def test_check_until
s = create_string_scanner("Foo Bar Baz")
assert_equal("Foo", s.check_until(/Foo/))
@@ -653,6 +740,16 @@ class TestStringScanner < Test::Unit::TestCase
assert_equal(nil, s.check_until(/Qux/))
end
+ def test_check_until_string
+ omit("not implemented on TruffleRuby") if RUBY_ENGINE == "truffleruby"
+ s = create_string_scanner("Foo Bar Baz")
+ assert_equal("Foo", s.check_until("Foo"))
+ assert_equal(0, s.pos)
+ assert_equal("Foo Bar", s.check_until("Bar"))
+ assert_equal(0, s.pos)
+ assert_equal(nil, s.check_until("Qux"))
+ end
+
def test_search_full
s = create_string_scanner("Foo Bar Baz")
assert_equal(8, s.search_full(/Bar /, false, false))
@@ -665,6 +762,19 @@ class TestStringScanner < Test::Unit::TestCase
assert_equal(11, s.pos)
end
+ def test_search_full_string
+ omit("not implemented on TruffleRuby") if RUBY_ENGINE == "truffleruby"
+ s = create_string_scanner("Foo Bar Baz")
+ assert_equal(8, s.search_full("Bar ", false, false))
+ assert_equal(0, s.pos)
+ assert_equal("Foo Bar ", s.search_full("Bar ", false, true))
+ assert_equal(0, s.pos)
+ assert_equal(8, s.search_full("Bar ", true, false))
+ assert_equal(8, s.pos)
+ assert_equal("Baz", s.search_full("az", true, true))
+ assert_equal(11, s.pos)
+ end
+
def test_peek
s = create_string_scanner("test string")
assert_equal("test st", s.peek(7))
@@ -712,6 +822,8 @@ class TestStringScanner < Test::Unit::TestCase
end
def test_aref_without_regex
+ omit "#[:missing] always raises on TruffleRuby if matched" if RUBY_ENGINE == "truffleruby"
+
s = create_string_scanner('abc')
s.get_byte
assert_nil(s[:c])
@@ -730,8 +842,8 @@ class TestStringScanner < Test::Unit::TestCase
def test_captures
s = create_string_scanner("Timestamp: Fri Dec 12 1975 14:39")
s.scan("Timestamp: ")
- s.scan(/(\w+) (\w+) (\d+) /)
- assert_equal(["Fri", "Dec", "12"], s.captures)
+ s.scan(/(\w+) (\w+) (\d+) (1980)?/)
+ assert_equal(["Fri", "Dec", "12", nil], s.captures)
s.scan(/(\w+) (\w+) (\d+) /)
assert_nil(s.captures)
end
@@ -745,6 +857,42 @@ class TestStringScanner < Test::Unit::TestCase
assert_nil(s.values_at(0, -1, 5, 2))
end
+ def test_scan_aref_repeatedly
+ s = StringScanner.new('test string')
+ assert_equal "test", s.scan(/\w(\w)(\w*)/)
+ assert_equal "test", s[0]
+ assert_equal "e", s[1]
+ assert_equal "st", s[2]
+ assert_nil s.scan(/\w+/)
+ assert_nil s[0]
+ assert_nil s[1]
+ assert_nil s[2]
+ assert_equal " ", s.scan(/\s+/)
+ assert_equal " ", s[0]
+ assert_nil s[1]
+ assert_nil s[2]
+ assert_equal "string", s.scan(/\w(\w)(\w*)/)
+ assert_equal "string", s[0]
+ assert_equal "t", s[1]
+ assert_equal "ring", s[2]
+ end
+
+ def test_named_captures
+ omit("not implemented on TruffleRuby") if ["truffleruby"].include?(RUBY_ENGINE)
+ scan = StringScanner.new("foobarbaz")
+ assert_equal({}, scan.named_captures)
+ assert_equal(9, scan.match?(/(?<f>foo)(?<r>bar)(?<z>baz)/))
+ assert_equal({"f" => "foo", "r" => "bar", "z" => "baz"}, scan.named_captures)
+ end
+end
+
+class TestStringScanner < Test::Unit::TestCase
+ include StringScannerTests
+
+ def create_string_scanner(string, *args)
+ StringScanner.new(string, *args)
+ end
+
def test_fixed_anchor_true
assert_equal(true, StringScanner.new("a", fixed_anchor: true).fixed_anchor?)
end
@@ -759,7 +907,9 @@ class TestStringScanner < Test::Unit::TestCase
end
end
-class TestStringScannerFixedAnchor < TestStringScanner
+class TestStringScannerFixedAnchor < Test::Unit::TestCase
+ include StringScannerTests
+
def create_string_scanner(string, *args)
StringScanner.new(string, fixed_anchor: true)
end
@@ -786,4 +936,12 @@ class TestStringScannerFixedAnchor < TestStringScanner
assert_equal 1, s.skip(/a/)
assert_nil s.skip(/^b/)
end
+
+ # ruby/strscan#86
+ def test_scan_shared_string
+ s = "hellohello"[5..-1]
+ ss = StringScanner.new(s).scan(/hello/)
+
+ assert_equal "hello", ss
+ end
end