spec/renum_spec.rb in renum-1.0.2 vs spec/renum_spec.rb in renum-1.2.0
- old
+ new
@@ -1,37 +1,9 @@
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
enum :Status, [ :NOT_STARTED, :IN_PROGRESS, :COMPLETE ]
-module MyNamespace
- enum :FooValue, %w( Bar Baz Bat )
-end
-
-enum :Color, [ :RED, :GREEN, :BLUE ] do
- def abbr
- name[0..0]
- end
-end
-
-enum :Size do
- Small("Really really tiny")
- Medium("Sort of in the middle")
- Large("Quite big")
-
- attr_reader :description
-
- def init description
- @description = description
- end
-end
-
-enum :HairColor do
- BLONDE()
- BRUNETTE()
- RED()
-end
-
describe "basic enum" do
it "creates a class for the value type" do
Status.should be_an_instance_of(Class)
end
@@ -65,44 +37,115 @@
it "makes values comparable" do
Color::RED.should < Color::GREEN
end
end
+module MyNamespace
+ enum :FooValue, %w( Bar Baz Bat )
+end
+
describe "nested enum" do
it "is namespaced in the containing module or class" do
MyNamespace::FooValue::Bar.class.should == MyNamespace::FooValue
end
end
+enum :Color, [ :RED, :GREEN, :BLUE ] do
+ def abbr
+ name[0..0]
+ end
+end
+
describe "enum with a block" do
it "can define additional instance methods" do
Color::RED.abbr.should == "R"
end
end
+enum :Size do
+ Small("Really really tiny")
+ Medium("Sort of in the middle")
+ Large("Quite big")
+ Unknown()
+
+ attr_reader :description
+
+ def init description = nil
+ @description = description || "NO DESCRIPTION GIVEN"
+ end
+end
+
+enum :HairColor do
+ BLONDE()
+ BRUNETTE()
+ RED()
+end
+
describe "enum with no values array and values declared in the block" do
- it "provides an alternative means of declaring values where extra information can be provided for initialization" do
+ it "provides another way to declare values where an init method can take extra params" do
Size::Small.description.should == "Really really tiny"
end
it "works the same as the basic form with respect to ordering" do
- Size.values.should == [Size::Small, Size::Medium, Size::Large]
+ Size.values.should == [Size::Small, Size::Medium, Size::Large, Size::Unknown]
end
it "responds as expected to arbitrary method calls, in spite of using method_missing for value definition" do
lambda { Size.ExtraLarge() }.should raise_error(NoMethodError)
end
it "supports there being no extra data and no init() method defined, if you don't need them" do
HairColor::BLONDE.name.should == "BLONDE"
end
+
+ it "calls the init method even if no arguments are provided" do
+ Size::Unknown.description.should == "NO DESCRIPTION GIVEN"
+ end
end
-# It was reported on my blog that <=> was causing segfaults.
-# I'd love to figure out why, but first I'd love to fix that.
-describe "digging into this segfault/illegal instruction issue, renum" do
+enum :Rating do
+ NotRated()
+
+ ThumbsDown do
+ def description
+ "real real bad"
+ end
+ end
+
+ ThumbsUp do
+ def description
+ "so so good"
+ end
+
+ def thumbs_up_only_method
+ "this method is only defined on ThumbsUp"
+ end
+ end
+
+ def description
+ raise NotImplementedError
+ end
+end
+
+describe "an enum with instance-specific method definitions" do
+ it "allows each instance to have its own behavior" do
+ Rating::ThumbsDown.description.should == "real real bad"
+ Rating::ThumbsUp.description.should == "so so good"
+ end
+
+ it "uses the implementation given at the top level if no alternate definition is given for an instance" do
+ lambda { Rating::NotRated.description }.should raise_error(NotImplementedError)
+ end
+
+ it "allows definition of a method on just one instance" do
+ Rating::ThumbsUp.thumbs_up_only_method.should == "this method is only defined on ThumbsUp"
+ lambda { Rating::NotRated.thumbs_up_only_method }.should raise_error(NoMethodError)
+ end
+end
+
+describe "<=> comparison issue that at one time was causing segfaults on MRI" do
it "doesn't cause the ruby process to bomb!" do
Color::RED.should < Color::GREEN
Color::RED.should_not > Color::GREEN
Color::RED.should < Color::BLUE
end
-end
\ No newline at end of file
+end