synthesis 0.1.5 → 0.1.6

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.
Files changed (32) hide show
  1. data/Rakefile +32 -2
  2. data/lib/synthesis/adapter/expectations.rb +1 -0
  3. data/lib/synthesis/adapter/rspec.rb +11 -5
  4. data/lib/synthesis/recordable.rb +1 -1
  5. data/lib/synthesis/task.rb +8 -3
  6. data/synthesis.gemspec +41 -0
  7. metadata +6 -30
  8. data/test/synthesis/adapter/mocha/expectation_record_test.rb +0 -15
  9. data/test/synthesis/adapter/mocha/helper.rb +0 -3
  10. data/test/synthesis/adapter/mocha/mocha_expectation_test.rb +0 -26
  11. data/test/synthesis/adapter/mocha/mocha_test.rb +0 -9
  12. data/test/synthesis/adapter/mocha/object_test.rb +0 -18
  13. data/test/synthesis/adapter/rspec/expectation_record_test.rb +0 -15
  14. data/test/synthesis/adapter/rspec/helper.rb +0 -3
  15. data/test/synthesis/adapter/rspec/message_expectation_test.rb +0 -19
  16. data/test/synthesis/adapter/rspec/methods_test.rb +0 -22
  17. data/test/synthesis/class_test.rb +0 -7
  18. data/test/synthesis/expectation_matcher_test.rb +0 -54
  19. data/test/synthesis/expectation_record_test.rb +0 -89
  20. data/test/synthesis/expectation_test.rb +0 -112
  21. data/test/synthesis/helper.rb +0 -3
  22. data/test/synthesis/method_invocation_watcher_test.rb +0 -18
  23. data/test/synthesis/module_test.rb +0 -7
  24. data/test/synthesis/object_test.rb +0 -7
  25. data/test/synthesis/recordable_test.rb +0 -116
  26. data/test_project/expectations/test/data_brander_test.rb +0 -18
  27. data/test_project/expectations/test/storage_test.rb +0 -21
  28. data/test_project/mocha/test/data_brander_test.rb +0 -36
  29. data/test_project/mocha/test/storage_test.rb +0 -31
  30. data/test_project/rspec/data_brander_spec.rb +0 -36
  31. data/test_project/rspec/storage_spec.rb +0 -30
  32. data/test_project/test_project.rb +0 -47
data/Rakefile CHANGED
@@ -7,7 +7,7 @@ require File.dirname(__FILE__) + "/lib/synthesis/task"
7
7
 
8
8
  load 'synthesis.gemspec'
9
9
 
10
- task :default => :test
10
+ task :default => [:test, "test_project:all"]
11
11
 
12
12
  desc "Run all tests"
13
13
  task :test => %w[test:core test:mocha test:spec]
@@ -43,6 +43,26 @@ Synthesis::Task.new('synthesis:spec') do |t|
43
43
  t.pattern = 'test_project/rspec/*_spec.rb'
44
44
  end
45
45
 
46
+ namespace :test_project do
47
+ task :all do
48
+ STDOUT.puts `rake test_project:mocha`
49
+ STDOUT.puts `rake test_project:rspec`
50
+ STDOUT.puts `rake test_project:expectations`
51
+ end
52
+
53
+ Rake::TestTask.new('mocha') do |t|
54
+ t.pattern = 'test_project/mocha/**/*_test.rb'
55
+ end
56
+
57
+ Rake::TestTask.new('rspec') do |t|
58
+ t.pattern = 'test_project/mocha/**/*_test.rb'
59
+ end
60
+
61
+ Rake::TestTask.new('expectations') do |t|
62
+ t.pattern = 'test_project/mocha/**/*_test.rb'
63
+ end
64
+ end
65
+
46
66
  desc 'Generate RDoc'
47
67
  Rake::RDocTask.new do |task|
48
68
  task.main = 'README'
@@ -64,4 +84,14 @@ Rake::GemPackageTask.new(GEMSPEC) do |t|
64
84
  end
65
85
 
66
86
  desc "Remove rdoc and package artefacts"
67
- task :clean => %w[clobber_package clobber_rdoc]
87
+ task :clean => %w[clobber_package clobber_rdoc]
88
+
89
+ task(:lf) {p Dir["lib/**/*rb"] }
90
+
91
+ task(:check_gemspec) do
92
+ require 'rubygems/specification'
93
+ data = File.read('synthesis.gemspec')
94
+ spec = nil
95
+ Thread.new { spec = eval("$SAFE = 3\n#{data}") }.join
96
+ puts spec
97
+ end
@@ -18,6 +18,7 @@ module Synthesis
18
18
  Mocha::Expectation.record_expected_arguments_on(:with)
19
19
  Mocha::Expectation.record_expected_return_values_on(:returns)
20
20
  Mocha::Expectation.record_expected_return_values_on(:raises)
21
+ Mocha::Expectation.remove_expectation_on(:never)
21
22
  end
22
23
 
23
24
  def stop_collecting_expectations
@@ -7,11 +7,11 @@ require File.dirname(__FILE__) + "/../../synthesis"
7
7
  module Synthesis
8
8
  class RSpecAdapter < Adapter
9
9
  def run
10
- rspec_options.files.clear
10
+ Synthesis.rspec_runner_options.files.clear
11
11
  fail_unless do
