expectations 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,6 @@
1
1
  class Expectations::Expectation
2
+ include Mocha::Standalone
3
+
2
4
  attr_accessor :expected, :block, :file, :line, :actual
3
5
  def initialize(expected, &block)
4
6
  self.expected, self.block = expected, block
@@ -6,15 +8,39 @@ class Expectations::Expectation
6
8
  end
7
9
 
8
10
  def execute
11
+ expected.is_a?(Mocha::Expectation) ? behavior_based_execute : state_based_execute
12
+ end
13
+
14
+ def behavior_based_execute
15
+ begin
16
+ mock = expected.instance_variable_get(:@mock)
17
+ mocha_setup
18
+ instance_exec mock, &block
19
+ mock.verify
20
+ self.extend(Expectations::Results::Fulfilled)
21
+ rescue Mocha::ExpectationError => ex
22
+ self.extend(Expectations::Results::BehaviorFailure)
23
+ self.message = ex.message.gsub(/:/,";")
24
+ rescue Exception => ex
25
+ self.extend(Expectations::Results::Error)
26
+ self.exception = ex
27
+ ensure
28
+ mocha_teardown
29
+ end
30
+ self
31
+ end
32
+
33
+ def state_based_execute
9
34
  begin
10
35
  self.actual = block.call
11
36
  return self.extend(Expectations::Results::Fulfilled) if expected == actual
12
37
  rescue Exception => ex
13
38
  return self.extend(Expectations::Results::Fulfilled) if expected == ex.class
14
39
  self.extend(Expectations::Results::Error)
15
- self.exception, self.actual = ex, ex.class
40
+ self.exception = ex
41
+ self.actual = ex.class if expected.is_a?(Class) && expected < StandardError
16
42
  return self
17
43
  end
18
- self.extend(Expectations::Results::Failure)
44
+ self.extend(Expectations::Results::StateBasedFailure)
19
45
  end
20
46
  end
@@ -0,0 +1,5 @@
1
+ module Mocha
2
+ class Mock
3
+ alias to_receive expects
4
+ end
5
+ end
@@ -0,0 +1,30 @@
1
+ class Object
2
+ alias to_receive expects
3
+
4
+ unless defined? instance_exec # 1.9
5
+ module InstanceExecMethods #:nodoc:
6
+ end
7
+ include InstanceExecMethods
8
+
9
+ # Evaluate the block with the given arguments within the context of
10
+ # this object, so self is set to the method receiver.
11
+ #
12
+ # From Mauricio's http://eigenclass.org/hiki/bounded+space+instance_exec
13
+ def instance_exec(*args, &block)
14
+ begin
15
+ old_critical, Thread.critical = Thread.critical, true
16
+ n = 0
17
+ n += 1 while respond_to?(method_name = "__instance_exec#{n}")
18
+ InstanceExecMethods.module_eval { define_method(method_name, &block) }
19
+ ensure
20
+ Thread.critical = old_critical
21
+ end
22
+
23
+ begin
24
+ send(method_name, *args)
25
+ ensure
26
+ InstanceExecMethods.module_eval { remove_method(method_name) } rescue nil
27
+ end
28
+ end
29
+ end
30
+ end
@@ -21,7 +21,18 @@ module Expectations::Results
21
21
  end
22
22
 
23
23
  module Expectations::Results
24
- module Failure
24
+ module StateBasedFailure
25
+ include Expectations::Results
26
+ char "F"
27
+ def message
28
+ "expected: <#{expected.inspect}> got: <#{actual.inspect}>"
29
+ end
30
+ end
31
+ end
32
+
33
+ module Expectations::Results
34
+ module BehaviorFailure
35
+ attr_accessor :message
25
36
  include Expectations::Results
26
37
  char "F"
27
38
  end
@@ -1,4 +1,9 @@
1
1
  class Expectations::Suite
2
+ include Mocha::Standalone
3
+
4
+ def initialize
5
+ mocha_setup
6
+ end
2
7
 
3
8
  def execute(out=STDOUT)
4
9
  suite_result = Expectations::SuiteResults.new(out)
