diff options
Diffstat (limited to 'test/strscan/test_stringscanner.rb')
-rw-r--r-- | test/strscan/test_stringscanner.rb | 186 |
1 files changed, 172 insertions, 14 deletions
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 |