Files
mruby-mruby/mrbgems/mruby-string-ext/test/numeric.rb
T
KOBAYASHI Shuji e86aa61f20 Add encoding argument to Integral#chr
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"`).
2019-07-23 20:16:46 +09:00

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