summaryrefslogtreecommitdiff
path: root/spec/ruby/language/undef_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/ruby/language/undef_spec.rb')
-rw-r--r--spec/ruby/language/undef_spec.rb79
1 files changed, 79 insertions, 0 deletions
diff --git a/spec/ruby/language/undef_spec.rb b/spec/ruby/language/undef_spec.rb
new file mode 100644
index 0000000000..98ecd99c21
--- /dev/null
+++ b/spec/ruby/language/undef_spec.rb
@@ -0,0 +1,79 @@
+require_relative '../spec_helper'
+
+describe "The undef keyword" do
+ describe "undefines a method" do
+ before :each do
+ @undef_class = Class.new do
+ def meth(o); o; end
+ end
+ @obj = @undef_class.new
+ @obj.meth(5).should == 5
+ end
+
+ it "with an identifier" do
+ @undef_class.class_eval do
+ undef meth
+ end
+ -> { @obj.meth(5) }.should.raise(NoMethodError)
+ end
+
+ it "with a simple symbol" do
+ @undef_class.class_eval do
+ undef :meth
+ end
+ -> { @obj.meth(5) }.should.raise(NoMethodError)
+ end
+
+ it "with a single quoted symbol" do
+ @undef_class.class_eval do
+ undef :'meth'
+ end
+ -> { @obj.meth(5) }.should.raise(NoMethodError)
+ end
+
+ it "with a double quoted symbol" do
+ @undef_class.class_eval do
+ undef :"meth"
+ end
+ -> { @obj.meth(5) }.should.raise(NoMethodError)
+ end
+
+ it "with an interpolated symbol" do
+ @undef_class.class_eval do
+ undef :"#{'meth'}"
+ end
+ -> { @obj.meth(5) }.should.raise(NoMethodError)
+ end
+
+ it "with an interpolated symbol when interpolated expression is not a String literal" do
+ @undef_class.class_eval do
+ undef :"#{'meth'.to_sym}"
+ end
+ -> { @obj.meth(5) }.should.raise(NoMethodError)
+ end
+ end
+
+ it "allows undefining multiple methods at a time" do
+ undef_multiple = Class.new do
+ def method1; end
+ def method2; :nope; end
+
+ undef :method1, :method2
+ end
+
+ obj = undef_multiple.new
+ obj.respond_to?(:method1).should == false
+ obj.respond_to?(:method2).should == false
+ end
+
+ it "raises a NameError when passed a missing name" do
+ Class.new do
+ -> {
+ undef not_exist
+ }.should.raise(NameError) { |e|
+ # a NameError and not a NoMethodError
+ e.class.should == NameError
+ }
+ end
+ end
+end