mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
e86aa61f20
Currently, `Integral#chr` in mruby changes behavior by `MRB_UTF8_STRING`
setting.
before this patch:
$ bin/mruby -e 'p 171.chr' #=> "\xab" (`MRB_UTF8_STRING` is disabled)
$ bin/mruby -e 'p 171.chr' #=> "«" (`MRB_UTF8_STRING` is enabled)
This behavior is incompatible with Ruby, and a little inconvenient because
it can't be interpreted as ASCII-8BIT with `MRB_UTF8_STRING`, I think.
So add encoding argument according to Ruby.
after this patch:
$ bin/mruby -e 'p 171.chr' #=> "\xab"
$ bin/mruby -e 'p 171.chr("ASCII-8BIT")' #=> "\xab"
$ bin/mruby -e 'p 171.chr("UTF-8")' #=> "«"
Allow only `String` for encoding because mruby doesn't have `Encoding`
class, and `"ASCII-8BIT"` (`"BINARY"`) and `"UTF-8"` (only with
`MRB_UTF8_STRING`) are valid value (default is `"ASCII-8BIT"`).
30 lines
970 B
Ruby
30 lines
970 B
Ruby
# coding: utf-8
|
|
|
|
assert('Integer#chr') do
|
|
assert_equal("A", 65.chr)
|
|
assert_equal("B", 0x42.chr)
|
|
assert_equal("\xab", 171.chr)
|
|
assert_raise(RangeError) { -1.chr }
|
|
assert_raise(RangeError) { 256.chr }
|
|
|
|
assert_equal("A", 65.chr("ASCII-8BIT"))
|
|
assert_equal("B", 0x42.chr("BINARY"))
|
|
assert_equal("\xab", 171.chr("ascii-8bit"))
|
|
assert_raise(RangeError) { -1.chr("binary") }
|
|
assert_raise(RangeError) { 256.chr("Ascii-8bit") }
|
|
assert_raise(ArgumentError) { 65.chr("ASCII") }
|
|
assert_raise(ArgumentError) { 65.chr("ASCII-8BIT", 2) }
|
|
assert_raise(TypeError) { 65.chr(:BINARY) }
|
|
|
|
if __ENCODING__ == "ASCII-8BIT"
|
|
assert_raise(ArgumentError) { 65.chr("UTF-8") }
|
|
else
|
|
assert_equal("A", 65.chr("UTF-8"))
|
|
assert_equal("B", 0x42.chr("UTF-8"))
|
|
assert_equal("«", 171.chr("utf-8"))
|
|
assert_equal("あ", 12354.chr("Utf-8"))
|
|
assert_raise(RangeError) { -1.chr("utf-8") }
|
|
assert_raise(RangeError) { 0x110000.chr.chr("UTF-8") }
|
|
end
|
|
end
|