summaryrefslogtreecommitdiff
path: root/spec/rubyspec/language/alias_spec.rb
diff options
context:
space:
mode:
authoreregon <eregon@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-05-07 12:04:49 +0000
committereregon <eregon@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-05-07 12:04:49 +0000
commit95e8c48dd3348503a8c7db5d0498894a1b676395 (patch)
tree9eef7f720314ebaff56845a74e203770e62284e4 /spec/rubyspec/language/alias_spec.rb
parented7d803500de38186c74bce94d233e85ef51e503 (diff)
Add in-tree mspec and ruby/spec
* For easier modifications of ruby/spec by MRI developers. * .gitignore: track changes under spec. * spec/mspec, spec/rubyspec: add in-tree mspec and ruby/spec. These files can therefore be updated like any other file in MRI. Instructions are provided in spec/README. [Feature #13156] [ruby-core:79246] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58595 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'spec/rubyspec/language/alias_spec.rb')
-rw-r--r--spec/rubyspec/language/alias_spec.rb190
1 files changed, 190 insertions, 0 deletions
diff --git a/spec/rubyspec/language/alias_spec.rb b/spec/rubyspec/language/alias_spec.rb
new file mode 100644
index 0000000000..626e37a603
--- /dev/null
+++ b/spec/rubyspec/language/alias_spec.rb
@@ -0,0 +1,190 @@
+require File.expand_path('../../spec_helper', __FILE__)
+
+class AliasObject
+ attr :foo
+ attr_reader :bar
+ attr_accessor :baz
+
+ def prep; @foo = 3; @bar = 4; end
+ def value; 5; end
+ def false_value; 6; end
+ def self.klass_method; 7; end
+end
+
+describe "The alias keyword" do
+ before :each do
+ @obj = AliasObject.new
+ @meta = class << @obj;self;end
+ end
+
+ it "creates a new name for an existing method" do
+ @meta.class_eval do
+ alias __value value
+ end
+ @obj.__value.should == 5
+ end
+
+ it "adds the new method to the list of methods" do
+ original_methods = @obj.methods
+ @meta.class_eval do
+ alias __value value
+ end
+ (@obj.methods - original_methods).map {|m| m.to_s }.should == ["__value"]
+ end
+
+ it "adds the new method to the list of public methods" do
+ original_methods = @obj.public_methods
+ @meta.class_eval do
+ alias __value value
+ end
+ (@obj.public_methods - original_methods).map {|m| m.to_s }.should == ["__value"]
+ end
+
+ it "overwrites an existing method with the target name" do
+ @meta.class_eval do
+ alias false_value value
+ end
+ @obj.false_value.should == 5
+ end
+
+ it "is reversible" do
+ @meta.class_eval do
+ alias __value value
+ alias value false_value
+ end
+ @obj.value.should == 6
+
+ @meta.class_eval do
+ alias value __value
+ end
+ @obj.value.should == 5
+ end
+
+ it "operates on the object's metaclass when used in instance_eval" do
+ @obj.instance_eval do
+ alias __value value
+ end
+
+ @obj.__value.should == 5
+ lambda { AliasObject.new.__value }.should raise_error(NoMethodError)
+ end
+
+ it "operates on the class/module metaclass when used in instance_eval" do
+ AliasObject.instance_eval do
+ alias __klass_method klass_method
+ end
+
+ AliasObject.__klass_method.should == 7
+ lambda { Object.__klass_method }.should raise_error(NoMethodError)
+ end
+
+ it "operates on the class/module metaclass when used in instance_exec" do
+ AliasObject.instance_exec do
+ alias __klass_method2 klass_method
+ end
+
+ AliasObject.__klass_method2.should == 7
+ lambda { Object.__klass_method2 }.should raise_error(NoMethodError)
+ end
+
+ it "operates on methods defined via attr, attr_reader, and attr_accessor" do
+ @obj.prep
+ @obj.instance_eval do
+ alias afoo foo
+ alias abar bar
+ alias abaz baz
+ end
+
+ @obj.afoo.should == 3
+ @obj.abar.should == 4
+ @obj.baz = 5
+ @obj.abaz.should == 5
+ end
+
+ it "operates on methods with splat arguments" do
+ class AliasObject2;end
+ AliasObject2.class_eval do
+ def test(*args)
+ 4
+ end
+ def test_with_check(*args)
+ test_without_check(*args)
+ end
+ alias test_without_check test
+ alias test test_with_check
+ end
+ AliasObject2.new.test(1,2,3,4,5).should == 4
+ end
+
+ it "operates on methods with splat arguments on eigenclasses" do
+ @meta.class_eval do
+ def test(*args)
+ 4
+ end
+ def test_with_check(*args)
+ test_without_check(*args)
+ end
+ alias test_without_check test
+ alias test test_with_check
+ end
+ @obj.test(1,2,3,4,5).should == 4
+ end
+
+ it "operates on methods with splat arguments defined in a superclass" do
+ alias_class = Class.new
+ alias_class.class_eval do
+ def test(*args)
+ 4
+ end
+ def test_with_check(*args)
+ test_without_check(*args)
+ end
+ end
+ sub = Class.new(alias_class) do
+ alias test_without_check test
+ alias test test_with_check
+ end
+ sub.new.test(1,2,3,4,5).should == 4
+ end
+
+ it "operates on methods with splat arguments defined in a superclass using text block for class eval" do
+ class Sub < AliasObject;end
+ AliasObject.class_eval <<-code
+ def test(*args)
+ 4
+ end
+ def test_with_check(*args)
+ test_without_check(*args)
+ end
+ alias test_without_check test
+ alias test test_with_check
+ code
+ Sub.new.test("testing").should == 4
+ end
+
+ it "is not allowed against Fixnum or String instances" do
+ lambda do
+ 1.instance_eval do
+ alias :foo :to_s
+ end
+ end.should raise_error(TypeError)
+
+ lambda do
+ :blah.instance_eval do
+ alias :foo :to_s
+ end
+ end.should raise_error(TypeError)
+ end
+
+ it "on top level defines the alias on Object" do
+ # because it defines on the default definee / current module
+ ruby_exe("def foo; end; alias bla foo; print method(:bla).owner", escape: true).should == "Object"
+ end
+
+ it "raises a NameError when passed a missing name" do
+ lambda { @meta.class_eval { alias undef_method not_exist } }.should raise_error(NameError) { |e|
+ # a NameError and not a NoMethodError
+ e.class.should == NameError
+ }
+ end
+end