guard-cunit 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.
- data/.travis.yml +11 -0
- data/CHANGELOG.md +241 -0
- data/Gemfile +9 -0
- data/Guardfile +11 -0
- data/README.md +70 -0
- data/Rakefile +24 -0
- data/guard-cunit.gemspec +29 -0
- data/lib/guard/cunit/cunit_parser.rb +79 -0
- data/lib/guard/cunit/runner.rb +128 -0
- data/lib/guard/cunit/templates/Guardfile +12 -0
- data/lib/guard/cunit/version.rb +7 -0
- data/lib/guard/cunit.rb +69 -0
- data/spec/guard_cunit_parser_spec.rb +83 -0
- data/spec/guard_cunit_spec.rb +239 -0
- data/spec/spec_helper.rb +108 -0
- metadata +122 -0
data/.travis.yml
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
language: ruby
|
|
2
|
+
rvm:
|
|
3
|
+
- "1.8.7"
|
|
4
|
+
- "1.9.2"
|
|
5
|
+
- "1.9.3"
|
|
6
|
+
- jruby-18mode # JRuby in 1.8 mode
|
|
7
|
+
- jruby-19mode # JRuby in 1.9 mode
|
|
8
|
+
- rbx-18mode
|
|
9
|
+
- rbx-19mode
|
|
10
|
+
# uncomment this line if your project needs to run something other than `rake`:
|
|
11
|
+
script: bundle exec rspec spec
|
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
# Chagelog
|
|
2
|
+
|
|
3
|
+
### Bug fix
|
|
4
|
+
commit fd83634f375f76fb7ef5af72516f6afe6f07946c
|
|
5
|
+
Date: Tue Nov 27 13:24:24 2012 +0200
|
|
6
|
+
|
|
7
|
+
fixed travis build 13 (removed unneded gem used only for debugging)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
### Bug fix
|
|
11
|
+
commit c021cdfc0e59b8160b684363d4c1a2bcf29472dc
|
|
12
|
+
Date: Tue Nov 27 13:03:50 2012 +0200
|
|
13
|
+
|
|
14
|
+
Fixed using of Notifier class and added some smoother handling of test exe outputs
|
|
15
|
+
|
|
16
|
+
### Bug fix
|
|
17
|
+
commit 5e3a8ae87abdff852b6e1917728ea792b4d11274
|
|
18
|
+
Date: Sun Nov 25 17:24:59 2012 +0200
|
|
19
|
+
|
|
20
|
+
rework parsing for cunit
|
|
21
|
+
|
|
22
|
+
### Bug fix
|
|
23
|
+
commit c93acec12fad9698b2a134bb316c92aa38a74c8f
|
|
24
|
+
Date: Sun Nov 25 11:20:01 2012 +0200
|
|
25
|
+
|
|
26
|
+
fixed test for parsing output from test
|
|
27
|
+
|
|
28
|
+
### Bug fix
|
|
29
|
+
commit 1a09331f89b5b0e3e72cd1b4b15551f7ed8c4b1b
|
|
30
|
+
Date: Sun Nov 25 09:13:23 2012 +0200
|
|
31
|
+
|
|
32
|
+
fixed guard reload calls and added test cases for passing cunit test output to parser
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
### Bug fix
|
|
36
|
+
commit 901dee0b5f8b14311885b4264bbb5fa1951161eb
|
|
37
|
+
Date: Wed Nov 21 14:01:07 2012 +0200
|
|
38
|
+
|
|
39
|
+
fixed rspec test running under windows platform
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
### Bug fix
|
|
43
|
+
commit 40da4a4c79c6ec5a7abefb09813ff953ce94e7e4
|
|
44
|
+
Date: Tue Nov 20 13:39:11 2012 +0200
|
|
45
|
+
|
|
46
|
+
test&fix for stopping guard's tasks and exiting, when one of them(tasks) fails
|
|
47
|
+
|
|
48
|
+
### Bug fix
|
|
49
|
+
commit 622488393175bb396a82a2f235bab9241fbe922a
|
|
50
|
+
Date: Sun Nov 18 17:06:41 2012 +0200
|
|
51
|
+
|
|
52
|
+
merged stdout and stderr outputs when spawning/piping tasks
|
|
53
|
+
|
|
54
|
+
### Improvement
|
|
55
|
+
commit b305b860e6e0dbed2006ab8a8775f1c352ce8139
|
|
56
|
+
Date: Sun Nov 18 11:37:28 2012 +0200
|
|
57
|
+
|
|
58
|
+
removed doc folder, since it is generated automatically with 'rake doc'
|
|
59
|
+
|
|
60
|
+
### Improvement
|
|
61
|
+
commit ad4dd6a13f290c31fb149ccd1ae9a0b65f8c5774
|
|
62
|
+
Date: Fri Nov 16 00:42:51 2012 -0500
|
|
63
|
+
|
|
64
|
+
skip interactions for guard run within rspec
|
|
65
|
+
|
|
66
|
+
## version 0.0.1
|
|
67
|
+
|
|
68
|
+
### Improvement
|
|
69
|
+
commit f246fc98f17959c59ef1525e56ebb70472ced89f
|
|
70
|
+
Date: Tue Nov 6 20:06:33 2012 +0200
|
|
71
|
+
|
|
72
|
+
added specific platform to gemspec since not yet tested on other platforms
|
|
73
|
+
|
|
74
|
+
### Improvement
|
|
75
|
+
commit a7fda4f1d8f7b0fb937aa0e20f5b37cac55323a0
|
|
76
|
+
Date: Tue Nov 6 20:04:59 2012 +0200
|
|
77
|
+
|
|
78
|
+
added specific platform to gem sinc still not tested on other platforms
|
|
79
|
+
|
|
80
|
+
### Improvement
|
|
81
|
+
commit 0ef39baec6dbcfe7da55286417420811baf194e3
|
|
82
|
+
Date: Tue Nov 6 19:45:44 2012 +0200
|
|
83
|
+
|
|
84
|
+
leave with class variable access but make it portable
|
|
85
|
+
|
|
86
|
+
### Improvement
|
|
87
|
+
commit c62e832c478b5690bd02a68399b22d3177df35b3
|
|
88
|
+
Date: Tue Nov 6 19:34:14 2012 +0200
|
|
89
|
+
|
|
90
|
+
reworked the tests
|
|
91
|
+
|
|
92
|
+
### Bugfix
|
|
93
|
+
commit decab60a968b1a1fc926e5edd00acecc8f2c2d80
|
|
94
|
+
Date: Tue Nov 6 19:12:59 2012 +0200
|
|
95
|
+
|
|
96
|
+
fixed rspec tests
|
|
97
|
+
|
|
98
|
+
### Improvement
|
|
99
|
+
commit 6dc936e6dc829353ee8433c1136333de07ae9781
|
|
100
|
+
Date: Fri Nov 2 07:59:40 2012 +0200
|
|
101
|
+
|
|
102
|
+
Some fixes to improve rake
|
|
103
|
+
|
|
104
|
+
### Improvement
|
|
105
|
+
commit 548da4659f9b982151c354533fac1104131e779c
|
|
106
|
+
Date: Mon Oct 15 19:39:32 2012 +0300
|
|
107
|
+
|
|
108
|
+
update gem
|
|
109
|
+
|
|
110
|
+
### Bug fix
|
|
111
|
+
commit 34978668aa7b26441a9a79c0eac38134cbd43fa4
|
|
112
|
+
Date: Mon Oct 15 19:29:30 2012 +0300
|
|
113
|
+
|
|
114
|
+
Fix cunit parser tests
|
|
115
|
+
|
|
116
|
+
### Bugfix
|
|
117
|
+
commit 62a192b47082cd00154fe7a6e3663430453bde47
|
|
118
|
+
Date: Fri Oct 12 18:52:35 2012 +0300
|
|
119
|
+
|
|
120
|
+
more test pass
|
|
121
|
+
|
|
122
|
+
### Improvement
|
|
123
|
+
commit b1bdec45bf9ce9dde9e9ef1a067e3fec4461960d
|
|
124
|
+
Date: Fri Oct 12 07:55:37 2012 +0300
|
|
125
|
+
|
|
126
|
+
add parser tests
|
|
127
|
+
|
|
128
|
+
### Bugfix
|
|
129
|
+
commit 1f6e251023c15b5092e16873afe552b1ea2eabcb
|
|
130
|
+
Date: Sat Oct 6 21:59:29 2012 +0300
|
|
131
|
+
|
|
132
|
+
fix run on change
|
|
133
|
+
|
|
134
|
+
### Bugfix
|
|
135
|
+
commit 06b4cd83ac895713a78754783b37c5e0f74e06a9
|
|
136
|
+
Date: Sat Oct 6 21:58:26 2012 +0300
|
|
137
|
+
|
|
138
|
+
fix the test
|
|
139
|
+
|
|
140
|
+
commit e62d28d6031cbc4664cf2fb8fd4a8ad172f8224e
|
|
141
|
+
Date: Sat Oct 6 21:52:08 2012 +0300
|
|
142
|
+
|
|
143
|
+
fix the test
|
|
144
|
+
|
|
145
|
+
### Improvement
|
|
146
|
+
commit aadbd9ad9ce9ae841f678718c931af9707fa2601
|
|
147
|
+
Date: Sat Oct 6 21:50:37 2012 +0300
|
|
148
|
+
|
|
149
|
+
enhance the test expect some info
|
|
150
|
+
|
|
151
|
+
### Improvement
|
|
152
|
+
commit 0e85a5b2cd2596c11826dec04f4da81d0723ae95
|
|
153
|
+
Date: Sat Oct 6 21:45:04 2012 +0300
|
|
154
|
+
|
|
155
|
+
add test for run_on_change
|
|
156
|
+
|
|
157
|
+
### Bugfix
|
|
158
|
+
commit 5f076ef6362a8f66508bae263c57b23c75566b73
|
|
159
|
+
Date: Thu Oct 4 21:34:49 2012 +0300
|
|
160
|
+
|
|
161
|
+
fix build - only pending tests should remain not covered
|
|
162
|
+
changed puts method with GUI.info
|
|
163
|
+
|
|
164
|
+
### Improvement
|
|
165
|
+
commit e5d0783f8d49b4b39934dde0ab867cd8032c4d5d
|
|
166
|
+
Date: Wed Oct 3 08:43:49 2012 +0300
|
|
167
|
+
|
|
168
|
+
add tests for the Cunit output parser
|
|
169
|
+
|
|
170
|
+
### Improvement
|
|
171
|
+
commit b5b5fb18245618c4e0d2969c51f16890969c5cac
|
|
172
|
+
Date: Sun Sep 23 08:53:05 2012 -0400
|
|
173
|
+
|
|
174
|
+
travis_build_status_to_readme
|
|
175
|
+
|
|
176
|
+
### Improvement
|
|
177
|
+
commit d9c74c868184f3d0a76f36d295c4be8be5b51e89
|
|
178
|
+
Date: Sun Sep 23 08:44:37 2012 -0400
|
|
179
|
+
|
|
180
|
+
use expand_path instead of absolute_path
|
|
181
|
+
|
|
182
|
+
### Bugfix
|
|
183
|
+
commit da363416aeceac84ce463a48b18b5434e145ae47
|
|
184
|
+
Date: Sun Sep 23 08:32:57 2012 -0400
|
|
185
|
+
|
|
186
|
+
fixed init of runner object
|
|
187
|
+
|
|
188
|
+
commit b7a8e79a9ac8533792c5c75c47d9165d1e95a3a6
|
|
189
|
+
Date: Sat Sep 22 19:22:31 2012 +0300
|
|
190
|
+
|
|
191
|
+
just test the travis
|
|
192
|
+
|
|
193
|
+
commit 782ffc3050fded2e516ce3587363b5f830c65e01
|
|
194
|
+
Date: Sat Sep 22 19:18:48 2012 +0300
|
|
195
|
+
|
|
196
|
+
fix rake and travis
|
|
197
|
+
|
|
198
|
+
### Improvement
|
|
199
|
+
commit 01f2967fc970a234f43c5899bcd90d919337996d
|
|
200
|
+
Date: Sat Sep 22 17:52:06 2012 +0300
|
|
201
|
+
|
|
202
|
+
added some more documentation and cleanup of dead code
|
|
203
|
+
|
|
204
|
+
### Improvement
|
|
205
|
+
commit 3746ac25267b63a0c1f93e9d0bfc699d0da89b63
|
|
206
|
+
Date: Fri Sep 21 18:32:43 2012 +0300
|
|
207
|
+
|
|
208
|
+
Moved runner behaviour in a separate class and fixed Guardfile format
|
|
209
|
+
|
|
210
|
+
commit e690c19158d6a511ba4e07bd4a48bf765609f0cf
|
|
211
|
+
Date: Fri Sep 21 18:30:23 2012 +0300
|
|
212
|
+
|
|
213
|
+
Moved runner behaviour in a separate class and fixed Guardfile format
|
|
214
|
+
|
|
215
|
+
commit 4372dfab33a65fba622685d3e8ca09eff09948ba
|
|
216
|
+
Date: Fri Sep 21 18:29:49 2012 +0300
|
|
217
|
+
|
|
218
|
+
Moved runner behaviour in a separate class and fixed Guardfile format
|
|
219
|
+
|
|
220
|
+
#### Bugfix
|
|
221
|
+
commit e1713aa0e01e7777a966beca23da83e07135f8a3
|
|
222
|
+
Date: Fri Sep 21 18:28:56 2012 +0300
|
|
223
|
+
|
|
224
|
+
fixed gemspec not to include gemfiles
|
|
225
|
+
|
|
226
|
+
### Improvement
|
|
227
|
+
commit 1c054c79f1068c633b059118f9854fc0344bde0f
|
|
228
|
+
Date: Fri Sep 21 18:25:11 2012 +0300
|
|
229
|
+
|
|
230
|
+
Added rdoc output :) - will improve
|
|
231
|
+
|
|
232
|
+
### Improvement
|
|
233
|
+
commit 667c9fc5e6a16059f9f493c95b0f00880c0a6006
|
|
234
|
+
Date: Fri Sep 21 18:15:56 2012 +0300
|
|
235
|
+
|
|
236
|
+
Fixed dependancy to guard and added meaningful README
|
|
237
|
+
|
|
238
|
+
commit 30678f36d96ed1337f27186f0daf5e4e1340198f
|
|
239
|
+
Date: Fri Sep 21 18:12:06 2012 +0300
|
|
240
|
+
|
|
241
|
+
Moved runner behaviour in a separate class and fixed Guardfile format
|
data/Gemfile
ADDED
data/Guardfile
ADDED
data/README.md
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Guard CUnit [](http://travis-ci.org/teacup-on-rockingchair/guard-cunit)
|
|
2
|
+
|
|
3
|
+
CUnit Guard allows you to run/watch Unit test for C modules, or anything other that works with Makefile
|
|
4
|
+
|
|
5
|
+
Soon will add parser for CUnit tests, and probably other UT libs
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
Need to have guard and also some of the notifiers that guard uses
|
|
10
|
+
|
|
11
|
+
otherwise, get the gemfile and install it:
|
|
12
|
+
```
|
|
13
|
+
$ gem install ./guard-cunit-*.gem
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
will put that in rubygems soon
|
|
17
|
+
|
|
18
|
+
# Guardfile
|
|
19
|
+
|
|
20
|
+
Generating the Guardfile is like all the other
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
$ guard init cunit
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
The file by default looks like this:
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
# A sample Guardfile
|
|
30
|
+
# More info at https://github.com/guard/guard#readme
|
|
31
|
+
|
|
32
|
+
#
|
|
33
|
+
# Cunit Guardfile - keep dflt builders after guard watcher's block
|
|
34
|
+
#
|
|
35
|
+
guard 'cunit' do
|
|
36
|
+
watch(%r{((.+)\.c$)|((.+)\.h$)|((M|m)akefile$)} )
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
set_builder "make 2>&1"
|
|
40
|
+
set_cleaner "make clean"
|
|
41
|
+
cunit_runner "#{File.basename(Dir.getwd)}_unit"
|
|
42
|
+
libdir "#{Dir.getwd}"
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
After the guard block are the new methods from Guardfile DSL, which are used for the tasks needed to be performed on running the build/tests
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
## Usage
|
|
51
|
+
|
|
52
|
+
For all other stuff related to guard's usage please read [Guard usage doc](https://github.com/guard/guard#readme)
|
|
53
|
+
|
|
54
|
+
Testing
|
|
55
|
+
-----------
|
|
56
|
+
|
|
57
|
+
Run rspec in top directory of the project or guard-rspec
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
Todo
|
|
61
|
+
-----------
|
|
62
|
+
- fix all bugs :)
|
|
63
|
+
- add parser for CUNIT tests
|
|
64
|
+
- add hook for coverage
|
|
65
|
+
- ... whatever wind blows ...
|
|
66
|
+
|
|
67
|
+
Author
|
|
68
|
+
----------
|
|
69
|
+
[A tea cup on a rocking chair](https://github.com/strandjata)
|
|
70
|
+
|
data/Rakefile
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
require "bundler/gem_tasks"
|
|
2
|
+
require 'rspec/core/rake_task'
|
|
3
|
+
|
|
4
|
+
Bundler::GemHelper.install_tasks
|
|
5
|
+
|
|
6
|
+
task :default => [ :spec, :doc, :gem]
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
desc "Run RSpec"
|
|
10
|
+
RSpec::Core::RakeTask.new do |t|
|
|
11
|
+
t.rcov = ENV['RCOV']
|
|
12
|
+
t.rcov_opts = %w{--exclude osx\/objc,gems\/,spec\/}
|
|
13
|
+
t.verbose = true
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
task :doc do
|
|
18
|
+
system 'rdoc -a -U'
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
task :gem do
|
|
22
|
+
system 'rm guard-cunit*.gem'
|
|
23
|
+
system 'gem build guard-cunit.gemspec'
|
|
24
|
+
end
|
data/guard-cunit.gemspec
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
$:.push File.expand_path("../lib/",__FILE__)
|
|
3
|
+
|
|
4
|
+
require "guard/cunit/version"
|
|
5
|
+
|
|
6
|
+
Gem::Specification.new do |s|
|
|
7
|
+
s.name = "guard-cunit"
|
|
8
|
+
s.version = Guard::CunitGuard::VERSION
|
|
9
|
+
s.authors = ["Tea Cup On Rocking Chair"]
|
|
10
|
+
s.email = ["strandjata@gmail.com"]
|
|
11
|
+
s.platform = Gem::Platform::RUBY
|
|
12
|
+
s.homepage = "http://teacup-on-rockingchair.github.com/guard-cunit/"
|
|
13
|
+
s.summary = %q{Guard gem for CUnit-driven projects}
|
|
14
|
+
s.description = %q{Guard Cunit should automatically build your C project and run CUnit based tests}
|
|
15
|
+
|
|
16
|
+
s.rubyforge_project = "guard-cunit"
|
|
17
|
+
|
|
18
|
+
# specify any dependencies here; for example:
|
|
19
|
+
s.add_dependency 'guard', '>= 1.1'
|
|
20
|
+
s.add_development_dependency 'bundler'
|
|
21
|
+
s.add_development_dependency 'rspec'
|
|
22
|
+
|
|
23
|
+
s.files = `git ls-files`.split("\n").delete_if {|x| x.match(/(.).gem\b/)}
|
|
24
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
|
25
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
|
26
|
+
s.require_paths = ["lib"]
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
class TestOutput < String
|
|
2
|
+
# limit the output to given nr rows
|
|
3
|
+
def limit_to_rows(number_of_rows)
|
|
4
|
+
output = TestOutput.new("")
|
|
5
|
+
raws_count = 1;
|
|
6
|
+
self.lines.each do |current_line|
|
|
7
|
+
output += current_line
|
|
8
|
+
break if(raws_count == number_of_rows)
|
|
9
|
+
raws_count+=1
|
|
10
|
+
end
|
|
11
|
+
output=output+"..." if ( number_of_rows < self.lines.count )
|
|
12
|
+
output
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# bang version
|
|
16
|
+
def limit_to_rows!(number_of_rows)
|
|
17
|
+
self.replace(limit_to_rows(number_of_rows))
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
module Guard
|
|
24
|
+
class Cunit
|
|
25
|
+
class CunitParser
|
|
26
|
+
@output
|
|
27
|
+
@summary_output
|
|
28
|
+
@failures
|
|
29
|
+
|
|
30
|
+
#constructor
|
|
31
|
+
def initialize (task_output = nil)
|
|
32
|
+
parse_output( task_output ) unless task_output == nil
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
#get cunit output
|
|
36
|
+
def parse_output( task_output )
|
|
37
|
+
task_output = "" unless task_output != nil
|
|
38
|
+
@output = TestOutput.new(task_output.dup)
|
|
39
|
+
get_summary
|
|
40
|
+
get_failures
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# find summary of the cunit test reprot
|
|
44
|
+
def get_summary
|
|
45
|
+
begin
|
|
46
|
+
@summary_output = TestOutput.new(@output[/Run Summary:[\w\W]*/])
|
|
47
|
+
rescue
|
|
48
|
+
@summary_output = TestOutput.new("")
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
#find failures from Cunit test report
|
|
53
|
+
def get_failures
|
|
54
|
+
begin
|
|
55
|
+
@failures = TestOutput.new(@output[/[\r\n]*[ \t\f]*1. [\w\W]*:[\d]* [\w\W]*/].sub(@summary_output,"").strip)
|
|
56
|
+
rescue
|
|
57
|
+
@failures = TestOutput.new("Failed")
|
|
58
|
+
end
|
|
59
|
+
@failures.limit_to_rows!(3)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
#display summary of the suites/tests/asserts
|
|
63
|
+
def cunit_output
|
|
64
|
+
@summary_output
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
#copy of the cunit output
|
|
68
|
+
def full_output
|
|
69
|
+
@output
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
#display failures output
|
|
73
|
+
def failures_output
|
|
74
|
+
@failures
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
require 'guard/cunit/cunit_parser'
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
module Guard
|
|
5
|
+
class Cunit
|
|
6
|
+
#
|
|
7
|
+
# the class implements running and handling of results of the tasks that made up the cunit guard
|
|
8
|
+
#
|
|
9
|
+
class Runner
|
|
10
|
+
@@cunit_runner=''
|
|
11
|
+
@@project_builder=''
|
|
12
|
+
@@project_cleaner=''
|
|
13
|
+
@@project_libdir=''
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def initialize
|
|
17
|
+
@parser = CunitParser.new()
|
|
18
|
+
@current_output = String.new("")
|
|
19
|
+
end
|
|
20
|
+
# set the executable file name to run CUNIT tests
|
|
21
|
+
def self.set_runner(name)
|
|
22
|
+
@@cunit_runner=name
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# set command to run to prepare build
|
|
26
|
+
def self.set_builder(name)
|
|
27
|
+
@@project_builder=name
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# set cleaner script/exe/command
|
|
31
|
+
def self.set_cleaner(name)
|
|
32
|
+
@@project_cleaner=name
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
# set directory where library under test is generated
|
|
37
|
+
def self.set_libdir(name)
|
|
38
|
+
@@project_libdir=name
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
#
|
|
42
|
+
# make wrapper for piping so we can use different approaches on win and *nix
|
|
43
|
+
#
|
|
44
|
+
def piper(exe)
|
|
45
|
+
if( RUBY_PLATFORM.match(/mingw/)||RUBY_PLATFORM.match(/mswin/)||RUBY_VERSION.match("1.8"))
|
|
46
|
+
IO.popen(exe) {|io|
|
|
47
|
+
yield io
|
|
48
|
+
}
|
|
49
|
+
else
|
|
50
|
+
IO.popen(exe.split << {:err=>[:child, :out]}) {|io|
|
|
51
|
+
yield io
|
|
52
|
+
}
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
end
|
|
56
|
+
#
|
|
57
|
+
# run one phase of the guard via a system command/executable
|
|
58
|
+
#
|
|
59
|
+
def run_task(task_executable)
|
|
60
|
+
success = true
|
|
61
|
+
piper(task_executable) {|myio|
|
|
62
|
+
@current_output = myio.read
|
|
63
|
+
}
|
|
64
|
+
success = false unless $?.exitstatus == 0
|
|
65
|
+
UI.info @current_output
|
|
66
|
+
success
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# run clean before each run all start with clean
|
|
70
|
+
def run_clean
|
|
71
|
+
raise "Clean failed" unless run_task(@@project_cleaner) == true
|
|
72
|
+
end
|
|
73
|
+
def export_libdir(libdir)
|
|
74
|
+
case RUBY_PLATFORM
|
|
75
|
+
when /mingw/,/mswin/
|
|
76
|
+
ENV["PATH"]="#{ENV["PATH"]};#{libdir}"
|
|
77
|
+
when /darwin/
|
|
78
|
+
ENV["DYLD_LIBRARY_PATH"]="#{ENV["DYLD_LIBRARY_PATH"]}:#{libdir}"
|
|
79
|
+
else
|
|
80
|
+
ENV["LD_LIBRARY_PATH"]="#{ENV["LD_LIBRARY_PATH"]}:#{libdir}"
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
# run unit tests via cunit executable
|
|
84
|
+
def run_tests
|
|
85
|
+
# setup environment so it should include lib dir for ld path
|
|
86
|
+
export_libdir(@@project_libdir)
|
|
87
|
+
|
|
88
|
+
if( !File.exists? (@@cunit_runner) )
|
|
89
|
+
Notifier.notify("Pending", :title => "Test Not Defined", :image => :pending, :priority => 2)
|
|
90
|
+
success = false
|
|
91
|
+
else
|
|
92
|
+
success = run_task(@@cunit_runner)
|
|
93
|
+
@parser.parse_output(@current_output)
|
|
94
|
+
if success == true
|
|
95
|
+
Notifier.notify("Success", :title => "Test Passed", :image => :passed, :priority => 2)
|
|
96
|
+
else
|
|
97
|
+
Notifier.notify(@parser.failures_output, :title => "Test Failed", :image => :failed, :priority => 2 )
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
raise "Test failed" unless success == true
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
# run make command to build the project
|
|
105
|
+
def run_make
|
|
106
|
+
success = run_task(@@project_builder)
|
|
107
|
+
Notifier.notify("Failed", :title => "Build Failed", :image => :failed, :priority => 2) unless success == true
|
|
108
|
+
raise "Build failed" unless success == true
|
|
109
|
+
end
|
|
110
|
+
# run them all
|
|
111
|
+
def run
|
|
112
|
+
UI.info "Test runner: #{@@cunit_runner}"
|
|
113
|
+
UI.info "Builder: #{@@project_builder}"
|
|
114
|
+
UI.info "Cleaner: #{@@project_cleaner}"
|
|
115
|
+
UI.info "Libdir: #{@@project_libdir}"
|
|
116
|
+
begin
|
|
117
|
+
run_clean
|
|
118
|
+
run_make
|
|
119
|
+
run_tests
|
|
120
|
+
rescue
|
|
121
|
+
return false
|
|
122
|
+
end
|
|
123
|
+
true
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Cunit Guardfile - keep dflt builders after guard watcher's block
|
|
3
|
+
#
|
|
4
|
+
guard 'cunit' do
|
|
5
|
+
watch(%r{((.+)\.c$)|((.+)\.h$)|((M|m)akefile$)} )
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
set_builder "make 2>&1"
|
|
9
|
+
set_cleaner "make clean"
|
|
10
|
+
cunit_runner "#{File.basename(Dir.getwd)}_unit"
|
|
11
|
+
libdir "#{Dir.getwd}"
|
|
12
|
+
|
data/lib/guard/cunit.rb
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
require 'guard'
|
|
2
|
+
require 'guard/guard'
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
module Guard
|
|
6
|
+
# main child class of Guard to nherit guard's behaviour
|
|
7
|
+
class Cunit < Guard
|
|
8
|
+
autoload :Runner, 'guard/cunit/runner'
|
|
9
|
+
# new method that also creates the runner class
|
|
10
|
+
def initialize(watchers = [], options = {})
|
|
11
|
+
super
|
|
12
|
+
@options = {
|
|
13
|
+
:all_on_start => true,
|
|
14
|
+
}.update(options)
|
|
15
|
+
@runner = Runner.new()
|
|
16
|
+
end
|
|
17
|
+
# Called when just `enter` is pressed
|
|
18
|
+
# This method should be principally used for long action like running all specs/tests/...
|
|
19
|
+
# @raise [:task_has_failed] when run_all has failed
|
|
20
|
+
def run_all
|
|
21
|
+
passed = @runner.run
|
|
22
|
+
throw :task_has_failed unless passed
|
|
23
|
+
end
|
|
24
|
+
def run_on_change(paths)
|
|
25
|
+
UI.info("Process changes in #{paths}")
|
|
26
|
+
passed = run_all
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
#
|
|
31
|
+
# add more behaviour to Guard's DSL to be able to configure executors
|
|
32
|
+
# of all the CUnit's Guard tasks
|
|
33
|
+
#
|
|
34
|
+
class Dsl
|
|
35
|
+
#
|
|
36
|
+
# put default values to task executors
|
|
37
|
+
#
|
|
38
|
+
def initialize
|
|
39
|
+
super
|
|
40
|
+
set_cleaner("make clean")
|
|
41
|
+
cunit_runner("./#{File.basename(Dir.getwd)}_unit")
|
|
42
|
+
set_builder("make 2>&1")
|
|
43
|
+
libdir("#{Dir.getwd}")
|
|
44
|
+
@runner = Cunit::Runner.new
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# dsl call to set cunit test executable
|
|
48
|
+
def cunit_runner (name)
|
|
49
|
+
Cunit::Runner.set_runner(name)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# dsl call to set cunit build command/script, by default make
|
|
53
|
+
def set_builder (name)
|
|
54
|
+
Cunit::Runner.set_builder(name)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
#dsl call to set cunit clean command/script, by default 'make clean'
|
|
58
|
+
def set_cleaner (name)
|
|
59
|
+
Cunit::Runner.set_cleaner(name)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# dsl call to set dir, where library under test is generated, by default current dir
|
|
63
|
+
def libdir(name)
|
|
64
|
+
Cunit::Runner.set_libdir(File.expand_path(name))
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
end
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
require "spec_helper.rb"
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
describe Guard::Cunit::CunitParser do
|
|
5
|
+
before(:each) do
|
|
6
|
+
|
|
7
|
+
@long_fake_output = String.new(" CUnit - A unit testing framework for C - Version 2.1-2
|
|
8
|
+
http://cunit.sourceforge.net/
|
|
9
|
+
|
|
10
|
+
Suite Simple calc CUNIT suite, Test Addition test had failures:
|
|
11
|
+
1. simplecalc_test.c:7 - CU_FAIL(\"TODO\")
|
|
12
|
+
2. simplecalc_test.c:17 - CU_FAIL(\"TODO\")
|
|
13
|
+
3. simplecalc_test.c:27 - CU_FAIL(\"TODO\")
|
|
14
|
+
4. simplecalc_test.c:37 - CU_FAIL(\"TODO\")
|
|
15
|
+
5. simplecalc_test.c:47 - CU_FAIL(\"TODO\")
|
|
16
|
+
6. simplecalc_test.c:57 - CU_FAIL(\"TODO\")
|
|
17
|
+
7. simplecalc_test.c:67 - CU_FAIL(\"TODO\")
|
|
18
|
+
8. simplecalc_test.c:77 - CU_FAIL(\"TODO\")
|
|
19
|
+
9. simplecalc_test.c:87 - CU_FAIL(\"TODO\")
|
|
20
|
+
10. simplecalc_test.c:97 - CU_FAIL(\"TODO\")
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
Run Summary: Type Total Ran Passed Failed Inactive
|
|
24
|
+
suites 1 1 n/a 0 0
|
|
25
|
+
tests 10 10 0 10 0
|
|
26
|
+
asserts 10 10 0 10 n/a
|
|
27
|
+
|
|
28
|
+
Elapsed time = 0.000 seconds")
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@fake_output = String.new(" CUnit - A unit testing framework for C - Version 2.1-2
|
|
32
|
+
http://cunit.sourceforge.net/
|
|
33
|
+
|
|
34
|
+
Suite Simple calc CUNIT suite, Test Addition test had failures:
|
|
35
|
+
1. simplecalc_test.c:7 - CU_FAIL(\"TODO\")
|
|
36
|
+
|
|
37
|
+
Run Summary: Type Total Ran Passed Failed Inactive
|
|
38
|
+
suites 1 1 n/a 0 0
|
|
39
|
+
tests 1 1 0 1 0
|
|
40
|
+
asserts 1 1 0 1 n/a
|
|
41
|
+
|
|
42
|
+
Elapsed time = 0.000 seconds")
|
|
43
|
+
|
|
44
|
+
@fake_fail_summary = String.new("1. simplecalc_test.c:7 - CU_FAIL(\"TODO\")")
|
|
45
|
+
|
|
46
|
+
@fake_summary = String.new("Run Summary: Type Total Ran Passed Failed Inactive
|
|
47
|
+
suites 1 1 n/a 0 0
|
|
48
|
+
tests 1 1 0 1 0
|
|
49
|
+
asserts 1 1 0 1 n/a
|
|
50
|
+
|
|
51
|
+
Elapsed time = 0.000 seconds")
|
|
52
|
+
|
|
53
|
+
@shortened_fail_summary = String.new("1. simplecalc_test.c:7 - CU_FAIL(\"TODO\")
|
|
54
|
+
2. simplecalc_test.c:17 - CU_FAIL(\"TODO\")
|
|
55
|
+
3. simplecalc_test.c:27 - CU_FAIL(\"TODO\")
|
|
56
|
+
...")
|
|
57
|
+
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
it "should generate a UI summary and full output from given text input" do
|
|
62
|
+
parser = Guard::Cunit::CunitParser.new(@fake_output)
|
|
63
|
+
parser.full_output.should == @fake_output
|
|
64
|
+
parser.cunit_output.should == (@fake_summary)
|
|
65
|
+
parser.failures_output.should == (@fake_fail_summary)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
it "failure summary should be maximum a 3 row output" do
|
|
69
|
+
parser = Guard::Cunit::CunitParser.new(@long_fake_output)
|
|
70
|
+
parser.failures_output.should == (@shortened_fail_summary)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
it "should be able to init with no output and later trigger process" do
|
|
74
|
+
parser = Guard::Cunit::CunitParser.new()
|
|
75
|
+
parser.parse_output(@long_fake_output)
|
|
76
|
+
parser.failures_output.should == (@shortened_fail_summary)
|
|
77
|
+
end
|
|
78
|
+
it "should be able to handle test exe with no output and put just failed as failure message" do
|
|
79
|
+
parser = Guard::Cunit::CunitParser.new()
|
|
80
|
+
parser.parse_output(nil)
|
|
81
|
+
parser.failures_output.should == ("Failed")
|
|
82
|
+
end
|
|
83
|
+
end
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
require "spec_helper.rb"
|
|
2
|
+
|
|
3
|
+
describe Guard::Cunit do
|
|
4
|
+
|
|
5
|
+
before (:all) do
|
|
6
|
+
@@first = true
|
|
7
|
+
@tmp_env = TempPrjEnv.new
|
|
8
|
+
@work_dir = Dir.getwd
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def get_ld_path
|
|
12
|
+
case RUBY_PLATFORM
|
|
13
|
+
when /mingw/
|
|
14
|
+
ENV["PATH"]
|
|
15
|
+
when /mswin/
|
|
16
|
+
ENV["PATH"]
|
|
17
|
+
when /darwin/
|
|
18
|
+
ENV["DYLD_LIBRARY_PATH"]
|
|
19
|
+
else
|
|
20
|
+
ENV["LD_LIBRARY_PATH"]
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
def setup_guard
|
|
24
|
+
if @@first == true
|
|
25
|
+
Guard::setup({:no_interactions => true})
|
|
26
|
+
@@first = false
|
|
27
|
+
else
|
|
28
|
+
Guard::reload({})
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
before(:each) do
|
|
33
|
+
Dir.chdir(@work_dir)
|
|
34
|
+
tmp_work_dir=@tmp_env.create_tmp_prj_dir
|
|
35
|
+
Dir.chdir((tmp_work_dir))
|
|
36
|
+
Guard::UI.stub(:info)
|
|
37
|
+
IO.stub(:popen)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
after(:each) do
|
|
41
|
+
Dir.chdir(@work_dir)
|
|
42
|
+
@tmp_env.cleanup_tmp_prj_dir
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "should inherit Guard class" do
|
|
46
|
+
subject.class.ancestors.should include(Guard::Guard)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
context "Run guard" do
|
|
50
|
+
|
|
51
|
+
it "should run build" do
|
|
52
|
+
|
|
53
|
+
guardfile_has_unit_test_exe()
|
|
54
|
+
popen_successfull_fake("make clean")
|
|
55
|
+
popen_successfull_fake("make 2>&1")
|
|
56
|
+
fake_test_exe("./#{File.basename(Dir.getwd)}_unit",:pass)
|
|
57
|
+
cguard = Guard::Cunit::Runner.new
|
|
58
|
+
setup_guard
|
|
59
|
+
cguard.run
|
|
60
|
+
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
it "should run build on changes " do
|
|
65
|
+
|
|
66
|
+
cguard = Guard::Cunit.new
|
|
67
|
+
cguard.stub(:run_all).and_return(true)
|
|
68
|
+
Guard::UI.should_receive(:info).with("Process changes in #{File.basename(Dir.getwd)}")
|
|
69
|
+
|
|
70
|
+
cguard.run_on_change("#{File.basename(Dir.getwd)}")
|
|
71
|
+
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
it "should set libpath for executbles with current project directory by default" do
|
|
75
|
+
oldenv=get_ld_path
|
|
76
|
+
|
|
77
|
+
guardfile_has_unit_test_exe(:test_exe=>"jiji")
|
|
78
|
+
popen_successfull_fake("make clean")
|
|
79
|
+
popen_successfull_fake("make 2>&1")
|
|
80
|
+
fake_test_exe("./jiji",:pass)
|
|
81
|
+
|
|
82
|
+
cguard = Guard::Cunit::Runner.new
|
|
83
|
+
setup_guard
|
|
84
|
+
cguard.run
|
|
85
|
+
newenv =get_ld_path
|
|
86
|
+
newenv.should include("#{oldenv}")
|
|
87
|
+
newenv.should include("#{Dir.getwd}")
|
|
88
|
+
get_ld_path=oldenv
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
it "should set libpath to predefined lib directory when user has specified such in the Guardfile" do
|
|
93
|
+
oldenv=get_ld_path
|
|
94
|
+
|
|
95
|
+
guardfile_has_unit_test_exe(:test_exe=>"jiji",:libdir=>'lib')
|
|
96
|
+
popen_successfull_fake("make clean")
|
|
97
|
+
popen_successfull_fake("make 2>&1")
|
|
98
|
+
fake_test_exe("./jiji",:pass)
|
|
99
|
+
|
|
100
|
+
cguard = Guard::Cunit::Runner.new
|
|
101
|
+
setup_guard
|
|
102
|
+
cguard.run
|
|
103
|
+
newenv =get_ld_path
|
|
104
|
+
newenv.should include("#{oldenv}")
|
|
105
|
+
newenv.should include("#{File.join(Dir.getwd,"lib")}")
|
|
106
|
+
get_ld_path=oldenv
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
it "should run cunit test define in the Guardfile" do
|
|
111
|
+
guardfile_has_unit_test_exe(:test_exe =>"didi")
|
|
112
|
+
|
|
113
|
+
popen_successfull_fake("make clean")
|
|
114
|
+
popen_successfull_fake("make 2>&1")
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
fake_test_exe("./didi",:pass)
|
|
118
|
+
cguard = Guard::Cunit::Runner.new
|
|
119
|
+
setup_guard
|
|
120
|
+
cguard.run
|
|
121
|
+
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
it "should run predefined build command" do
|
|
126
|
+
guardfile_has_unit_test_exe(:test_exe =>"jiji",:builder => "./make_all.sh")
|
|
127
|
+
fake_test_exe("./jiji",:pass)
|
|
128
|
+
popen_successfull_fake("./make_all.sh")
|
|
129
|
+
|
|
130
|
+
popen_successfull_fake("make clean")
|
|
131
|
+
|
|
132
|
+
cguard = Guard::Cunit::Runner.new
|
|
133
|
+
setup_guard
|
|
134
|
+
cguard.run
|
|
135
|
+
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
it "should run predefined clean command" do
|
|
139
|
+
guardfile_has_unit_test_exe(:test_exe =>"jiji",:builder => "./make_all.sh",:cleaner=> "./clean_all.sh")
|
|
140
|
+
fake_test_exe("./jiji",:pass)
|
|
141
|
+
popen_successfull_fake("./make_all.sh")
|
|
142
|
+
popen_successfull_fake("./clean_all.sh")
|
|
143
|
+
cguard = Guard::Cunit::Runner.new
|
|
144
|
+
setup_guard
|
|
145
|
+
cguard.run
|
|
146
|
+
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
context "Handle exit codes" do
|
|
153
|
+
it "should report failure on build failed" do
|
|
154
|
+
guardfile_has_unit_test_exe()
|
|
155
|
+
popen_successfull_fake("make clean")
|
|
156
|
+
popen_failing_fake("make 2>&1")
|
|
157
|
+
cguard = Guard::Cunit::Runner.new
|
|
158
|
+
setup_guard
|
|
159
|
+
cguard.run.should == false
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
it "should block further tasks on build failed" do
|
|
163
|
+
guardfile_has_unit_test_exe(:test_exe=>"jiji")
|
|
164
|
+
popen_successfull_fake("make clean")
|
|
165
|
+
popen_failing_fake("make 2>&1")
|
|
166
|
+
f = File.new("./jiji", "w+", 0666)
|
|
167
|
+
f.close
|
|
168
|
+
IO.stub(:popen).with("jiji".split << {:err=>[:child, :out]})
|
|
169
|
+
IO.should_not_receive(:popen).with("jiji".split << {:err=>[:child, :out]})
|
|
170
|
+
cguard = Guard::Cunit::Runner.new
|
|
171
|
+
setup_guard
|
|
172
|
+
cguard.run.should == false
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
it "should report failure on test failed" do
|
|
177
|
+
guardfile_has_unit_test_exe(:test_exe=>"jiji")
|
|
178
|
+
popen_successfull_fake("make clean")
|
|
179
|
+
popen_successfull_fake("make 2>&1")
|
|
180
|
+
fake_test_exe("./jiji",:fail)
|
|
181
|
+
cguard = Guard::Cunit::Runner.new
|
|
182
|
+
setup_guard
|
|
183
|
+
cguard.run.should == false
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
context "Displaying notifications" do
|
|
190
|
+
|
|
191
|
+
it "should display failure if build fails" do
|
|
192
|
+
Guard::Notifier.stub(:notify)
|
|
193
|
+
guardfile_has_unit_test_exe()
|
|
194
|
+
Guard::Notifier.should_receive(:notify).with("Failed", :title => "Build Failed", :image => :failed, :priority => 2)
|
|
195
|
+
popen_successfull_fake("make clean")
|
|
196
|
+
popen_failing_fake("make 2>&1")
|
|
197
|
+
cguard = Guard::Cunit::Runner.new
|
|
198
|
+
setup_guard
|
|
199
|
+
cguard.run
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
it "should display failure if test fails" do
|
|
203
|
+
IO.stub(:popen)
|
|
204
|
+
Guard::Notifier.stub(:notify)
|
|
205
|
+
guardfile_has_unit_test_exe(:test_exe=>"jiji")
|
|
206
|
+
Guard::Notifier.should_receive(:notify).with( anything(), :title => "Test Failed", :image => :failed, :priority => 2 )
|
|
207
|
+
popen_successfull_fake("make clean")
|
|
208
|
+
popen_successfull_fake("make 2>&1")
|
|
209
|
+
fake_test_exe("./jiji",:fail)
|
|
210
|
+
cguard = Guard::Cunit::Runner.new
|
|
211
|
+
setup_guard
|
|
212
|
+
cguard.run
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
it "should display pending if test is absent" do
|
|
216
|
+
Guard::Notifier.stub(:notify)
|
|
217
|
+
guardfile_has_unit_test_exe()
|
|
218
|
+
Guard::Notifier.should_receive(:notify).with("Pending", :title => "Test Not Defined", :image => :pending, :priority => 2)
|
|
219
|
+
popen_successfull_fake("make clean")
|
|
220
|
+
popen_successfull_fake("make 2>&1")
|
|
221
|
+
cguard = Guard::Cunit::Runner.new
|
|
222
|
+
setup_guard
|
|
223
|
+
cguard.run
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
it "should display success if build and test succeeded" do
|
|
227
|
+
Guard::Notifier.stub(:notify)
|
|
228
|
+
guardfile_has_unit_test_exe()
|
|
229
|
+
Guard::Notifier.should_receive(:notify).with("Success", :title => "Test Passed", :image => :passed, :priority => 2)
|
|
230
|
+
popen_successfull_fake("make clean")
|
|
231
|
+
popen_successfull_fake("make 2>&1")
|
|
232
|
+
fake_test_exe(nil,:pass)
|
|
233
|
+
cguard = Guard::Cunit::Runner.new
|
|
234
|
+
Guard.add_guard('cunit')
|
|
235
|
+
cguard.run
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
end
|
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
require 'rubygems'
|
|
2
|
+
require 'fileutils'
|
|
3
|
+
require 'pathname'
|
|
4
|
+
require 'guard'
|
|
5
|
+
require 'guard/cunit'
|
|
6
|
+
require 'guard/cunit/runner'
|
|
7
|
+
require 'guard/cunit/cunit_parser'
|
|
8
|
+
require 'rspec'
|
|
9
|
+
|
|
10
|
+
# a class to set/cleanup environment for fake project
|
|
11
|
+
class TempPrjEnv
|
|
12
|
+
def initialize
|
|
13
|
+
@test_tmp = (Pathname.new(Dir.getwd)+"tmp").to_s
|
|
14
|
+
@test_prj_dir= ((Pathname.new(Dir.getwd)+"tmp")+"1test_prj").to_s
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# create a tmp subdir and within it fake project directory
|
|
18
|
+
def create_tmp_prj_dir
|
|
19
|
+
begin
|
|
20
|
+
Dir.mkdir(@test_tmp,0777)
|
|
21
|
+
Dir.mkdir(@test_prj_dir,0777)
|
|
22
|
+
rescue Exception => e
|
|
23
|
+
puts "Could not make #{@test_tmp} dirs at #{Dir.getwd} - #{e.to_s}"
|
|
24
|
+
end
|
|
25
|
+
@test_prj_dir
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# cleanup the subdir
|
|
29
|
+
def cleanup_tmp_prj_dir
|
|
30
|
+
begin
|
|
31
|
+
FileUtils.rm_r(@test_tmp)
|
|
32
|
+
rescue Exception => e
|
|
33
|
+
puts "Could not remove dirs #{e.to_s}"
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
#define fake script to return given exit code
|
|
40
|
+
def fake_script(code)
|
|
41
|
+
|
|
42
|
+
case RUBY_PLATFORM
|
|
43
|
+
when /mingw/
|
|
44
|
+
`exit #{code}`
|
|
45
|
+
when /mswin/
|
|
46
|
+
`exit #{code}`
|
|
47
|
+
else
|
|
48
|
+
`(exit #{code})`
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
#wrapper for popen for different platforms
|
|
54
|
+
def popen_fake(fakename,exp_result)
|
|
55
|
+
|
|
56
|
+
if( RUBY_PLATFORM.match(/mingw/)||RUBY_PLATFORM.match(/mswin/)||RUBY_VERSION.match("1.8"))
|
|
57
|
+
pipe_args = fakename
|
|
58
|
+
else
|
|
59
|
+
pipe_args = fakename.split << {:err=>[:child, :out]}
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
IO.stub(:popen).with(pipe_args)
|
|
63
|
+
if exp_result == false
|
|
64
|
+
IO.should_receive(:popen).with(pipe_args) { fake_script(1) }
|
|
65
|
+
else
|
|
66
|
+
IO.should_receive(:popen).with(pipe_args) { fake_script(0) }
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
# setup stub for system command with successful exit result
|
|
72
|
+
def popen_successfull_fake(fakename)
|
|
73
|
+
popen_fake(fakename,true)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# setup stub for system command with failing exit result
|
|
77
|
+
def popen_failing_fake(fakename)
|
|
78
|
+
|
|
79
|
+
popen_fake(fakename,false)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# fake the test executable runner, its existance and result
|
|
83
|
+
def fake_test_exe(exe_name,successful = :fail)
|
|
84
|
+
exe_name="./#{File.basename(Dir.getwd)}_unit" unless exe_name != nil
|
|
85
|
+
f = File.new(exe_name, "w+", 0666)
|
|
86
|
+
f.close
|
|
87
|
+
if successful == :pass
|
|
88
|
+
popen_successfull_fake(exe_name)
|
|
89
|
+
else
|
|
90
|
+
popen_failing_fake(exe_name)
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# a generator for CUnit Guardfile
|
|
95
|
+
def guardfile_has_unit_test_exe(params={ :test_exe=>nil, :builder=>nil, :cleaner=>nil, :libdir=>nil})
|
|
96
|
+
File.open("Guardfile","w+",0644) do |file|
|
|
97
|
+
file.puts "guard \'cunit\' do"
|
|
98
|
+
|
|
99
|
+
file.puts " set_builder \"#{params[:builder]}\"" unless (params[:builder] == nil)
|
|
100
|
+
file.puts " set_cleaner \"#{params[:cleaner]}\"" unless (params[:cleaner] == nil)
|
|
101
|
+
file.puts " cunit_runner \"./#{params[:test_exe]}\"" unless (params[:test_exe] == nil)
|
|
102
|
+
file.puts " libdir \"#{params[:libdir]}\"" unless (params[:libdir] == nil)
|
|
103
|
+
|
|
104
|
+
file.puts ' watch(%r{((.+)\.c$)|((.+)\.h$)|((M|m)akefile$)} ) '
|
|
105
|
+
file.puts 'end'
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
metadata
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: guard-cunit
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
hash: 27
|
|
5
|
+
prerelease:
|
|
6
|
+
segments:
|
|
7
|
+
- 0
|
|
8
|
+
- 0
|
|
9
|
+
- 2
|
|
10
|
+
version: 0.0.2
|
|
11
|
+
platform: ruby
|
|
12
|
+
authors:
|
|
13
|
+
- Tea Cup On Rocking Chair
|
|
14
|
+
autorequire:
|
|
15
|
+
bindir: bin
|
|
16
|
+
cert_chain: []
|
|
17
|
+
|
|
18
|
+
date: 2012-12-02 00:00:00 Z
|
|
19
|
+
dependencies:
|
|
20
|
+
- !ruby/object:Gem::Dependency
|
|
21
|
+
type: :runtime
|
|
22
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
|
23
|
+
none: false
|
|
24
|
+
requirements:
|
|
25
|
+
- - ">="
|
|
26
|
+
- !ruby/object:Gem::Version
|
|
27
|
+
hash: 13
|
|
28
|
+
segments:
|
|
29
|
+
- 1
|
|
30
|
+
- 1
|
|
31
|
+
version: "1.1"
|
|
32
|
+
prerelease: false
|
|
33
|
+
name: guard
|
|
34
|
+
version_requirements: *id001
|
|
35
|
+
- !ruby/object:Gem::Dependency
|
|
36
|
+
type: :development
|
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
|
38
|
+
none: false
|
|
39
|
+
requirements:
|
|
40
|
+
- - ">="
|
|
41
|
+
- !ruby/object:Gem::Version
|
|
42
|
+
hash: 3
|
|
43
|
+
segments:
|
|
44
|
+
- 0
|
|
45
|
+
version: "0"
|
|
46
|
+
prerelease: false
|
|
47
|
+
name: bundler
|
|
48
|
+
version_requirements: *id002
|
|
49
|
+
- !ruby/object:Gem::Dependency
|
|
50
|
+
type: :development
|
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
|
52
|
+
none: false
|
|
53
|
+
requirements:
|
|
54
|
+
- - ">="
|
|
55
|
+
- !ruby/object:Gem::Version
|
|
56
|
+
hash: 3
|
|
57
|
+
segments:
|
|
58
|
+
- 0
|
|
59
|
+
version: "0"
|
|
60
|
+
prerelease: false
|
|
61
|
+
name: rspec
|
|
62
|
+
version_requirements: *id003
|
|
63
|
+
description: Guard Cunit should automatically build your C project and run CUnit based tests
|
|
64
|
+
email:
|
|
65
|
+
- strandjata@gmail.com
|
|
66
|
+
executables: []
|
|
67
|
+
|
|
68
|
+
extensions: []
|
|
69
|
+
|
|
70
|
+
extra_rdoc_files: []
|
|
71
|
+
|
|
72
|
+
files:
|
|
73
|
+
- .travis.yml
|
|
74
|
+
- CHANGELOG.md
|
|
75
|
+
- Gemfile
|
|
76
|
+
- Guardfile
|
|
77
|
+
- README.md
|
|
78
|
+
- Rakefile
|
|
79
|
+
- guard-cunit.gemspec
|
|
80
|
+
- lib/guard/cunit.rb
|
|
81
|
+
- lib/guard/cunit/cunit_parser.rb
|
|
82
|
+
- lib/guard/cunit/runner.rb
|
|
83
|
+
- lib/guard/cunit/templates/Guardfile
|
|
84
|
+
- lib/guard/cunit/version.rb
|
|
85
|
+
- spec/guard_cunit_parser_spec.rb
|
|
86
|
+
- spec/guard_cunit_spec.rb
|
|
87
|
+
- spec/spec_helper.rb
|
|
88
|
+
homepage: http://teacup-on-rockingchair.github.com/guard-cunit/
|
|
89
|
+
licenses: []
|
|
90
|
+
|
|
91
|
+
post_install_message:
|
|
92
|
+
rdoc_options: []
|
|
93
|
+
|
|
94
|
+
require_paths:
|
|
95
|
+
- lib
|
|
96
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
97
|
+
none: false
|
|
98
|
+
requirements:
|
|
99
|
+
- - ">="
|
|
100
|
+
- !ruby/object:Gem::Version
|
|
101
|
+
hash: 3
|
|
102
|
+
segments:
|
|
103
|
+
- 0
|
|
104
|
+
version: "0"
|
|
105
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
|
+
none: false
|
|
107
|
+
requirements:
|
|
108
|
+
- - ">="
|
|
109
|
+
- !ruby/object:Gem::Version
|
|
110
|
+
hash: 3
|
|
111
|
+
segments:
|
|
112
|
+
- 0
|
|
113
|
+
version: "0"
|
|
114
|
+
requirements: []
|
|
115
|
+
|
|
116
|
+
rubyforge_project: guard-cunit
|
|
117
|
+
rubygems_version: 1.8.24
|
|
118
|
+
signing_key:
|
|
119
|
+
specification_version: 3
|
|
120
|
+
summary: Guard gem for CUnit-driven projects
|
|
121
|
+
test_files: []
|
|
122
|
+
|