1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/test/ruby/test_string.rb
Jeremy Evans 80b5a0ff2a
Make rb_scan_args handle keywords more similar to Ruby methods (#2460)
Cfuncs that use rb_scan_args with the : entry suffer similar keyword
argument separation issues that Ruby methods suffer if the cfuncs
accept optional or variable arguments.

This makes the following changes to : handling.

* Treats as **kw, prompting keyword argument separation warnings
  if called with a positional hash.

* Do not look for an option hash if empty keywords are provided.
  For backwards compatibility, treat an empty keyword splat as a empty
  mandatory positional hash argument, but emit a a warning, as this
  behavior will be removed in Ruby 3.  The argument number check
  needs to be moved lower so it can correctly handle an empty
  positional argument being added.

* If the last argument is nil and it is necessary to treat it as an option
  hash in order to make sure all arguments are processed, continue to
  treat the last argument as the option hash. Emit a warning in this case,
  as this behavior will be removed in Ruby 3.

* If splitting the keyword hash into two hashes, issue a warning, as we
  will not be splitting hashes in Ruby 3.

* If the keyword argument is required to fill a mandatory positional
  argument, continue to do so, but emit a warning as this behavior will
  be going away in Ruby 3.

* If keyword arguments are provided and the last argument is not a hash,
  that indicates something wrong. This can happen if a cfunc is calling
  rb_scan_args multiple times, and providing arguments that were not
  passed to it from Ruby.  Callers need to switch to the new
  rb_scan_args_kw function, which allows passing of whether keywords
  were provided.

This commit fixes all warnings caused by the changes above.

It switches some function calls to *_kw versions with appropriate
kw_splat flags. If delegating arguments, RB_PASS_CALLED_KEYWORDS
is used.  If creating new arguments, RB_PASS_KEYWORDS is used if
the last argument is a hash to be treated as keywords.

In open_key_args in io.c, use rb_scan_args_kw.
In this case, the arguments provided come from another C
function, not Ruby.  The last argument may or may not be a hash,
so we can't set keyword argument mode.  However, if it is a
hash, we don't want to warn when treating it as keywords.

In Ruby files, make sure to appropriately use keyword splats
or literal keywords when calling Cfuncs that now issue keyword
argument separation warnings through rb_scan_args.  Also, make
sure not to pass nil in place of an option hash.

Work around Kernel#warn warnings due to problems in the Rubygems
override of the method.  There is an open pull request to fix
these issues in Rubygems, but part of the Rubygems tests for
their override fail on ruby-head due to rb_scan_args not
recognizing empty keyword splats, which this commit fixes.

Implementation wise, adding rb_scan_args_kw is kind of a pain,
because rb_scan_args takes a variable number of arguments.
In order to not duplicate all the code, the function internals need
to be split into two functions taking a va_list, and to avoid passing
in a ton of arguments, a single struct argument is used to handle
the variables previously local to the function.
2019-09-25 11:18:49 -07:00

3231 lines
92 KiB
Ruby

# frozen_string_literal: false
require 'test/unit'
class TestString < Test::Unit::TestCase
ENUMERATOR_WANTARRAY = RUBY_VERSION >= "3.0.0"
WIDE_ENCODINGS = [
Encoding::UTF_16BE, Encoding::UTF_16LE,
Encoding::UTF_32BE, Encoding::UTF_32LE,
]
def initialize(*args)
@cls = String
@aref_re_nth = true
@aref_re_silent = false
@aref_slicebang_silent = true
super
end
def S(*args, **kw)
@cls.new(*args, **kw)
end
def test_s_new
assert_equal("", S())
assert_equal(Encoding::ASCII_8BIT, S().encoding)
assert_equal("", S(""))
assert_equal(__ENCODING__, S("").encoding)
src = "RUBY"
assert_equal(src, S(src))
assert_equal(__ENCODING__, S(src).encoding)
src.force_encoding("euc-jp")
assert_equal(src, S(src))
assert_equal(Encoding::EUC_JP, S(src).encoding)
assert_equal("", S(encoding: "euc-jp"))
assert_equal(Encoding::EUC_JP, S(encoding: "euc-jp").encoding)
assert_equal("", S("", encoding: "euc-jp"))
assert_equal(Encoding::EUC_JP, S("", encoding: "euc-jp").encoding)
src = "RUBY"
assert_equal(src, S(src, encoding: "euc-jp"))
assert_equal(Encoding::EUC_JP, S(src, encoding: "euc-jp").encoding)
src.force_encoding("euc-jp")
assert_equal(src, S(src, encoding: "utf-8"))
assert_equal(Encoding::UTF_8, S(src, encoding: "utf-8").encoding)
assert_equal("", S(capacity: 1000))
assert_equal(Encoding::ASCII_8BIT, S(capacity: 1000).encoding)
assert_equal("", S(capacity: 1000, encoding: "euc-jp"))
assert_equal(Encoding::EUC_JP, S(capacity: 1000, encoding: "euc-jp").encoding)
assert_equal("", S("", capacity: 1000))
assert_equal(__ENCODING__, S("", capacity: 1000).encoding)
assert_equal("", S("", capacity: 1000, encoding: "euc-jp"))
assert_equal(Encoding::EUC_JP, S("", capacity: 1000, encoding: "euc-jp").encoding)
end
def test_initialize
str = S("").freeze
assert_equal("", str.__send__(:initialize))
assert_raise(FrozenError){ str.__send__(:initialize, 'abc') }
assert_raise(FrozenError){ str.__send__(:initialize, capacity: 1000) }
assert_raise(FrozenError){ str.__send__(:initialize, 'abc', capacity: 1000) }
assert_raise(FrozenError){ str.__send__(:initialize, encoding: 'euc-jp') }
assert_raise(FrozenError){ str.__send__(:initialize, 'abc', encoding: 'euc-jp') }
assert_raise(FrozenError){ str.__send__(:initialize, 'abc', capacity: 1000, encoding: 'euc-jp') }
str = S("")
assert_equal("mystring", str.__send__(:initialize, "mystring"))
str = S("mystring")
assert_equal("mystring", str.__send__(:initialize, str))
str = S("")
assert_equal("mystring", str.__send__(:initialize, "mystring", capacity: 1000))
str = S("mystring")
assert_equal("mystring", str.__send__(:initialize, str, capacity: 1000))
end
def test_initialize_shared
String.new(str = "mystring" * 10).__send__(:initialize, capacity: str.bytesize)
assert_equal("mystring", str[0, 8])
end
def test_initialize_nonstring
assert_raise(TypeError) {
S(1)
}
assert_raise(TypeError) {
S(1, capacity: 1000)
}
end
def test_initialize_memory_leak
assert_no_memory_leak([], <<-PREP, <<-CODE, rss: true)
code = proc {('x'*100000).__send__(:initialize, '')}
1_000.times(&code)
PREP
100_000.times(&code)
CODE
end
def test_AREF # '[]'
assert_equal("A", S("AooBar")[0])
assert_equal("B", S("FooBaB")[-1])
assert_equal(nil, S("FooBar")[6])
assert_equal(nil, S("FooBar")[-7])
assert_equal(S("Foo"), S("FooBar")[0,3])
assert_equal(S("Bar"), S("FooBar")[-3,3])
assert_equal(S(""), S("FooBar")[6,2])
assert_equal(nil, S("FooBar")[-7,10])
assert_equal(S("Foo"), S("FooBar")[0..2])
assert_equal(S("Foo"), S("FooBar")[0...3])
assert_equal(S("Bar"), S("FooBar")[-3..-1])
assert_equal(S(""), S("FooBar")[6..2])
assert_equal(nil, S("FooBar")[-10..-7])
assert_equal(S("Foo"), S("FooBar")[/^F../])
assert_equal(S("Bar"), S("FooBar")[/..r$/])
assert_equal(nil, S("FooBar")[/xyzzy/])
assert_equal(nil, S("FooBar")[/plugh/])
assert_equal(S("Foo"), S("FooBar")[S("Foo")])
assert_equal(S("Bar"), S("FooBar")[S("Bar")])
assert_equal(nil, S("FooBar")[S("xyzzy")])
assert_equal(nil, S("FooBar")[S("plugh")])
if @aref_re_nth
assert_equal(S("Foo"), S("FooBar")[/([A-Z]..)([A-Z]..)/, 1])
assert_equal(S("Bar"), S("FooBar")[/([A-Z]..)([A-Z]..)/, 2])
assert_equal(nil, S("FooBar")[/([A-Z]..)([A-Z]..)/, 3])
assert_equal(S("Bar"), S("FooBar")[/([A-Z]..)([A-Z]..)/, -1])
assert_equal(S("Foo"), S("FooBar")[/([A-Z]..)([A-Z]..)/, -2])
assert_equal(nil, S("FooBar")[/([A-Z]..)([A-Z]..)/, -3])
end
o = Object.new
def o.to_int; 2; end
assert_equal("o", "foo"[o])
assert_raise(ArgumentError) { "foo"[] }
end
def test_ASET # '[]='
s = S("FooBar")
s[0] = S('A')
assert_equal(S("AooBar"), s)
s[-1]= S('B')
assert_equal(S("AooBaB"), s)
assert_raise(IndexError) { s[-7] = S("xyz") }
assert_equal(S("AooBaB"), s)
s[0] = S("ABC")
assert_equal(S("ABCooBaB"), s)
s = S("FooBar")
s[0,3] = S("A")
assert_equal(S("ABar"),s)
s[0] = S("Foo")
assert_equal(S("FooBar"), s)
s[-3,3] = S("Foo")
assert_equal(S("FooFoo"), s)
assert_raise(IndexError) { s[7,3] = S("Bar") }
assert_raise(IndexError) { s[-7,3] = S("Bar") }
s = S("FooBar")
s[0..2] = S("A")
assert_equal(S("ABar"), s)
s[1..3] = S("Foo")
assert_equal(S("AFoo"), s)
s[-4..-4] = S("Foo")
assert_equal(S("FooFoo"), s)
assert_raise(RangeError) { s[7..10] = S("Bar") }
assert_raise(RangeError) { s[-7..-10] = S("Bar") }
s = S("FooBar")
s[/^F../]= S("Bar")
assert_equal(S("BarBar"), s)
s[/..r$/] = S("Foo")
assert_equal(S("BarFoo"), s)
if @aref_re_silent
s[/xyzzy/] = S("None")
assert_equal(S("BarFoo"), s)
else
assert_raise(IndexError) { s[/xyzzy/] = S("None") }
end
if @aref_re_nth
s[/([A-Z]..)([A-Z]..)/, 1] = S("Foo")
assert_equal(S("FooFoo"), s)
s[/([A-Z]..)([A-Z]..)/, 2] = S("Bar")
assert_equal(S("FooBar"), s)
assert_raise(IndexError) { s[/([A-Z]..)([A-Z]..)/, 3] = "None" }
s[/([A-Z]..)([A-Z]..)/, -1] = S("Foo")
assert_equal(S("FooFoo"), s)
s[/([A-Z]..)([A-Z]..)/, -2] = S("Bar")
assert_equal(S("BarFoo"), s)
assert_raise(IndexError) { s[/([A-Z]..)([A-Z]..)/, -3] = "None" }
end
s = S("FooBar")
s[S("Foo")] = S("Bar")
assert_equal(S("BarBar"), s)
s = S("a string")
s[0..s.size] = S("another string")
assert_equal(S("another string"), s)
o = Object.new
def o.to_int; 2; end
s = "foo"
s[o] = "bar"
assert_equal("fobar", s)
assert_raise(ArgumentError) { "foo"[1, 2, 3] = "" }
assert_raise(IndexError) {"foo"[RbConfig::LIMITS["LONG_MIN"]] = "l"}
end
def test_CMP # '<=>'
assert_equal(1, S("abcdef") <=> S("abcde"))
assert_equal(0, S("abcdef") <=> S("abcdef"))
assert_equal(-1, S("abcde") <=> S("abcdef"))
assert_equal(-1, S("ABCDEF") <=> S("abcdef"))
assert_nil("foo" <=> Object.new)
o = Object.new
def o.to_str; "bar"; end
assert_equal(1, "foo" <=> o)
class << o;remove_method :to_str;end
def o.<=>(x); nil; end
assert_nil("foo" <=> o)
class << o;remove_method :<=>;end
def o.<=>(x); 1; end
assert_equal(-1, "foo" <=> o)
class << o;remove_method :<=>;end
def o.<=>(x); 2**100; end
assert_equal(-1, "foo" <=> o)
end
def test_EQUAL # '=='
assert_not_equal(:foo, S("foo"))
assert_equal(S("abcdef"), S("abcdef"))
assert_not_equal(S("CAT"), S('cat'))
assert_not_equal(S("CaT"), S('cAt'))
o = Object.new
def o.to_str; end
def o.==(x); false; end
assert_equal(false, "foo" == o)
class << o;remove_method :==;end
def o.==(x); true; end
assert_equal(true, "foo" == o)
end
def test_LSHIFT # '<<'
assert_equal(S("world!"), S("world") << 33)
assert_equal(S("world!"), S("world") << S("!"))
s = "a"
10.times {|i|
s << s
assert_equal("a" * (2 << i), s)
}
s = ["foo"].pack("p")
l = s.size
s << "bar"
assert_equal(l + 3, s.size)
bug = '[ruby-core:27583]'
assert_raise(RangeError, bug) {S("a".force_encoding(Encoding::UTF_8)) << -3}
assert_raise(RangeError, bug) {S("a".force_encoding(Encoding::UTF_8)) << -2}
assert_raise(RangeError, bug) {S("a".force_encoding(Encoding::UTF_8)) << -1}
assert_raise(RangeError, bug) {S("a".force_encoding(Encoding::UTF_8)) << 0x81308130}
assert_nothing_raised {S("a".force_encoding(Encoding::GB18030)) << 0x81308130}
end
def test_MATCH # '=~'
assert_equal(10, S("FeeFieFoo-Fum") =~ /Fum$/)
assert_equal(nil, S("FeeFieFoo-Fum") =~ /FUM$/)
o = Object.new
def o.=~(x); x + "bar"; end
assert_equal("foobar", S("foo") =~ o)
assert_raise(TypeError) { S("foo") =~ "foo" }
end
def test_MOD # '%'
assert_equal(S("00123"), S("%05d") % 123)
assert_equal(S("123 |00000001"), S("%-5s|%08x") % [123, 1])
x = S("%3s %-4s%%foo %.0s%5d %#x%c%3.1f %b %x %X %#b %#x %#X") %
[S("hi"),
123,
S("never seen"),
456,
0,
?A,
3.0999,
11,
171,
171,
11,
171,
171]
assert_equal(S(' hi 123 %foo 456 0A3.1 1011 ab AB 0b1011 0xab 0XAB'), x)
end
def test_MUL # '*'
assert_equal(S("XXX"), S("X") * 3)
assert_equal(S("HOHO"), S("HO") * 2)
end
def test_PLUS # '+'
assert_equal(S("Yodel"), S("Yo") + S("del"))
end
def casetest(a, b, rev=false)
msg = proc {"#{a} should#{' not' if rev} match #{b}"}
case a
when b
assert(!rev, msg)
else
assert(rev, msg)
end
end
def test_VERY_EQUAL # '==='
# assert_equal(true, S("foo") === :foo)
casetest(S("abcdef"), S("abcdef"))
casetest(S("CAT"), S('cat'), true) # Reverse the test - we don't want to
casetest(S("CaT"), S('cAt'), true) # find these in the case.
end
def test_capitalize
assert_equal(S("Hello"), S("hello").capitalize)
assert_equal(S("Hello"), S("hELLO").capitalize)
assert_equal(S("123abc"), S("123ABC").capitalize)
end
def test_capitalize!
a = S("hello"); a.capitalize!
assert_equal(S("Hello"), a)
a = S("hELLO"); a.capitalize!
assert_equal(S("Hello"), a)
a = S("123ABC"); a.capitalize!
assert_equal(S("123abc"), a)
assert_equal(nil, S("123abc").capitalize!)
assert_equal(S("123abc"), S("123ABC").capitalize!)
assert_equal(S("Abc"), S("ABC").capitalize!)
assert_equal(S("Abc"), S("abc").capitalize!)
assert_equal(nil, S("Abc").capitalize!)
a = S("hello")
b = a.dup
assert_equal(S("Hello"), a.capitalize!)
assert_equal(S("hello"), b)
end
Bug2463 = '[ruby-dev:39856]'
def test_center
assert_equal(S("hello"), S("hello").center(4))
assert_equal(S(" hello "), S("hello").center(11))
assert_equal(S("ababaababa"), S("").center(10, "ab"), Bug2463)
assert_equal(S("ababaababab"), S("").center(11, "ab"), Bug2463)
end
def test_chomp
assert_equal(S("hello"), S("hello").chomp("\n"))
assert_equal(S("hello"), S("hello\n").chomp("\n"))
save = $/
$/ = "\n"
assert_equal(S("hello"), S("hello").chomp)
assert_equal(S("hello"), S("hello\n").chomp)
$/ = "!"
assert_equal(S("hello"), S("hello").chomp)
assert_equal(S("hello"), S("hello!").chomp)
$/ = save
assert_equal(S("a").hash, S("a\u0101").chomp(S("\u0101")).hash, '[ruby-core:22414]')
s = S("hello")
assert_equal("hel", s.chomp('lo'))
assert_equal("hello", s)
s = S("hello")
assert_equal("hello", s.chomp('he'))
assert_equal("hello", s)
s = S("\u{3053 3093 306b 3061 306f}")
assert_equal("\u{3053 3093 306b}", s.chomp("\u{3061 306f}"))
assert_equal("\u{3053 3093 306b 3061 306f}", s)
s = S("\u{3053 3093 306b 3061 306f}")
assert_equal("\u{3053 3093 306b 3061 306f}", s.chomp('lo'))
assert_equal("\u{3053 3093 306b 3061 306f}", s)
s = S("hello")
assert_equal("hello", s.chomp("\u{3061 306f}"))
assert_equal("hello", s)
# skip if argument is a broken string
s = S("\xe3\x81\x82")
assert_equal("\xe3\x81\x82", s.chomp("\x82"))
assert_equal("\xe3\x81\x82", s)
s = S("\x95\x5c").force_encoding("Shift_JIS")
assert_equal("\x95\x5c".force_encoding("Shift_JIS"), s.chomp("\x5c"))
assert_equal("\x95\x5c".force_encoding("Shift_JIS"), s)
# clear coderange
s = S("hello\u{3053 3093}")
assert_not_predicate(s, :ascii_only?)
assert_predicate(s.chomp("\u{3053 3093}"), :ascii_only?)
# argument should be converted to String
klass = Class.new { def to_str; 'a'; end }
s = S("abba")
assert_equal("abb", s.chomp(klass.new))
assert_equal("abba", s)
# chomp removes any of "\n", "\r\n", "\r" when "\n" is specified
s = "foo\n"
assert_equal("foo", s.chomp("\n"))
s = "foo\r\n"
assert_equal("foo", s.chomp("\n"))
s = "foo\r"
assert_equal("foo", s.chomp("\n"))
ensure
$/ = save
end
def test_chomp!
a = S("hello")
a.chomp!(S("\n"))
assert_equal(S("hello"), a)
assert_equal(nil, a.chomp!(S("\n")))
a = S("hello\n")
a.chomp!(S("\n"))
assert_equal(S("hello"), a)
save = $/
$/ = "\n"
a = S("hello")
a.chomp!
assert_equal(S("hello"), a)
a = S("hello\n")
a.chomp!
assert_equal(S("hello"), a)
$/ = "!"
a = S("hello")
a.chomp!
assert_equal(S("hello"), a)
a="hello!"
a.chomp!
assert_equal(S("hello"), a)
$/ = save
a = S("hello\n")
b = a.dup
assert_equal(S("hello"), a.chomp!)
assert_equal(S("hello\n"), b)
s = "foo\r\n"
s.chomp!
assert_equal("foo", s)
s = "foo\r"
s.chomp!
assert_equal("foo", s)
s = "foo\r\n"
s.chomp!("")
assert_equal("foo", s)
s = "foo\r"
s.chomp!("")
assert_equal("foo\r", s)
assert_equal(S("a").hash, S("a\u0101").chomp!(S("\u0101")).hash, '[ruby-core:22414]')
s = S("").freeze
assert_raise_with_message(FrozenError, /frozen/) {s.chomp!}
s = S("ax")
o = Struct.new(:s).new(s)
def o.to_str
s.freeze
"x"
end
assert_raise_with_message(FrozenError, /frozen/) {s.chomp!(o)}
s = S("hello")
assert_equal("hel", s.chomp!('lo'))
assert_equal("hel", s)
s = S("hello")
assert_equal(nil, s.chomp!('he'))
assert_equal("hello", s)
s = S("\u{3053 3093 306b 3061 306f}")
assert_equal("\u{3053 3093 306b}", s.chomp!("\u{3061 306f}"))
assert_equal("\u{3053 3093 306b}", s)
s = S("\u{3053 3093 306b 3061 306f}")
assert_equal(nil, s.chomp!('lo'))
assert_equal("\u{3053 3093 306b 3061 306f}", s)
s = S("hello")
assert_equal(nil, s.chomp!("\u{3061 306f}"))
assert_equal("hello", s)
# skip if argument is a broken string
s = S("\xe3\x81\x82")
assert_equal(nil, s.chomp!("\x82"))
assert_equal("\xe3\x81\x82", s)
s = S("\x95\x5c").force_encoding("Shift_JIS")
assert_equal(nil, s.chomp!("\x5c"))
assert_equal("\x95\x5c".force_encoding("Shift_JIS"), s)
# clear coderange
s = S("hello\u{3053 3093}")
assert_not_predicate(s, :ascii_only?)
assert_predicate(s.chomp!("\u{3053 3093}"), :ascii_only?)
# argument should be converted to String
klass = Class.new { def to_str; 'a'; end }
s = S("abba")
assert_equal("abb", s.chomp!(klass.new))
assert_equal("abb", s)
# chomp removes any of "\n", "\r\n", "\r" when "\n" is specified
s = "foo\n"
assert_equal("foo", s.chomp!("\n"))
s = "foo\r\n"
assert_equal("foo", s.chomp!("\n"))
s = "foo\r"
assert_equal("foo", s.chomp!("\n"))
ensure
$/ = save
end
def test_chop
assert_equal(S("hell"), S("hello").chop)
assert_equal(S("hello"), S("hello\r\n").chop)
assert_equal(S("hello\n"), S("hello\n\r").chop)
assert_equal(S(""), S("\r\n").chop)
assert_equal(S(""), S("").chop)
assert_equal(S("a").hash, S("a\u00d8").chop.hash)
end
def test_chop!
a = S("hello").chop!
assert_equal(S("hell"), a)
a = S("hello\r\n").chop!
assert_equal(S("hello"), a)
a = S("hello\n\r").chop!
assert_equal(S("hello\n"), a)
a = S("\r\n").chop!
assert_equal(S(""), a)
a = S("").chop!
assert_nil(a)
a = S("a\u00d8")
a.chop!
assert_equal(S("a").hash, a.hash)
a = S("hello\n")
b = a.dup
assert_equal(S("hello"), a.chop!)
assert_equal(S("hello\n"), b)
end
def test_clone
for taint in [ false, true ]
for frozen in [ false, true ]
a = S("Cool")
a.taint if taint
a.freeze if frozen
b = a.clone
assert_equal(a, b)
assert_not_same(a, b)
assert_equal(a.frozen?, b.frozen?)
assert_equal(a.tainted?, b.tainted?)
end
end
assert_equal("", File.read(IO::NULL).clone, '[ruby-dev:32819] reported by Kazuhiro NISHIYAMA')
end
def test_concat
assert_equal(S("world!"), S("world").concat(33))
assert_equal(S("world!"), S("world").concat(S('!')))
b = S("sn")
assert_equal(S("snsnsn"), b.concat(b, b))
bug7090 = '[ruby-core:47751]'
result = S("").force_encoding(Encoding::UTF_16LE)
result << 0x0300
expected = S("\u0300".encode(Encoding::UTF_16LE))
assert_equal(expected, result, bug7090)
assert_raise(TypeError) { 'foo' << :foo }
assert_raise(FrozenError) { 'foo'.freeze.concat('bar') }
end
def test_concat_literals
s="." * 50
assert_equal(Encoding::UTF_8, "#{s}x".encoding)
end
def test_count
a = S("hello world")
assert_equal(5, a.count(S("lo")))
assert_equal(2, a.count(S("lo"), S("o")))
assert_equal(4, a.count(S("hello"), S("^l")))
assert_equal(4, a.count(S("ej-m")))
assert_equal(0, S("y").count(S("a\\-z")))
assert_equal(5, "abc\u{3042 3044 3046}".count("^a"))
assert_equal(1, "abc\u{3042 3044 3046}".count("\u3042"))
assert_equal(5, "abc\u{3042 3044 3046}".count("^\u3042"))
assert_equal(2, "abc\u{3042 3044 3046}".count("a-z", "^a"))
assert_equal(0, "abc\u{3042 3044 3046}".count("a", "\u3042"))
assert_equal(0, "abc\u{3042 3044 3046}".count("\u3042", "a"))
assert_equal(0, "abc\u{3042 3044 3046}".count("\u3042", "\u3044"))
assert_equal(4, "abc\u{3042 3044 3046}".count("^a", "^\u3044"))
assert_equal(4, "abc\u{3042 3044 3046}".count("^\u3044", "^a"))
assert_equal(4, "abc\u{3042 3044 3046}".count("^\u3042", "^\u3044"))
assert_raise(ArgumentError) { "foo".count }
end
def crypt_supports_des_crypt?
/openbsd/ !~ RUBY_PLATFORM
end
def test_crypt
if crypt_supports_des_crypt?
pass = "aaGUC/JkO9/Sc"
good_salt = "aa"
bad_salt = "ab"
else
pass = "$2a$04$0WVaz0pV3jzfZ5G5tpmHWuBQGbkjzgtSc3gJbmdy0GAGMa45MFM2."
good_salt = "$2a$04$0WVaz0pV3jzfZ5G5tpmHWu"
bad_salt = "$2a$04$0WVaz0pV3jzfZ5G5tpmHXu"
end
assert_equal(S(pass), S("mypassword").crypt(S(good_salt)))
assert_not_equal(S(pass), S("mypassword").crypt(S(bad_salt)))
assert_raise(ArgumentError) {S("mypassword").crypt(S(""))}
assert_raise(ArgumentError) {S("mypassword").crypt(S("\0a"))}
assert_raise(ArgumentError) {S("mypassword").crypt(S("a\0"))}
assert_raise(ArgumentError) {S("poison\u0000null").crypt(S("aa"))}
WIDE_ENCODINGS.each do |enc|
assert_raise(ArgumentError) {S("mypassword").crypt(S("aa".encode(enc)))}
assert_raise(ArgumentError) {S("mypassword".encode(enc)).crypt(S("aa"))}
end
@cls == String and
assert_no_memory_leak([], "s = ''; salt_proc = proc{#{(crypt_supports_des_crypt? ? '..' : good_salt).inspect}}", "#{<<~"begin;"}\n#{<<~'end;'}")
begin;
1000.times { s.crypt(-salt_proc.call).clear }
end;
end
def test_delete
assert_equal(S("heo"), S("hello").delete(S("l"), S("lo")))
assert_equal(S("he"), S("hello").delete(S("lo")))
assert_equal(S("hell"), S("hello").delete(S("aeiou"), S("^e")))
assert_equal(S("ho"), S("hello").delete(S("ej-m")))
assert_equal("a".hash, "a\u0101".delete("\u0101").hash, '[ruby-talk:329267]')
assert_equal(true, "a\u0101".delete("\u0101").ascii_only?)
assert_equal(true, "a\u3041".delete("\u3041").ascii_only?)
assert_equal(false, "a\u3041\u3042".delete("\u3041").ascii_only?)
assert_equal("a", "abc\u{3042 3044 3046}".delete("^a"))
assert_equal("bc\u{3042 3044 3046}", "abc\u{3042 3044 3046}".delete("a"))
assert_equal("\u3042", "abc\u{3042 3044 3046}".delete("^\u3042"))
bug6160 = '[ruby-dev:45374]'
assert_equal("", '\\'.delete('\\'), bug6160)
end
def test_delete!
a = S("hello")
a.delete!(S("l"), S("lo"))
assert_equal(S("heo"), a)
a = S("hello")
a.delete!(S("lo"))
assert_equal(S("he"), a)
a = S("hello")
a.delete!(S("aeiou"), S("^e"))
assert_equal(S("hell"), a)
a = S("hello")
a.delete!(S("ej-m"))
assert_equal(S("ho"), a)
a = S("hello")
assert_nil(a.delete!(S("z")))
a = S("hello")
b = a.dup
a.delete!(S("lo"))
assert_equal(S("he"), a)
assert_equal(S("hello"), b)
a = S("hello")
a.delete!(S("^el"))
assert_equal(S("ell"), a)
assert_raise(ArgumentError) { S("foo").delete! }
end
def test_downcase
assert_equal(S("hello"), S("helLO").downcase)
assert_equal(S("hello"), S("hello").downcase)
assert_equal(S("hello"), S("HELLO").downcase)
assert_equal(S("abc hello 123"), S("abc HELLO 123").downcase)
end
def test_downcase!
a = S("helLO")
b = a.dup
assert_equal(S("hello"), a.downcase!)
assert_equal(S("hello"), a)
assert_equal(S("helLO"), b)
a=S("hello")
assert_nil(a.downcase!)
assert_equal(S("hello"), a)
end
def test_dump
a= S("Test") << 1 << 2 << 3 << 9 << 13 << 10
assert_equal(S('"Test\\x01\\x02\\x03\\t\\r\\n"'), a.dump)
b= S("\u{7F}")
assert_equal(S('"\\x7F"'), b.dump)
b= S("\u{AB}")
assert_equal(S('"\\u00AB"'), b.dump)
b= S("\u{ABC}")
assert_equal(S('"\\u0ABC"'), b.dump)
b= S("\uABCD")
assert_equal(S('"\\uABCD"'), b.dump)
b= S("\u{ABCDE}")
assert_equal(S('"\\u{ABCDE}"'), b.dump)
b= S("\u{10ABCD}")
assert_equal(S('"\\u{10ABCD}"'), b.dump)
end
def test_undump
a = S("Test") << 1 << 2 << 3 << 9 << 13 << 10
assert_equal(a, S('"Test\\x01\\x02\\x03\\t\\r\\n"').undump)
assert_equal(S("\\ca"), S('"\\ca"').undump)
assert_equal(S("\u{7F}"), S('"\\x7F"').undump)
assert_equal(S("\u{7F}A"), S('"\\x7FA"').undump)
assert_equal(S("\u{AB}"), S('"\\u00AB"').undump)
assert_equal(S("\u{ABC}"), S('"\\u0ABC"').undump)
assert_equal(S("\uABCD"), S('"\\uABCD"').undump)
assert_equal(S("\uABCD"), S('"\\uABCD"').undump)
assert_equal(S("\u{ABCDE}"), S('"\\u{ABCDE}"').undump)
assert_equal(S("\u{10ABCD}"), S('"\\u{10ABCD}"').undump)
assert_equal(S("\u{ABCDE 10ABCD}"), S('"\\u{ABCDE 10ABCD}"').undump)
assert_equal(S(""), S('"\\u{}"').undump)
assert_equal(S(""), S('"\\u{ }"').undump)
assert_equal(S("\u3042".encode("sjis")), S('"\x82\xA0"'.force_encoding("sjis")).undump)
assert_equal(S("\u8868".encode("sjis")), S("\"\\x95\\\\\"".force_encoding("sjis")).undump)
assert_equal(S("äöü"), S('"\u00E4\u00F6\u00FC"').undump)
assert_equal(S("äöü"), S('"\xC3\xA4\xC3\xB6\xC3\xBC"').undump)
assert_equal(Encoding::UTF_8, S('"\\u3042"').encode(Encoding::EUC_JP).undump.encoding)
assert_equal("abc".encode(Encoding::UTF_16LE),
'"a\x00b\x00c\x00".force_encoding("UTF-16LE")'.undump)
assert_equal('\#', '"\\\\#"'.undump)
assert_equal('\#{', '"\\\\\#{"'.undump)
assert_raise(RuntimeError) { S('\u3042').undump }
assert_raise(RuntimeError) { S('"\x82\xA0\u3042"'.force_encoding("SJIS")).undump }
assert_raise(RuntimeError) { S('"\u3042\x82\xA0"'.force_encoding("SJIS")).undump }
assert_raise(RuntimeError) { S('"".force_encoding()').undump }
assert_raise(RuntimeError) { S('"".force_encoding("').undump }
assert_raise(RuntimeError) { S('"".force_encoding("UNKNOWN")').undump }
assert_raise(RuntimeError) { S('"\u3042".force_encoding("UTF-16LE")').undump }
assert_raise(RuntimeError) { S('"\x00\x00".force_encoding("UTF-16LE")"').undump }
assert_raise(RuntimeError) { S('"\x00\x00".force_encoding("'+("a"*9999999)+'")"').undump }
assert_raise(RuntimeError) { S(%("\u00E4")).undump }
assert_raise(RuntimeError) { S('"').undump }
assert_raise(RuntimeError) { S('"""').undump }
assert_raise(RuntimeError) { S('""""').undump }
assert_raise(RuntimeError) { S('"a').undump }
assert_raise(RuntimeError) { S('"\u"').undump }
assert_raise(RuntimeError) { S('"\u{"').undump }
assert_raise(RuntimeError) { S('"\u304"').undump }
assert_raise(RuntimeError) { S('"\u304Z"').undump }
assert_raise(RuntimeError) { S('"\udfff"').undump }
assert_raise(RuntimeError) { S('"\u{dfff}"').undump }
assert_raise(RuntimeError) { S('"\u{3042"').undump }
assert_raise(RuntimeError) { S('"\u{3042 "').undump }
assert_raise(RuntimeError) { S('"\u{110000}"').undump }
assert_raise(RuntimeError) { S('"\u{1234567}"').undump }
assert_raise(RuntimeError) { S('"\x"').undump }
assert_raise(RuntimeError) { S('"\xA"').undump }
assert_raise(RuntimeError) { S('"\\"').undump }
assert_raise(RuntimeError) { S(%("\0")).undump }
assert_raise_with_message(RuntimeError, /invalid/) {
'"\\u{007F}".xxxxxx'.undump
}
end
def test_dup
for taint in [ false, true ]
for frozen in [ false, true ]
a = S("hello")
a.taint if taint
a.freeze if frozen
b = a.dup
assert_equal(a, b)
assert_not_same(a, b)
assert_not_predicate(b, :frozen?)
assert_equal(a.tainted?, b.tainted?)
end
end
end
def test_each
save = $/
$/ = "\n"
res=[]
S("hello\nworld").lines.each {|x| res << x}
assert_equal(S("hello\n"), res[0])
assert_equal(S("world"), res[1])
res=[]
S("hello\n\n\nworld").lines(S('')).each {|x| res << x}
assert_equal(S("hello\n\n"), res[0])
assert_equal(S("world"), res[1])
$/ = "!"
res=[]
S("hello!world").lines.each {|x| res << x}
assert_equal(S("hello!"), res[0])
assert_equal(S("world"), res[1])
ensure
$/ = save
end
def test_each_byte
s = S("ABC")
res = []
assert_equal s.object_id, s.each_byte {|x| res << x }.object_id
assert_equal(65, res[0])
assert_equal(66, res[1])
assert_equal(67, res[2])
assert_equal 65, s.each_byte.next
end
def test_bytes
s = S("ABC")
assert_equal [65, 66, 67], s.bytes
if ENUMERATOR_WANTARRAY
assert_warn(/block not used/) {
assert_equal [65, 66, 67], s.bytes {}
}
else
res = []
assert_equal s.object_id, s.bytes {|x| res << x }.object_id
assert_equal(65, res[0])
assert_equal(66, res[1])
assert_equal(67, res[2])
s = S("ABC")
res = []
assert_same s, s.bytes {|x| res << x }
assert_equal [65, 66, 67], res
end
end
def test_each_codepoint
# Single byte optimization
assert_equal 65, S("ABC").each_codepoint.next
s = S("\u3042\u3044\u3046")
res = []
assert_equal s.object_id, s.each_codepoint {|x| res << x }.object_id
assert_equal(0x3042, res[0])
assert_equal(0x3044, res[1])
assert_equal(0x3046, res[2])
assert_equal 0x3042, s.each_codepoint.next
end
def test_codepoints
# Single byte optimization
assert_equal [65, 66, 67], S("ABC").codepoints
s = S("\u3042\u3044\u3046")
assert_equal [0x3042, 0x3044, 0x3046], s.codepoints
if ENUMERATOR_WANTARRAY
assert_warn(/block not used/) {
assert_equal [0x3042, 0x3044, 0x3046], s.codepoints {}
}
else
res = []
assert_equal s.object_id, s.codepoints {|x| res << x }.object_id
assert_equal(0x3042, res[0])
assert_equal(0x3044, res[1])
assert_equal(0x3046, res[2])
s = S("ABC")
res = []
assert_same s, s.codepoints {|x| res << x }
assert_equal [65, 66, 67], res
end
end
def test_each_char
s = S("ABC")
res = []
assert_equal s.object_id, s.each_char {|x| res << x }.object_id
assert_equal("A", res[0])
assert_equal("B", res[1])
assert_equal("C", res[2])
assert_equal "A", S("ABC").each_char.next
end
def test_chars
s = S("ABC")
assert_equal ["A", "B", "C"], s.chars
if ENUMERATOR_WANTARRAY
assert_warn(/block not used/) {
assert_equal ["A", "B", "C"], s.chars {}
}
else
res = []
assert_equal s.object_id, s.chars {|x| res << x }.object_id
assert_equal("A", res[0])
assert_equal("B", res[1])
assert_equal("C", res[2])
end
end
def test_each_grapheme_cluster
[
"\u{0D 0A}",
"\u{20 200d}",
"\u{600 600}",
"\u{600 20}",
"\u{261d 1F3FB}",
"\u{1f600}",
"\u{20 308}",
"\u{1F477 1F3FF 200D 2640 FE0F}",
"\u{1F468 200D 1F393}",
"\u{1F46F 200D 2642 FE0F}",
"\u{1f469 200d 2764 fe0f 200d 1f469}",
].each do |g|
assert_equal [g], g.each_grapheme_cluster.to_a
assert_equal 1, g.each_grapheme_cluster.size
assert_predicate g.dup.taint.each_grapheme_cluster.to_a[0], :tainted?
end
[
["\u{a 324}", ["\u000A", "\u0324"]],
["\u{d 324}", ["\u000D", "\u0324"]],
["abc", ["a", "b", "c"]],
].each do |str, grapheme_clusters|
assert_equal grapheme_clusters, str.each_grapheme_cluster.to_a
assert_equal grapheme_clusters.size, str.each_grapheme_cluster.size
str.dup.taint.each_grapheme_cluster do |g|
assert_predicate g, :tainted?
end
end
s = ("x"+"\u{10ABCD}"*250000)
assert_empty(s.each_grapheme_cluster {s.clear})
end
def test_grapheme_clusters
[
"\u{20 200d}",
"\u{600 600}",
"\u{600 20}",
"\u{261d 1F3FB}",
"\u{1f600}",
"\u{20 308}",
"\u{1F477 1F3FF 200D 2640 FE0F}",
"\u{1F468 200D 1F393}",
"\u{1F46F 200D 2642 FE0F}",
"\u{1f469 200d 2764 fe0f 200d 1f469}",
].product([Encoding::UTF_8, *WIDE_ENCODINGS]) do |g, enc|
g = g.encode(enc)
assert_equal [g], g.grapheme_clusters
assert_predicate g.taint.grapheme_clusters[0], :tainted?
end
[
"\u{a 324}",
"\u{d 324}",
"abc",
].product([Encoding::UTF_8, *WIDE_ENCODINGS]) do |g, enc|
g = g.encode(enc)
assert_equal g.chars, g.grapheme_clusters
end
assert_equal ["a", "b", "c"], "abc".b.grapheme_clusters
if ENUMERATOR_WANTARRAY
assert_warn(/block not used/) {
assert_equal ["A", "B", "C"], "ABC".grapheme_clusters {}
}
else
s = "ABC".b.taint
res = []
assert_same s, s.grapheme_clusters {|x| res << x }
assert_equal(3, res.size)
assert_equal("A", res[0])
assert_equal("B", res[1])
assert_equal("C", res[2])
res.each {|g| assert_predicate(g, :tainted?)}
end
end
def test_each_line
save = $/
$/ = "\n"
res=[]
S("hello\nworld").each_line {|x| res << x}
assert_equal(S("hello\n"), res[0])
assert_equal(S("world"), res[1])
res=[]
S("hello\n\n\nworld").each_line(S('')) {|x| res << x}
assert_equal(S("hello\n\n"), res[0])
assert_equal(S("world"), res[1])
res=[]
S("hello\r\n\r\nworld").each_line(S('')) {|x| res << x}
assert_equal(S("hello\r\n\r\n"), res[0])
assert_equal(S("world"), res[1])
$/ = "!"
res=[]
S("hello!world").each_line {|x| res << x}
assert_equal(S("hello!"), res[0])
assert_equal(S("world"), res[1])
$/ = "ab"
res=[]
S("a").lines.each {|x| res << x}
assert_equal(1, res.size)
assert_equal(S("a"), res[0])
$/ = save
s = nil
"foo\nbar".each_line(nil) {|s2| s = s2 }
assert_equal("foo\nbar", s)
assert_equal "hello\n", S("hello\nworld").each_line.next
assert_equal "hello\nworld", S("hello\nworld").each_line(nil).next
bug7646 = "[ruby-dev:46827]"
assert_nothing_raised(bug7646) do
"\n\u0100".each_line("\n") {}
end
ensure
$/ = save
end
def test_each_line_chomp
res = []
S("hello\nworld").each_line("\n", chomp: true) {|x| res << x}
assert_equal(S("hello"), res[0])
assert_equal(S("world"), res[1])
res = []
S("hello\n\n\nworld").each_line(S(''), chomp: true) {|x| res << x}
assert_equal(S("hello\n"), res[0])
assert_equal(S("world"), res[1])
res = []
S("hello\r\n\r\nworld").each_line(S(''), chomp: true) {|x| res << x}
assert_equal(S("hello\r\n"), res[0])
assert_equal(S("world"), res[1])
res = []
S("hello!world").each_line(S('!'), chomp: true) {|x| res << x}
assert_equal(S("hello"), res[0])
assert_equal(S("world"), res[1])
res = []
S("a").each_line(S('ab'), chomp: true).each {|x| res << x}
assert_equal(1, res.size)
assert_equal(S("a"), res[0])
s = nil
"foo\nbar".each_line(nil, chomp: true) {|s2| s = s2 }
assert_equal("foo\nbar", s)
assert_equal "hello", S("hello\nworld").each_line(chomp: true).next
assert_equal "hello\nworld", S("hello\nworld").each_line(nil, chomp: true).next
res = []
S("").each_line(chomp: true) {|x| res << x}
assert_equal([], res)
res = []
S("\n").each_line(chomp: true) {|x| res << x}
assert_equal([S("")], res)
res = []
S("\r\n").each_line(chomp: true) {|x| res << x}
assert_equal([S("")], res)
res = []
S("a\n b\n").each_line(" ", chomp: true) {|x| res << x}
assert_equal([S("a\n"), S("b\n")], res)
end
def test_lines
s = S("hello\nworld")
assert_equal ["hello\n", "world"], s.lines
assert_equal ["hello\nworld"], s.lines(nil)
if ENUMERATOR_WANTARRAY
assert_warn(/block not used/) {
assert_equal ["hello\n", "world"], s.lines {}
}
else
res = []
assert_equal s.object_id, s.lines {|x| res << x }.object_id
assert_equal(S("hello\n"), res[0])
assert_equal(S("world"), res[1])
end
end
def test_empty?
assert_empty(S(""))
assert_not_empty(S("not"))
end
def test_end_with?
assert_send([S("hello"), :end_with?, S("llo")])
assert_not_send([S("hello"), :end_with?, S("ll")])
assert_send([S("hello"), :end_with?, S("el"), S("lo")])
bug5536 = '[ruby-core:40623]'
assert_raise(TypeError, bug5536) {S("str").end_with? :not_convertible_to_string}
end
def test_eql?
a = S("hello")
assert_operator(a, :eql?, S("hello"))
assert_operator(a, :eql?, a)
end
def test_gsub
assert_equal(S("h*ll*"), S("hello").gsub(/[aeiou]/, S('*')))
assert_equal(S("h<e>ll<o>"), S("hello").gsub(/([aeiou])/, S('<\1>')))
assert_equal(S("h e l l o "),
S("hello").gsub(/./) { |s| s[0].to_s + S(' ')})
assert_equal(S("HELL-o"),
S("hello").gsub(/(hell)(.)/) { |s| $1.upcase + S('-') + $2 })
assert_equal(S("<>h<>e<>l<>l<>o<>"), S("hello").gsub(S(''), S('<\0>')))
a = S("hello")
a.taint
assert_predicate(a.gsub(/./, S('X')), :tainted?)
assert_equal("z", "abc".gsub(/./, "a" => "z"), "moved from btest/knownbug")
assert_raise(ArgumentError) { "foo".gsub }
end
def test_gsub_encoding
a = S("hello world")
a.force_encoding Encoding::UTF_8
b = S("hi")
b.force_encoding Encoding::US_ASCII
assert_equal Encoding::UTF_8, a.gsub(/hello/, b).encoding
c = S("everybody")
c.force_encoding Encoding::US_ASCII
assert_equal Encoding::UTF_8, a.gsub(/world/, c).encoding
assert_equal S("a\u{e9}apos&lt;"), S("a\u{e9}'&lt;").gsub("'", "apos")
bug9849 = '[ruby-core:62669] [Bug #9849]'
assert_equal S("\u{3042 3042 3042}!foo!"), S("\u{3042 3042 3042}/foo/").gsub("/", "!"), bug9849
end
def test_gsub!
a = S("hello")
b = a.dup
a.gsub!(/[aeiou]/, S('*'))
assert_equal(S("h*ll*"), a)
assert_equal(S("hello"), b)
a = S("hello")
a.gsub!(/([aeiou])/, S('<\1>'))
assert_equal(S("h<e>ll<o>"), a)
a = S("hello")
a.gsub!(/./) { |s| s[0].to_s + S(' ')}
assert_equal(S("h e l l o "), a)
a = S("hello")
a.gsub!(/(hell)(.)/) { |s| $1.upcase + S('-') + $2 }
assert_equal(S("HELL-o"), a)
r = S('X')
r.taint
a.gsub!(/./, r)
assert_predicate(a, :tainted?)
a = S("hello")
assert_nil(a.sub!(S('X'), S('Y')))
end
def test_sub_hash
assert_equal('azc', 'abc'.sub(/b/, "b" => "z"))
assert_equal('ac', 'abc'.sub(/b/, {}))
assert_equal('a1c', 'abc'.sub(/b/, "b" => 1))
assert_equal('aBc', 'abc'.sub(/b/, Hash.new {|h, k| k.upcase }))
assert_equal('a[\&]c', 'abc'.sub(/b/, "b" => '[\&]'))
assert_equal('aBcabc', 'abcabc'.sub(/b/, Hash.new {|h, k| h[k] = k.upcase }))
assert_equal('aBcdef', 'abcdef'.sub(/de|b/, "b" => "B", "de" => "DE"))
end
def test_gsub_hash
assert_equal('azc', 'abc'.gsub(/b/, "b" => "z"))
assert_equal('ac', 'abc'.gsub(/b/, {}))
assert_equal('a1c', 'abc'.gsub(/b/, "b" => 1))
assert_equal('aBc', 'abc'.gsub(/b/, Hash.new {|h, k| k.upcase }))
assert_equal('a[\&]c', 'abc'.gsub(/b/, "b" => '[\&]'))
assert_equal('aBcaBc', 'abcabc'.gsub(/b/, Hash.new {|h, k| h[k] = k.upcase }))
assert_equal('aBcDEf', 'abcdef'.gsub(/de|b/, "b" => "B", "de" => "DE"))
end
def test_hash
assert_equal(S("hello").hash, S("hello").hash)
assert_not_equal(S("hello").hash, S("helLO").hash)
bug4104 = '[ruby-core:33500]'
assert_not_equal(S("a").hash, S("a\0").hash, bug4104)
bug9172 = '[ruby-core:58658] [Bug #9172]'
assert_not_equal(S("sub-setter").hash, S("discover").hash, bug9172)
end
def test_hex
assert_equal(255, S("0xff").hex)
assert_equal(-255, S("-0xff").hex)
assert_equal(255, S("ff").hex)
assert_equal(-255, S("-ff").hex)
assert_equal(0, S("-ralph").hex)
assert_equal(-15, S("-fred").hex)
assert_equal(15, S("fred").hex)
end
def test_include?
assert_include(S("foobar"), ?f)
assert_include(S("foobar"), S("foo"))
assert_not_include(S("foobar"), S("baz"))
assert_not_include(S("foobar"), ?z)
end
def test_index
assert_equal(0, S("hello").index(?h))
assert_equal(1, S("hello").index(S("ell")))
assert_equal(2, S("hello").index(/ll./))
assert_equal(3, S("hello").index(?l, 3))
assert_equal(3, S("hello").index(S("l"), 3))
assert_equal(3, S("hello").index(/l./, 3))
assert_nil(S("hello").index(?z, 3))
assert_nil(S("hello").index(S("z"), 3))
assert_nil(S("hello").index(/z./, 3))
assert_nil(S("hello").index(?z))
assert_nil(S("hello").index(S("z")))
assert_nil(S("hello").index(/z./))
assert_equal(0, S("").index(S("")))
assert_equal(0, S("").index(//))
assert_nil(S("").index(S("hello")))
assert_nil(S("").index(/hello/))
assert_equal(0, S("hello").index(S("")))
assert_equal(0, S("hello").index(//))
s = S("long") * 1000 << "x"
assert_nil(s.index(S("y")))
assert_equal(4 * 1000, s.index(S("x")))
s << "yx"
assert_equal(4 * 1000, s.index(S("x")))
assert_equal(4 * 1000, s.index(S("xyx")))
o = Object.new
def o.to_str; "bar"; end
assert_equal(3, "foobarbarbaz".index(o))
assert_raise(TypeError) { "foo".index(Object.new) }
assert_nil("foo".index(//, -100))
assert_nil($~)
end
def test_insert
assert_equal("Xabcd", S("abcd").insert(0, 'X'))
assert_equal("abcXd", S("abcd").insert(3, 'X'))
assert_equal("abcdX", S("abcd").insert(4, 'X'))
assert_equal("abXcd", S("abcd").insert(-3, 'X'))
assert_equal("abcdX", S("abcd").insert(-1, 'X'))
end
def test_intern
assert_equal(:koala, S("koala").intern)
assert_not_equal(:koala, S("Koala").intern)
end
def test_length
assert_equal(0, S("").length)
assert_equal(4, S("1234").length)
assert_equal(6, S("1234\r\n").length)
assert_equal(7, S("\0011234\r\n").length)
end
def test_ljust
assert_equal(S("hello"), S("hello").ljust(4))
assert_equal(S("hello "), S("hello").ljust(11))
assert_equal(S("ababababab"), S("").ljust(10, "ab"), Bug2463)
assert_equal(S("abababababa"), S("").ljust(11, "ab"), Bug2463)
end
def test_next
assert_equal(S("abd"), S("abc").next)
assert_equal(S("z"), S("y").next)
assert_equal(S("aaa"), S("zz").next)
assert_equal(S("124"), S("123").next)
assert_equal(S("1000"), S("999").next)
assert_equal(S("2000aaa"), S("1999zzz").next)
assert_equal(S("AAAAA000"), S("ZZZZ999").next)
assert_equal(S("*+"), S("**").next)
assert_equal(S("!"), S(" ").next)
assert_equal(S(""), S("").next)
end
def test_next!
a = S("abc")
b = a.dup
assert_equal(S("abd"), a.next!)
assert_equal(S("abd"), a)
assert_equal(S("abc"), b)
a = S("y")
assert_equal(S("z"), a.next!)
assert_equal(S("z"), a)
a = S("zz")
assert_equal(S("aaa"), a.next!)
assert_equal(S("aaa"), a)
a = S("123")
assert_equal(S("124"), a.next!)
assert_equal(S("124"), a)
a = S("999")
assert_equal(S("1000"), a.next!)
assert_equal(S("1000"), a)
a = S("1999zzz")
assert_equal(S("2000aaa"), a.next!)
assert_equal(S("2000aaa"), a)
a = S("ZZZZ999")
assert_equal(S("AAAAA000"), a.next!)
assert_equal(S("AAAAA000"), a)
a = S("**")
assert_equal(S("*+"), a.next!)
assert_equal(S("*+"), a)
a = S(" ")
assert_equal(S("!"), a.next!)
assert_equal(S("!"), a)
end
def test_oct
assert_equal(255, S("0377").oct)
assert_equal(255, S("377").oct)
assert_equal(-255, S("-0377").oct)
assert_equal(-255, S("-377").oct)
assert_equal(0, S("OO").oct)
assert_equal(24, S("030OO").oct)
end
def test_replace
a = S("foo")
assert_equal(S("f"), a.replace(S("f")))
a = S("foo")
assert_equal(S("foobar"), a.replace(S("foobar")))
a = S("foo")
a.taint
b = a.replace(S("xyz"))
assert_equal(S("xyz"), b)
assert_predicate(b, :tainted?)
s = "foo" * 100
s2 = ("bar" * 100).dup
s.replace(s2)
assert_equal(s2, s)
s2 = ["foo"].pack("p")
s.replace(s2)
assert_equal(s2, s)
fs = "".freeze
assert_raise(FrozenError) { fs.replace("a") }
assert_raise(FrozenError) { fs.replace(fs) }
assert_raise(ArgumentError) { fs.replace() }
assert_raise(FrozenError) { fs.replace(42) }
end
def test_reverse
assert_equal(S("beta"), S("ateb").reverse)
assert_equal(S("madamImadam"), S("madamImadam").reverse)
a=S("beta")
assert_equal(S("ateb"), a.reverse)
assert_equal(S("beta"), a)
end
def test_reverse!
a = S("beta")
b = a.dup
assert_equal(S("ateb"), a.reverse!)
assert_equal(S("ateb"), a)
assert_equal(S("beta"), b)
assert_equal(S("madamImadam"), S("madamImadam").reverse!)
a = S("madamImadam")
assert_equal(S("madamImadam"), a.reverse!) # ??
assert_equal(S("madamImadam"), a)
end
def test_rindex
assert_equal(3, S("hello").rindex(?l))
assert_equal(6, S("ell, hello").rindex(S("ell")))
assert_equal(7, S("ell, hello").rindex(/ll./))
assert_equal(3, S("hello,lo").rindex(?l, 3))
assert_equal(3, S("hello,lo").rindex(S("l"), 3))
assert_equal(3, S("hello,lo").rindex(/l./, 3))
assert_nil(S("hello").rindex(?z, 3))
assert_nil(S("hello").rindex(S("z"), 3))
assert_nil(S("hello").rindex(/z./, 3))
assert_nil(S("hello").rindex(?z))
assert_nil(S("hello").rindex(S("z")))
assert_nil(S("hello").rindex(/z./))
o = Object.new
def o.to_str; "bar"; end
assert_equal(6, "foobarbarbaz".rindex(o))
assert_raise(TypeError) { "foo".rindex(Object.new) }
assert_nil("foo".rindex(//, -100))
assert_nil($~)
assert_equal(3, "foo".rindex(//))
assert_equal([3, 3], $~.offset(0))
end
def test_rjust
assert_equal(S("hello"), S("hello").rjust(4))
assert_equal(S(" hello"), S("hello").rjust(11))
assert_equal(S("ababababab"), S("").rjust(10, "ab"), Bug2463)
assert_equal(S("abababababa"), S("").rjust(11, "ab"), Bug2463)
end
def test_scan
a = S("cruel world")
assert_equal([S("cruel"), S("world")],a.scan(/\w+/))
assert_equal([S("cru"), S("el "), S("wor")],a.scan(/.../))
assert_equal([[S("cru")], [S("el ")], [S("wor")]],a.scan(/(...)/))
res = []
a.scan(/\w+/) { |w| res << w }
assert_equal([S("cruel"), S("world") ],res)
res = []
a.scan(/.../) { |w| res << w }
assert_equal([S("cru"), S("el "), S("wor")],res)
res = []
a.scan(/(...)/) { |w| res << w }
assert_equal([[S("cru")], [S("el ")], [S("wor")]],res)
a = S("hello")
a.taint
res = []
a.scan(/./) { |w| res << w }
assert_predicate(res[0], :tainted?, '[ruby-core:33338] #4087')
/h/ =~ a
a.scan(/x/)
assert_nil($~)
/h/ =~ a
a.scan('x')
assert_nil($~)
assert_equal(3, S("hello hello hello").scan("hello".taint).count(&:tainted?))
assert_equal(%w[1 2 3], S("a1 a2 a3").scan(/a\K./))
end
def test_size
assert_equal(0, S("").size)
assert_equal(4, S("1234").size)
assert_equal(6, S("1234\r\n").size)
assert_equal(7, S("\0011234\r\n").size)
end
def test_slice
assert_equal(?A, S("AooBar").slice(0))
assert_equal(?B, S("FooBaB").slice(-1))
assert_nil(S("FooBar").slice(6))
assert_nil(S("FooBar").slice(-7))
assert_equal(S("Foo"), S("FooBar").slice(0,3))
assert_equal(S(S("Bar")), S("FooBar").slice(-3,3))
assert_nil(S("FooBar").slice(7,2)) # Maybe should be six?
assert_nil(S("FooBar").slice(-7,10))
assert_equal(S("Foo"), S("FooBar").slice(0..2))
assert_equal(S("Bar"), S("FooBar").slice(-3..-1))
assert_equal(S(""), S("FooBar").slice(6..2))
assert_nil(S("FooBar").slice(-10..-7))
assert_equal(S("Foo"), S("FooBar").slice(/^F../))
assert_equal(S("Bar"), S("FooBar").slice(/..r$/))
assert_nil(S("FooBar").slice(/xyzzy/))
assert_nil(S("FooBar").slice(/plugh/))
assert_equal(S("Foo"), S("FooBar").slice(S("Foo")))
assert_equal(S("Bar"), S("FooBar").slice(S("Bar")))
assert_nil(S("FooBar").slice(S("xyzzy")))
assert_nil(S("FooBar").slice(S("plugh")))
bug9882 = '[ruby-core:62842] [Bug #9882]'
substr = S("\u{30c6 30b9 30c8 2019}#{bug9882}").slice(4..-1)
assert_equal(S(bug9882).hash, substr.hash, bug9882)
assert_predicate(substr, :ascii_only?, bug9882)
end
def test_slice!
a = S("AooBar")
b = a.dup
assert_equal(?A, a.slice!(0))
assert_equal(S("ooBar"), a)
assert_equal(S("AooBar"), b)
a = S("FooBar")
assert_equal(?r,a.slice!(-1))
assert_equal(S("FooBa"), a)
a = S("FooBar")
if @aref_slicebang_silent
assert_nil( a.slice!(6) )
else
assert_raise(IndexError) { a.slice!(6) }
end
assert_equal(S("FooBar"), a)
if @aref_slicebang_silent
assert_nil( a.slice!(-7) )
else
assert_raise(IndexError) { a.slice!(-7) }
end
assert_equal(S("FooBar"), a)
a = S("FooBar")
assert_equal(S("Foo"), a.slice!(0,3))
assert_equal(S("Bar"), a)
a = S("FooBar")
assert_equal(S("Bar"), a.slice!(-3,3))
assert_equal(S("Foo"), a)
a=S("FooBar")
if @aref_slicebang_silent
assert_nil(a.slice!(7,2)) # Maybe should be six?
else
assert_raise(IndexError) {a.slice!(7,2)} # Maybe should be six?
end
assert_equal(S("FooBar"), a)
if @aref_slicebang_silent
assert_nil(a.slice!(-7,10))
else
assert_raise(IndexError) {a.slice!(-7,10)}
end
assert_equal(S("FooBar"), a)
a=S("FooBar")
assert_equal(S("Foo"), a.slice!(0..2))
assert_equal(S("Bar"), a)
a=S("FooBar")
assert_equal(S("Bar"), a.slice!(-3..-1))
assert_equal(S("Foo"), a)
a=S("FooBar")
if @aref_slicebang_silent
assert_equal(S(""), a.slice!(6..2))
else
assert_raise(RangeError) {a.slice!(6..2)}
end
assert_equal(S("FooBar"), a)
if @aref_slicebang_silent
assert_nil(a.slice!(-10..-7))
else
assert_raise(RangeError) {a.slice!(-10..-7)}
end
assert_equal(S("FooBar"), a)
a=S("FooBar")
assert_equal(S("Foo"), a.slice!(/^F../))
assert_equal(S("Bar"), a)
a=S("FooBar")
assert_equal(S("Bar"), a.slice!(/..r$/))
assert_equal(S("Foo"), a)
a=S("FooBar")
if @aref_slicebang_silent
assert_nil(a.slice!(/xyzzy/))
else
assert_raise(IndexError) {a.slice!(/xyzzy/)}
end
assert_equal(S("FooBar"), a)
if @aref_slicebang_silent
assert_nil(a.slice!(/plugh/))
else
assert_raise(IndexError) {a.slice!(/plugh/)}
end
assert_equal(S("FooBar"), a)
a=S("FooBar")
assert_equal(S("Foo"), a.slice!(S("Foo")))
assert_equal(S("Bar"), a)
a=S("FooBar")
assert_equal(S("Bar"), a.slice!(S("Bar")))
assert_equal(S("Foo"), a)
assert_raise(ArgumentError) { "foo".slice! }
end
def test_split
fs, $; = $;, nil
assert_equal([S("a"), S("b"), S("c")], S(" a b\t c ").split)
assert_equal([S("a"), S("b"), S("c")], S(" a b\t c ").split(S(" ")))
assert_equal([S(" a "), S(" b "), S(" c ")], S(" a | b | c ").split(S("|")))
assert_equal([S("a"), S("b"), S("c")], S("aXXbXXcXX").split(/X./))
assert_equal([S("a"), S("b"), S("c")], S("abc").split(//))
assert_equal([S("a|b|c")], S("a|b|c").split(S('|'), 1))
assert_equal([S("a"), S("b|c")], S("a|b|c").split(S('|'), 2))
assert_equal([S("a"), S("b"), S("c")], S("a|b|c").split(S('|'), 3))
assert_equal([S("a"), S("b"), S("c"), S("")], S("a|b|c|").split(S('|'), -1))
assert_equal([S("a"), S("b"), S("c"), S(""), S("")], S("a|b|c||").split(S('|'), -1))
assert_equal([S("a"), S(""), S("b"), S("c")], S("a||b|c|").split(S('|')))
assert_equal([S("a"), S(""), S("b"), S("c"), S("")], S("a||b|c|").split(S('|'), -1))
assert_equal([], "".split(//, 1))
ensure
EnvUtil.suppress_warning {$; = fs}
end
def test_split_with_block
fs, $; = $;, nil
result = []; S(" a b\t c ").split {|s| result << s}
assert_equal([S("a"), S("b"), S("c")], result)
result = []; S(" a b\t c ").split(S(" ")) {|s| result << s}
assert_equal([S("a"), S("b"), S("c")], result)
result = []; S(" a | b | c ").split(S("|")) {|s| result << s}
assert_equal([S(" a "), S(" b "), S(" c ")], result)
result = []; S("aXXbXXcXX").split(/X./) {|s| result << s}
assert_equal([S("a"), S("b"), S("c")], result)
result = []; S("abc").split(//) {|s| result << s}
assert_equal([S("a"), S("b"), S("c")], result)
result = []; S("a|b|c").split(S('|'), 1) {|s| result << s}
assert_equal([S("a|b|c")], result)
result = []; S("a|b|c").split(S('|'), 2) {|s| result << s}
assert_equal([S("a"), S("b|c")], result)
result = []; S("a|b|c").split(S('|'), 3) {|s| result << s}
assert_equal([S("a"), S("b"), S("c")], result)
result = []; S("a|b|c|").split(S('|'), -1) {|s| result << s}
assert_equal([S("a"), S("b"), S("c"), S("")], result)
result = []; S("a|b|c||").split(S('|'), -1) {|s| result << s}
assert_equal([S("a"), S("b"), S("c"), S(""), S("")], result)
result = []; S("a||b|c|").split(S('|')) {|s| result << s}
assert_equal([S("a"), S(""), S("b"), S("c")], result)
result = []; S("a||b|c|").split(S('|'), -1) {|s| result << s}
assert_equal([S("a"), S(""), S("b"), S("c"), S("")], result)
result = []; "".split(//, 1) {|s| result << s}
assert_equal([], result)
result = []; "aaa,bbb,ccc,ddd".split(/,/) {|s| result << s.gsub(/./, "A")}
assert_equal(["AAA"]*4, result)
ensure
EnvUtil.suppress_warning {$; = fs}
end
def test_fs
assert_raise_with_message(TypeError, /\$;/) {
$; = []
}
assert_separately(%W[-W0], "#{<<~"begin;"}\n#{<<~'end;'}")
bug = '[ruby-core:79582] $; must not be GCed'
begin;
$; = " "
$a = nil
alias $; $a
alias $-F $a
GC.start
assert_equal([], "".split, bug)
end;
begin
fs = $;
assert_warn(/\$; will be deprecated/) {$; = " "}
ensure
EnvUtil.suppress_warning {$; = fs}
end
end
def test_split_encoding
bug6206 = '[ruby-dev:45441]'
Encoding.list.each do |enc|
next unless enc.ascii_compatible?
s = S("a:".force_encoding(enc))
assert_equal([enc]*2, s.split(":", 2).map(&:encoding), bug6206)
end
end
def test_split_wchar
bug8642 = '[ruby-core:56036] [Bug #8642]'
WIDE_ENCODINGS.each do |enc|
s = S("abc,def".encode(enc))
assert_equal(["abc", "def"].map {|c| c.encode(enc)},
s.split(",".encode(enc)),
"#{bug8642} in #{enc.name}")
end
end
def test_split_invalid_sequence
bug10886 = '[ruby-core:68229] [Bug #10886]'
broken = S("\xa1".force_encoding("utf-8"))
assert_raise(ArgumentError, bug10886) {
S("a,b").split(broken)
}
end
def test_split_invalid_argument
assert_raise(TypeError) {
S("a,b").split(BasicObject.new)
}
end
def test_split_dupped
s = "abc"
s.split("b", 1).map(&:upcase!)
assert_equal("abc", s)
end
def test_squeeze
assert_equal(S("abc"), S("aaabbbbccc").squeeze)
assert_equal(S("aa bb cc"), S("aa bb cc").squeeze(S(" ")))
assert_equal(S("BxTyWz"), S("BxxxTyyyWzzzzz").squeeze(S("a-z")))
end
def test_squeeze!
a = S("aaabbbbccc")
b = a.dup
assert_equal(S("abc"), a.squeeze!)
assert_equal(S("abc"), a)
assert_equal(S("aaabbbbccc"), b)
a = S("aa bb cc")
assert_equal(S("aa bb cc"), a.squeeze!(S(" ")))
assert_equal(S("aa bb cc"), a)
a = S("BxxxTyyyWzzzzz")
assert_equal(S("BxTyWz"), a.squeeze!(S("a-z")))
assert_equal(S("BxTyWz"), a)
a=S("The quick brown fox")
assert_nil(a.squeeze!)
end
def test_start_with?
assert_send([S("hello"), :start_with?, S("hel")])
assert_not_send([S("hello"), :start_with?, S("el")])
assert_send([S("hello"), :start_with?, S("el"), S("he")])
bug5536 = '[ruby-core:40623]'
assert_raise(TypeError, bug5536) {S("str").start_with? :not_convertible_to_string}
assert_equal(true, "hello".start_with?(/hel/))
assert_equal("hel", $&)
assert_equal(false, "hello".start_with?(/el/))
assert_nil($&)
end
def test_strip
assert_equal(S("x"), S(" x ").strip)
assert_equal(S("x"), S(" \n\r\t x \t\r\n\n ").strip)
assert_equal("0b0 ".force_encoding("UTF-16BE"),
"\x00 0b0 ".force_encoding("UTF-16BE").strip)
assert_equal("0\x000b0 ".force_encoding("UTF-16BE"),
"0\x000b0 ".force_encoding("UTF-16BE").strip)
end
def test_strip!
a = S(" x ")
b = a.dup
assert_equal(S("x") ,a.strip!)
assert_equal(S("x") ,a)
assert_equal(S(" x "), b)
a = S(" \n\r\t x \t\r\n\n ")
assert_equal(S("x"), a.strip!)
assert_equal(S("x"), a)
a = S("x")
assert_nil(a.strip!)
assert_equal(S("x") ,a)
end
def test_sub
assert_equal(S("h*llo"), S("hello").sub(/[aeiou]/, S('*')))
assert_equal(S("h<e>llo"), S("hello").sub(/([aeiou])/, S('<\1>')))
assert_equal(S("h ello"), S("hello").sub(/./) {
|s| s[0].to_s + S(' ')})
assert_equal(S("HELL-o"), S("hello").sub(/(hell)(.)/) {
|s| $1.upcase + S('-') + $2
})
assert_equal(S("h<e>llo"), S("hello").sub('e', S('<\0>')))
assert_equal(S("a\\aba"), S("ababa").sub(/b/, '\\'))
assert_equal(S("ab\\aba"), S("ababa").sub(/(b)/, '\1\\'))
assert_equal(S("ababa"), S("ababa").sub(/(b)/, '\1'))
assert_equal(S("ababa"), S("ababa").sub(/(b)/, '\\1'))
assert_equal(S("a\\1aba"), S("ababa").sub(/(b)/, '\\\1'))
assert_equal(S("a\\1aba"), S("ababa").sub(/(b)/, '\\\\1'))
assert_equal(S("a\\baba"), S("ababa").sub(/(b)/, '\\\\\1'))
assert_equal(S("a--ababababababababab"),
S("abababababababababab").sub(/(b)/, '-\9-'))
assert_equal(S("1-b-0"),
S("1b2b3b4b5b6b7b8b9b0").
sub(/(b).(b).(b).(b).(b).(b).(b).(b).(b)/, '-\9-'))
assert_equal(S("1-b-0"),
S("1b2b3b4b5b6b7b8b9b0").
sub(/(b).(b).(b).(b).(b).(b).(b).(b).(b)/, '-\\9-'))
assert_equal(S("1-\\9-0"),
S("1b2b3b4b5b6b7b8b9b0").
sub(/(b).(b).(b).(b).(b).(b).(b).(b).(b)/, '-\\\9-'))
assert_equal(S("k"),
S("1a2b3c4d5e6f7g8h9iAjBk").
sub(/.(.).(.).(.).(.).(.).(.).(.).(.).(.).(.).(.)/, '\+'))
assert_equal(S("ab\\aba"), S("ababa").sub(/b/, '\&\\'))
assert_equal(S("ababa"), S("ababa").sub(/b/, '\&'))
assert_equal(S("ababa"), S("ababa").sub(/b/, '\\&'))
assert_equal(S("a\\&aba"), S("ababa").sub(/b/, '\\\&'))
assert_equal(S("a\\&aba"), S("ababa").sub(/b/, '\\\\&'))
assert_equal(S("a\\baba"), S("ababa").sub(/b/, '\\\\\&'))
a = S("hello")
a.taint
x = a.sub(/./, S('X'))
assert_predicate(x, :tainted?)
o = Object.new
def o.to_str; "bar"; end
assert_equal("fooBARbaz", "foobarbaz".sub(o, "BAR"))
assert_raise(TypeError) { "foo".sub(Object.new, "") }
assert_raise(ArgumentError) { "foo".sub }
assert_raise(IndexError) { "foo"[/(?:(o$)|(x))/, 2] = 'bar' }
o = Object.new
def o.to_s; self; end
assert_match(/^foo#<Object:0x.*>baz$/, "foobarbaz".sub("bar") { o })
assert_equal(S("Abc"), S("abc").sub("a", "A"))
m = nil
assert_equal(S("Abc"), S("abc").sub("a") {m = $~; "A"})
assert_equal(S("a"), m[0])
assert_equal(/a/, m.regexp)
bug = '[ruby-core:78686] [Bug #13042] other than regexp has no name references'
assert_raise_with_message(IndexError, /oops/, bug) {
'hello'.gsub('hello', '\k<oops>')
}
end
def test_sub!
a = S("hello")
b = a.dup
a.sub!(/[aeiou]/, S('*'))
assert_equal(S("h*llo"), a)
assert_equal(S("hello"), b)
a = S("hello")
a.sub!(/([aeiou])/, S('<\1>'))
assert_equal(S("h<e>llo"), a)
a = S("hello")
a.sub!(/./) { |s| s[0].to_s + S(' ')}
assert_equal(S("h ello"), a)
a = S("hello")
a.sub!(/(hell)(.)/) { |s| $1.upcase + S('-') + $2 }
assert_equal(S("HELL-o"), a)
a=S("hello")
assert_nil(a.sub!(/X/, S('Y')))
r = S('X')
r.taint
a.sub!(/./, r)
assert_predicate(a, :tainted?)
bug16105 = '[Bug #16105] heap-use-after-free'
a = S("ABCDEFGHIJKLMNOPQRSTUVWXYZ012345678")
b = a.dup
c = a.slice(1, 100)
assert_equal("AABCDEFGHIJKLMNOPQRSTUVWXYZ012345678", b.sub!(c, b), bug16105)
end
def test_succ
assert_equal(S("abd"), S("abc").succ)
assert_equal(S("z"), S("y").succ)
assert_equal(S("aaa"), S("zz").succ)
assert_equal(S("124"), S("123").succ)
assert_equal(S("1000"), S("999").succ)
assert_equal(S("2.000"), S("1.999").succ)
assert_equal(S("No.10"), S("No.9").succ)
assert_equal(S("2000aaa"), S("1999zzz").succ)
assert_equal(S("AAAAA000"), S("ZZZZ999").succ)
assert_equal(S("*+"), S("**").succ)
assert_equal("abce", "abcd".succ)
assert_equal("THX1139", "THX1138".succ)
assert_equal("<\<koalb>>", "<\<koala>>".succ)
assert_equal("2000aaa", "1999zzz".succ)
assert_equal("AAAA0000", "ZZZ9999".succ)
assert_equal("**+", "***".succ)
assert_equal("!", " ".succ)
assert_equal("", "".succ)
bug = '[ruby-core:83062] [Bug #13952]'
s = "\xff".b
assert_not_predicate(s, :ascii_only?)
assert_predicate(s.succ, :ascii_only?, bug)
end
def test_succ!
a = S("abc")
b = a.dup
assert_equal(S("abd"), a.succ!)
assert_equal(S("abd"), a)
assert_equal(S("abc"), b)
a = S("y")
assert_equal(S("z"), a.succ!)
assert_equal(S("z"), a)
a = S("zz")
assert_equal(S("aaa"), a.succ!)
assert_equal(S("aaa"), a)
a = S("123")
assert_equal(S("124"), a.succ!)
assert_equal(S("124"), a)
a = S("999")
assert_equal(S("1000"), a.succ!)
assert_equal(S("1000"), a)
a = S("1999zzz")
assert_equal(S("2000aaa"), a.succ!)
assert_equal(S("2000aaa"), a)
a = S("ZZZZ999")
assert_equal(S("AAAAA000"), a.succ!)
assert_equal(S("AAAAA000"), a)
a = S("**")
assert_equal(S("*+"), a.succ!)
assert_equal(S("*+"), a)
a = S("No.9")
assert_equal(S("No.10"), a.succ!)
assert_equal(S("No.10"), a)
a = S(" ")
assert_equal(S("!"), a.succ!)
assert_equal(S("!"), a)
a = S("")
assert_equal(S(""), a.succ!)
assert_equal(S(""), a)
assert_equal("aaaaaaaaaaaa", "zzzzzzzzzzz".succ!)
assert_equal("aaaaaaaaaaaaaaaaaaaaaaaa", "zzzzzzzzzzzzzzzzzzzzzzz".succ!)
end
def test_sum
n = S("\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001")
assert_equal(15, n.sum)
n += S("\001")
assert_equal(16, n.sum(17))
n[0] = 2.chr
assert_not_equal(15, n.sum)
assert_equal(17, n.sum(0))
assert_equal(17, n.sum(-1))
end
def check_sum(str, bits=16)
sum = 0
str.each_byte {|c| sum += c}
sum = sum & ((1 << bits) - 1) if bits != 0
assert_equal(sum, str.sum(bits))
end
def test_sum_2
assert_equal(0, "".sum)
assert_equal(294, "abc".sum)
check_sum("abc")
check_sum("\x80")
-3.upto(70) {|bits|
check_sum("xyz", bits)
}
end
def test_sum_long
s8421505 = "\xff" * 8421505
assert_equal(127, s8421505.sum(31))
assert_equal(2147483775, s8421505.sum(0))
s16843010 = ("\xff" * 16843010)
assert_equal(254, s16843010.sum(32))
assert_equal(4294967550, s16843010.sum(0))
end
def test_swapcase
assert_equal(S("hi&LOW"), S("HI&low").swapcase)
end
def test_swapcase!
a = S("hi&LOW")
b = a.dup
assert_equal(S("HI&low"), a.swapcase!)
assert_equal(S("HI&low"), a)
assert_equal(S("hi&LOW"), b)
a = S("$^#^%$#!!")
assert_nil(a.swapcase!)
assert_equal(S("$^#^%$#!!"), a)
end
def test_to_f
assert_equal(344.3, S("344.3").to_f)
assert_equal(5.9742e24, S("5.9742e24").to_f)
assert_equal(98.6, S("98.6 degrees").to_f)
assert_equal(0.0, S("degrees 100.0").to_f)
assert_equal([ 0.0].pack('G'), [S(" 0.0").to_f].pack('G'))
assert_equal([-0.0].pack('G'), [S("-0.0").to_f].pack('G'))
end
def test_to_i
assert_equal(1480, S("1480ft/sec").to_i)
assert_equal(0, S("speed of sound in water @20C = 1480ft/sec)").to_i)
assert_equal(0, " 0".to_i)
assert_equal(0, "+0".to_i)
assert_equal(0, "-0".to_i)
assert_equal(0, "--0".to_i)
assert_equal(16, "0x10".to_i(0))
assert_equal(16, "0X10".to_i(0))
assert_equal(2, "0b10".to_i(0))
assert_equal(2, "0B10".to_i(0))
assert_equal(8, "0o10".to_i(0))
assert_equal(8, "0O10".to_i(0))
assert_equal(10, "0d10".to_i(0))
assert_equal(10, "0D10".to_i(0))
assert_equal(8, "010".to_i(0))
assert_raise(ArgumentError) { "010".to_i(-10) }
2.upto(36) {|radix|
assert_equal(radix, "10".to_i(radix))
assert_equal(radix**2, "100".to_i(radix))
}
assert_raise(ArgumentError) { "0".to_i(1) }
assert_raise(ArgumentError) { "0".to_i(37) }
assert_equal(0, "z".to_i(10))
assert_equal(12, "1_2".to_i(10))
assert_equal(0x40000000, "1073741824".to_i(10))
assert_equal(0x4000000000000000, "4611686018427387904".to_i(10))
assert_equal(1, "1__2".to_i(10))
assert_equal(1, "1_z".to_i(10))
bug6192 = '[ruby-core:43566]'
assert_raise(Encoding::CompatibilityError, bug6192) {"0".encode("utf-16be").to_i}
assert_raise(Encoding::CompatibilityError, bug6192) {"0".encode("utf-16le").to_i}
assert_raise(Encoding::CompatibilityError, bug6192) {"0".encode("utf-32be").to_i}
assert_raise(Encoding::CompatibilityError, bug6192) {"0".encode("utf-32le").to_i}
assert_raise(Encoding::CompatibilityError, bug6192) {"0".encode("iso-2022-jp").to_i}
end
def test_to_s
a = S("me")
assert_equal("me", a.to_s)
assert_equal(a.__id__, a.to_s.__id__) if @cls == String
end
def test_to_str
a = S("me")
assert_equal("me", a.to_s)
assert_equal(a.__id__, a.to_s.__id__) if @cls == String
o = Object.new
def o.to_str
"at"
end
assert_equal("meat", a.concat(o))
o = Object.new
def o.to_str
foo_bar()
end
assert_match(/foo_bar/, assert_raise(NoMethodError) {a.concat(o)}.message)
end
def test_tr
assert_equal(S("hippo"), S("hello").tr(S("el"), S("ip")))
assert_equal(S("*e**o"), S("hello").tr(S("^aeiou"), S("*")))
assert_equal(S("hal"), S("ibm").tr(S("b-z"), S("a-z")))
a = "abc".force_encoding(Encoding::US_ASCII)
assert_equal(Encoding::US_ASCII, a.tr(S("z"), S("\u0101")).encoding, '[ruby-core:22326]')
assert_equal("a".hash, "a".tr("a", "\u0101").tr("\u0101", "a").hash, '[ruby-core:22328]')
assert_equal(true, "\u0101".tr("\u0101", "a").ascii_only?)
assert_equal(true, "\u3041".tr("\u3041", "a").ascii_only?)
assert_equal(false, "\u3041\u3042".tr("\u3041", "a").ascii_only?)
bug6156 = '[ruby-core:43335]'
bug13950 = '[ruby-core:83056] [Bug #13950]'
str, range, star = %w[b a-z *].map{|s|s.encode("utf-16le")}
result = str.tr(range, star)
assert_equal(star, result, bug6156)
assert_not_predicate(str, :ascii_only?)
assert_not_predicate(star, :ascii_only?)
assert_not_predicate(result, :ascii_only?, bug13950)
end
def test_tr!
a = S("hello")
b = a.dup
assert_equal(S("hippo"), a.tr!(S("el"), S("ip")))
assert_equal(S("hippo"), a)
assert_equal(S("hello"),b)
a = S("hello")
assert_equal(S("*e**o"), a.tr!(S("^aeiou"), S("*")))
assert_equal(S("*e**o"), a)
a = S("IBM")
assert_equal(S("HAL"), a.tr!(S("B-Z"), S("A-Z")))
assert_equal(S("HAL"), a)
a = S("ibm")
assert_nil(a.tr!(S("B-Z"), S("A-Z")))
assert_equal(S("ibm"), a)
a = "abc".force_encoding(Encoding::US_ASCII)
assert_nil(a.tr!(S("z"), S("\u0101")), '[ruby-core:22326]')
assert_equal(Encoding::US_ASCII, a.encoding, '[ruby-core:22326]')
end
def test_tr_s
assert_equal(S("hypo"), S("hello").tr_s(S("el"), S("yp")))
assert_equal(S("h*o"), S("hello").tr_s(S("el"), S("*")))
assert_equal("a".hash, "\u0101\u0101".tr_s("\u0101", "a").hash)
assert_equal(true, "\u3041\u3041".tr("\u3041", "a").ascii_only?)
end
def test_tr_s!
a = S("hello")
b = a.dup
assert_equal(S("hypo"), a.tr_s!(S("el"), S("yp")))
assert_equal(S("hypo"), a)
assert_equal(S("hello"), b)
a = S("hello")
assert_equal(S("h*o"), a.tr_s!(S("el"), S("*")))
assert_equal(S("h*o"), a)
end
def test_unpack
a = [S("cat"), S("wom"), S("x"), S("yy")]
assert_equal(a, S("catwomx yy ").unpack(S("A3A3A3A3")))
assert_equal([S("cat")], S("cat \000\000").unpack(S("A*")))
assert_equal([S("cwx"), S("wx"), S("x"), S("yy")],
S("cwx yy ").unpack(S("A3@1A3@2A3A3")))
assert_equal([S("cat"), S("wom"), S("x\000\000"), S("yy\000")],
S("catwomx\000\000yy\000").unpack(S("a3a3a3a3")))
assert_equal([S("cat \000\000")], S("cat \000\000").unpack(S("a*")))
assert_equal([S("ca")], S("catdog").unpack(S("a2")))
assert_equal([S("cat\000\000")],
S("cat\000\000\000\000\000dog").unpack(S("a5")))
assert_equal([S("01100001")], S("\x61").unpack(S("B8")))
assert_equal([S("01100001")], S("\x61").unpack(S("B*")))
assert_equal([S("0110000100110111")], S("\x61\x37").unpack(S("B16")))
assert_equal([S("01100001"), S("00110111")], S("\x61\x37").unpack(S("B8B8")))
assert_equal([S("0110")], S("\x60").unpack(S("B4")))
assert_equal([S("01")], S("\x40").unpack(S("B2")))
assert_equal([S("01100001")], S("\x86").unpack(S("b8")))
assert_equal([S("01100001")], S("\x86").unpack(S("b*")))
assert_equal([S("0110000100110111")], S("\x86\xec").unpack(S("b16")))
assert_equal([S("01100001"), S("00110111")], S("\x86\xec").unpack(S("b8b8")))
assert_equal([S("0110")], S("\x06").unpack(S("b4")))
assert_equal([S("01")], S("\x02").unpack(S("b2")))
assert_equal([ 65, 66, 67 ], S("ABC").unpack(S("C3")))
assert_equal([ 255, 66, 67 ], S("\377BC").unpack("C*"))
assert_equal([ 65, 66, 67 ], S("ABC").unpack("c3"))
assert_equal([ -1, 66, 67 ], S("\377BC").unpack("c*"))
assert_equal([S("4142"), S("0a"), S("1")], S("AB\n\x10").unpack(S("H4H2H1")))
assert_equal([S("1424"), S("a0"), S("2")], S("AB\n\x02").unpack(S("h4h2h1")))
assert_equal([S("abc\002defcat\001"), S(""), S("")],
S("abc=02def=\ncat=\n=01=\n").unpack(S("M9M3M4")))
assert_equal([S("hello\n")], S("aGVsbG8K\n").unpack(S("m")))
assert_equal([S("hello\nhello\n")], S(",:&5L;&\\*:&5L;&\\*\n").unpack(S("u")))
assert_equal([0xa9, 0x42, 0x2260], S("\xc2\xa9B\xe2\x89\xa0").unpack(S("U*")))
=begin
skipping "Not tested:
D,d & double-precision float, native format\\
E & double-precision float, little-endian byte order\\
e & single-precision float, little-endian byte order\\
F,f & single-precision float, native format\\
G & double-precision float, network (big-endian) byte order\\
g & single-precision float, network (big-endian) byte order\\
I & unsigned integer\\
i & integer\\
L & unsigned long\\
l & long\\
m & string encoded in base64 (uuencoded)\\
N & long, network (big-endian) byte order\\
n & short, network (big-endian) byte-order\\
P & pointer to a structure (fixed-length string)\\
p & pointer to a null-terminated string\\
S & unsigned short\\
s & short\\
V & long, little-endian byte order\\
v & short, little-endian byte order\\
X & back up a byte\\
x & null byte\\
Z & ASCII string (null padded, count is width)\\
"
=end
end
def test_upcase
assert_equal(S("HELLO"), S("hello").upcase)
assert_equal(S("HELLO"), S("hello").upcase)
assert_equal(S("HELLO"), S("HELLO").upcase)
assert_equal(S("ABC HELLO 123"), S("abc HELLO 123").upcase)
end
def test_upcase!
a = S("hello")
b = a.dup
assert_equal(S("HELLO"), a.upcase!)
assert_equal(S("HELLO"), a)
assert_equal(S("hello"), b)
a = S("HELLO")
assert_nil(a.upcase!)
assert_equal(S("HELLO"), a)
end
def test_upto
a = S("aa")
start = S("aa")
count = 0
assert_equal(S("aa"), a.upto(S("zz")) {|s|
assert_equal(start, s)
start.succ!
count += 1
})
assert_equal(676, count)
end
def test_upto_numeric
a = S("00")
start = S("00")
count = 0
assert_equal(S("00"), a.upto(S("23")) {|s|
assert_equal(start, s, "[ruby-dev:39361]")
assert_equal(Encoding::US_ASCII, s.encoding)
start.succ!
count += 1
})
assert_equal(24, count, "[ruby-dev:39361]")
end
def test_upto_nonalnum
first = S("\u3041")
last = S("\u3093")
count = 0
assert_equal(first, first.upto(last) {|s|
count += 1
s.replace(last)
})
assert_equal(83, count, "[ruby-dev:39626]")
end
def test_mod_check
assert_raise(RuntimeError) {
s = ""
s.sub!(/\A/) { s.replace "z" * 2000; "zzz" }
}
end
def test_frozen_check
assert_raise(FrozenError) {
s = ""
s.sub!(/\A/) { s.freeze; "zzz" }
}
end
class S2 < String
end
def test_str_new4
s = (0..54).to_a.join # length = 100
s2 = S2.new(s[10,90])
s3 = s2[10,80]
assert_equal((10..54).to_a.to_a.join, s2)
assert_equal((15..54).to_a.to_a.join, s3)
end
def test_rb_str_new4
s = "a" * 100
s2 = s[10,90]
assert_equal("a" * 90, s2)
s3 = s2[10,80]
assert_equal("a" * 80, s3)
end
class StringLike
def initialize(str)
@str = str
end
def to_str
@str
end
end
def test_rb_str_to_str
assert_equal("ab", "a" + StringLike.new("b"))
end
def test_rb_str_shared_replace
s = "a" * 100
s.succ!
assert_equal("a" * 99 + "b", s)
s = ""
s.succ!
assert_equal("", s)
end
def test_times
assert_raise(ArgumentError) { "a" * (-1) }
end
def test_splice!
l = S("1234\n234\n34\n4\n")
assert_equal(S("1234\n"), l.slice!(/\A.*\n/), "[ruby-dev:31665]")
assert_equal(S("234\n"), l.slice!(/\A.*\n/), "[ruby-dev:31665]")
assert_equal(S("34\n"), l.slice!(/\A.*\n/), "[ruby-dev:31665]")
assert_equal(S("4\n"), l.slice!(/\A.*\n/), "[ruby-dev:31665]")
assert_nil(l.slice!(/\A.*\n/), "[ruby-dev:31665]")
end
def test_times2
s1 = ''
100.times {|n|
s2 = "a" * n
assert_equal(s1, s2)
s1 << 'a'
}
assert_raise(ArgumentError) { "foo" * (-1) }
end
def test_respond_to
o = Object.new
def o.respond_to?(arg) [:to_str].include?(arg) ? nil : super end
def o.to_str() "" end
def o.==(other) "" == other end
assert_equal(false, "" == o)
end
def test_match_method
assert_equal("bar", "foobarbaz".match(/bar/).to_s)
o = Regexp.new('foo')
def o.match(x, y, z); x + y + z; end
assert_equal("foobarbaz", "foo".match(o, "bar", "baz"))
x = nil
"foo".match(o, "bar", "baz") {|y| x = y }
assert_equal("foobarbaz", x)
assert_raise(ArgumentError) { "foo".match }
end
def test_match_p_regexp
/backref/ =~ 'backref'
# must match here, but not in a separate method, e.g., assert_send,
# to check if $~ is affected or not.
assert_equal(true, "".match?(//))
assert_equal(true, :abc.match?(/.../))
assert_equal(true, 'abc'.match?(/b/))
assert_equal(true, 'abc'.match?(/b/, 1))
assert_equal(true, 'abc'.match?(/../, 1))
assert_equal(true, 'abc'.match?(/../, -2))
assert_equal(false, 'abc'.match?(/../, -4))
assert_equal(false, 'abc'.match?(/../, 4))
assert_equal(true, "\u3042xx".match?(/../, 1))
assert_equal(false, "\u3042x".match?(/../, 1))
assert_equal(true, ''.match?(/\z/))
assert_equal(true, 'abc'.match?(/\z/))
assert_equal(true, 'Ruby'.match?(/R.../))
assert_equal(false, 'Ruby'.match?(/R.../, 1))
assert_equal(false, 'Ruby'.match?(/P.../))
assert_equal('backref', $&)
end
def test_match_p_string
/backref/ =~ 'backref'
# must match here, but not in a separate method, e.g., assert_send,
# to check if $~ is affected or not.
assert_equal(true, "".match?(''))
assert_equal(true, :abc.match?('...'))
assert_equal(true, 'abc'.match?('b'))
assert_equal(true, 'abc'.match?('b', 1))
assert_equal(true, 'abc'.match?('..', 1))
assert_equal(true, 'abc'.match?('..', -2))
assert_equal(false, 'abc'.match?('..', -4))
assert_equal(false, 'abc'.match?('..', 4))
assert_equal(true, "\u3042xx".match?('..', 1))
assert_equal(false, "\u3042x".match?('..', 1))
assert_equal(true, ''.match?('\z'))
assert_equal(true, 'abc'.match?('\z'))
assert_equal(true, 'Ruby'.match?('R...'))
assert_equal(false, 'Ruby'.match?('R...', 1))
assert_equal(false, 'Ruby'.match?('P...'))
assert_equal('backref', $&)
end
def test_clear
s = "foo" * 100
s.clear
assert_equal("", s)
end
def test_to_s_2
c = Class.new(String)
s = c.new
s.replace("foo")
assert_equal("foo", s.to_s)
assert_instance_of(String, s.to_s)
end
def test_inspect_nul
bug8290 = '[ruby-core:54458]'
s = "\0" + "12"
assert_equal '"\u000012"', s.inspect, bug8290
s = "\0".b + "12"
assert_equal '"\x0012"', s.inspect, bug8290
end
def test_partition
assert_equal(%w(he l lo), "hello".partition(/l/))
assert_equal(%w(he l lo), "hello".partition("l"))
assert_raise(TypeError) { "hello".partition(1) }
def (hyphen = Object.new).to_str; "-"; end
assert_equal(%w(foo - bar), "foo-bar".partition(hyphen), '[ruby-core:23540]')
bug6206 = '[ruby-dev:45441]'
Encoding.list.each do |enc|
next unless enc.ascii_compatible?
s = S("a:".force_encoding(enc))
assert_equal([enc]*3, s.partition("|").map(&:encoding), bug6206)
end
assert_equal(["\u30E6\u30FC\u30B6", "@", "\u30C9\u30E1.\u30A4\u30F3"],
"\u30E6\u30FC\u30B6@\u30C9\u30E1.\u30A4\u30F3".partition(/[@.]/))
bug = '[ruby-core:82911]'
hello = "hello"
hello.partition("hi").map(&:upcase!)
assert_equal("hello", hello, bug)
end
def test_rpartition
assert_equal(%w(hel l o), "hello".rpartition(/l/))
assert_equal(%w(hel l o), "hello".rpartition("l"))
assert_raise(TypeError) { "hello".rpartition(1) }
def (hyphen = Object.new).to_str; "-"; end
assert_equal(%w(foo - bar), "foo-bar".rpartition(hyphen), '[ruby-core:23540]')
bug6206 = '[ruby-dev:45441]'
Encoding.list.each do |enc|
next unless enc.ascii_compatible?
s = S("a:".force_encoding(enc))
assert_equal([enc]*3, s.rpartition("|").map(&:encoding), bug6206)
end
bug8138 = '[ruby-dev:47183]'
assert_equal(["\u30E6\u30FC\u30B6@\u30C9\u30E1", ".", "\u30A4\u30F3"],
"\u30E6\u30FC\u30B6@\u30C9\u30E1.\u30A4\u30F3".rpartition(/[@.]/), bug8138)
bug = '[ruby-core:82911]'
hello = "hello"
hello.rpartition("hi").map(&:upcase!)
assert_equal("hello", hello, bug)
end
def test_setter
assert_raise(TypeError) { $/ = 1 }
name = "\u{5206 884c}"
assert_separately([], <<-"end;") # do
alias $#{name} $/
assert_raise_with_message(TypeError, /\\$#{name}/) { $#{name} = 1 }
end;
end
def test_to_id
c = Class.new
c.class_eval do
def initialize
@foo = :foo
end
end
assert_raise(TypeError) do
c.class_eval { attr 1 }
end
o = Object.new
def o.to_str; :foo; end
assert_raise(TypeError) do
c.class_eval { attr 1 }
end
class << o;remove_method :to_str;end
def o.to_str; "foo"; end
assert_nothing_raised do
c.class_eval { attr o }
end
assert_equal(:foo, c.new.foo)
end
def test_gsub_enumerator
assert_normal_exit %q{"abc".gsub(/./).next}, "[ruby-dev:34828]"
end
def test_clear_nonasciicompat
assert_equal("", "\u3042".encode("ISO-2022-JP").clear)
end
def test_try_convert
assert_equal(nil, String.try_convert(1))
assert_equal("foo", String.try_convert("foo"))
end
def test_substr_negative_begin
assert_equal("\u3042", ("\u3042" * 100)[-1])
end
=begin
def test_compare_different_encoding_string
s1 = "\xff".force_encoding("UTF-8")
s2 = "\xff".force_encoding("ISO-2022-JP")
assert_equal([-1, 1], [s1 <=> s2, s2 <=> s1].sort)
end
=end
def test_casecmp
assert_equal(0, "FoO".casecmp("fOO"))
assert_equal(1, "FoO".casecmp("BaR"))
assert_equal(-1, "baR".casecmp("FoO"))
assert_equal(1, "\u3042B".casecmp("\u3042a"))
assert_nil("foo".casecmp(:foo))
assert_nil("foo".casecmp(Object.new))
o = Object.new
def o.to_str; "fOO"; end
assert_equal(0, "FoO".casecmp(o))
end
def test_casecmp?
assert_equal(true, 'FoO'.casecmp?('fOO'))
assert_equal(false, 'FoO'.casecmp?('BaR'))
assert_equal(false, 'baR'.casecmp?('FoO'))
assert_equal(true, 'äöü'.casecmp?('ÄÖÜ'))
assert_nil("foo".casecmp?(:foo))
assert_nil("foo".casecmp?(Object.new))
o = Object.new
def o.to_str; "fOO"; end
assert_equal(true, "FoO".casecmp?(o))
end
def test_upcase2
assert_equal("\u3042AB", "\u3042aB".upcase)
end
def test_downcase2
assert_equal("\u3042ab", "\u3042aB".downcase)
end
def test_rstrip
assert_equal(" hello", " hello ".rstrip)
assert_equal("\u3042", "\u3042 ".rstrip)
assert_raise(Encoding::CompatibilityError) { "\u3042".encode("ISO-2022-JP").rstrip }
end
def test_rstrip_bang
s1 = S(" hello ")
assert_equal(" hello", s1.rstrip!)
assert_equal(" hello", s1)
s2 = S("\u3042 ")
assert_equal("\u3042", s2.rstrip!)
assert_equal("\u3042", s2)
s3 = S(" \u3042")
assert_equal(nil, s3.rstrip!)
assert_equal(" \u3042", s3)
s4 = S("\u3042")
assert_equal(nil, s4.rstrip!)
assert_equal("\u3042", s4)
assert_raise(Encoding::CompatibilityError) { "\u3042".encode("ISO-2022-JP").rstrip! }
end
def test_lstrip
assert_equal("hello ", " hello ".lstrip)
assert_equal("\u3042", " \u3042".lstrip)
end
def test_lstrip_bang
s1 = S(" hello ")
assert_equal("hello ", s1.lstrip!)
assert_equal("hello ", s1)
s2 = S("\u3042 ")
assert_equal(nil, s2.lstrip!)
assert_equal("\u3042 ", s2)
s3 = S(" \u3042")
assert_equal("\u3042", s3.lstrip!)
assert_equal("\u3042", s3)
s4 = S("\u3042")
assert_equal(nil, s4.lstrip!)
assert_equal("\u3042", s4)
end
def test_delete_prefix
assert_raise(TypeError) { 'hello'.delete_prefix(nil) }
assert_raise(TypeError) { 'hello'.delete_prefix(1) }
assert_raise(TypeError) { 'hello'.delete_prefix(/hel/) }
s = S("hello")
assert_equal("lo", s.delete_prefix('hel'))
assert_equal("hello", s)
s = S("hello")
assert_equal("hello", s.delete_prefix('lo'))
assert_equal("hello", s)
s = S("\u{3053 3093 306b 3061 306f}")
assert_equal("\u{306b 3061 306f}", s.delete_prefix("\u{3053 3093}"))
assert_equal("\u{3053 3093 306b 3061 306f}", s)
s = S("\u{3053 3093 306b 3061 306f}")
assert_equal("\u{3053 3093 306b 3061 306f}", s.delete_prefix('hel'))
assert_equal("\u{3053 3093 306b 3061 306f}", s)
s = S("hello")
assert_equal("hello", s.delete_prefix("\u{3053 3093}"))
assert_equal("hello", s)
# skip if argument is a broken string
s = S("\xe3\x81\x82")
assert_equal("\xe3\x81\x82", s.delete_prefix("\xe3"))
assert_equal("\xe3\x81\x82", s)
s = S("\x95\x5c").force_encoding("Shift_JIS")
assert_equal("\x95\x5c".force_encoding("Shift_JIS"), s.delete_prefix("\x95"))
assert_equal("\x95\x5c".force_encoding("Shift_JIS"), s)
# clear coderange
s = S("\u{3053 3093}hello")
assert_not_predicate(s, :ascii_only?)
assert_predicate(s.delete_prefix("\u{3053 3093}"), :ascii_only?)
# argument should be converted to String
klass = Class.new { def to_str; 'a'; end }
s = S("abba")
assert_equal("bba", s.delete_prefix(klass.new))
assert_equal("abba", s)
end
def test_delete_prefix_bang
assert_raise(TypeError) { 'hello'.delete_prefix!(nil) }
assert_raise(TypeError) { 'hello'.delete_prefix!(1) }
assert_raise(TypeError) { 'hello'.delete_prefix!(/hel/) }
s = S("hello")
assert_equal("lo", s.delete_prefix!('hel'))
assert_equal("lo", s)
s = S("hello")
assert_equal(nil, s.delete_prefix!('lo'))
assert_equal("hello", s)
s = S("\u{3053 3093 306b 3061 306f}")
assert_equal("\u{306b 3061 306f}", s.delete_prefix!("\u{3053 3093}"))
assert_equal("\u{306b 3061 306f}", s)
s = S("\u{3053 3093 306b 3061 306f}")
assert_equal(nil, s.delete_prefix!('hel'))
assert_equal("\u{3053 3093 306b 3061 306f}", s)
s = S("hello")
assert_equal(nil, s.delete_prefix!("\u{3053 3093}"))
assert_equal("hello", s)
# skip if argument is a broken string
s = S("\xe3\x81\x82")
assert_equal(nil, s.delete_prefix!("\xe3"))
assert_equal("\xe3\x81\x82", s)
# clear coderange
s = S("\u{3053 3093}hello")
assert_not_predicate(s, :ascii_only?)
assert_predicate(s.delete_prefix!("\u{3053 3093}"), :ascii_only?)
# argument should be converted to String
klass = Class.new { def to_str; 'a'; end }
s = S("abba")
assert_equal("bba", s.delete_prefix!(klass.new))
assert_equal("bba", s)
s = S("ax").freeze
assert_raise_with_message(FrozenError, /frozen/) {s.delete_prefix!("a")}
s = S("ax")
o = Struct.new(:s).new(s)
def o.to_str
s.freeze
"a"
end
assert_raise_with_message(FrozenError, /frozen/) {s.delete_prefix!(o)}
end
def test_delete_suffix
assert_raise(TypeError) { 'hello'.delete_suffix(nil) }
assert_raise(TypeError) { 'hello'.delete_suffix(1) }
assert_raise(TypeError) { 'hello'.delete_suffix(/hel/) }
s = S("hello")
assert_equal("hel", s.delete_suffix('lo'))
assert_equal("hello", s)
s = S("hello")
assert_equal("hello", s.delete_suffix('he'))
assert_equal("hello", s)
s = S("\u{3053 3093 306b 3061 306f}")
assert_equal("\u{3053 3093 306b}", s.delete_suffix("\u{3061 306f}"))
assert_equal("\u{3053 3093 306b 3061 306f}", s)
s = S("\u{3053 3093 306b 3061 306f}")
assert_equal("\u{3053 3093 306b 3061 306f}", s.delete_suffix('lo'))
assert_equal("\u{3053 3093 306b 3061 306f}", s)
s = S("hello")
assert_equal("hello", s.delete_suffix("\u{3061 306f}"))
assert_equal("hello", s)
# skip if argument is a broken string
s = S("\xe3\x81\x82")
assert_equal("\xe3\x81\x82", s.delete_suffix("\x82"))
assert_equal("\xe3\x81\x82", s)
# clear coderange
s = S("hello\u{3053 3093}")
assert_not_predicate(s, :ascii_only?)
assert_predicate(s.delete_suffix("\u{3053 3093}"), :ascii_only?)
# argument should be converted to String
klass = Class.new { def to_str; 'a'; end }
s = S("abba")
assert_equal("abb", s.delete_suffix(klass.new))
assert_equal("abba", s)
# chomp removes any of "\n", "\r\n", "\r" when "\n" is specified,
# but delete_suffix does not
s = "foo\n"
assert_equal("foo", s.delete_suffix("\n"))
s = "foo\r\n"
assert_equal("foo\r", s.delete_suffix("\n"))
s = "foo\r"
assert_equal("foo\r", s.delete_suffix("\n"))
end
def test_delete_suffix_bang
assert_raise(TypeError) { 'hello'.delete_suffix!(nil) }
assert_raise(TypeError) { 'hello'.delete_suffix!(1) }
assert_raise(TypeError) { 'hello'.delete_suffix!(/hel/) }
s = S("hello").freeze
assert_raise_with_message(FrozenError, /frozen/) {s.delete_suffix!('lo')}
s = S("ax")
o = Struct.new(:s).new(s)
def o.to_str
s.freeze
"x"
end
assert_raise_with_message(FrozenError, /frozen/) {s.delete_suffix!(o)}
s = S("hello")
assert_equal("hel", s.delete_suffix!('lo'))
assert_equal("hel", s)
s = S("hello")
assert_equal(nil, s.delete_suffix!('he'))
assert_equal("hello", s)
s = S("\u{3053 3093 306b 3061 306f}")
assert_equal("\u{3053 3093 306b}", s.delete_suffix!("\u{3061 306f}"))
assert_equal("\u{3053 3093 306b}", s)
s = S("\u{3053 3093 306b 3061 306f}")
assert_equal(nil, s.delete_suffix!('lo'))
assert_equal("\u{3053 3093 306b 3061 306f}", s)
s = S("hello")
assert_equal(nil, s.delete_suffix!("\u{3061 306f}"))
assert_equal("hello", s)
# skip if argument is a broken string
s = S("\xe3\x81\x82")
assert_equal(nil, s.delete_suffix!("\x82"))
assert_equal("\xe3\x81\x82", s)
s = S("\x95\x5c").force_encoding("Shift_JIS")
assert_equal(nil, s.delete_suffix!("\x5c"))
assert_equal("\x95\x5c".force_encoding("Shift_JIS"), s)
# clear coderange
s = S("hello\u{3053 3093}")
assert_not_predicate(s, :ascii_only?)
assert_predicate(s.delete_suffix!("\u{3053 3093}"), :ascii_only?)
# argument should be converted to String
klass = Class.new { def to_str; 'a'; end }
s = S("abba")
assert_equal("abb", s.delete_suffix!(klass.new))
assert_equal("abb", s)
# chomp removes any of "\n", "\r\n", "\r" when "\n" is specified,
# but delete_suffix does not
s = "foo\n"
assert_equal("foo", s.delete_suffix!("\n"))
s = "foo\r\n"
assert_equal("foo\r", s.delete_suffix!("\n"))
s = "foo\r"
assert_equal(nil, s.delete_suffix!("\n"))
end
=begin
def test_symbol_table_overflow
assert_in_out_err([], <<-INPUT, [], /symbol table overflow \(symbol [a-z]{8}\) \(RuntimeError\)/)
("aaaaaaaa".."zzzzzzzz").each {|s| s.to_sym }
INPUT
end
=end
def test_nesting_shared
a = ('a' * 24).encode(Encoding::ASCII).gsub('x', '')
hash = {}
hash[a] = true
assert_equal(('a' * 24), a)
4.times { GC.start }
assert_equal(('a' * 24), a, '[Bug #15792]')
end
def test_nesting_shared_b
a = ('j' * 24).b.b
eval('', binding, a)
assert_equal(('j' * 24), a)
4.times { GC.start }
assert_equal(('j' * 24), a, '[Bug #15934]')
end
def test_shared_force_encoding
s = "\u{3066}\u{3059}\u{3068}".gsub(//, '')
h = {}
h[s] = nil
k = h.keys[0]
assert_equal(s, k, '[ruby-dev:39068]')
assert_equal(Encoding::UTF_8, k.encoding, '[ruby-dev:39068]')
s.dup.force_encoding(Encoding::ASCII_8BIT).gsub(//, '')
k = h.keys[0]
assert_equal(s, k, '[ruby-dev:39068]')
assert_equal(Encoding::UTF_8, k.encoding, '[ruby-dev:39068]')
end
def test_ascii_incomat_inspect
bug4081 = '[ruby-core:33283]'
WIDE_ENCODINGS.each do |e|
assert_equal('"abc"', "abc".encode(e).inspect)
assert_equal('"\\u3042\\u3044\\u3046"', "\u3042\u3044\u3046".encode(e).inspect)
assert_equal('"ab\\"c"', "ab\"c".encode(e).inspect, bug4081)
end
begin
verbose, $VERBOSE = $VERBOSE, nil
ext = Encoding.default_external
Encoding.default_external = "us-ascii"
$VERBOSE = verbose
i = "abc\"\\".force_encoding("utf-8").inspect
ensure
$VERBOSE = nil
Encoding.default_external = ext
$VERBOSE = verbose
end
assert_equal('"abc\\"\\\\"', i, bug4081)
end
def test_dummy_inspect
assert_equal('"\e\x24\x42\x22\x4C\x22\x68\e\x28\x42"',
"\u{ffe2}\u{2235}".encode("cp50220").inspect)
end
def test_prepend
assert_equal(S("hello world!"), "!".prepend("hello ", "world"))
b = S("ue")
assert_equal(S("ueueue"), b.prepend(b, b))
foo = Object.new
def foo.to_str
"b"
end
assert_equal(S("ba"), "a".prepend(foo))
a = S("world")
b = S("hello ")
a.prepend(b)
assert_equal(S("hello world"), a)
assert_equal(S("hello "), b)
end
def u(str)
str.force_encoding(Encoding::UTF_8)
end
def test_byteslice
assert_equal("h", "hello".byteslice(0))
assert_equal(nil, "hello".byteslice(5))
assert_equal("o", "hello".byteslice(-1))
assert_equal(nil, "hello".byteslice(-6))
assert_equal("", "hello".byteslice(0, 0))
assert_equal("hello", "hello".byteslice(0, 6))
assert_equal("hello", "hello".byteslice(0, 6))
assert_equal("", "hello".byteslice(5, 1))
assert_equal("o", "hello".byteslice(-1, 6))
assert_equal(nil, "hello".byteslice(-6, 1))
assert_equal(nil, "hello".byteslice(0, -1))
assert_equal("h", "hello".byteslice(0..0))
assert_equal("", "hello".byteslice(5..0))
assert_equal("o", "hello".byteslice(4..5))
assert_equal(nil, "hello".byteslice(6..0))
assert_equal("", "hello".byteslice(-1..0))
assert_equal("llo", "hello".byteslice(-3..5))
assert_equal(u("\x81"), "\u3042".byteslice(1))
assert_equal(u("\x81\x82"), "\u3042".byteslice(1, 2))
assert_equal(u("\x81\x82"), "\u3042".byteslice(1..2))
assert_equal(u("\x82")+("\u3042"*9), ("\u3042"*10).byteslice(2, 28))
bug7954 = '[ruby-dev:47108]'
assert_equal(false, "\u3042".byteslice(0, 2).valid_encoding?, bug7954)
assert_equal(false, ("\u3042"*10).byteslice(0, 20).valid_encoding?, bug7954)
end
def test_unknown_string_option
str = nil
assert_nothing_raised(SyntaxError) do
eval(%{
str = begin"hello"end
})
end
assert_equal "hello", str
end
def test_eq_tilde_can_be_overridden
assert_separately([], <<-RUBY)
class String
undef =~
def =~(str)
"foo"
end
end
assert_equal("foo", "" =~ //)
RUBY
end
class Bug9581 < String
def =~ re; :foo end
end
def test_regexp_match_subclass
s = Bug9581.new("abc")
r = /abc/
assert_equal(:foo, s =~ r)
assert_equal(:foo, s.send(:=~, r))
assert_equal(:foo, s.send(:=~, /abc/))
assert_equal(:foo, s =~ /abc/, "should not use optimized instruction")
end
def test_LSHIFT_neary_long_max
return unless @cls == String
assert_ruby_status([], <<-'end;', '[ruby-core:61886] [Bug #9709]', timeout: 20)
begin
a = "a" * 0x4000_0000
a << "a" * 0x1_0000
rescue NoMemoryError
end
end;
end if [0].pack("l!").bytesize < [nil].pack("p").bytesize
# enable only when string size range is smaller than memory space
def test_uplus_minus
str = "foo"
assert_not_predicate(str, :frozen?)
assert_not_predicate(+str, :frozen?)
assert_predicate(-str, :frozen?)
assert_same(str, +str)
assert_not_same(str, -str)
str = "bar".freeze
assert_predicate(str, :frozen?)
assert_not_predicate(+str, :frozen?)
assert_predicate(-str, :frozen?)
assert_not_same(str, +str)
assert_same(str, -str)
bar = %w(b a r).join('')
assert_same(str, -bar, "uminus deduplicates [Feature #13077]")
end
def test_uminus_no_freeze_not_bare
str = @cls.new("foo")
assert_instance_of(@cls, -str)
assert_equal(false, str.frozen?)
str = @cls.new("foo")
str.instance_variable_set(:@iv, 1)
assert_instance_of(@cls, -str)
assert_equal(false, str.frozen?)
assert_equal(1, str.instance_variable_get(:@iv))
str = @cls.new("foo")
str.taint
assert_instance_of(@cls, -str)
assert_equal(false, str.frozen?)
assert_predicate(str, :tainted?)
end
def test_ord
assert_equal(97, "a".ord)
assert_equal(97, "abc".ord)
assert_equal(0x3042, "\u3042\u3043".ord)
assert_raise(ArgumentError) { "".ord }
end
def test_chr
assert_equal("a", "abcde".chr)
assert_equal("a", "a".chr)
assert_equal("\u3042", "\u3042\u3043".chr)
assert_equal('', ''.chr)
end
def test_substr_code_range
data = "\xff" + "a"*200
assert_not_predicate(data, :valid_encoding?)
assert_predicate(data[100..-1], :valid_encoding?)
end
end
class TestString2 < TestString
def initialize(*args)
super
@cls = S2
end
end