synthesis 0.0.2 → 0.0.3
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.
- data/README +6 -1
- data/Rakefile +6 -3
- data/lib/synthesis/adapter/mocha/expectation_record.rb +2 -2
- data/lib/synthesis/adapter/mocha/object.rb +1 -1
- data/lib/synthesis/class.rb +2 -2
- data/lib/synthesis/expectation.rb +6 -6
- data/lib/synthesis/expectation_record.rb +2 -2
- data/lib/synthesis/method_invocation_watcher.rb +1 -1
- data/lib/synthesis/module.rb +2 -2
- data/lib/synthesis/object.rb +2 -2
- data/lib/synthesis/recordable.rb +4 -2
- data/test/synthesis/adapter/mocha/expectation_record_test.rb +1 -1
- data/test/synthesis/adapter/mocha/method_invocation_watcher_test.rb +2 -2
- data/test/synthesis/adapter/mocha/mocha_expectation_test.rb +1 -1
- data/test/synthesis/adapter/mocha/object_test.rb +2 -2
- data/test/synthesis/class_test.rb +1 -1
- data/test/synthesis/expectation_record_test.rb +9 -9
- data/test/synthesis/expectation_test.rb +14 -14
- data/test/synthesis/module_test.rb +1 -1
- data/test/synthesis/object_test.rb +1 -1
- data/test/synthesis/recordable_test.rb +9 -1
- metadata +3 -3
data/README
CHANGED
@@ -8,6 +8,10 @@ Currently we believe that developers are writing unnecessary functional tests to
|
|
8
8
|
|
9
9
|
sudo gem i synthesis
|
10
10
|
|
11
|
+
== Download
|
12
|
+
|
13
|
+
Synthesis RubyForge page ( http://rubyforge.org/projects/synthesis )
|
14
|
+
|
11
15
|
== Dependencies
|
12
16
|
|
13
17
|
Synthesis's core doesn't have any dependencies.
|
@@ -52,4 +56,5 @@ Synthesis will currently ignore dynamically generated at runtime methods.
|
|
52
56
|
|
53
57
|
* Synthesized Testing: A Primer ( http://nutrun.com/weblog/synthesized-testing-a-primer )
|
54
58
|
* Using Synthesis With Test::Unit and Mocha ( http://nutrun.com/weblog/using-synthesis-with-testunit-and-mocha )
|
55
|
-
* Using Synthesis With Expectations ( http://nutrun.com/weblog/using-synthesis-with-expectations )
|
59
|
+
* Using Synthesis With Expectations ( http://nutrun.com/weblog/using-synthesis-with-expectations )
|
60
|
+
* Synthesis validates simulated method calls taking method signature arguments into account ( http://nutrun.com/weblog/synthesis-002 )
|
data/Rakefile
CHANGED
@@ -71,13 +71,13 @@ end
|
|
71
71
|
|
72
72
|
gem_spec = Gem::Specification.new do |s|
|
73
73
|
s.name = 'synthesis'
|
74
|
-
s.version = '0.0.
|
74
|
+
s.version = '0.0.3'
|
75
75
|
s.platform = Gem::Platform::RUBY
|
76
76
|
s.rubyforge_project = "synthesis"
|
77
77
|
s.summary, s.description = 'A tool for Synthesized Testing'
|
78
78
|
s.author = 'Stuart Caborn, George Malamidis'
|
79
79
|
s.email = 'george@nutrun.com'
|
80
|
-
s.homepage = 'http://
|
80
|
+
s.homepage = 'http://synthesis.rubyforge.org'
|
81
81
|
s.has_rdoc = true
|
82
82
|
s.rdoc_options += ['--quiet', '--title', 'Queueue', '--main', 'README', '--inline-source']
|
83
83
|
s.extra_rdoc_files = ['README', 'COPYING']
|
@@ -89,4 +89,7 @@ end
|
|
89
89
|
Rake::GemPackageTask.new(gem_spec) do |t|
|
90
90
|
t.need_zip = false
|
91
91
|
t.need_tar = false
|
92
|
-
end
|
92
|
+
end
|
93
|
+
|
94
|
+
desc "Remove rdoc and package artefacts"
|
95
|
+
task :clean => ['clobber_package', 'clobber_rdoc']
|
@@ -3,10 +3,10 @@ module Synthesis
|
|
3
3
|
class << self
|
4
4
|
alias_method :add_mocha_expectation, :add_expectation
|
5
5
|
|
6
|
-
def add_expectation(obj, meth, args = [])
|
6
|
+
def add_expectation(obj, meth, track, args = [])
|
7
7
|
# Ignone things like "foo = mock"
|
8
8
|
return nil if obj.is_a?(Class::AnyInstance)
|
9
|
-
add_mocha_expectation(obj, meth, args)
|
9
|
+
add_mocha_expectation(obj, meth, track, args)
|
10
10
|
end
|
11
11
|
end
|
12
12
|
end
|
@@ -2,7 +2,7 @@ class Object
|
|
2
2
|
alias mocha_expects expects
|
3
3
|
|
4
4
|
def expects(meth)
|
5
|
-
s_expectation = Synthesis::ExpectationRecord.add_expectation(self, meth)
|
5
|
+
s_expectation = Synthesis::ExpectationRecord.add_expectation(self, meth, caller[0])
|
6
6
|
m_expectation = mocha_expects(meth)
|
7
7
|
m_expectation.synthesis_expectation = s_expectation
|
8
8
|
m_expectation
|
data/lib/synthesis/class.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Synthesis
|
2
2
|
module Expectation
|
3
|
-
def self.new(receiver, method, args = [])
|
4
|
-
receiver.expectation method, args
|
3
|
+
def self.new(receiver, method, track, args = [])
|
4
|
+
receiver.expectation method, track, args
|
5
5
|
end
|
6
6
|
|
7
7
|
class Expectation
|
@@ -9,8 +9,8 @@ module Synthesis
|
|
9
9
|
attr_reader :receiver, :method
|
10
10
|
attr_accessor :args
|
11
11
|
|
12
|
-
def initialize(receiver, method, args)
|
13
|
-
@receiver, @method, @args = receiver, method, args
|
12
|
+
def initialize(receiver, method, track, args)
|
13
|
+
@receiver, @method, @track, @args = receiver, method, track, args
|
14
14
|
end
|
15
15
|
|
16
16
|
def record_invocations
|
@@ -55,7 +55,7 @@ module Synthesis
|
|
55
55
|
end
|
56
56
|
|
57
57
|
def to_s
|
58
|
-
"#{@receiver.name}.#{@method}(#{@args.map { |arg| arg.class } * ', '})"
|
58
|
+
"#{@receiver.name}.#{@method}(#{@args.map { |arg| arg.class } * ', '}) in #{@track}"
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
@@ -75,7 +75,7 @@ module Synthesis
|
|
75
75
|
end
|
76
76
|
|
77
77
|
def to_s
|
78
|
-
"#{meta_receiver.name}.new.#{@method}(#{@args.map { |arg| arg.class } * ', '})"
|
78
|
+
"#{meta_receiver.name}.new.#{@method}(#{@args.map { |arg| arg.class } * ', '}) in #{@track}"
|
79
79
|
end
|
80
80
|
end
|
81
81
|
|
@@ -3,9 +3,9 @@ module Synthesis
|
|
3
3
|
class << self
|
4
4
|
include Logging
|
5
5
|
|
6
|
-
def add_expectation(receiver, method, args = [])
|
6
|
+
def add_expectation(receiver, method, track, args = [])
|
7
7
|
unless ignore? receiver
|
8
|
-
expectation = Expectation.new(receiver, method, args)
|
8
|
+
expectation = Expectation.new(receiver, method, track, args)
|
9
9
|
expectations << expectation
|
10
10
|
expectation
|
11
11
|
end
|
data/lib/synthesis/module.rb
CHANGED
data/lib/synthesis/object.rb
CHANGED
data/lib/synthesis/recordable.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
module Synthesis
|
2
2
|
module Recordable
|
3
3
|
def recordable_method(method)
|
4
|
-
|
5
|
-
|
4
|
+
unless method_defined? "__recordable__#{method}".intern
|
5
|
+
alias_method "__recordable__#{method}".intern, method
|
6
|
+
class_eval @@recordable_method_def[method]
|
7
|
+
end
|
6
8
|
end
|
7
9
|
|
8
10
|
@@recordable_method_def = proc { |method| %(
|
@@ -9,7 +9,7 @@ module Synthesis
|
|
9
9
|
|
10
10
|
def test_does_not_add_any_instance_expectation
|
11
11
|
any = Class::AnyInstance.new(Object)
|
12
|
-
ExpectationRecord.add_expectation(any, :foo)
|
12
|
+
ExpectationRecord.add_expectation(any, :foo, :track)
|
13
13
|
assert_equal(0, ExpectationRecord.expectations.size)
|
14
14
|
end
|
15
15
|
end
|
@@ -9,7 +9,7 @@ module Synthesis
|
|
9
9
|
|
10
10
|
def test_ignores_invocation_for_mocked_object
|
11
11
|
foo = Class.new { def self.bar;end }
|
12
|
-
ExpectationRecord.add_expectation foo, :bar
|
12
|
+
ExpectationRecord.add_expectation foo, :bar, :track
|
13
13
|
ExpectationRecord.record_invocations
|
14
14
|
e = ExpectationRecord.expectations.to_a[0]
|
15
15
|
foo.expects(:bar)
|
@@ -19,7 +19,7 @@ module Synthesis
|
|
19
19
|
|
20
20
|
def test_records_invocation_for_non_mocked_object
|
21
21
|
foo = Class.new { def self.bar;end }
|
22
|
-
ExpectationRecord.add_expectation foo, :bar
|
22
|
+
ExpectationRecord.add_expectation foo, :bar, :track
|
23
23
|
ExpectationRecord.record_invocations
|
24
24
|
e = ExpectationRecord.expectations.to_a[0]
|
25
25
|
foo.bar
|
@@ -12,7 +12,7 @@ class MochaExpectationTest < Test::Unit::TestCase
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def test_with_passes_expected_params_to_synthesis_expectation
|
15
|
-
@mocha_expectation.synthesis_expectation = Synthesis::Expectation.new
|
15
|
+
@mocha_expectation.synthesis_expectation = Synthesis::Expectation.new Hash, :foo, :track
|
16
16
|
@mocha_expectation.with 1, 2
|
17
17
|
assert_equal([1, 2], @mocha_expectation.synthesis_expectation.args)
|
18
18
|
end
|
@@ -4,14 +4,14 @@ require File.dirname(__FILE__) + "/../../../../lib/synthesis/adapter/mocha"
|
|
4
4
|
module Synthesis
|
5
5
|
class ObjectTest < Test::Unit::TestCase
|
6
6
|
def test_records_singleton_method_expectation
|
7
|
-
ExpectationRecord.expects(:add_expectation).with(Hash, :foo)
|
7
|
+
ExpectationRecord.expects(:add_expectation).with(Hash, :foo, kind_of(String))
|
8
8
|
Hash.expects(:foo)
|
9
9
|
Hash.foo
|
10
10
|
end
|
11
11
|
|
12
12
|
def test_records_instance_method_expectation
|
13
13
|
hash = Hash.new
|
14
|
-
ExpectationRecord.expects(:add_expectation).with(hash, :foo)
|
14
|
+
ExpectationRecord.expects(:add_expectation).with(hash, :foo, kind_of(String))
|
15
15
|
hash.expects(:foo)
|
16
16
|
hash.foo
|
17
17
|
end
|
@@ -3,6 +3,6 @@ require File.dirname(__FILE__) + "/../../lib/synthesis"
|
|
3
3
|
|
4
4
|
class ClassTest < Test::Unit::TestCase
|
5
5
|
def test_has_singleton_expectation
|
6
|
-
assert_instance_of Synthesis::Expectation::Singleton, Hash.expectation(:foo)
|
6
|
+
assert_instance_of Synthesis::Expectation::Singleton, Hash.expectation(:foo, :track)
|
7
7
|
end
|
8
8
|
end
|
@@ -9,13 +9,13 @@ module Synthesis
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def test_adds_expectation
|
12
|
-
ExpectationRecord.add_expectation Object.new, :to_s
|
12
|
+
ExpectationRecord.add_expectation Object.new, :to_s, :track
|
13
13
|
assert_equal(1, ExpectationRecord.expectations.size)
|
14
14
|
end
|
15
15
|
|
16
16
|
def test_watches_expectation_invocations
|
17
17
|
c = Class.new { def foo; end }
|
18
|
-
ExpectationRecord.add_expectation c.new, :foo
|
18
|
+
ExpectationRecord.add_expectation c.new, :foo, :track
|
19
19
|
ExpectationRecord.record_invocations
|
20
20
|
a = c.new
|
21
21
|
MethodInvocationWatcher.expects(:invoked).with(a, :foo, [])
|
@@ -23,29 +23,29 @@ module Synthesis
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def test_finds_expectation
|
26
|
-
ExpectationRecord.add_expectation Object.new, :foo
|
26
|
+
ExpectationRecord.add_expectation Object.new, :foo, :track
|
27
27
|
expected = ExpectationRecord.expectations.to_a[0]
|
28
|
-
matcher = Expectation.new Object.new, :foo
|
28
|
+
matcher = Expectation.new Object.new, :foo, :track
|
29
29
|
actual = ExpectationRecord[matcher]
|
30
30
|
assert_equal(expected, actual)
|
31
31
|
end
|
32
32
|
|
33
33
|
def test_returns_nil_expectation_on_no_expectation_found
|
34
|
-
ExpectationRecord.add_expectation Object.new, :foo
|
35
|
-
matcher = Expectation.new Object.new, :bar
|
34
|
+
ExpectationRecord.add_expectation Object.new, :foo, :track
|
35
|
+
matcher = Expectation.new Object.new, :bar, :track
|
36
36
|
actual_instance = ExpectationRecord[matcher]
|
37
37
|
assert_kind_of Expectation::NilExpectation, actual_instance
|
38
38
|
end
|
39
39
|
|
40
40
|
def test_does_not_add_expectation_for_ignored_class
|
41
41
|
ExpectationRecord.ignore Hash
|
42
|
-
ExpectationRecord.add_expectation Hash, :foo
|
42
|
+
ExpectationRecord.add_expectation Hash, :foo, :track
|
43
43
|
assert ExpectationRecord.expectations.empty?
|
44
44
|
end
|
45
45
|
|
46
46
|
def test_returns_added_expectation_on_add
|
47
|
-
expected = Expectation.new Hash, :foo
|
48
|
-
actual = ExpectationRecord.add_expectation Hash, :foo
|
47
|
+
expected = Expectation.new Hash, :foo, :track
|
48
|
+
actual = ExpectationRecord.add_expectation Hash, :foo, :track
|
49
49
|
assert_equal expected, actual
|
50
50
|
end
|
51
51
|
end
|
@@ -4,55 +4,55 @@ require File.dirname(__FILE__) + "/../../lib/synthesis"
|
|
4
4
|
module Synthesis
|
5
5
|
class ExpectationTest < Test::Unit::TestCase
|
6
6
|
def test_creates_singleton_method_expectation_given_class
|
7
|
-
expectation = Expectation.new Class.new, :foo
|
7
|
+
expectation = Expectation.new Class.new, :foo, :track
|
8
8
|
assert_kind_of Expectation::Singleton, expectation
|
9
9
|
end
|
10
10
|
|
11
11
|
def test_creates_instance_method_expectation_given_instance
|
12
|
-
expectation = Expectation.new Class.new.new, :foo
|
12
|
+
expectation = Expectation.new Class.new.new, :foo, :track
|
13
13
|
assert_kind_of Expectation::Instance, expectation
|
14
14
|
end
|
15
15
|
|
16
16
|
def test_creates_singleton_method_expectation_given_module
|
17
|
-
expectation = Expectation.new Module.new, :foo
|
17
|
+
expectation = Expectation.new Module.new, :foo, :track
|
18
18
|
assert_kind_of Expectation::Singleton, expectation
|
19
19
|
end
|
20
20
|
|
21
21
|
def test_records_instance_receiver_method_invocations
|
22
22
|
receiver = Class.new { def foo;end }
|
23
|
-
expectation = Expectation.new receiver.new, :foo
|
23
|
+
expectation = Expectation.new receiver.new, :foo, :track
|
24
24
|
expectation.record_invocations
|
25
25
|
assert_respond_to receiver.new, :__recordable__foo
|
26
26
|
end
|
27
27
|
|
28
28
|
def test_records_singleton_receiver_method_invocations
|
29
29
|
receiver = Class.new { def self.foo;end }
|
30
|
-
expectation = Expectation.new receiver, :foo
|
30
|
+
expectation = Expectation.new receiver, :foo, :track
|
31
31
|
expectation.record_invocations
|
32
32
|
assert_respond_to receiver, :__recordable__foo
|
33
33
|
end
|
34
34
|
|
35
35
|
def test_equality
|
36
|
-
exp1 = Expectation.new Object.new, :foo
|
37
|
-
exp2 = Expectation.new Object.new, :foo
|
36
|
+
exp1 = Expectation.new Object.new, :foo, :track
|
37
|
+
exp2 = Expectation.new Object.new, :foo, :track
|
38
38
|
assert_equal exp1, exp2
|
39
39
|
end
|
40
40
|
|
41
41
|
def test_non_equality
|
42
|
-
exp1 = Expectation.new Hash.new, :foo
|
43
|
-
exp2 = Expectation.new Array.new, :foo
|
42
|
+
exp1 = Expectation.new Hash.new, :foo, :track
|
43
|
+
exp2 = Expectation.new Array.new, :foo, :track
|
44
44
|
assert_not_equal exp1, exp2
|
45
45
|
end
|
46
46
|
|
47
47
|
def test_equality_based_on_same_type_args
|
48
|
-
exp1 = Expectation.new Object.new, :foo, [1, 2]
|
49
|
-
exp2 = Expectation.new Object.new, :foo, [1, 2]
|
48
|
+
exp1 = Expectation.new Object.new, :foo, :track, [1, 2]
|
49
|
+
exp2 = Expectation.new Object.new, :foo, :track, [1, 2]
|
50
50
|
assert_equal exp1, exp2
|
51
51
|
end
|
52
52
|
|
53
53
|
def test_args_based_non_equality_based_on_different_type_args
|
54
|
-
exp1 = Expectation.new Object.new, :foo, [1, Hash.new]
|
55
|
-
exp2 = Expectation.new Object.new, :foo, [1, 2]
|
54
|
+
exp1 = Expectation.new Object.new, :foo, :track, [1, Hash.new]
|
55
|
+
exp2 = Expectation.new Object.new, :foo, :track, [1, 2]
|
56
56
|
assert_not_equal exp1, exp2
|
57
57
|
end
|
58
58
|
|
@@ -65,7 +65,7 @@ module Synthesis
|
|
65
65
|
end
|
66
66
|
|
67
67
|
def test_does_not_blow_up_on_name_error
|
68
|
-
expectation = Expectation.new
|
68
|
+
expectation = Expectation.new Hash, :bad, :track
|
69
69
|
silent(expectation) do
|
70
70
|
assert_nothing_raised(NameError) { expectation.record_invocations }
|
71
71
|
end
|
@@ -3,6 +3,6 @@ require File.dirname(__FILE__) + "/../../lib/synthesis"
|
|
3
3
|
|
4
4
|
class ModuleTest < Test::Unit::TestCase
|
5
5
|
def test_has_singleton_expectation
|
6
|
-
assert_instance_of Synthesis::Expectation::Singleton, Module.new.expectation(:foo)
|
6
|
+
assert_instance_of Synthesis::Expectation::Singleton, Module.new.expectation(:foo, :track)
|
7
7
|
end
|
8
8
|
end
|
@@ -3,6 +3,6 @@ require File.dirname(__FILE__) + "/../../lib/synthesis"
|
|
3
3
|
|
4
4
|
class ObjectTest < Test::Unit::TestCase
|
5
5
|
def test_has_instance_expectation
|
6
|
-
assert_instance_of Synthesis::Expectation::Instance, Object.new.expectation(:foo)
|
6
|
+
assert_instance_of Synthesis::Expectation::Instance, Object.new.expectation(:foo, :track)
|
7
7
|
end
|
8
8
|
end
|
@@ -17,6 +17,14 @@ module Synthesis
|
|
17
17
|
bar = foo.new
|
18
18
|
MethodInvocationWatcher.expects(:invoked).with(bar, :b, [])
|
19
19
|
bar.b
|
20
|
-
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_does_not_redefine_already_redefined_method
|
23
|
+
foo = Class.new { def b; end }
|
24
|
+
foo.extend Recordable
|
25
|
+
foo.stubs(:method_defined?).returns(true)
|
26
|
+
foo.expects(:alias_method).never
|
27
|
+
foo.recordable_method(:b)
|
28
|
+
end
|
21
29
|
end
|
22
30
|
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.0.
|
4
|
+
version: 0.0.3
|
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-
|
12
|
+
date: 2008-02-03 00:00:00 +00:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -68,7 +68,7 @@ files:
|
|
68
68
|
- README
|
69
69
|
- Rakefile
|
70
70
|
has_rdoc: true
|
71
|
-
homepage: http://
|
71
|
+
homepage: http://synthesis.rubyforge.org
|
72
72
|
post_install_message:
|
73
73
|
rdoc_options:
|
74
74
|
- --quiet
|