12
- rspec_options.instance_variable_set(:@formatters, nil)
13
- # rspec_options.instance_variable_set(:@format_options, [["profile", STDOUT]])
14
- rspec_options.run_examples
12
+ Synthesis.rspec_runner_options.instance_variable_set(:@formatters, nil)
13
+ # Synthesis.rspec_runner_options.instance_variable_set(:@format_options, [["profile", STDOUT]])
14
+ Synthesis.rspec_runner_options.run_examples
15
15
  end
16
16
  end
17
17
 
@@ -30,5 +30,11 @@ module Synthesis
30
30
  Spec::Mocks::MessageExpectation.stop_intercepting!
31
31
  Spec::Mocks::Methods.stop_recording!
32
32
  end
33
- end
33
+ end
34
+
35
+ def rspec_runner_options
36
+ Spec::Runner.options rescue rspec_options
37
+ end
38
+
39
+ module_function :rspec_runner_options
34
40
  end
@@ -1,7 +1,7 @@
1
1
  module Synthesis
2
2
  module Recordable
3
3
  def recordable_method(meth)
4
- if method_defined?(meth)
4
+ if method_defined?(meth) || private_method_defined?(meth)
5
5
  defined_recordable_method(meth)
6
6
  else
7
7
  magic_recordable_method(meth)
@@ -6,10 +6,10 @@ require File.dirname(__FILE__) + "/../synthesis/logging"
6
6
  module Synthesis
7
7
  class Task < Rake::TaskLib
8
8
  include Logging
9
- attr_accessor :verbose, :pattern, :ruby_opts, :adapter, :out, :ignored
9
+ attr_accessor :verbose, :pattern, :ruby_opts, :adapter, :out, :ignored, :libs
10
10
 
11
11
  def initialize(name='synthesis:test')
12
- @name, @ignored = name, []
12
+ @name, @ignored, @libs = name, [], []
13
13
  yield self if block_given?
14
14
  @pattern ||= 'test/**/*_test.rb'
15
15
  @ruby_opts ||= []
@@ -32,7 +32,7 @@ module Synthesis
32
32
  desc "Run Synthesis tests"
33
33
  task @name do
34
34
  RakeFileUtils.verbose(@verbose) do
35
- @ruby_opts.unshift("-w") if @warning
35
+ load_paths
36
36
  require File.dirname(__FILE__) + "/../synthesis"
37
37
  require File.dirname(__FILE__) + "/../synthesis/runner"
38
38
  Synthesis::Logging.const_set(:OUT, @out) if @out
@@ -42,5 +42,10 @@ module Synthesis
42
42
  end
43
43
  self
44
44
  end
45
+
46
+ private
47
+ def load_paths
48
+ @libs.each { |path| $:.unshift(File.join(Dir.pwd, path)) }
49
+ end
45
50
  end
46
51
  end
data/synthesis.gemspec ADDED
@@ -0,0 +1,41 @@
1
+ GEMSPEC =Gem::Specification.new do |s|
2
+ s.name = 'synthesis'
3
+ s.version = '0.1.6'
4
+ s.platform = Gem::Platform::RUBY
5
+ s.rubyforge_project = "synthesis"
6
+ s.summary, s.description = 'A tool for Synthesized Testing'
7
+ s.authors = 'Stuart Caborn, George Malamidis'
8
+ s.email = 'george@nutrun.com'
9
+ s.homepage = 'http://synthesis.rubyforge.org'
10
+ s.has_rdoc = true
11
+ s.rdoc_options += ['--quiet', '--title', 'Synthesis', '--main', 'README', '--inline-source']
12
+ s.extra_rdoc_files = ['README', 'COPYING']
13
+ s.files = [
14
+ "COPYING",
15
+ "Rakefile",
16
+ "README",
17
+ "synthesis.gemspec",
18
+ "lib/synthesis/adapter/expectations.rb",
19
+ "lib/synthesis/adapter/mocha.rb",
20
+ "lib/synthesis/adapter/rspec.rb",
21
+ "lib/synthesis/adapter.rb",
22
+ "lib/synthesis/class.rb",
23
+ "lib/synthesis/expectation.rb",
24
+ "lib/synthesis/expectation_interceptor.rb",
25
+ "lib/synthesis/expectation_matcher.rb",
26
+ "lib/synthesis/expectation_record.rb",
27
+ "lib/synthesis/expectation_record_enabled.rb",
28
+ "lib/synthesis/logging.rb",
29
+ "lib/synthesis/method_invocation_watcher.rb",
30
+ "lib/synthesis/module.rb",
31
+ "lib/synthesis/object.rb",
32
+ "lib/synthesis/recordable.rb",
33
+ "lib/synthesis/reporter.rb",
34
+ "lib/synthesis/runner.rb",
35
+ "lib/synthesis/task.rb",
36
+ "lib/synthesis/util/mock_instance/mocha.rb",
37
+ "lib/synthesis/util/mock_instance/rspec.rb",
38
+ "lib/synthesis/util/mock_instance.rb",
39
+ "lib/synthesis.rb"
40
+ ]
41
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: synthesis
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stuart Caborn, George Malamidis
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-07-03 00:00:00 +01:00
12
+ date: 2008-10-17 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -23,6 +23,10 @@ extra_rdoc_files:
23
23
  - README
24
24
  - COPYING
25
25
  files:
26
+ - COPYING
27
+ - Rakefile
28
+ - README
29
+ - synthesis.gemspec
26
30
  - lib/synthesis/adapter/expectations.rb
27
31
  - lib/synthesis/adapter/mocha.rb
28
32
  - lib/synthesis/adapter/rspec.rb
