pretentious 0.0.7 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +64 -3
- data/example.rb +21 -0
- data/lib/pretentious.rb +36 -403
- data/lib/pretentious/generator.rb +460 -0
- data/lib/pretentious/recorded_proc.rb +43 -0
- data/lib/pretentious/rspec_generator.rb +41 -2
- data/lib/pretentious/version.rb +1 -1
- data/run_test.sh +1 -1
- data/spec/fibonacci_spec.rb +0 -2
- data/spec/generator_spec.rb +148 -0
- data/spec/prententious_spec.rb +27 -0
- data/spec/test_class1_spec.rb +14 -15
- data/spec/test_class2_spec.rb +0 -1
- data/spec/test_class3_spec.rb +4 -6
- data/spec/test_class4_spec.rb +3 -4
- data/spec/test_class_for_auto_stub_spec.rb +25 -0
- data/spec/test_class_for_mocks_spec.rb +53 -0
- data/test/test_generator.rb +4 -0
- data/test_classes.rb +96 -0
- metadata +12 -2
@@ -0,0 +1,43 @@
|
|
1
|
+
module Pretentious
|
2
|
+
|
3
|
+
class RecordedProc < Proc
|
4
|
+
|
5
|
+
def initialize(target_proc, is_given_block = false)
|
6
|
+
@target_proc = target_proc
|
7
|
+
@return_value = []
|
8
|
+
@args = []
|
9
|
+
@given_block = is_given_block
|
10
|
+
@called = false
|
11
|
+
end
|
12
|
+
|
13
|
+
def given_block?
|
14
|
+
@given_block
|
15
|
+
end
|
16
|
+
|
17
|
+
def target_proc
|
18
|
+
@target_proc
|
19
|
+
end
|
20
|
+
|
21
|
+
def return_value
|
22
|
+
@return_value
|
23
|
+
end
|
24
|
+
|
25
|
+
def is_called?
|
26
|
+
@called
|
27
|
+
end
|
28
|
+
|
29
|
+
def call(*args, &block)
|
30
|
+
@called = true
|
31
|
+
@args << args
|
32
|
+
return_value = @target_proc.call(*args, &block)
|
33
|
+
|
34
|
+
unless @return_value.include? return_value
|
35
|
+
@return_value << return_value
|
36
|
+
end
|
37
|
+
|
38
|
+
return_value
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -69,8 +69,10 @@ class Pretentious::RspecGenerator
|
|
69
69
|
''
|
70
70
|
end
|
71
71
|
|
72
|
+
if (dependencies.size > 0)
|
73
|
+
buffer(declare_dependencies(dependencies, test_instance.init_let_variables, 3 * @_indentation.length, declarations))
|
74
|
+
end
|
72
75
|
|
73
|
-
buffer(declare_dependencies(dependencies, test_instance.init_let_variables, 3 * @_indentation.length, declarations))
|
74
76
|
if (args.size > 0)
|
75
77
|
buffer("@fixture = #{test_instance.test_class.name}.new(#{params_generator(args, test_instance.init_let_variables, declarations)})#{block_source}",3)
|
76
78
|
else
|
@@ -136,6 +138,7 @@ class Pretentious::RspecGenerator
|
|
136
138
|
declaration = {}
|
137
139
|
#collect all params
|
138
140
|
params_collection = []
|
141
|
+
mocks_collection = {}
|
139
142
|
|
140
143
|
method_calls.each_key do |k|
|
141
144
|
info_blocks_arr = method_calls[k]
|
@@ -149,12 +152,30 @@ class Pretentious::RspecGenerator
|
|
149
152
|
params_collection << block[:block]
|
150
153
|
end
|
151
154
|
|
155
|
+
block[:context][:calls].each do |mock_block|
|
156
|
+
k = "#{mock_block[:class]}_#{mock_block[:method]}"
|
157
|
+
|
158
|
+
if mocks_collection[k].nil?
|
159
|
+
mocks_collection[k] = []
|
160
|
+
end
|
161
|
+
|
162
|
+
mocks_collection[k] << mock_block
|
163
|
+
params_collection << mock_block[:result]
|
164
|
+
|
165
|
+
end if block[:context]
|
166
|
+
|
167
|
+
|
152
168
|
end
|
153
169
|
|
154
170
|
end
|
155
171
|
|
172
|
+
if (params_collection.size > 0)
|
173
|
+
buffer(declare_dependencies(params_collection, let_variables, 3 * @_indentation.length, declaration))
|
174
|
+
end
|
156
175
|
|
157
|
-
|
176
|
+
if (mocks_collection.keys.size > 0)
|
177
|
+
buffer(generate_rspec_stub(mocks_collection, let_variables, 3 * @_indentation.length, declaration))
|
178
|
+
end
|
158
179
|
|
159
180
|
method_calls.each_key do |k|
|
160
181
|
info_blocks_arr = method_calls[k]
|
@@ -178,6 +199,24 @@ class Pretentious::RspecGenerator
|
|
178
199
|
buffer("end",2)
|
179
200
|
end
|
180
201
|
|
202
|
+
def generate_rspec_stub(mocks_collection, let_variables, indentation_level , declaration)
|
203
|
+
indentation = ""
|
204
|
+
|
205
|
+
indentation_level.times {
|
206
|
+
indentation << ' '
|
207
|
+
}
|
208
|
+
str = ""
|
209
|
+
mocks_collection.each do |k,values|
|
210
|
+
vals = values.collect { |v| Pretentious::value_ize(v[:result], let_variables, declaration) }
|
211
|
+
|
212
|
+
#check if all vals are the same and just use one
|
213
|
+
vals = [vals[0]] if vals.uniq.size == 1
|
214
|
+
|
215
|
+
str << "#{indentation}allow_any_instance_of(#{values[0][:class].to_s}).to receive(:#{values[0][:method].to_s}).and_return(#{vals.join(', ')})\n"
|
216
|
+
end
|
217
|
+
str
|
218
|
+
end
|
219
|
+
|
181
220
|
#def generate_specs(context_prefix, fixture, method_calls, let_variables)
|
182
221
|
# method_calls.each_key do |k|
|
183
222
|
# info_blocks_arr = method_calls[k]
|
data/lib/pretentious/version.rb
CHANGED
data/run_test.sh
CHANGED
data/spec/fibonacci_spec.rb
CHANGED
@@ -5,7 +5,6 @@ RSpec.describe Fibonacci do
|
|
5
5
|
context 'Scenario 1' do
|
6
6
|
before do
|
7
7
|
|
8
|
-
|
9
8
|
@fixture = Fibonacci.new
|
10
9
|
|
11
10
|
end
|
@@ -38,7 +37,6 @@ RSpec.describe Fibonacci do
|
|
38
37
|
|
39
38
|
it 'should pass current expectations' do
|
40
39
|
|
41
|
-
|
42
40
|
# Fibonacci::say_hello should return hello
|
43
41
|
expect( Fibonacci.say_hello ).to eq("hello")
|
44
42
|
|
@@ -0,0 +1,148 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class TestSubClass
|
4
|
+
def test_method
|
5
|
+
"a return string"
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class TestClass
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@test_class2 = TestSubClass.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def message(params1)
|
16
|
+
@params1 = params1
|
17
|
+
end
|
18
|
+
|
19
|
+
def method_with_assign=(params2)
|
20
|
+
@params2 = "#{params2}!"
|
21
|
+
end
|
22
|
+
|
23
|
+
def method_with_usage
|
24
|
+
@test_class2.test_method
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
class DummyGenerator
|
29
|
+
|
30
|
+
def initialize
|
31
|
+
@data = []
|
32
|
+
end
|
33
|
+
|
34
|
+
def begin_spec(test_class)
|
35
|
+
@data << {begin: test_class}
|
36
|
+
end
|
37
|
+
|
38
|
+
def generate(test_instance, instance_count)
|
39
|
+
@data << {instance: test_instance.class.to_s,
|
40
|
+
instance_method_calls: test_instance.method_calls,
|
41
|
+
instance_count: instance_count}
|
42
|
+
end
|
43
|
+
|
44
|
+
def end_spec()
|
45
|
+
@data << :end
|
46
|
+
end
|
47
|
+
|
48
|
+
def output
|
49
|
+
@data
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
RSpec.describe Pretentious::Generator do
|
55
|
+
|
56
|
+
context 'Pretentious::Generator#impostor_for' do
|
57
|
+
before do
|
58
|
+
@impostor = Pretentious::Generator.impostor_for(Object, TestClass)
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should be a class" do
|
62
|
+
expect(@impostor.kind_of? Class).to be
|
63
|
+
end
|
64
|
+
|
65
|
+
it "subject class should be valid" do
|
66
|
+
expect(@impostor.test_class).to eq TestClass
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'show contain the same methods' do
|
70
|
+
expect(@impostor.instance_methods).to include :message
|
71
|
+
expect(@impostor.instance_methods).to include :method_with_assign=
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context "Pretentious::Generator#replace_class" do
|
76
|
+
|
77
|
+
around(:each) do |example|
|
78
|
+
@old_class = TestClass
|
79
|
+
module_space, klass, last, new_class = Pretentious::Generator.replace_class(TestClass)
|
80
|
+
@new_class = new_class
|
81
|
+
example.run
|
82
|
+
Pretentious::Generator.restore_class(module_space, klass, last)
|
83
|
+
end
|
84
|
+
|
85
|
+
it "new class should be named like the old class" do
|
86
|
+
expect(@new_class.to_s).to eq "TestClassImpostor"
|
87
|
+
expect(TestClass == @new_class).to be
|
88
|
+
end
|
89
|
+
|
90
|
+
it "a new kind of class should be created" do
|
91
|
+
expect(@old_class == @new_class).to_not be
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should set instance variables like the real thing" do
|
95
|
+
instance = @new_class.new
|
96
|
+
instance.message("hello")
|
97
|
+
expect(instance.instance_variable_get(:@params1)).to eq "hello"
|
98
|
+
instance.method_with_assign="world"
|
99
|
+
expect(instance.instance_variable_get(:@params2)).to eq "world!"
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
context "Pretentious::Generator#generate_for" do
|
104
|
+
around(:each) do |example|
|
105
|
+
Pretentious::Generator.test_generator= DummyGenerator
|
106
|
+
example.run
|
107
|
+
Pretentious::Generator.test_generator= nil
|
108
|
+
end
|
109
|
+
|
110
|
+
it "generates call artifacts for target class" do
|
111
|
+
call_artifacts = Pretentious::Generator.generate_for(TestClass) do
|
112
|
+
instance = TestClass.new
|
113
|
+
instance.message("hello")
|
114
|
+
end
|
115
|
+
|
116
|
+
expect(call_artifacts).to eq({TestClass=>
|
117
|
+
[{:begin=>TestClass},
|
118
|
+
{:instance=>"TestClassImpostor",
|
119
|
+
:instance_method_calls=>
|
120
|
+
[{:method=>:message,
|
121
|
+
:params=>["hello"],
|
122
|
+
:block=>nil,
|
123
|
+
:names=>[[:req, :params1]],
|
124
|
+
:context=>{:calls=>[]}, :result=>"hello"}],
|
125
|
+
:instance_count=>1}, :end]})
|
126
|
+
end
|
127
|
+
|
128
|
+
context "auto mocks generator" do
|
129
|
+
|
130
|
+
it "generates a stub call structure" do
|
131
|
+
|
132
|
+
call_artifacts = Pretentious::Generator.generate_for(TestClass._stub(TestSubClass)) do
|
133
|
+
instance = TestClass.new
|
134
|
+
instance.method_with_usage
|
135
|
+
end
|
136
|
+
|
137
|
+
expect(call_artifacts).to eq({ TestClass => [{:begin=>TestClass},
|
138
|
+
{:instance=>"TestClassImpostor",
|
139
|
+
:instance_method_calls=>[{:method=>:method_with_usage,
|
140
|
+
:params=>[], :block=>nil, :names=>[],
|
141
|
+
:context=>{:calls=>[{:method=>:test_method, :params=>[],
|
142
|
+
:block=>nil, :names=>[], :result=>"a return string",
|
143
|
+
:class=>TestSubClass}]}, :result=>"a return string"}],
|
144
|
+
:instance_count=>1}, :end]})
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Pretentious::Generator do
|
4
|
+
|
5
|
+
context 'Pretentious::Deconstructor#build_tree' do
|
6
|
+
|
7
|
+
before do
|
8
|
+
@fixture = Pretentious::Generator.new
|
9
|
+
end
|
10
|
+
|
11
|
+
it "classes should have a stub class section" do
|
12
|
+
Fibonacci._stub(String)
|
13
|
+
expect(Fibonacci._get_mock_classes).to eq([String])
|
14
|
+
end
|
15
|
+
|
16
|
+
it "tracks object calls" do
|
17
|
+
result = Pretentious::Generator.generate_for(Fibonacci) do
|
18
|
+
Fibonacci.say_hello
|
19
|
+
end
|
20
|
+
expect(result).to eq({
|
21
|
+
Fibonacci => "require 'spec_helper'\n\nRSpec.describe Fibonacci do\n\n it 'should pass current expectations' do\n\n # Fibonacci::say_hello should return hello\n expect( Fibonacci.say_hello ).to eq(\"hello\")\n\n end\nend\n"
|
22
|
+
})
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
data/spec/test_class1_spec.rb
CHANGED
@@ -12,7 +12,6 @@ RSpec.describe TestClass1 do
|
|
12
12
|
|
13
13
|
it 'should pass current expectations' do
|
14
14
|
|
15
|
-
|
16
15
|
# TestClass1#message should return test
|
17
16
|
expect( @fixture.message ).to eq("test")
|
18
17
|
|
@@ -22,25 +21,25 @@ RSpec.describe TestClass1 do
|
|
22
21
|
context 'Scenario 2' do
|
23
22
|
before do
|
24
23
|
|
25
|
-
|
26
|
-
another_object = TestClass1.new(
|
27
|
-
|
24
|
+
var_2158495560 = "test"
|
25
|
+
another_object = TestClass1.new(var_2158495560)
|
26
|
+
var_2158482220 = {hello: "world", test: another_object, arr_1: [1, 2, 3, 4, 5, another_object], sub_hash: {yes: true, obj: another_object}}
|
28
27
|
|
29
|
-
@fixture = TestClass1.new(
|
28
|
+
@fixture = TestClass1.new(var_2158482220)
|
30
29
|
|
31
30
|
end
|
32
31
|
|
33
32
|
it 'should pass current expectations' do
|
34
33
|
|
35
|
-
|
36
|
-
another_object = TestClass1.new(
|
37
|
-
|
38
|
-
|
39
|
-
|
34
|
+
var_2158495560 = "test"
|
35
|
+
another_object = TestClass1.new(var_2158495560)
|
36
|
+
var_2158482220 = {hello: "world", test: another_object, arr_1: [1, 2, 3, 4, 5, another_object], sub_hash: {yes: true, obj: another_object}}
|
37
|
+
var_2158348900 = Proc.new { |message|
|
38
|
+
var_2158482220
|
40
39
|
}
|
41
40
|
|
42
41
|
e = nil
|
43
|
-
|
42
|
+
var_2158332200 = Proc.new {
|
44
43
|
# Variable return values ... can't figure out what goes in here...
|
45
44
|
}
|
46
45
|
|
@@ -51,11 +50,11 @@ RSpec.describe TestClass1 do
|
|
51
50
|
# TestClass1#print_message should return
|
52
51
|
expect( @fixture.print_message ).to be_nil
|
53
52
|
|
54
|
-
# TestClass1#set_block should return #<Pretentious::RecordedProc:
|
55
|
-
expect( @fixture.set_block &
|
53
|
+
# TestClass1#set_block should return #<Pretentious::RecordedProc:0x000001014b2380@example.rb:71>
|
54
|
+
expect( @fixture.set_block &var_2158348900 ).to eq(var_2158348900)
|
56
55
|
|
57
|
-
# TestClass1#call_block should return {:hello=>"world", :test=>#<TestClass1:
|
58
|
-
expect( @fixture.call_block &
|
56
|
+
# TestClass1#call_block should return {:hello=>"world", :test=>#<TestClass1:0x00000101500d00 @message="test", @_init_arguments={:params=>["test"]}, @_variable_names={2158495560=>"message"}>, :arr_1=>[1, 2, 3, 4, 5, #<TestClass1:0x00000101500d00 @message="test", @_init_arguments={:params=>["test"]}, @_variable_names={2158495560=>"message"}>], :sub_hash=>{:yes=>true, :obj=>#<TestClass1:0x00000101500d00 @message="test", @_init_arguments={:params=>["test"]}, @_variable_names={2158495560=>"message"}>}}
|
57
|
+
expect( @fixture.call_block &var_2158332200 ).to eq(var_2158482220)
|
59
58
|
|
60
59
|
# TestClass1#something_is_wrong should return StandardError
|
61
60
|
expect { @fixture.something_is_wrong }.to raise_error
|
data/spec/test_class2_spec.rb
CHANGED
data/spec/test_class3_spec.rb
CHANGED
@@ -5,8 +5,8 @@ RSpec.describe TestClass3 do
|
|
5
5
|
context 'Scenario 1' do
|
6
6
|
before do
|
7
7
|
|
8
|
-
|
9
|
-
another_object = TestClass1.new(
|
8
|
+
var_2158495560 = "test"
|
9
|
+
another_object = TestClass1.new(var_2158495560)
|
10
10
|
args = {hello: "world", test: another_object, arr_1: [1, 2, 3, 4, 5, another_object], sub_hash: {yes: true, obj: another_object}}
|
11
11
|
test_class_one = TestClass1.new(args)
|
12
12
|
args_1 = "This is message 2"
|
@@ -18,7 +18,6 @@ RSpec.describe TestClass3 do
|
|
18
18
|
|
19
19
|
it 'should pass current expectations' do
|
20
20
|
|
21
|
-
|
22
21
|
# TestClass3#show_messages should return awesome!!!
|
23
22
|
expect( @fixture.show_messages ).to eq("awesome!!!")
|
24
23
|
|
@@ -28,8 +27,8 @@ RSpec.describe TestClass3 do
|
|
28
27
|
context 'Scenario 2' do
|
29
28
|
before do
|
30
29
|
|
31
|
-
|
32
|
-
another_object = TestClass1.new(
|
30
|
+
var_2158495560 = "test"
|
31
|
+
another_object = TestClass1.new(var_2158495560)
|
33
32
|
args = {hello: "world", test: another_object, arr_1: [1, 2, 3, 4, 5, another_object], sub_hash: {yes: true, obj: another_object}}
|
34
33
|
test_class_one = TestClass1.new(args)
|
35
34
|
args_1 = "This is message 2"
|
@@ -41,7 +40,6 @@ RSpec.describe TestClass3 do
|
|
41
40
|
|
42
41
|
it 'should pass current expectations' do
|
43
42
|
|
44
|
-
|
45
43
|
# TestClass3#show_messages should return awesome!!!
|
46
44
|
expect( @fixture.show_messages ).to eq("awesome!!!")
|
47
45
|
|
data/spec/test_class4_spec.rb
CHANGED
@@ -5,19 +5,18 @@ RSpec.describe TestClass4 do
|
|
5
5
|
context 'Scenario 1' do
|
6
6
|
before do
|
7
7
|
|
8
|
-
|
9
|
-
|
8
|
+
var_2158495560 = "test"
|
9
|
+
var_2158363380 = Proc.new {
|
10
10
|
"test"
|
11
11
|
}
|
12
12
|
|
13
13
|
|
14
|
-
@fixture = TestClass4.new &
|
14
|
+
@fixture = TestClass4.new &var_2158363380
|
15
15
|
|
16
16
|
end
|
17
17
|
|
18
18
|
it 'should pass current expectations' do
|
19
19
|
|
20
|
-
|
21
20
|
end
|
22
21
|
end
|
23
22
|
|