]> git.openstreetmap.org Git - rails.git/blobdiff - vendor/gems/rspec-1.1.2/spec/spec/matchers/change_spec.rb
added RSpec and RSpec on Rails
[rails.git] / vendor / gems / rspec-1.1.2 / spec / spec / matchers / change_spec.rb
diff --git a/vendor/gems/rspec-1.1.2/spec/spec/matchers/change_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/matchers/change_spec.rb
new file mode 100644 (file)
index 0000000..d95aa6d
--- /dev/null
@@ -0,0 +1,319 @@
+#Based on patch from Wilson Bilkovich
+
+require File.dirname(__FILE__) + '/../../spec_helper.rb'
+class SomethingExpected
+  attr_accessor :some_value
+end
+
+describe "should change(actual, message)" do
+  before(:each) do
+    @instance = SomethingExpected.new
+    @instance.some_value = 5
+  end
+
+  it "should pass when actual is modified by the block" do
+    lambda {@instance.some_value = 6}.should change(@instance, :some_value)
+  end
+
+  it "should fail when actual is not modified by the block" do
+    lambda do
+      lambda {}.should change(@instance, :some_value)
+    end.should fail_with("some_value should have changed, but is still 5")
+  end
+end
+
+describe "should_not change(actual, message)" do
+  before(:each) do
+    @instance = SomethingExpected.new
+    @instance.some_value = 5
+  end
+
+  it "should pass when actual is not modified by the block" do
+    lambda { }.should_not change(@instance, :some_value)
+  end
+
+  it "should fail when actual is not modified by the block" do
+    lambda do
+      lambda {@instance.some_value = 6}.should_not change(@instance, :some_value)
+    end.should fail_with("some_value should not have changed, but did change from 5 to 6")
+  end
+end
+
+describe "should change { block }" do
+  before(:each) do
+    @instance = SomethingExpected.new
+    @instance.some_value = 5
+  end
+
+  it "should pass when actual is modified by the block" do
+    lambda {@instance.some_value = 6}.should change { @instance.some_value }
+  end
+
+  it "should fail when actual is not modified by the block" do
+    lambda do
+      lambda {}.should change{ @instance.some_value }
+    end.should fail_with("result should have changed, but is still 5")
+  end
+  
+  it "should warn if passed a block using do/end" do
+    lambda do
+      lambda {}.should change do
+      end
+    end.should raise_error(Spec::Matchers::MatcherError, /block passed to should or should_not/)
+  end
+end
+
+describe "should_not change { block }" do
+  before(:each) do
+    @instance = SomethingExpected.new
+    @instance.some_value = 5
+  end
+
+  it "should pass when actual is modified by the block" do
+    lambda {}.should_not change{ @instance.some_value }
+  end
+
+  it "should fail when actual is not modified by the block" do
+    lambda do
+      lambda {@instance.some_value = 6}.should_not change { @instance.some_value }
+    end.should fail_with("result should not have changed, but did change from 5 to 6")
+  end
+  
+  it "should warn if passed a block using do/end" do
+    lambda do
+      lambda {}.should_not change do
+      end
+    end.should raise_error(Spec::Matchers::MatcherError, /block passed to should or should_not/)
+  end
+end
+
+describe "should change(actual, message).by(expected)" do
+  before(:each) do
+    @instance = SomethingExpected.new
+    @instance.some_value = 5
+  end
+
+  it "should pass when attribute is changed by expected amount" do
+    lambda { @instance.some_value += 1 }.should change(@instance, :some_value).by(1)
+  end
+
+  it "should fail when the attribute is changed by unexpected amount" do
+    lambda do
+      lambda { @instance.some_value += 2 }.should change(@instance, :some_value).by(1)
+    end.should fail_with("some_value should have been changed by 1, but was changed by 2")
+  end
+
+  it "should fail when the attribute is changed by unexpected amount in the opposite direction" do
+    lambda do
+      lambda { @instance.some_value -= 1 }.should change(@instance, :some_value).by(1)
+    end.should fail_with("some_value should have been changed by 1, but was changed by -1")
+  end
+end
+
+describe "should change{ block }.by(expected)" do
+  before(:each) do
+    @instance = SomethingExpected.new
+    @instance.some_value = 5
+  end
+
+  it "should pass when attribute is changed by expected amount" do
+    lambda { @instance.some_value += 1 }.should change{@instance.some_value}.by(1)
+  end
+
+  it "should fail when the attribute is changed by unexpected amount" do
+    lambda do
+      lambda { @instance.some_value += 2 }.should change{@instance.some_value}.by(1)
+    end.should fail_with("result should have been changed by 1, but was changed by 2")
+  end
+
+  it "should fail when the attribute is changed by unexpected amount in the opposite direction" do
+    lambda do
+      lambda { @instance.some_value -= 1 }.should change{@instance.some_value}.by(1)
+    end.should fail_with("result should have been changed by 1, but was changed by -1")
+  end
+end
+
+describe "should change(actual, message).by_at_least(expected)" do
+  before(:each) do
+    @instance = SomethingExpected.new
+    @instance.some_value = 5
+  end
+
+  it "should pass when attribute is changed by greater than the expected amount" do
+    lambda { @instance.some_value += 2 }.should change(@instance, :some_value).by_at_least(1)
+  end
+  
+  it "should pass when attribute is changed by the expected amount" do
+    lambda { @instance.some_value += 2 }.should change(@instance, :some_value).by_at_least(2)
+  end  
+
+  it "should fail when the attribute is changed by less than the expected amount" do
+    lambda do
+      lambda { @instance.some_value += 1 }.should change(@instance, :some_value).by_at_least(2)
+    end.should fail_with("some_value should have been changed by at least 2, but was changed by 1")
+  end
+
+end
+
+describe "should change{ block }.by_at_least(expected)" do
+  before(:each) do
+    @instance = SomethingExpected.new
+    @instance.some_value = 5
+  end
+
+  it "should pass when attribute is changed by greater than expected amount" do
+    lambda { @instance.some_value += 2 }.should change{@instance.some_value}.by_at_least(1)
+  end
+  
+  it "should pass when attribute is changed by the expected amount" do
+    lambda { @instance.some_value += 2 }.should change{@instance.some_value}.by_at_least(2)
+  end  
+
+  it "should fail when the attribute is changed by less than the unexpected amount" do
+    lambda do
+      lambda { @instance.some_value += 1 }.should change{@instance.some_value}.by_at_least(2)
+    end.should fail_with("result should have been changed by at least 2, but was changed by 1")
+  end
+end
+
+
+describe "should change(actual, message).by_at_most(expected)" do
+  before(:each) do
+    @instance = SomethingExpected.new
+    @instance.some_value = 5
+  end
+
+  it "should pass when attribute is changed by less than the expected amount" do
+    lambda { @instance.some_value += 2 }.should change(@instance, :some_value).by_at_most(3)
+  end
+  
+  it "should pass when attribute is changed by the expected amount" do
+    lambda { @instance.some_value += 2 }.should change(@instance, :some_value).by_at_most(2)
+  end  
+
+  it "should fail when the attribute is changed by greater than the expected amount" do
+    lambda do
+      lambda { @instance.some_value += 2 }.should change(@instance, :some_value).by_at_most(1)
+    end.should fail_with("some_value should have been changed by at most 1, but was changed by 2")
+  end
+
+end
+
+describe "should change{ block }.by_at_most(expected)" do
+  before(:each) do
+    @instance = SomethingExpected.new
+    @instance.some_value = 5
+  end
+
+  it "should pass when attribute is changed by less than expected amount" do
+    lambda { @instance.some_value += 2 }.should change{@instance.some_value}.by_at_most(3)
+  end
+  
+  it "should pass when attribute is changed by the expected amount" do
+    lambda { @instance.some_value += 2 }.should change{@instance.some_value}.by_at_most(2)
+  end  
+
+  it "should fail when the attribute is changed by greater than the unexpected amount" do
+    lambda do
+      lambda { @instance.some_value += 2 }.should change{@instance.some_value}.by_at_most(1)
+    end.should fail_with("result should have been changed by at most 1, but was changed by 2")
+  end
+end
+
+describe "should change(actual, message).from(old)" do
+  before(:each) do
+    @instance = SomethingExpected.new
+    @instance.some_value = 'string'
+  end
+
+  it "should pass when attribute is == to expected value before executing block" do
+    lambda { @instance.some_value = "astring" }.should change(@instance, :some_value).from("string")
+  end
+
+  it "should fail when attribute is not == to expected value before executing block" do
+    lambda do
+      lambda { @instance.some_value = "knot" }.should change(@instance, :some_value).from("cat")
+    end.should fail_with("some_value should have initially been \"cat\", but was \"string\"")
+  end
+end
+
+describe "should change{ block }.from(old)" do
+  before(:each) do
+    @instance = SomethingExpected.new
+    @instance.some_value = 'string'
+  end
+
+  it "should pass when attribute is == to expected value before executing block" do
+    lambda { @instance.some_value = "astring" }.should change{@instance.some_value}.from("string")
+  end
+
+  it "should fail when attribute is not == to expected value before executing block" do
+    lambda do
+      lambda { @instance.some_value = "knot" }.should change{@instance.some_value}.from("cat")
+    end.should fail_with("result should have initially been \"cat\", but was \"string\"")
+  end
+end
+
+describe "should change(actual, message).to(new)" do
+  before(:each) do
+    @instance = SomethingExpected.new
+    @instance.some_value = 'string'
+  end
+  
+  it "should pass when attribute is == to expected value after executing block" do
+    lambda { @instance.some_value = "cat" }.should change(@instance, :some_value).to("cat")
+  end
+
+  it "should fail when attribute is not == to expected value after executing block" do
+    lambda do
+      lambda { @instance.some_value = "cat" }.should change(@instance, :some_value).from("string").to("dog")
+    end.should fail_with("some_value should have been changed to \"dog\", but is now \"cat\"")
+  end
+end
+
+describe "should change{ block }.to(new)" do
+  before(:each) do
+    @instance = SomethingExpected.new
+    @instance.some_value = 'string'
+  end
+  
+  it "should pass when attribute is == to expected value after executing block" do
+    lambda { @instance.some_value = "cat" }.should change{@instance.some_value}.to("cat")
+  end
+
+  it "should fail when attribute is not == to expected value after executing block" do
+    lambda do
+      lambda { @instance.some_value = "cat" }.should change{@instance.some_value}.from("string").to("dog")
+    end.should fail_with("result should have been changed to \"dog\", but is now \"cat\"")
+  end
+end
+
+describe "should change(actual, message).from(old).to(new)" do
+  before(:each) do
+    @instance = SomethingExpected.new
+    @instance.some_value = 'string'
+  end
+  
+  it "should pass when #to comes before #from" do
+    lambda { @instance.some_value = "cat" }.should change(@instance, :some_value).to("cat").from("string")
+  end
+
+  it "should pass when #from comes before #to" do
+    lambda { @instance.some_value = "cat" }.should change(@instance, :some_value).from("string").to("cat")
+  end
+end
+
+describe "should change{ block }.from(old).to(new)" do
+  before(:each) do
+    @instance = SomethingExpected.new
+    @instance.some_value = 'string'
+  end
+  
+  it "should pass when #to comes before #from" do
+    lambda { @instance.some_value = "cat" }.should change{@instance.some_value}.to("cat").from("string")
+  end
+
+  it "should pass when #from comes before #to" do
+    lambda { @instance.some_value = "cat" }.should change{@instance.some_value}.from("string").to("cat")
+  end
+end