@@ -45,34 +49,6 @@ files:
45
49
  - lib/synthesis/util/mock_instance/rspec.rb
46
50
  - lib/synthesis/util/mock_instance.rb
47
51
  - lib/synthesis.rb
48
- - test/synthesis/adapter/mocha/expectation_record_test.rb
49
- - test/synthesis/adapter/mocha/helper.rb
50
- - test/synthesis/adapter/mocha/mocha_expectation_test.rb
51
- - test/synthesis/adapter/mocha/mocha_test.rb
52
- - test/synthesis/adapter/mocha/object_test.rb
53
- - test/synthesis/adapter/rspec/expectation_record_test.rb
54
- - test/synthesis/adapter/rspec/helper.rb
55
- - test/synthesis/adapter/rspec/message_expectation_test.rb
56
- - test/synthesis/adapter/rspec/methods_test.rb
57
- - test/synthesis/class_test.rb
58
- - test/synthesis/expectation_matcher_test.rb
59
- - test/synthesis/expectation_record_test.rb
60
- - test/synthesis/expectation_test.rb
61
- - test/synthesis/helper.rb
62
- - test/synthesis/method_invocation_watcher_test.rb
63
- - test/synthesis/module_test.rb
64
- - test/synthesis/object_test.rb
65
- - test/synthesis/recordable_test.rb
66
- - test_project/expectations/test/data_brander_test.rb
67
- - test_project/expectations/test/storage_test.rb
68
- - test_project/mocha/test/data_brander_test.rb
69
- - test_project/mocha/test/storage_test.rb
70
- - test_project/rspec/data_brander_spec.rb
71
- - test_project/rspec/storage_spec.rb
72
- - test_project/test_project.rb
73
- - COPYING
74
- - README
75
- - Rakefile
76
52
  has_rdoc: true
77
53
  homepage: http://synthesis.rubyforge.org
78
54
  post_install_message:
