summaryrefslogtreecommitdiff
path: root/spec/ruby/language/class_variable_spec.rb
diff options
context:
space:
mode:
authoreregon <eregon@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-09-20 20:18:52 +0000
committereregon <eregon@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-09-20 20:18:52 +0000
commit1d15d5f08032acf1b7bceacbb450d617ff6e0931 (patch)
treea3785a79899302bc149e4a6e72f624ac27dc1f10 /spec/ruby/language/class_variable_spec.rb
parent75bfc6440d595bf339007f4fb280fd4d743e89c1 (diff)
Move spec/rubyspec to spec/ruby for consistency
* Other ruby implementations use the spec/ruby directory. [Misc #13792] [ruby-core:82287] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59979 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'spec/ruby/language/class_variable_spec.rb')
-rw-r--r--spec/ruby/language/class_variable_spec.rb84
1 files changed, 84 insertions, 0 deletions
diff --git a/spec/ruby/language/class_variable_spec.rb b/spec/ruby/language/class_variable_spec.rb
new file mode 100644
index 0000000000..463f731a93
--- /dev/null
+++ b/spec/ruby/language/class_variable_spec.rb
@@ -0,0 +1,84 @@
+require File.expand_path('../../spec_helper', __FILE__)
+require File.expand_path('../../fixtures/class_variables', __FILE__)
+
+describe "A class variable" do
+ after :each do
+ ClassVariablesSpec::ClassA.new.cvar_a = :cvar_a
+ end
+
+ it "can be accessed from a subclass" do
+ ClassVariablesSpec::ClassB.new.cvar_a.should == :cvar_a
+ end
+
+ it "is set in the superclass" do
+ a = ClassVariablesSpec::ClassA.new
+ b = ClassVariablesSpec::ClassB.new
+ b.cvar_a = :new_val
+
+ a.cvar_a.should == :new_val
+ end
+end
+
+describe "A class variable defined in a module" do
+ after :each do
+ ClassVariablesSpec::ClassC.cvar_m = :value
+ ClassVariablesSpec::ClassC.remove_class_variable(:@@cvar) if ClassVariablesSpec::ClassC.cvar_defined?
+ end
+
+ it "can be accessed from classes that extend the module" do
+ ClassVariablesSpec::ClassC.cvar_m.should == :value
+ end
+
+ it "is not defined in these classes" do
+ ClassVariablesSpec::ClassC.cvar_defined?.should be_false
+ end
+
+ it "is only updated in the module a method defined in the module is used" do
+ ClassVariablesSpec::ClassC.cvar_m = "new value"
+ ClassVariablesSpec::ClassC.cvar_m.should == "new value"
+
+ ClassVariablesSpec::ClassC.cvar_defined?.should be_false
+ end
+
+ it "is updated in the class when a Method defined in the class is used" do
+ ClassVariablesSpec::ClassC.cvar_c = "new value"
+ ClassVariablesSpec::ClassC.cvar_defined?.should be_true
+ end
+
+ it "can be accessed inside the class using the module methods" do
+ ClassVariablesSpec::ClassC.cvar_c = "new value"
+ ClassVariablesSpec::ClassC.cvar_m.should == :value
+ end
+
+ it "can be accessed from modules that extend the module" do
+ ClassVariablesSpec::ModuleO.cvar_n.should == :value
+ end
+
+ it "is defined in the extended module" do
+ ClassVariablesSpec::ModuleN.class_variable_defined?(:@@cvar_n).should be_true
+ end
+
+ it "is not defined in the extending module" do
+ ClassVariablesSpec::ModuleO.class_variable_defined?(:@@cvar_n).should be_false
+ end
+end
+
+describe 'A class variable definition' do
+ it "is created in a module if any of the parents do not define it" do
+ a = Class.new
+ b = Class.new(a)
+ c = Class.new(b)
+ b.class_variable_set(:@@cv, :value)
+
+ lambda { a.class_variable_get(:@@cv) }.should raise_error(NameError)
+ b.class_variable_get(:@@cv).should == :value
+ c.class_variable_get(:@@cv).should == :value
+
+ # updates the same variable
+ c.class_variable_set(:@@cv, :next)
+
+ lambda { a.class_variable_get(:@@cv) }.should raise_error(NameError)
+ b.class_variable_get(:@@cv).should == :next
+ c.class_variable_get(:@@cv).should == :next
+ end
+end