2012-11-29 12:35:29 -05:00
# -*- coding: us-ascii -*-
2015-12-16 00:07:31 -05:00
# frozen_string_literal: false
2007-02-23 00:23:33 -05:00
require 'test/unit'
class TestRubyLiteral < Test :: Unit :: TestCase
def test_special_const
assert_equal 'true' , true . inspect
assert_instance_of TrueClass , true
assert_equal 'false' , false . inspect
assert_instance_of FalseClass , false
assert_equal 'nil' , nil . inspect
assert_instance_of NilClass , nil
assert_equal ':sym' , :sym . inspect
assert_instance_of Symbol , :sym
assert_equal '1234' , 1234 . inspect
Use Integer instead of Fixnum and Bignum.
* object.c, numeric.c, enum.c, ext/-test-/bignum/mul.c,
lib/rexml/quickpath.rb, lib/rexml/text.rb, lib/rexml/xpath_parser.rb,
lib/rubygems/specification.rb, lib/uri/generic.rb,
bootstraptest/test_eval.rb, basictest/test.rb,
test/-ext-/bignum/test_big2str.rb, test/-ext-/bignum/test_div.rb,
test/-ext-/bignum/test_mul.rb, test/-ext-/bignum/test_str2big.rb,
test/csv/test_data_converters.rb, test/date/test_date.rb,
test/json/test_json_generate.rb, test/minitest/test_minitest_mock.rb,
test/openssl/test_cipher.rb, test/rexml/test_jaxen.rb,
test/ruby/test_array.rb, test/ruby/test_basicinstructions.rb,
test/ruby/test_bignum.rb, test/ruby/test_case.rb,
test/ruby/test_class.rb, test/ruby/test_complex.rb,
test/ruby/test_enum.rb, test/ruby/test_eval.rb,
test/ruby/test_iseq.rb, test/ruby/test_literal.rb,
test/ruby/test_math.rb, test/ruby/test_module.rb,
test/ruby/test_numeric.rb, test/ruby/test_range.rb,
test/ruby/test_rational.rb, test/ruby/test_refinement.rb,
test/ruby/test_rubyvm.rb, test/ruby/test_struct.rb,
test/ruby/test_variable.rb, test/rubygems/test_gem_specification.rb,
test/thread/test_queue.rb: Use Integer instead of Fixnum and Bignum.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55029 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-05-17 09:15:57 -04:00
assert_instance_of Integer , 1234
2007-02-23 00:23:33 -05:00
assert_equal '1234' , 1_2_3_4 . inspect
Use Integer instead of Fixnum and Bignum.
* object.c, numeric.c, enum.c, ext/-test-/bignum/mul.c,
lib/rexml/quickpath.rb, lib/rexml/text.rb, lib/rexml/xpath_parser.rb,
lib/rubygems/specification.rb, lib/uri/generic.rb,
bootstraptest/test_eval.rb, basictest/test.rb,
test/-ext-/bignum/test_big2str.rb, test/-ext-/bignum/test_div.rb,
test/-ext-/bignum/test_mul.rb, test/-ext-/bignum/test_str2big.rb,
test/csv/test_data_converters.rb, test/date/test_date.rb,
test/json/test_json_generate.rb, test/minitest/test_minitest_mock.rb,
test/openssl/test_cipher.rb, test/rexml/test_jaxen.rb,
test/ruby/test_array.rb, test/ruby/test_basicinstructions.rb,
test/ruby/test_bignum.rb, test/ruby/test_case.rb,
test/ruby/test_class.rb, test/ruby/test_complex.rb,
test/ruby/test_enum.rb, test/ruby/test_eval.rb,
test/ruby/test_iseq.rb, test/ruby/test_literal.rb,
test/ruby/test_math.rb, test/ruby/test_module.rb,
test/ruby/test_numeric.rb, test/ruby/test_range.rb,
test/ruby/test_rational.rb, test/ruby/test_refinement.rb,
test/ruby/test_rubyvm.rb, test/ruby/test_struct.rb,
test/ruby/test_variable.rb, test/rubygems/test_gem_specification.rb,
test/thread/test_queue.rb: Use Integer instead of Fixnum and Bignum.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55029 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-05-17 09:15:57 -04:00
assert_instance_of Integer , 1_2_3_4
2007-02-23 00:23:33 -05:00
assert_equal '18' , 0x12 . inspect
Use Integer instead of Fixnum and Bignum.
* object.c, numeric.c, enum.c, ext/-test-/bignum/mul.c,
lib/rexml/quickpath.rb, lib/rexml/text.rb, lib/rexml/xpath_parser.rb,
lib/rubygems/specification.rb, lib/uri/generic.rb,
bootstraptest/test_eval.rb, basictest/test.rb,
test/-ext-/bignum/test_big2str.rb, test/-ext-/bignum/test_div.rb,
test/-ext-/bignum/test_mul.rb, test/-ext-/bignum/test_str2big.rb,
test/csv/test_data_converters.rb, test/date/test_date.rb,
test/json/test_json_generate.rb, test/minitest/test_minitest_mock.rb,
test/openssl/test_cipher.rb, test/rexml/test_jaxen.rb,
test/ruby/test_array.rb, test/ruby/test_basicinstructions.rb,
test/ruby/test_bignum.rb, test/ruby/test_case.rb,
test/ruby/test_class.rb, test/ruby/test_complex.rb,
test/ruby/test_enum.rb, test/ruby/test_eval.rb,
test/ruby/test_iseq.rb, test/ruby/test_literal.rb,
test/ruby/test_math.rb, test/ruby/test_module.rb,
test/ruby/test_numeric.rb, test/ruby/test_range.rb,
test/ruby/test_rational.rb, test/ruby/test_refinement.rb,
test/ruby/test_rubyvm.rb, test/ruby/test_struct.rb,
test/ruby/test_variable.rb, test/rubygems/test_gem_specification.rb,
test/thread/test_queue.rb: Use Integer instead of Fixnum and Bignum.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55029 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-05-17 09:15:57 -04:00
assert_instance_of Integer , 0x12
2008-03-01 10:51:04 -05:00
assert_raise ( SyntaxError ) { eval ( " 0x " ) }
2007-02-23 00:23:33 -05:00
assert_equal '15' , 0 o17 . inspect
Use Integer instead of Fixnum and Bignum.
* object.c, numeric.c, enum.c, ext/-test-/bignum/mul.c,
lib/rexml/quickpath.rb, lib/rexml/text.rb, lib/rexml/xpath_parser.rb,
lib/rubygems/specification.rb, lib/uri/generic.rb,
bootstraptest/test_eval.rb, basictest/test.rb,
test/-ext-/bignum/test_big2str.rb, test/-ext-/bignum/test_div.rb,
test/-ext-/bignum/test_mul.rb, test/-ext-/bignum/test_str2big.rb,
test/csv/test_data_converters.rb, test/date/test_date.rb,
test/json/test_json_generate.rb, test/minitest/test_minitest_mock.rb,
test/openssl/test_cipher.rb, test/rexml/test_jaxen.rb,
test/ruby/test_array.rb, test/ruby/test_basicinstructions.rb,
test/ruby/test_bignum.rb, test/ruby/test_case.rb,
test/ruby/test_class.rb, test/ruby/test_complex.rb,
test/ruby/test_enum.rb, test/ruby/test_eval.rb,
test/ruby/test_iseq.rb, test/ruby/test_literal.rb,
test/ruby/test_math.rb, test/ruby/test_module.rb,
test/ruby/test_numeric.rb, test/ruby/test_range.rb,
test/ruby/test_rational.rb, test/ruby/test_refinement.rb,
test/ruby/test_rubyvm.rb, test/ruby/test_struct.rb,
test/ruby/test_variable.rb, test/rubygems/test_gem_specification.rb,
test/thread/test_queue.rb: Use Integer instead of Fixnum and Bignum.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55029 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-05-17 09:15:57 -04:00
assert_instance_of Integer , 0 o17
2008-03-01 10:51:04 -05:00
assert_raise ( SyntaxError ) { eval ( " 0o " ) }
2007-02-23 00:23:33 -05:00
assert_equal '5' , 0b101 . inspect
Use Integer instead of Fixnum and Bignum.
* object.c, numeric.c, enum.c, ext/-test-/bignum/mul.c,
lib/rexml/quickpath.rb, lib/rexml/text.rb, lib/rexml/xpath_parser.rb,
lib/rubygems/specification.rb, lib/uri/generic.rb,
bootstraptest/test_eval.rb, basictest/test.rb,
test/-ext-/bignum/test_big2str.rb, test/-ext-/bignum/test_div.rb,
test/-ext-/bignum/test_mul.rb, test/-ext-/bignum/test_str2big.rb,
test/csv/test_data_converters.rb, test/date/test_date.rb,
test/json/test_json_generate.rb, test/minitest/test_minitest_mock.rb,
test/openssl/test_cipher.rb, test/rexml/test_jaxen.rb,
test/ruby/test_array.rb, test/ruby/test_basicinstructions.rb,
test/ruby/test_bignum.rb, test/ruby/test_case.rb,
test/ruby/test_class.rb, test/ruby/test_complex.rb,
test/ruby/test_enum.rb, test/ruby/test_eval.rb,
test/ruby/test_iseq.rb, test/ruby/test_literal.rb,
test/ruby/test_math.rb, test/ruby/test_module.rb,
test/ruby/test_numeric.rb, test/ruby/test_range.rb,
test/ruby/test_rational.rb, test/ruby/test_refinement.rb,
test/ruby/test_rubyvm.rb, test/ruby/test_struct.rb,
test/ruby/test_variable.rb, test/rubygems/test_gem_specification.rb,
test/thread/test_queue.rb: Use Integer instead of Fixnum and Bignum.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55029 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-05-17 09:15:57 -04:00
assert_instance_of Integer , 0b101
2008-03-01 10:51:04 -05:00
assert_raise ( SyntaxError ) { eval ( " 0b " ) }
2007-02-23 00:23:33 -05:00
assert_equal '123456789012345678901234567890' , 123456789012345678901234567890 . inspect
Use Integer instead of Fixnum and Bignum.
* object.c, numeric.c, enum.c, ext/-test-/bignum/mul.c,
lib/rexml/quickpath.rb, lib/rexml/text.rb, lib/rexml/xpath_parser.rb,
lib/rubygems/specification.rb, lib/uri/generic.rb,
bootstraptest/test_eval.rb, basictest/test.rb,
test/-ext-/bignum/test_big2str.rb, test/-ext-/bignum/test_div.rb,
test/-ext-/bignum/test_mul.rb, test/-ext-/bignum/test_str2big.rb,
test/csv/test_data_converters.rb, test/date/test_date.rb,
test/json/test_json_generate.rb, test/minitest/test_minitest_mock.rb,
test/openssl/test_cipher.rb, test/rexml/test_jaxen.rb,
test/ruby/test_array.rb, test/ruby/test_basicinstructions.rb,
test/ruby/test_bignum.rb, test/ruby/test_case.rb,
test/ruby/test_class.rb, test/ruby/test_complex.rb,
test/ruby/test_enum.rb, test/ruby/test_eval.rb,
test/ruby/test_iseq.rb, test/ruby/test_literal.rb,
test/ruby/test_math.rb, test/ruby/test_module.rb,
test/ruby/test_numeric.rb, test/ruby/test_range.rb,
test/ruby/test_rational.rb, test/ruby/test_refinement.rb,
test/ruby/test_rubyvm.rb, test/ruby/test_struct.rb,
test/ruby/test_variable.rb, test/rubygems/test_gem_specification.rb,
test/thread/test_queue.rb: Use Integer instead of Fixnum and Bignum.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55029 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-05-17 09:15:57 -04:00
assert_instance_of Integer , 123456789012345678901234567890
2007-02-23 00:23:33 -05:00
assert_instance_of Float , 1 . 3
2012-02-24 03:58:24 -05:00
assert_equal '2' , eval ( " 0x00+2 " ) . inspect
2007-02-23 00:23:33 -05:00
end
def test_self
assert_equal self , self
assert_instance_of TestRubyLiteral , self
assert_respond_to self , :test_self
end
def test_string
assert_instance_of String , ?a
assert_equal " a " , ?a
assert_instance_of String , ?A
assert_equal " A " , ?A
assert_instance_of String , ?\n
assert_equal " \n " , ?\n
2019-05-28 08:39:13 -04:00
assert_equal " " , ?\s
2007-02-23 00:23:33 -05:00
assert_equal " " , ?\ # space
assert_equal '' , ''
assert_equal 'string' , 'string'
assert_equal 'string string' , 'string string'
assert_equal ' ' , ' '
assert_equal ' ' , " "
assert_equal " \0 " , " \0 "
assert_equal " \1 " , " \1 "
assert_equal " 3 " , " \x33 "
assert_equal " \n " , " \n "
2010-04-26 21:54:23 -04:00
bug2500 = '[ruby-core:27228]'
2011-09-01 20:58:10 -04:00
bug5262 = '[ruby-core:39222]'
2010-04-26 21:54:23 -04:00
%w[ c C- M- ] . each do | pre |
2010-05-16 08:54:37 -04:00
[ " u " , %w[ u{ } ] ] . each do | open , close |
2011-09-01 20:58:10 -04:00
[ " ? " , [ '"' , '"' ] ] . each do | qopen , qclose |
str = " #{ qopen } \\ #{ pre } \\ #{ open } 5555 #{ close } #{ qclose } "
assert_raise ( SyntaxError , " #{ bug2500 } eval( #{ str } ) " ) { eval ( str ) }
str = " #{ qopen } \\ #{ pre } \\ #{ open } \ u201c #{ close } #{ qclose } "
assert_raise ( SyntaxError , " #{ bug5262 } eval( #{ str } ) " ) { eval ( str ) }
str = " #{ qopen } \\ #{ pre } \\ #{ open } \ u201c #{ close } #{ qclose } " . encode ( " euc-jp " )
assert_raise ( SyntaxError , " #{ bug5262 } eval( #{ str } ) " ) { eval ( str ) }
str = " #{ qopen } \\ #{ pre } \\ #{ open } \ u201c #{ close } #{ qclose } " . encode ( " iso-8859-13 " )
assert_raise ( SyntaxError , " #{ bug5262 } eval( #{ str } ) " ) { eval ( str ) }
str = " #{ qopen } \\ #{ pre } \\ #{ open } \xe2 \x7f #{ close } #{ qclose } " . force_encoding ( " utf-8 " )
assert_raise ( SyntaxError , " #{ bug5262 } eval( #{ str } ) " ) { eval ( str ) }
end
2010-04-26 21:54:23 -04:00
end
end
2012-02-23 18:52:12 -05:00
bug6069 = '[ruby-dev:45278]'
2010-05-16 08:54:37 -04:00
assert_equal " \x13 " , " \ c \x33 "
assert_equal " \x13 " , " \ C- \x33 "
assert_equal " \xB3 " , " \ M- \x33 "
2012-02-24 17:54:00 -05:00
assert_equal " \ u201c " , eval ( %[ " \\ \ u{201c}" ] ) , bug5262
assert_equal " \ u201c " . encode ( " euc-jp " ) , eval ( %[ " \\ \ u{201c}" ] . encode ( " euc-jp " ) ) , bug5262
assert_equal " \ u201c " . encode ( " iso-8859-13 " ) , eval ( %[ " \\ \ u{201c}" ] . encode ( " iso-8859-13 " ) ) , bug5262
assert_equal " \\ \ u201c " , eval ( %[ ' \\ \ u{201c}' ] ) , bug6069
assert_equal " \\ \ u201c " . encode ( " euc-jp " ) , eval ( %[ ' \\ \ u{201c}' ] . encode ( " euc-jp " ) ) , bug6069
assert_equal " \\ \ u201c " . encode ( " iso-8859-13 " ) , eval ( %[ ' \\ \ u{201c}' ] . encode ( " iso-8859-13 " ) ) , bug6069
assert_equal " \ u201c " , eval ( %[ ? \\ \ u{201c} ] ) , bug6069
assert_equal " \ u201c " . encode ( " euc-jp " ) , eval ( %[ ? \\ \ u{201c} ] . encode ( " euc-jp " ) ) , bug6069
assert_equal " \ u201c " . encode ( " iso-8859-13 " ) , eval ( %[ ? \\ \ u{201c} ] . encode ( " iso-8859-13 " ) ) , bug6069
2016-11-21 17:45:26 -05:00
assert_equal " ab " , eval ( " ?a 'b' " )
assert_equal " a \n b " , eval ( " <<A 'b' \n a \n A " )
2007-02-23 00:23:33 -05:00
end
def test_dstring
assert_equal '2' , " #{ 1 + 1 } "
assert_equal '16' , " #{ 2 ** 4 } "
s = " string "
assert_equal s , " #{ s } "
2009-07-20 06:01:05 -04:00
a = 'Foo'
b = " #{ a } " << 'Bar'
assert_equal ( 'Foo' , a , 'r3842' )
assert_equal ( 'FooBar' , b , 'r3842' )
2007-02-23 00:23:33 -05:00
end
2015-09-10 09:48:51 -04:00
def test_dstring_encoding
bug11519 = '[ruby-core:70703] [Bug #11519]'
[ '"foo#{}"' , '"#{}foo"' , '"#{}"' ] . each do | code |
a = eval ( " # -*- coding: utf-8 -*- \n #{ code } " )
assert_equal ( Encoding :: UTF_8 , a . encoding ,
proc { " #{ bug11519 } : #{ code } .encoding " } )
end
end
2007-02-23 00:23:33 -05:00
def test_dsymbol
assert_equal :a3c , :" a #{ 1 + 2 } c "
end
2017-09-17 05:28:58 -04:00
def test_dsymbol_redefined_intern
assert_separately ( [ ] , " #{ << - " begin; " } \n #{ << - 'end;' } " )
begin ;
class String
alias _intern intern
def intern
" < #{ upcase } > "
end
end
mesg = " literal symbol should not be affected by method redefinition "
str = " foo "
assert_equal ( :foo , :" #{ str } " , mesg )
end ;
end
2007-02-23 00:23:33 -05:00
def test_xstring
assert_equal " foo \n " , ` echo foo `
s = 'foo'
assert_equal " foo \n " , ` echo #{ s } `
end
2015-09-27 02:44:02 -04:00
def test_frozen_string
all_assertions do | a |
2015-10-21 05:34:09 -04:00
a . for ( " false with indicator " ) do
2015-09-27 02:44:02 -04:00
str = eval ( " # -*- frozen-string-literal: false -*- \n " " 'foo' " )
assert_not_predicate ( str , :frozen? )
end
2015-10-21 05:34:09 -04:00
a . for ( " true with indicator " ) do
2015-09-27 02:44:02 -04:00
str = eval ( " # -*- frozen-string-literal: true -*- \n " " 'foo' " )
assert_predicate ( str , :frozen? )
end
2015-10-21 05:34:09 -04:00
a . for ( " false without indicator " ) do
str = eval ( " # frozen-string-literal: false \n " " 'foo' " )
assert_not_predicate ( str , :frozen? )
end
a . for ( " true without indicator " ) do
str = eval ( " # frozen-string-literal: true \n " " 'foo' " )
assert_predicate ( str , :frozen? )
end
a . for ( " false with preceding garbage " ) do
str = eval ( " # x frozen-string-literal: false \n " " 'foo' " )
assert_not_predicate ( str , :frozen? )
end
a . for ( " true with preceding garbage " ) do
str = eval ( " # x frozen-string-literal: true \n " " 'foo' " )
assert_not_predicate ( str , :frozen? )
end
a . for ( " false with succeeding garbage " ) do
str = eval ( " # frozen-string-literal: false x \n " " 'foo' " )
assert_not_predicate ( str , :frozen? )
end
a . for ( " true with succeeding garbage " ) do
str = eval ( " # frozen-string-literal: true x \n " " 'foo' " )
assert_not_predicate ( str , :frozen? )
end
2015-09-27 02:44:02 -04:00
end
end
Collapse putobject, putobject, newarray
This collapses:
```
== disasm: #<ISeq:bar@bench.rb:3 (3,0)-(5,3)> (catch: FALSE)
0000 putobject "a" ( 4)[LiCa]
0002 putobject "b"
0004 putobject "c"
0006 putobject "d"
0008 putobject "e"
0010 putobject "f"
0012 putobject "g"
0014 putobject "h"
0016 putobject "i"
0018 putobject "j"
0020 putobject "k"
0022 newarray 11
0024 leave ( 5)[Re]
```
In to this:
```
== disasm: #<ISeq:bar@bench.rb:3 (3,0)-(5,3)> (catch: FALSE)
0000 duparray ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"]( 4)[LiCa]
0002 leave ( 5)[Re]
```
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66174 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-12-03 18:53:11 -05:00
def test_frozen_string_in_array_literal
list = eval ( " # frozen-string-literal: true \n " " ['foo', 'bar'] " )
assert_equal 2 , list . length
list . each { | str | assert_predicate str , :frozen? }
end
2017-11-13 18:53:00 -05:00
if defined? ( RubyVM :: InstructionSequence . compile_option ) and
RubyVM :: InstructionSequence . compile_option . key? ( :debug_frozen_string_literal )
def test_debug_frozen_string
2019-06-29 20:34:41 -04:00
src = 'n = 1; _="foo#{n ? "-#{n}" : ""}"' ; f = " test.rb " ; n = 1
2017-11-13 18:53:00 -05:00
opt = { frozen_string_literal : true , debug_frozen_string_literal : true }
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 14:18:49 -04:00
str = RubyVM :: InstructionSequence . compile ( src , f , f , n , ** opt ) . eval
2017-11-13 18:53:00 -05:00
assert_equal ( " foo-1 " , str )
assert_predicate ( str , :frozen? )
2017-12-11 19:46:34 -05:00
assert_raise_with_message ( FrozenError , / created at #{ Regexp . quote ( f ) } : #{ n } / ) {
2017-11-13 18:53:00 -05:00
str << " x "
}
end
Collapse putobject, putobject, newarray
This collapses:
```
== disasm: #<ISeq:bar@bench.rb:3 (3,0)-(5,3)> (catch: FALSE)
0000 putobject "a" ( 4)[LiCa]
0002 putobject "b"
0004 putobject "c"
0006 putobject "d"
0008 putobject "e"
0010 putobject "f"
0012 putobject "g"
0014 putobject "h"
0016 putobject "i"
0018 putobject "j"
0020 putobject "k"
0022 newarray 11
0024 leave ( 5)[Re]
```
In to this:
```
== disasm: #<ISeq:bar@bench.rb:3 (3,0)-(5,3)> (catch: FALSE)
0000 duparray ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"]( 4)[LiCa]
0002 leave ( 5)[Re]
```
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66174 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-12-03 18:53:11 -05:00
def test_debug_frozen_string_in_array_literal
src = '["foo"]' ; f = " test.rb " ; n = 1
opt = { frozen_string_literal : true , debug_frozen_string_literal : true }
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 14:18:49 -04:00
ary = RubyVM :: InstructionSequence . compile ( src , f , f , n , ** opt ) . eval
Collapse putobject, putobject, newarray
This collapses:
```
== disasm: #<ISeq:bar@bench.rb:3 (3,0)-(5,3)> (catch: FALSE)
0000 putobject "a" ( 4)[LiCa]
0002 putobject "b"
0004 putobject "c"
0006 putobject "d"
0008 putobject "e"
0010 putobject "f"
0012 putobject "g"
0014 putobject "h"
0016 putobject "i"
0018 putobject "j"
0020 putobject "k"
0022 newarray 11
0024 leave ( 5)[Re]
```
In to this:
```
== disasm: #<ISeq:bar@bench.rb:3 (3,0)-(5,3)> (catch: FALSE)
0000 duparray ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"]( 4)[LiCa]
0002 leave ( 5)[Re]
```
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66174 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-12-03 18:53:11 -05:00
assert_equal ( " foo " , ary . first )
assert_predicate ( ary . first , :frozen? )
assert_raise_with_message ( FrozenError , / created at #{ Regexp . quote ( f ) } : #{ n } / ) {
ary . first << " x "
2018-12-12 12:16:02 -05:00
} unless ENV [ 'RUBY_ISEQ_DUMP_DEBUG' ]
Collapse putobject, putobject, newarray
This collapses:
```
== disasm: #<ISeq:bar@bench.rb:3 (3,0)-(5,3)> (catch: FALSE)
0000 putobject "a" ( 4)[LiCa]
0002 putobject "b"
0004 putobject "c"
0006 putobject "d"
0008 putobject "e"
0010 putobject "f"
0012 putobject "g"
0014 putobject "h"
0016 putobject "i"
0018 putobject "j"
0020 putobject "k"
0022 newarray 11
0024 leave ( 5)[Re]
```
In to this:
```
== disasm: #<ISeq:bar@bench.rb:3 (3,0)-(5,3)> (catch: FALSE)
0000 duparray ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"]( 4)[LiCa]
0002 leave ( 5)[Re]
```
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66174 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-12-03 18:53:11 -05:00
end
2017-11-13 18:53:00 -05:00
end
2007-02-23 00:23:33 -05:00
def test_regexp
assert_instance_of Regexp , / /
2010-01-25 18:12:50 -05:00
assert_match ( / / , 'a' )
assert_match ( / / , '' )
2007-02-23 00:23:33 -05:00
assert_instance_of Regexp , / a /
2010-01-25 18:12:50 -05:00
assert_match ( / a / , 'a' )
assert_no_match ( / test / , 'tes' )
2007-02-23 00:23:33 -05:00
re = / test /
assert_match re , 'test'
str = 'test'
assert_match re , str
2010-01-25 18:12:50 -05:00
assert_match ( / test / , str )
2007-02-23 00:23:33 -05:00
assert_equal 0 , ( / test / =~ 'test' )
assert_equal 0 , ( re =~ 'test' )
assert_equal 0 , ( / test / =~ str )
assert_equal 0 , ( re =~ str )
assert_equal 0 , ( 'test' =~ / test / )
assert_equal 0 , ( 'test' =~ re )
assert_equal 0 , ( str =~ / test / )
assert_equal 0 , ( str =~ re )
end
def test_dregexp
assert_instance_of Regexp , / re #{ 'ge' } xp /
assert_equal ( / regexp / , / re #{ 'ge' } xp / )
2010-10-03 23:43:50 -04:00
bug3903 = '[ruby-core:32682]'
assert_raise ( SyntaxError , bug3903 ) { eval ( '/[#{"\x80"}]/' ) }
2007-02-23 00:23:33 -05:00
end
def test_array
assert_instance_of Array , [ ]
assert_equal [ ] , [ ]
assert_equal 0 , [ ] . size
assert_instance_of Array , [ 0 ]
assert_equal [ 3 ] , [ 3 ]
assert_equal 1 , [ 3 ] . size
a = [ 3 ]
assert_equal 3 , a [ 0 ]
assert_instance_of Array , [ 1 , 2 ]
assert_equal [ 1 , 2 ] , [ 1 , 2 ]
assert_instance_of Array , [ 1 , 2 , 3 , 4 , 5 ]
assert_equal [ 1 , 2 , 3 , 4 , 5 ] , [ 1 , 2 , 3 , 4 , 5 ]
assert_equal 5 , [ 1 , 2 , 3 , 4 , 5 ] . size
a = [ 1 , 2 ]
assert_equal 1 , a [ 0 ]
assert_equal 2 , a [ 1 ]
a = [ 1 + 2 , 3 + 4 , 5 + 6 ]
assert_instance_of Array , a
assert_equal [ 3 , 7 , 11 ] , a
assert_equal 7 , a [ 1 ]
assert_equal 1 , ( [ 0 ] [ 0 ] += 1 )
assert_equal 1 , ( [ 2 ] [ 0 ] -= 1 )
a = [ obj = Object . new ]
assert_instance_of Array , a
assert_equal 1 , a . size
assert_equal obj , a [ 0 ]
a = [ 1 , 2 , 3 ]
a [ 1 ] = 5
assert_equal 5 , a [ 1 ]
end
def test_hash
assert_instance_of Hash , { }
assert_equal ( { } , { } )
assert_instance_of Hash , { 1 = > 2 }
assert_equal ( { 1 = > 2 } , { 1 = > 2 } )
h = { 1 = > 2 }
assert_equal 2 , h [ 1 ]
h = { " string " = > " literal " , " goto " = > " hell " }
assert_equal h , h
assert_equal 2 , h . size
assert_equal h , h
assert_equal " literal " , h [ " string " ]
end
2018-12-20 01:44:50 -05:00
def test_hash_literal_frozen
2018-12-20 01:59:27 -05:00
assert_separately ( [ ] , " #{ << ~ " begin; " } \n #{ << ~ 'end;' } " )
begin ;
def frozen_hash_literal_arg
{ 0 = > 1 , 1 = > 4 , 2 = > 17 }
end
2018-12-20 02:17:55 -05:00
ObjectSpace . each_object ( Hash ) do | a |
2018-12-25 02:21:45 -05:00
if a . class == Hash and ! a . default_proc and a . size == 3 &&
a [ 0 ] == 1 && a [ 1 ] == 4 && a [ 2 ] == 17
2018-12-20 02:17:55 -05:00
# should not be found.
raise
2018-12-20 01:44:50 -05:00
end
end
2018-12-20 01:59:27 -05:00
assert_not_include frozen_hash_literal_arg , 3
end ;
2018-12-20 01:44:50 -05:00
end
2012-04-11 21:33:34 -04:00
def test_big_array_and_hash_literal
2012-04-17 23:31:11 -04:00
assert_normal_exit %q{ GC.disable=true; x = nil; raise if eval("[ # { (1..1_000_000).map { 'x' } .join(", ") } ]").size != 1_000_000 } , " " , timeout : 300 , child_env : %[ --disable-gems ]
assert_normal_exit %q{ GC.disable=true; x = nil; raise if eval("[ # { (1..1_000_000).to_a.join(", ") } ]").size != 1_000_000 } , " " , timeout : 300 , child_env : %[ --disable-gems ]
assert_normal_exit %q{ GC.disable=true; x = nil; raise if eval(" { # { (1..1_000_000).map { |n| " # { n } => x" } .join(', ') } } ").size != 1_000_000 } , " " , timeout : 300 , child_env : %[ --disable-gems ]
assert_normal_exit %q{ GC.disable=true; x = nil; raise if eval(" { # { (1..1_000_000).map { |n| " # { n } => # { n } " } .join(', ') } } ").size != 1_000_000 } , " " , timeout : 300 , child_env : %[ --disable-gems ]
2015-07-16 01:18:40 -04:00
end
2012-11-29 12:35:29 -05:00
2015-07-16 01:18:40 -04:00
def test_big_hash_literal
2012-11-29 12:35:29 -05:00
bug7466 = '[ruby-dev:46658]'
h = {
0xFE042 = > 0xE5CD ,
0xFE043 = > 0xE5CD ,
0xFE045 = > 0xEA94 ,
0xFE046 = > 0xE4E3 ,
0xFE047 = > 0xE4E2 ,
0xFE048 = > 0xEA96 ,
0xFE049 = > 0x3013 ,
0xFE04A = > 0xEB36 ,
0xFE04B = > 0xEB37 ,
0xFE04C = > 0xEB38 ,
0xFE04D = > 0xEB49 ,
0xFE04E = > 0xEB82 ,
0xFE04F = > 0xE4D2 ,
0xFE050 = > 0xEB35 ,
0xFE051 = > 0xEAB9 ,
0xFE052 = > 0xEABA ,
0xFE053 = > 0xE4D4 ,
0xFE054 = > 0xE4CD ,
0xFE055 = > 0xEABB ,
0xFE056 = > 0xEABC ,
0xFE057 = > 0xEB32 ,
0xFE058 = > 0xEB33 ,
0xFE059 = > 0xEB34 ,
0xFE05A = > 0xEB39 ,
0xFE05B = > 0xEB5A ,
0xFE190 = > 0xE5A4 ,
0xFE191 = > 0xE5A5 ,
0xFE192 = > 0xEAD0 ,
0xFE193 = > 0xEAD1 ,
0xFE194 = > 0xEB47 ,
0xFE195 = > 0xE509 ,
0xFE196 = > 0xEAA0 ,
0xFE197 = > 0xE50B ,
0xFE198 = > 0xEAA1 ,
0xFE199 = > 0xEAA2 ,
0xFE19A = > 0x3013 ,
0xFE19B = > 0xE4FC ,
0xFE19C = > 0xE4FA ,
0xFE19D = > 0xE4FC ,
0xFE19E = > 0xE4FA ,
0xFE19F = > 0xE501 ,
0xFE1A0 = > 0x3013 ,
0xFE1A1 = > 0xE5DD ,
0xFE1A2 = > 0xEADB ,
0xFE1A3 = > 0xEAE9 ,
0xFE1A4 = > 0xEB13 ,
0xFE1A5 = > 0xEB14 ,
0xFE1A6 = > 0xEB15 ,
0xFE1A7 = > 0xEB16 ,
0xFE1A8 = > 0xEB17 ,
0xFE1A9 = > 0xEB18 ,
0xFE1AA = > 0xEB19 ,
0xFE1AB = > 0xEB1A ,
0xFE1AC = > 0xEB44 ,
0xFE1AD = > 0xEB45 ,
0xFE1AE = > 0xE4CB ,
0xFE1AF = > 0xE5BF ,
0xFE1B0 = > 0xE50E ,
0xFE1B1 = > 0xE4EC ,
0xFE1B2 = > 0xE4EF ,
0xFE1B3 = > 0xE4F8 ,
0xFE1B4 = > 0x3013 ,
0xFE1B5 = > 0x3013 ,
0xFE1B6 = > 0xEB1C ,
0xFE1B9 = > 0xEB7E ,
0xFE1D3 = > 0xEB22 ,
0xFE7DC = > 0xE4D8 ,
0xFE1D4 = > 0xEB23 ,
0xFE1D5 = > 0xEB24 ,
0xFE1D6 = > 0xEB25 ,
0xFE1CC = > 0xEB1F ,
0xFE1CD = > 0xEB20 ,
0xFE1CE = > 0xE4D9 ,
0xFE1CF = > 0xE48F ,
0xFE1C5 = > 0xE5C7 ,
0xFE1C6 = > 0xEAEC ,
0xFE1CB = > 0xEB1E ,
0xFE1DA = > 0xE4DD ,
0xFE1E1 = > 0xEB57 ,
0xFE1E2 = > 0xEB58 ,
0xFE1E3 = > 0xE492 ,
0xFE1C9 = > 0xEB1D ,
0xFE1D9 = > 0xE4D3 ,
0xFE1DC = > 0xE5D4 ,
0xFE1BA = > 0xE4E0 ,
0xFE1BB = > 0xEB76 ,
0xFE1C8 = > 0xE4E0 ,
0xFE1DD = > 0xE5DB ,
0xFE1BC = > 0xE4DC ,
0xFE1D8 = > 0xE4DF ,
0xFE1BD = > 0xE49A ,
0xFE1C7 = > 0xEB1B ,
0xFE1C2 = > 0xE5C2 ,
0xFE1C0 = > 0xE5C0 ,
0xFE1B8 = > 0xE4DB ,
0xFE1C3 = > 0xE470 ,
0xFE1BE = > 0xE4D8 ,
0xFE1C4 = > 0xE4D9 ,
0xFE1B7 = > 0xE4E1 ,
0xFE1BF = > 0xE4DE ,
0xFE1C1 = > 0xE5C1 ,
0xFE1CA = > 0x3013 ,
0xFE1D0 = > 0xE4E1 ,
0xFE1D1 = > 0xEB21 ,
0xFE1D2 = > 0xE4D7 ,
0xFE1D7 = > 0xE4DA ,
0xFE1DB = > 0xE4EE ,
0xFE1DE = > 0xEB3F ,
0xFE1DF = > 0xEB46 ,
0xFE1E0 = > 0xEB48 ,
0xFE336 = > 0xE4FB ,
0xFE320 = > 0xE472 ,
0xFE321 = > 0xEB67 ,
0xFE322 = > 0xEACA ,
0xFE323 = > 0xEAC0 ,
0xFE324 = > 0xE5AE ,
0xFE325 = > 0xEACB ,
0xFE326 = > 0xEAC9 ,
0xFE327 = > 0xE5C4 ,
0xFE328 = > 0xEAC1 ,
0xFE329 = > 0xE4E7 ,
0xFE32A = > 0xE4E7 ,
0xFE32B = > 0xEACD ,
0xFE32C = > 0xEACF ,
0xFE32D = > 0xEACE ,
0xFE32E = > 0xEAC7 ,
0xFE32F = > 0xEAC8 ,
0xFE330 = > 0xE471 ,
0xFE331 = > " [Bug # 7466] " ,
}
k = h . keys
assert_equal ( [ 129 , 0xFE331 ] , [ k . size , k . last ] , bug7466 )
2015-07-16 01:18:40 -04:00
code = [
" h = { " ,
( 1 .. 128 ) . map { | i | " #{ i } => 0, " } ,
( 129 .. 140 ) . map { | i | " #{ i } => [], " } ,
" } " ,
] . join
assert_separately ( [ ] , << - " end; " )
GC . stress = true
#{code}
GC . stress = false
assert_equal ( 140 , h . size )
end ;
2012-04-11 21:33:34 -04:00
end
2017-04-27 00:21:04 -04:00
def test_hash_duplicated_key
h = EnvUtil . suppress_warning do
eval << ~ end
# This is a syntax that renders warning at very early stage.
# eval used to delay warning, to be suppressible by EnvUtil.
{ " a " = > 100 , " b " = > 200 , " a " = > 300 , " a " = > 400 }
end
end
assert_equal ( 2 , h . size )
assert_equal ( 400 , h [ 'a' ] )
assert_equal ( 200 , h [ 'b' ] )
assert_nil ( h [ 'c' ] )
assert_equal ( nil , h . key ( '300' ) )
end
def test_hash_frozen_key_id
key = " a " . freeze
h = { key = > 100 }
assert_equal ( 100 , h [ 'a' ] )
assert_same ( key , * h . keys )
end
def test_hash_key_tampering
key = " a "
h = { key = > 100 }
key . upcase!
assert_equal ( 100 , h [ 'a' ] )
end
2007-02-23 00:23:33 -05:00
def test_range
assert_instance_of Range , ( 1 .. 2 )
assert_equal ( 1 .. 2 , 1 .. 2 )
r = 1 .. 2
assert_equal 1 , r . begin
assert_equal 2 , r . end
assert_equal false , r . exclude_end?
assert_instance_of Range , ( 1 ... 3 )
assert_equal ( 1 ... 3 , 1 ... 3 )
r = 1 ... 3
assert_equal 1 , r . begin
assert_equal 3 , r . end
assert_equal true , r . exclude_end?
r = 1 + 2 .. 3 + 4
assert_instance_of Range , r
assert_equal 3 , r . begin
assert_equal 7 , r . end
assert_equal false , r . exclude_end?
r = 1 + 2 ... 3 + 4
assert_instance_of Range , r
assert_equal 3 , r . begin
assert_equal 7 , r . end
assert_equal true , r . exclude_end?
assert_instance_of Range , 'a' .. 'c'
r = 'a' .. 'c'
assert_equal 'a' , r . begin
assert_equal 'c' , r . end
end
def test__FILE__
assert_instance_of String , __FILE__
assert_equal __FILE__ , __FILE__
assert_equal 'test_literal.rb' , File . basename ( __FILE__ )
end
def test__LINE__
Use Integer instead of Fixnum and Bignum.
* object.c, numeric.c, enum.c, ext/-test-/bignum/mul.c,
lib/rexml/quickpath.rb, lib/rexml/text.rb, lib/rexml/xpath_parser.rb,
lib/rubygems/specification.rb, lib/uri/generic.rb,
bootstraptest/test_eval.rb, basictest/test.rb,
test/-ext-/bignum/test_big2str.rb, test/-ext-/bignum/test_div.rb,
test/-ext-/bignum/test_mul.rb, test/-ext-/bignum/test_str2big.rb,
test/csv/test_data_converters.rb, test/date/test_date.rb,
test/json/test_json_generate.rb, test/minitest/test_minitest_mock.rb,
test/openssl/test_cipher.rb, test/rexml/test_jaxen.rb,
test/ruby/test_array.rb, test/ruby/test_basicinstructions.rb,
test/ruby/test_bignum.rb, test/ruby/test_case.rb,
test/ruby/test_class.rb, test/ruby/test_complex.rb,
test/ruby/test_enum.rb, test/ruby/test_eval.rb,
test/ruby/test_iseq.rb, test/ruby/test_literal.rb,
test/ruby/test_math.rb, test/ruby/test_module.rb,
test/ruby/test_numeric.rb, test/ruby/test_range.rb,
test/ruby/test_rational.rb, test/ruby/test_refinement.rb,
test/ruby/test_rubyvm.rb, test/ruby/test_struct.rb,
test/ruby/test_variable.rb, test/rubygems/test_gem_specification.rb,
test/thread/test_queue.rb: Use Integer instead of Fixnum and Bignum.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55029 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-05-17 09:15:57 -04:00
assert_instance_of Integer , __LINE__
2007-02-23 00:23:33 -05:00
assert_equal __LINE__ , __LINE__
end
2008-03-01 11:16:46 -05:00
def test_integer
head = [ '' , '0x' , '0o' , '0b' , '0d' , '-' , '+' ]
chars = [ '0' , '1' , '_' , '9' , 'f' ]
head . each { | h |
4 . times { | len |
a = [ h ]
len . times { a = a . product ( chars ) . map { | x | x . join ( '' ) } }
a . each { | s |
next if s . empty?
begin
r1 = Integer ( s )
rescue ArgumentError
r1 = :err
end
begin
r2 = eval ( s )
rescue NameError , SyntaxError
r2 = :err
end
assert_equal ( r1 , r2 , " Integer( #{ s . inspect } ) != eval( #{ s . inspect } ) " )
}
}
}
2009-11-29 21:00:14 -05:00
bug2407 = '[ruby-dev:39798]'
2018-04-09 07:09:30 -04:00
head . grep_v ( / ^0 / ) do | s |
head . grep ( / ^0 / ) do | h |
h = " #{ s } #{ h } _ "
assert_syntax_error ( h , / numeric literal without digits \ Z / , " #{ bug2407 } : #{ h . inspect } " )
2009-11-29 21:00:14 -05:00
end
2018-04-09 07:09:30 -04:00
end
2008-03-01 11:16:46 -05:00
end
def test_float
head = [ '' , '-' , '+' ]
chars = [ '0' , '1' , '_' , '9' , 'f' , '.' ]
head . each { | h |
6 . times { | len |
a = [ h ]
len . times { a = a . product ( chars ) . map { | x | x . join ( '' ) } }
a . each { | s |
next if s . empty?
next if / \ . \ z / =~ s
next if / \ A[-+]? \ . / =~ s
next if / \ A[-+]?0 / =~ s
begin
r1 = Float ( s )
rescue ArgumentError
r1 = :err
end
begin
r2 = eval ( s )
rescue NameError , SyntaxError
r2 = :err
end
r2 = :err if Range === r2
assert_equal ( r1 , r2 , " Float( #{ s . inspect } ) != eval( #{ s . inspect } ) " )
}
}
}
2016-07-15 04:08:59 -04:00
assert_equal ( 100 . 0 , 0 . 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100 e100 )
2008-03-01 11:16:46 -05:00
end
2014-11-18 14:16:27 -05:00
def test_symbol_list
assert_equal ( [ :foo , :bar ] , % i [ foo bar ] )
assert_equal ( [ :" \" foo " ] , % i [ " foo])
x = 10
assert_equal ( [ :foo , :b10 ] , % I [ foo b #{x}])
assert_equal ( [ :" \" foo10 " ] , % I [ " foo #{ x } ])
assert_ruby_status ( [ " --disable-gems " , " --dump=parsetree " ] , " %I[foo bar] " )
end
2007-02-23 00:23:33 -05:00
end