@@ -1,15 +0,0 @@
1
- require File.dirname(__FILE__) + "/helper"
2
-
3
- module Synthesis
4
- class ExpectationRecordTest < Test::Unit::TestCase
5
- def teardown
6
- ExpectationRecord.send(:reset!)
7
- end
8
-
9
- def test_does_not_add_any_instance_expectation
10
- any = Class::AnyInstance.new(Object)
11
- ExpectationRecord.add_expectation(any, :foo, :track)
12
- assert_equal(0, ExpectationRecord.expectations.size)
13
- end
14
- end
15
- end
@@ -1,3 +0,0 @@
1
- %w(test/unit rubygems mocha).each { |l| require l }
2
- require File.dirname(__FILE__) + "/../../../../lib/synthesis/adapter/mocha"
3
- Synthesis::MochaAdapter.new(nil).collect_expectations
@@ -1,26 +0,0 @@
1
- require File.dirname(__FILE__) + "/helper"
2
-
3
- class MochaExpectationTest < Test::Unit::TestCase
4
- def setup
5
- @mocha_expectation = Mocha::Expectation.new(:mock, :blah)
6
- @synthesis_expectation = Synthesis::Expectation.new(Hash, :method, :track, [], [1])
7
- end
8
-
9
- def test_holds_synthesis_expectation
10
- @mocha_expectation.synthesis_expectation = @synthesis_expectation
11
- assert_equal(@synthesis_expectation, @mocha_expectation.synthesis_expectation)
12
- end
13
-
14
- def test_with_passes_expected_params_to_synthesis_expectation
15
- @mocha_expectation.synthesis_expectation = @synthesis_expectation
16
- @mocha_expectation.with(1, 2)
17
- assert_equal([1, 2], @mocha_expectation.synthesis_expectation.args)
18
- end
19
-
20
- def test_passes_return_values_to_synthesis_expectation
21
- @mocha_expectation.synthesis_expectation = @synthesis_expectation
22
- @mocha_expectation.returns(:rock)
23
- return_values = @synthesis_expectation.instance_variable_get(:@return_values)
24
- assert_equal([1, :rock], return_values)
25
- end
26
- end
@@ -1,9 +0,0 @@
1
- require File.dirname(__FILE__) + "/helper"
2
-
3
- module Synthesis
4
- class MochaTest < Test::Unit::TestCase
5
- def test_sets_mock_object_to_class_any_instance
6
- assert_equal(Class::AnyInstance, Synthesis::MOCK_OBJECT)
7
- end
8
- end
9
- end
@@ -1,18 +0,0 @@
1
- require File.dirname(__FILE__) + "/helper"
2
-
3
- module Synthesis
4
- class ObjectTest < Test::Unit::TestCase
5
- def test_records_singleton_method_expectation
6
- ExpectationRecord.expects(:add_expectation).with(Hash, :foo, kind_of(String))
7
- Hash.expects(:foo)
8
- Hash.foo
9
- end
10
-
11
- def test_records_instance_method_expectation
12
- hash = Hash.new
13
- ExpectationRecord.expects(:add_expectation).with(hash, :foo, kind_of(String))
14
- hash.expects(:foo)
15
- hash.foo
16
- end
17
- end
18
- end
@@ -1,15 +0,0 @@
1
- require File.dirname(__FILE__) + "/helper"
2
-
3
- module Synthesis
4
- class ExpectationRecordTest < Test::Unit::TestCase
5
- def teardown
6
- ExpectationRecord.send(:reset!)
7
- end
8
-
9
- def test_does_not_add_any_instance_expectation
10
- mock = Spec::Mocks::Mock.new(Numeric)
11
- ExpectationRecord.add_expectation(mock, :foo, :track)
12
- assert_equal(0, ExpectationRecord.expectations.size)
13
- end
14
- end
15
- end
@@ -1,3 +0,0 @@
1
- require "test/unit"
2
- require File.dirname(__FILE__) + "/../../../../lib/synthesis/adapter/rspec"
3
- Synthesis::RSpecAdapter.new(nil).collect_expectations
@@ -1,19 +0,0 @@
1
- require File.dirname(__FILE__) + "/helper"
2
-
3
- class MessageExpectationTest < Test::Unit::TestCase
4
- def setup
5
- error_generator = Class.new {def opts=(param)end}.new
6
- @spec_expectation = Spec::Mocks::MessageExpectation.new(error_generator, :n, :n, :n, :n)
7
- end
8
-
9
- def test_holds_synthesis_expectation
10
- @spec_expectation.synthesis_expectation = 1
11
- assert_equal 1, @spec_expectation.synthesis_expectation
12
- end
13
-
14
- def test_with_passes_expected_params_to_synthesis_expectation
15
- @spec_expectation.synthesis_expectation = Synthesis::Expectation.new(Hash, :foo, :track)
16
- @spec_expectation.with 1, 2
17
- assert_equal([1, 2], @spec_expectation.synthesis_expectation.args)
18
- end
19
- end
@@ -1,22 +0,0 @@
1
- require File.dirname(__FILE__) + "/helper"
2
-
3
- module Synthesis
4
- class MethodsTest < Test::Unit::TestCase
5
- def teardown
6
- ExpectationRecord.send(:reset!)
7
- end
8
-
9
- def test_records_singleton_method_expectation
10
- ExpectationRecord.should_receive(:add_expectation).with(Hash, :foo, an_instance_of(String))
11
- Hash.should_receive(:foo)
12
- Hash.foo
13
- end
14
-
15
- def test_records_instance_method_expectation
16
- hash = Hash.new
17
- ExpectationRecord.should_receive(:add_expectation).with(hash, :foo, an_instance_of(String))
18
- hash.should_receive(:foo)
19
- hash.foo
20
- end
21
- end
22
- end
@@ -1,7 +0,0 @@
1
- require File.dirname(__FILE__) + "/helper"
2
-
3
- class ClassTest < Test::Unit::TestCase
4
- def test_has_singleton_expectation
5
- assert_instance_of(Synthesis::Expectation::Singleton, Hash.expectation(:foo, :track))
6
- end
7
- end
@@ -1,54 +0,0 @@
1
- require File.dirname(__FILE__) + "/helper"
2
-
3
- module Synthesis
4
- class ExpectationMatcherTest < Test::Unit::TestCase
5
- def test_match
6
- exp1 = Expectation.new(Object.new, :foo, :track, [Array, Hash], [Array, Hash])
7
- exp2 = Expectation.new(Object.new, :foo, :track, [Array, Hash], [Array, Hash])
8
- assert(ExpectationMatcher.new(exp1, exp2).match?)
9
- end
10
-
11
- def test_no_match_based_on_expectation_type
12
- exp1 = Expectation.new(Array, :foo, :track, [Array, Hash], [Array, Hash])
13
- exp2 = Expectation.new(Array.new, :foo, :track, [Array, Hash], [Array, Hash])
14
- assert(!ExpectationMatcher.new(exp1, exp2).match?)
15
- end
16
-
17
- def test_no_match_based_on_receiver_type
18
- exp1 = Expectation.new(Array.new, :foo, :track, [Array, Hash], [Array, Hash])
19
- exp2 = Expectation.new(Hash.new, :foo, :track, [Array, Hash], [Array, Hash])
20
- assert(!ExpectationMatcher.new(exp1, exp2).match?)
21
- end
22
-
23
- def test_no_match_based_on_method_name
24
- exp1 = Expectation.new(Object.new, :foo, :track, [Array, Hash], [Array, Hash])
25
- exp2 = Expectation.new(Object.new, :bar, :track, [Array, Hash], [Array, Hash])
26
- assert(!ExpectationMatcher.new(exp1, exp2).match?)
27
- end
28
-
29
- def test_no_match_based_on_arg_types
30
- exp1 = Expectation.new(Object.new, :foo, :track, [1, "a"], [Array, Hash])
31
- exp2 = Expectation.new(Object.new, :foo, :track, [1, 2], [Array, Hash])
32
- assert(!ExpectationMatcher.new(exp1, exp2).match?)
33
- end
34
-
35
- def test_no_match_based_on_return_value_types
36
- exp1 = Expectation.new(Object.new, :foo, :track, [Array, Hash])
37
- exp1.add_return_values(:sym)
38
- exp2 = Expectation.new(Object.new, :foo, :track, [Array, Hash], ["string"])
39
- assert(!ExpectationMatcher.new(exp1, exp2).match?)
40
- end
41
-
42
- def test_match_based_on_return_value_types
43
- exp1 = Expectation.new(Object.new, :foo, :track, [Array, Hash], [[1], {:a => :b}])
44
- exp2 = Expectation.new(Object.new, :foo, :track, [Array, Hash], [[4], {:a => 9}])
45
- assert(ExpectationMatcher.new(exp1, exp2).match?)
46
- end
47
-
48
- def test_ignores_return_value_types_unless_return_values_defined
49
- exp1 = Expectation.new(Object.new, :foo, :track, [Array, Hash])
50
- exp2 = Expectation.new(Object.new, :foo, :track, [Array, Hash])
51
- assert(ExpectationMatcher.new(exp1, exp2).match?)
52
- end
53
- end
54
- end
@@ -1,89 +0,0 @@
1
- require File.dirname(__FILE__) + "/helper"
2
-
3
- module Synthesis
4
- class ExpectationRecordTest < Test::Unit::TestCase
5
- def teardown
6
- ExpectationRecord.send(:reset!)
7
- end
8
-
9
- def test_adds_expectation
10
- ExpectationRecord.add_expectation(Object.new, :to_s, :track)
11
- assert_equal(1, ExpectationRecord.expectations.size)
12
- end
13
-
14
- def test_watches_expectation_invocations
15
- c = Class.new { def foo; end }
16
- ExpectationRecord.add_expectation(c.new, :foo, :track)
17
- ExpectationRecord.record_invocations
18
- a = c.new
19
- MethodInvocationWatcher.expects(:invoked).with(a, :foo, [], [nil])
20
- a.foo
21
- end
22
-
23
- def test_finds_expectation
24
- c = Class.new { def foo; end }
25
- expected = ExpectationRecord.add_expectation(c.new, :foo, :track)
26
- expected.add_return_values(20)
27
- ExpectationRecord.record_invocations
28
- matcher = Expectation.new(c.new, :foo, :track, [], [20])
29
- actual = ExpectationRecord[matcher]
30
- assert_equal(expected, actual)
31
- end
32
-
33
- def test_returns_nil_expectation_on_no_expectation_found
34
- ExpectationRecord.add_expectation(Object.new, :foo, :track)
35
- matcher = Expectation.new(Object.new, :bar, :track)
36
- actual_instance = ExpectationRecord[matcher]
37
- assert_kind_of(Expectation::NilExpectation, actual_instance)
38
- end
39
-
40
- def test_does_not_add_expectation_for_ignored_class
41
- ExpectationRecord.ignore(Hash)
42
- ExpectationRecord.add_expectation(Hash, :foo, :track)
43
- assert(ExpectationRecord.expectations.empty?)
44
- end
45
-
46
- def test_does_not_add_expectation_for_ignored_object
47
- ExpectationRecord.ignore(Hash)
48
- ExpectationRecord.add_expectation(Hash.new, :foo, :track)
49
- assert(ExpectationRecord.expectations.empty?)
50
- end
51
-
52
- def test_does_not_add_expectation_for_ignored_module
53
- ExpectationRecord.ignore(Enumerable)
54
- ExpectationRecord.add_expectation(Enumerable, :foo, :track)
55
- assert(ExpectationRecord.expectations.empty?)
56
- end
57
-
58
- def test_returns_added_expectation_on_add
59
- expected = Expectation.new(Hash, :foo, :track, [], [:return_val])
60
- actual = ExpectationRecord.add_expectation(Hash, :foo, :track)
61
- actual.add_return_values(:return_val)
62
- assert_equal(expected, actual)
63
- end
64
-
65
- def test_uniqs_expectations_before_recording_invocations
66
- c = Class.new { def foo; end }
67
- ExpectationRecord.add_expectation(c, :foo, :track)
68
- ExpectationRecord.add_expectation(c, :foo, :track)
69
- assert_equal(2, ExpectationRecord.expectations.size)
70
- ExpectationRecord.record_invocations
71
- assert_equal(1, ExpectationRecord.expectations.size)
72
- end
73
-
74
- def test_flattens_expectations_before_recording_invocations
75
- c = Class.new { def foo; end }
76
- expectation = ExpectationRecord.add_expectation(c, :foo, :track)
77
- expectation.add_return_values(1, "str", "sym")
78
- ExpectationRecord.record_invocations
79
- ExpectationRecord.expectations.each { |val| assert(!val.is_a?(Array)) }
80
- end
81
-
82
- def test_removes_expectation
83
- c = Class.new { def foo; end }
84
- expectation = ExpectationRecord.add_expectation(c, :foo, :track)
85
- ExpectationRecord.remove(expectation)
86
- assert_equal(0, ExpectationRecord.expectations.size)
87
- end
88
- end
89
- end
@@ -1,112 +0,0 @@
1
- require File.dirname(__FILE__) + "/helper"
2
-
3
- module Synthesis
4
- class ExpectationTest < Test::Unit::TestCase
5
- def test_creates_singleton_method_expectation_given_class
6
- expectation = Expectation.new(Class.new, :foo, :track)
7
- assert_kind_of(Expectation::Singleton, expectation)
8
- end
9
-
10
- def test_creates_instance_method_expectation_given_instance
11
- expectation = Expectation.new(Class.new.new, :foo, :track)
12
- assert_kind_of(Expectation::Instance, expectation)
13
- end
14
-
15
- def test_creates_singleton_method_expectation_given_module
16
- expectation = Expectation.new(Module.new, :foo, :track)
17
- assert_kind_of(Expectation::Singleton, expectation)
18
- end
19
-
20
- def test_records_instance_receiver_method_invocations
21
- receiver = Class.new { def foo;end }
22
- expectation = Expectation.new(receiver.new, :foo, :track)
23
- expectation.record_invocations
24
- assert_respond_to(receiver.new, :__recordable__foo)
25
- end
26
-
27
- def test_records_singleton_receiver_method_invocations
28
- receiver = Class.new { def self.foo;end }
29
- expectation = Expectation.new(receiver, :foo, :track, [], [:return])
30
- expectation.record_invocations
31
- assert_respond_to(receiver, :__recordable__foo)
32
- end
33
-
34
- def test_make_sure_equality_works_with_uniq
35
- expectations = [
36
- Expectation.new(String, :new, [], [:arg1, :arg2], [:return]),
37
- Expectation.new(String, :new, [], [:arg1, :arg2], [:return])
38
- ]
39
- assert_equal(1, expectations.uniq.size)
40
- end
41
-
42
- def test_singleton_receiver_class
43
- assert_equal(String, Expectation.new(String, :new, :track, [], []).receiver_class)
44
- end
45
-
46
- def test_instance_receiver_class
47
- assert_equal(String, Expectation.new(String.new, :new, :track, [], []).receiver_class)
48
- end
49
-
50
- def test_arg_types
51
- expectation = Expectation.new(String.new, :new, :track, [:sym, "str"], [])
52
- assert_equal([Symbol, String], expectation.arg_types)
53
- end
54
-
55
- def test_return_value_type
56
- expectation = Expectation.new(String, :new, :track)
57
- expectation.add_return_values(:sym)
58
- assert_equal(Symbol, expectation.return_value_type)
59
- end
60
-
61
- def test_true_class_return_value_type
62
- expectation = Expectation.new(String, :new, :track)
63
- expectation.add_return_values(true)
64
- assert_equal(TrueClass, expectation.return_value_type)
65
- end
66
-
67
- def test_false_class_return_value_type
68
- expectation = Expectation.new(String, :new, :track)
69
- expectation.add_return_values(false)
70
- assert_equal(FalseClass, expectation.return_value_type)
71
- end
72
-
73
- def test_returns_nil_return_value_type_when_no_return_values
74
- expectation = Expectation.new(String, :new, :track)
75
- assert_nil(expectation.return_value_type)
76
- end
77
-
78
- def test_adds_return_value
79
- expectation = Expectation.new(String.new, :new, :track, [], [:sym])
80
- expectation.add_return_values("str")
81
- actual = expectation.instance_variable_get(:@return_values)
82
- assert_equal([:sym, "str"], actual)
83
- end
84
-
85
- def test_return_values_defined_when_return_values_added
86
- expectation = Expectation.new(String.new, :new, :track, [], [:sym])
87
- expectation.add_return_values("str")
88
- assert(expectation.return_values_defined?)
89
- end
90
-
91
- def test_return_values_not_defined_when_no_return_values_added
92
- expectation = Expectation.new(String.new, :new, :track, [], [:sym])
93
- assert(!expectation.return_values_defined?)
94
- end
95
-
96
- def test_explodes_to_new_expectations_for_each_return_value
97
- expectation = Expectation.new(String, :new, :track, [])
98
- expectation.add_return_values(:sym, "str")
99
- expected = [
100
- Expectation.new(String, :new, :track, [], [:sym]),
101
- Expectation.new(String, :new, :track, [], ["str"])
102
- ]
103
- assert_equal(expected, expectation.explode)
104
- end
105
-
106
- def test_returns_self_when_only_one_return_type_on_explode
107
- expectation = Expectation.new(String, :new, :track, [])
108
- expectation.add_return_values("rock")
109
- assert_equal(expectation, expectation.explode)
110
- end
111
- end
112
- end
@@ -1,3 +0,0 @@
1
- %w(test/unit rubygems mocha).each { |l| require l }
2
- require File.dirname(__FILE__) + "/../../lib/synthesis"
3
- MOCK_OBJECT = Class.new {}
@@ -1,18 +0,0 @@
1
- require File.dirname(__FILE__) + "/helper"
2
-
3
- module Synthesis
4
- class MethodInvocationWatcherTest < Test::Unit::TestCase
5
- def teardown
6
- ExpectationRecord.send(:reset!)
7
- end
8
-
9
- def test_marks_expectation_invoked
10
- c = Class.new { def foo; end }
11
- ExpectationRecord.add_expectation(c, :to_s, :track, []).add_return_values(1)
12
- ExpectationRecord.record_invocations
13
- MethodInvocationWatcher.invoked(c, :to_s, [], [1])
14
- expectation = ExpectationRecord.expectations.to_a.first
15
- assert(expectation.invoked?)
16
- end
17
- end
18
- end
@@ -1,7 +0,0 @@
1
- require File.dirname(__FILE__) + "/helper"
2
-
3
- class ModuleTest < Test::Unit::TestCase
4
- def test_has_singleton_expectation
5
- assert_instance_of(Synthesis::Expectation::Singleton, Module.new.expectation(:foo, :track))
6
- end
7
- end
@@ -1,7 +0,0 @@
1
- require File.dirname(__FILE__) + "/helper"
2
-
3
- class ObjectTest < Test::Unit::TestCase
4
- def test_has_instance_expectation
5
- assert_instance_of(Synthesis::Expectation::Instance, Object.new.expectation(:foo, :track))
6
- end
7
- end
@@ -1,116 +0,0 @@
1
- require File.dirname(__FILE__) + "/helper"
2
-
3
- module Synthesis
4
- class RecordableTest < Test::Unit::TestCase
5
- def test_redefines_method
6
- foo = Class.new { def a; end }
7
- foo.extend(Recordable)
8
- foo.recordable_method(:a)
9
- assert_respond_to(foo.new, :__recordable__a)
10
- end
11
-
12
- def test_records_method_invocation
13
- foo = Class.new { def b; end }
14
- foo.extend(Recordable)
15
- foo.recordable_method(:b)
16
- bar = foo.new
17
- MethodInvocationWatcher.expects(:invoked).with(bar, :b, [], [nil])
18
- bar.b
19
- end
20
-
21
- def test_does_not_redefine_already_redefined_method
22
- foo = Class.new { def b; end }
23
- foo.extend(Recordable)
24
- foo.stubs(:method_defined?).returns(true)
25
- foo.expects(:alias_method).never
26
- foo.recordable_method(:b)
27
- end
28
-
29
- def test_defines_non_existent_method
30
- foo = Class.new
31
- foo.extend(Recordable)
32
- foo.recordable_method(:bar)
33
- assert_respond_to(foo.new, :bar)
34
- end
35
-
36
- def test_defines_non_existent_method_recordable_placeholder_method
37
- foo = Class.new
38
- foo.extend(Recordable)
39
- foo.recordable_method(:bar)
40
- assert_respond_to(foo.new, :__recordable__bar)
41
- end
42
-
43
- def test_non_existed_method_placeholder_raises
44
- foo = Class.new
45
- foo.extend(Recordable)
46
- foo.recordable_method(:bar)
47
- assert_raise(RuntimeError) { foo.new.__recordable__bar }
48
- end
49
-
50
- def test_does_not_redefine_already_defined_magic_method
51
- foo = Class.new
52
- foo.extend(Recordable)
53
- foo.recordable_method(:b)
54
- foo.expects(:alias_method).never
55
- end
56
-
57
- def test_records_magic_method_invocation
58
- foo = Class.new {def method_missing(meth, *args) :magic! end}
59
- foo.extend(Recordable)
60
- foo.recordable_method(:b)
61
- bar = foo.new
62
- MethodInvocationWatcher.expects(:invoked).with(bar, :b, [], [:magic!])
63
- bar.b
64
- end
65
-
66
- def test_records_raised_exception
67
- begin
68
- foo = Class.new {def bar() raise end}
69
- foo.extend(Recordable)
70
- foo.recordable_method(:bar)
71
- inst = foo.new
72
- matcher = Expectation.new(inst, :bar, nil, [])
73
- matcher.add_return_values(RuntimeError.new)
74
- not_found = Expectation::NilExpectation.new
75
- ExpectationRecord.expects(:[]).with(matcher).returns(not_found)
76
- inst.bar
77
- rescue => e
78
- raise e unless e.is_a?(RuntimeError)
79
- end
80
- end
81
-
82
- def test_reraises_recorded_exception
83
- assert_raise(RuntimeError) do
84
- foo = Class.new {def bar() raise end}
85
- foo.extend(Recordable)
86
- foo.recordable_method(:bar)
87
- foo.new.bar
88
- end
89
- end
90
-
91
- def test_records_raised_exception_for_magic_method
92
- begin
93
- foo = Class.new {def method_missing(m, *a) raise end}
94
- foo.extend(Recordable)
95
- foo.recordable_method(:bar)
96
- inst = foo.new
97
- matcher = Expectation.new(inst, :bar, nil, [])
98
- matcher.add_return_values(RuntimeError.new)
99
- not_found = Expectation::NilExpectation.new
100
- ExpectationRecord.expects(:[]).with(matcher).returns(not_found)
101
- inst.bar
102
- rescue => e
103
- raise e unless e.is_a?(RuntimeError)
104
- end
105
- end
106
-
107
- def test_reraises_recorded_exception_for_magic_method
108
- assert_raise(RuntimeError) do
109
- foo = Class.new {def method_missing(m, *a) raise end}
110
- foo.extend(Recordable)
111
- foo.recordable_method(:bar)
112
- foo.new.bar
113
- end
114
- end
115
- end
116
- end
@@ -1,18 +0,0 @@
1
- require "rubygems"
2
- require "expectations"
3
- require File.dirname(__FILE__) + "/../../test_project"
4
-
5
- Expectations do
6
- expect Storage.new('whatever').to.receive(:save).with('METAL - rock') do |storage|
7
- DataBrander.new(storage).save_branded 'rock'
8
- end
9
-
10
- expect Storage.new("").to.receive(:ouch!).raises(Problem.new) do |storage|
11
- begin
12
- DataBrander.new(storage).dont_do_this
13
- rescue Problem
14
- return true
15
- end
16
- fail
17
- end
18
- end
@@ -1,21 +0,0 @@
1
- require "rubygems"
2
- require "expectations"
3
- require File.dirname(__FILE__) + "/../../test_project"
4
-
5
- Expectations do
6
- expect "rock" do
7
- begin
8
- Storage.new('test.txt').save('rock')
9
- File.read 'test.txt'
10
- ensure
11
- FileUtils.rm_f 'test.txt'
12
- end
13
- end
14
-
15
- expect Problem do
16
- Storage.new("").ouch!
17
- end
18
-
19
- # expect(Storage.new("").to.receive(:never_call_me).never) {}
20
-
21
- end
@@ -1,36 +0,0 @@
1
- %w(test/unit rubygems mocha).each { |l| require l }
2
- require File.dirname(__FILE__) + "/../../test_project"
3
-
4
- class DataBranderTest < Test::Unit::TestCase
5
- def test_saves_branded_to_storage
6
- storage = Storage.new 'whatever'
7
- storage.expects(:save).with('METAL - rock')
8
- DataBrander.new(storage).save_branded('rock')
9
- end
10
-
11
- def test_ignores_total_ducks
12
- m = mock
13
- m.expects(:foo)
14
- m.foo
15
- end
16
-
17
- def test_delegates_problem
18
- storage = Storage.new("")
19
- storage.expects(:ouch!).raises(Problem.new)
20
- assert_raise(Problem) { DataBrander.new(storage).dont_do_this }
21
- end
22
-
23
- def test_is_ok
24
- storage = Storage.new("")
25
- storage.expects(:ok_or_problem).with(:ok).returns(:ok)
26
- DataBrander.new(storage).ok
27
- end
28
-
29
- def test_does_not_rescue_problem_on_not_ok
30
- assert_raise(Problem) do
31
- storage = Storage.new("")
32
- storage.expects(:ok_or_problem).with(:not_ok).raises(Problem.new)
33
- DataBrander.new(storage).not_ok
34
- end
35
- end
36
- end
@@ -1,31 +0,0 @@
1
- require "test/unit"
2
- require "fileutils"
3
- require File.dirname(__FILE__) + "/../../test_project"
4
- require "rubygems"
5
- require "mocha"
6
-
7
- class StorageTest < Test::Unit::TestCase
8
- def test_saves_to_file
9
- Storage.new('test.txt').save('rock')
10
- assert_equal 'rock', File.read('test.txt')
11
- ensure
12
- FileUtils.rm_f('test.txt')
13
- end
14
-
15
- def test_ouch_raises_problem
16
- assert_raise(Problem) { Storage.new("").ouch! }
17
- end
18
-
19
- def test_ok_or_problem_returns_ok_when_given_ok
20
- assert_equal(:ok, Storage.new("").ok_or_problem(:ok))
21
- end
22
-
23
- def test_ok_raises_problem_when_not_given_ok
24
- assert_raise(Problem) { Storage.new("").ok_or_problem(:not_ok) }
25
- end
26
-
27
- def test_never_called
28
- storage = Storage.new("")
29
- storage.expects(:never_call_me).never
30
- end
31
- end
@@ -1,36 +0,0 @@
1
- %w(rubygems spec fileutils).each { |l| require l }
2
- require File.dirname(__FILE__) + "/../test_project"
3
-
4
- describe DataBrander do
5
- it "should save branded to pstore" do
6
- pstore = Storage.new 'whatever'
7
- pstore.should_receive(:save).with('METAL - rock')
8
- DataBrander.new(pstore).save_branded 'rock'
9
- end
10
-
11
- it "should ignore total ducks" do
12
- m = mock(Storage)
13
- m.should_receive(:foo)
14
- m.foo
15
- end
16
-
17
- it "should delegate problem" do
18
- storage = Storage.new("")
19
- storage.should_receive(:ouch!).and_raise(Problem.new)
20
- proc {DataBrander.new(storage).dont_do_this}.should raise_error(Problem)
21
- end
22
-
23
- it "should return :ok when given :ok" do
24
- storage = Storage.new("")
25
- storage.should_receive(:ok_or_problem).with(:ok).and_return(:ok)
26
- DataBrander.new(storage).ok
27
- end
28
-
29
- it "should not rescue problem on not ok" do
30
- proc do
31
- storage = Storage.new("")
32
- storage.should_receive(:ok_or_problem).with(:not_ok).and_raise(Problem.new)
33
- DataBrander.new(storage).not_ok
34
- end.should raise_error(Problem)
35
- end
36
- end
@@ -1,30 +0,0 @@
1
- %w(rubygems spec fileutils).each { |l| require l }
2
- require File.dirname(__FILE__) + "/../test_project"
3
-
4
- describe Storage do
5
- it "should save to file" do
6
- begin
7
- Storage.new('test.txt').save('rock')
8
- File.read('test.txt').should == 'rock'
9
- ensure
10
- FileUtils.rm_f('test.txt')
11
- end
12
- end
13
-
14
- it "should raise problem on ouch!" do
15
- proc { Storage.new("").ouch! }.should raise_error(Problem)
16
- end
17
-
18
- it "should return :ok when given :ok" do
19
- Storage.new("").ok_or_problem(:ok).should == :ok
20
- end
21
-
22
- it "should raise problem when not give :ok" do
23
- proc { Storage.new("").ok_or_problem(:not_ok) }.should raise_error(Problem)
24
- end
25
-
26
- it "should never call" do
27
- storage = Storage.new("")
28
- storage.should_receive(:never_call_me).never
29
- end
30
- end
@@ -1,47 +0,0 @@
1
- class DataBrander
2
- BRAND = "METAL"
3
-
4
- def initialize(storage)
5
- @storage = storage
6
- end
7
-
8
- def save_branded(data)
9
- @storage.save "#{BRAND} - #{data}"
10
- end
11
-
12
- def dont_do_this
13
- @storage.ouch!
14
- end
15
-
16
- def ok
17
- @storage.ok_or_problem(:ok)
18
- end
19
-
20
- def not_ok
21
- @storage.ok_or_problem(:not_ok)
22
- end
23
- end
24
-
25
- class Storage
26
- def initialize(filename)
27
- @filename = filename
28
- end
29
-
30
- def save(val)
31
- File.open(@filename, 'w') {|f| f << val}
32
- end
33
-
34
- def ouch!
35
- raise Problem
36
- end
37
-
38
- def ok_or_problem(ok)
39
- ok == :ok ? ok : raise(Problem)
40
- end
41
-
42
- def never_call_me
43
- :whatever
44
- end
45
- end
46
-
47
- class Problem < Exception;end