@@ -10,7 +15,7 @@ class Expectations::Suite
10
15
  suite_result.print_results(benchmark)
11
16
  suite_result.result
12
17
  end
13
-
18
+
14
19
  def expectations
15
20
  @expectations ||= []
16
21
  end
@@ -22,7 +22,9 @@ class Expectations::SuiteResults
22
22
  end
23
23
 
24
24
  def failures
25
- expectations.select { |expectation| expectation.is_a?(Expectations::Results::Failure) }
25
+ expectations.select do |expectation|
26
+ expectation.is_a?(Expectations::Results::StateBasedFailure) || expectation.is_a?(Expectations::Results::BehaviorFailure)
27
+ end
26
28
  end
27
29
 
28
30
  def print_results(benchmark)
@@ -37,14 +39,14 @@ class Expectations::SuiteResults
37
39
  errors.each do |error|
38
40
  out.puts " #{error.file}:#{error.line}:in `expect'"
39
41
  out.puts " line <#{error.line}>"
40
- out.puts " error <#{error.exception.message}>"
42
+ out.puts " error <#{error.exception.message.gsub(/:/,";")}>"
41
43
  out.puts " expected <#{error.expected.inspect}> got <#{error.actual.inspect}>"
42
44
  end
43
45
  out.puts "\nFailures:" if failures.any?
44
46
  failures.each do |failure|
45
47
  out.puts " #{failure.file}:#{failure.line}:in `expect'"
46
48
  out.puts " line <#{failure.line}>"
47
- out.puts " expected: <#{failure.expected.inspect}> got: <#{failure.actual.inspect}>"
49
+ out.puts " #{failure.message}"
48
50
  end
49
51
  end
50
52
  end
data/lib/expectations.rb CHANGED
@@ -5,8 +5,13 @@ def Expectations(&block)
5
5
  Expectations::SuiteRunner.instance.suite_eval &block
6
6
  end
7
7
 
8
+ require 'rubygems'
9
+ require 'mocha'
10
+ require 'mocha/standalone'
8
11
  require 'singleton'
9
12
  require 'benchmark'
13
+ require File.expand_path(File.dirname(__FILE__) + '/expectations/object')
14
+ require File.expand_path(File.dirname(__FILE__) + '/expectations/mocha')
10
15
  require File.expand_path(File.dirname(__FILE__) + '/expectations/suite')
11
16
  require File.expand_path(File.dirname(__FILE__) + '/expectations/suite_runner')
12
17
  require File.expand_path(File.dirname(__FILE__) + '/expectations/suite_results')
data/rakefile.rb CHANGED
@@ -33,7 +33,7 @@ specification = Gem::Specification.new do |s|
33
33
  expect NoMethodError do
34
34
  Object.invalid_method_call
35
35
  end."
36
- s.version = "0.0.1"
36
+ s.version = "0.0.2"
37
37
  s.author = 'Jay Fields'
38
38
  s.description = "A lightweight unit testing framework. Tests (expectations) will be written as follows
39
39
  expect 2 do
@@ -50,7 +50,7 @@ specification = Gem::Specification.new do |s|
50
50
  s.extra_rdoc_files = ['README']
51
51
  s.rdoc_options << '--title' << 'expectations' << '--main' << 'README' << '--line-numbers'
52
52
 
53
- s.autorequire = 'arbs'
53
+ s.autorequire = 'expectations'
54
54
  s.files = FileList['{lib,test}/**/*.rb', '[A-Z]*$', 'rakefile.rb'].to_a
55
55
  s.test_file = "test/all_tests.rb"
56
56
  end
@@ -2,7 +2,7 @@ require File.dirname(__FILE__) + "/../test_helper"
2
2
 
3
3
  Expectations do
4
4
  expect true do
5
- Expectations::Expectation.new(1) { 2 }.execute.is_a?(Expectations::Results::Failure)
5
+ Expectations::Expectation.new(1) { 2 }.execute.is_a?(Expectations::Results::StateBasedFailure)
6
6
  end
7
7
 
8
8
  expect true do
@@ -13,6 +13,22 @@ Expectations do
13
13
  Expectations::Expectation.new(1) { raise }.execute.is_a?(Expectations::Results::Error)
14
14
  end
15
15
 
16
+ expect NoMethodError do
17
+ Expectations::Expectation.new(ArgumentError) { Object.no_method }.execute.actual
18
+ end
19
+
20
+ expect "undefined method `no_method' for Object:Class" do
21
+ Expectations::Expectation.new(ArgumentError) { Object.no_method }.execute.exception.to_s
22
+ end
23
+
24
+ expect true do
25
+ Expectations::Expectation.new(NoMethodError) { Object.no_method }.execute.is_a?(Expectations::Results::Fulfilled)
26
+ end
27
+
28
+ expect nil do
29
+ Expectations::Expectation.new(String) { Object.no_method }.execute.actual
30
+ end
31
+
16
32
  expect __LINE__ + 1 do
17
33
  Expectations::Expectation.new(1) { 2 }.execute.line
18
34
  end
@@ -7,7 +7,11 @@ Expectations do
7
7
  end
8
8
 
9
9
  expect "F" do
10
- Object.new.extend(Expectations::Results::Failure).char
10
+ Object.new.extend(Expectations::Results::StateBasedFailure).char
11
+ end
12
+
13
+ expect "F" do
14
+ Object.new.extend(Expectations::Results::BehaviorFailure).char
11
15
  end
12
16
 
13
17
  expect "E" do
@@ -19,7 +23,11 @@ Expectations do
19
23
  end
20
24
 
21
25
  expect false do
22
- Object.new.extend(Expectations::Results::Failure).fulfilled?
26
+ Object.new.extend(Expectations::Results::StateBasedFailure).fulfilled?
27
+ end
28
+
29
+ expect false do
30
+ Object.new.extend(Expectations::Results::BehaviorFailure).fulfilled?
23
31
  end
24
32
 
25
33
  expect false do
@@ -21,7 +21,13 @@ Expectations do
21
21
 
22
22
  expect false do
23
23
  results = Expectations::SuiteResults.new(Silent)
24
- results << Object.new.extend(Expectations::Results::Failure)
24
+ results << Object.new.extend(Expectations::Results::StateBasedFailure)
25
+ results.result
26
+ end
27
+
28
+ expect false do
29
+ results = Expectations::SuiteResults.new(Silent)
30
+ results << Object.new.extend(Expectations::Results::BehaviorFailure)
25
31
  results.result
26
32
  end
27
33
  end
@@ -1,6 +1,10 @@
1
1
  require File.dirname(__FILE__) + "/test_helper"
2
2
 
3
+ class Phone
4
+ end
5
+
3
6
  Expectations do
7
+
4
8
  expect 2 do
5
9
  1 + 1
6
10
  end
@@ -9,4 +13,22 @@ Expectations do
9
13
  Object.no_method
10
14
  end
11
15
 
16
+ expect mock.to_receive(:redial) do |phone|
17
+ phone.redial(10)
18
+ end
19
+
20
+ expect mock.to_receive(:dial).with("2125551212") do |phone|
21
+ phone.dial("2125551212")
22
+ end
23
+
24
+ expect mock.to_receive(:dial).times(2) do |phone|
25
+ phone.dial
26
+ phone.dial
27
+ end
28
+
29
+ expect Object.to_receive(:foo).with(1).times(2) do
30
+ Object.foo(1)
31
+ Object.foo(1)
32
+ end
33
+
12
34
  end
metadata CHANGED
@@ -1,11 +1,11 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: expectations
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jay Fields
8
- autorequire: arbs
8
+ autorequire: expectations
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
@@ -23,6 +23,8 @@ extra_rdoc_files:
23
23
  - README
24
24
  files:
25
25
  - lib/expectations/expectation.rb
26
+ - lib/expectations/mocha.rb
27
+ - lib/expectations/object.rb
26
28
  - lib/expectations/results.rb
27
29
  - lib/expectations/suite.rb
28
30
  - lib/expectations/suite_results.rb