jasmine-headless-webkit 0.1.0 → 0.2.0
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/CHANGELOG.md +8 -0
- data/README.md +2 -92
- data/bin/jasmine-headless-webkit +30 -21
- data/coffee.watchr +18 -0
- data/ext/jasmine-webkit-specrunner/specrunner.cpp +75 -48
- data/jasmine/jasmine.headless-reporter.coffee +44 -0
- data/jasmine/jasmine.headless-reporter.js +79 -0
- data/lib/autotest/jasmine_mixin.rb +2 -1
- data/lib/jasmine/cli.rb +17 -7
- data/lib/jasmine/headless/railtie.rb +14 -0
- data/lib/jasmine/headless/task.rb +20 -0
- data/lib/jasmine-headless-webkit/version.rb +1 -1
- data/lib/jasmine-headless-webkit.rb +3 -1
- data/spec/bin/jasmine-headless-webkit_spec.rb +3 -3
- data/spec/lib/jasmine/cli_spec.rb +34 -7
- metadata +8 -2
data/CHANGELOG.md
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
## 0.2.0
|
2
|
+
|
3
|
+
* Add a Rake task and a default task for Rails
|
4
|
+
* Global runner configuration via ~/.jasmine-headless-webkit
|
5
|
+
* Custom Jasmine reporter for better user feedback
|
6
|
+
* Specify the specs to be run, instead of always running them all
|
7
|
+
* Move README to gh-pages site
|
8
|
+
|
data/README.md
CHANGED
@@ -2,98 +2,8 @@
|
|
2
2
|
|
3
3
|
Run your specs at sonic boom speed! No pesky reload button or page rendering slowdowns!
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
This gem works with projects that have used the [Jasmine gem](https://github.com/pivotal/jasmine-gem) to
|
8
|
-
create a `jasmine.yml` file that defines what to test. The runner loads that
|
9
|
-
`jasmine.yml` file and executes the tests defined within in a Qt WebKit widget, displaying the results
|
10
|
-
to the console and setting the exit code to one of the following:
|
11
|
-
|
12
|
-
* 0 for success
|
13
|
-
* 1 for spec run failure
|
14
|
-
* 2 for spec run success, but `console.log` was called during the run
|
15
|
-
|
16
|
-
`console.log` works, too, so you can run your specs side-by-side in a browser if you're so inclined. It
|
17
|
-
serializes whatever you're passing in as as JSON string, so objects that are cyclical in nature will not
|
18
|
-
serialize. If anyone has a good solution for this, please suggest and/or fork'n'fix.
|
19
|
-
|
20
|
-
## Installation
|
21
|
-
|
22
|
-
`gem install jasmine-headless-webkit` or use Bundler.
|
23
|
-
|
24
|
-
Installation requires Qt 4.7. See [senchalabs/examples](https://github.com/senchalabs/examples) and [my fork
|
25
|
-
of examples](https://github.com/johnbintz/examples) for more information on the QtWebKit runner.
|
26
|
-
|
27
|
-
Tested in the following environments:
|
28
|
-
|
29
|
-
* Mac OS X 10.6, with MacPorts Qt and Nokia Qt.mpkg
|
30
|
-
* Kubuntu 10.10
|
31
|
-
|
32
|
-
Let me know via a message or in the Issues section if it works on your setup and it's not listed!
|
33
|
-
|
34
|
-
## Usage
|
35
|
-
|
36
|
-
jasmine-headless-webkit [options] [path to jasmine.yml, defaults to spec/javascripts/support/jasmine.yml]
|
37
|
-
|
38
|
-
Current supported options:
|
39
|
-
|
40
|
-
* `-c`/`--colors` enables color output
|
41
|
-
* `--no-colors` disables color output
|
42
|
-
* `--keep` preserves the temporary HTML document if an error occurs in testing
|
43
|
-
|
44
|
-
These options can also be placed into a `.jasmine-headless-webkit` file in your project root.
|
45
|
-
|
46
|
-
### CoffeeScript Support
|
47
|
-
|
48
|
-
`jasmine-headless-webkit` brings in the `coffee-script` gem and compiles & injects all CoffeeScript into the
|
49
|
-
generated HTML page. All you need to do is configure your `jasmine.yml` file to look for .coffee files:
|
50
|
-
|
51
|
-
src_files:
|
52
|
-
- app/assets/javascripts/**/*.coffee
|
53
|
-
spec_files:
|
54
|
-
- **/*[sS]pec.coffee
|
55
|
-
|
56
|
-
*(This will probably make it difficult to test your code in an official Jasmine server for now. You can try
|
57
|
-
[a technique like this](https://github.com/jbaudanza/rack-asset-compiler/blob/master/examples/jasmine_config.rb) for compiling CoffeeScript when it's requested from the server
|
58
|
-
or use [this fork of jasmine-gem](https://github.com/johnbintz/jasmine-gem/tree/coffeescript-inline-support) which
|
59
|
-
is thoroughly untested.)*
|
60
|
-
|
61
|
-
You will get line numbers on compile errors, but not logic errors. This is a CoffeeScript thing, and they're working on it. :)
|
62
|
-
|
63
|
-
### JavaScript Dialogs
|
64
|
-
|
65
|
-
You can call `alert()` and `confirm()` in your code. `alert()` will print the message to the console, and
|
66
|
-
`confirm()` will always return true. There's no way right now to respond to `confirm()`, so it's best to
|
67
|
-
mock that call:
|
68
|
-
|
69
|
-
spyOn(window, 'confirm').andReturn(false);
|
70
|
-
|
71
|
-
### Autotest Integration
|
72
|
-
|
73
|
-
`jasmine-headless-webkit` can integrate with Autotest. Your `jasmine.yml` file needs to be in the default
|
74
|
-
path, and you have to be ready to use a very alpha implementation of the feature. If used with RSpec 2,
|
75
|
-
Jasmine tests run after RSpec tests.
|
76
|
-
|
77
|
-
You need to create a `.jasmine-headless-webkit` file in your project root for this integration
|
78
|
-
to work.
|
79
|
-
|
80
|
-
`jasmine-headless-webkit` provides two new hooks: `:run_jasmine` and `:ran_jasmine` for before and after the
|
81
|
-
Jasmine specs have run. This is a good place to do things like re-package all your assets using
|
82
|
-
[Jammit](http://documentcloud.github.com/jammit/):
|
83
|
-
|
84
|
-
Autotest.add_hook(:run_jasmine) do |at|
|
85
|
-
system %{jammit}
|
86
|
-
end
|
87
|
-
|
88
|
-
### Server Interaction
|
89
|
-
|
90
|
-
`jasmine-headless-webkit` works the same as if you create an HTML file, manually load the Jasmine library and
|
91
|
-
your code & tests into the page, and open that page in a browser. Because of this, there's no way to handle
|
92
|
-
server interaction with your application or with a Jasmine server. If you need to test server interaction,
|
93
|
-
do one of the following:
|
94
|
-
|
95
|
-
* Stub your server responses using [Sinon.JS](http://sinonjs.org/)
|
96
|
-
* Use [PhantomJS](http://www.phantomjs.org/) against a running copy of a Jasmine server, instead of this project
|
5
|
+
http://johnbintz.github.com/jasmine-headless-webkit/ has the most up-to-date information on using
|
6
|
+
this project. You can see the source of that site on the gh-pages branch.
|
97
7
|
|
98
8
|
## License
|
99
9
|
|
data/bin/jasmine-headless-webkit
CHANGED
@@ -9,10 +9,6 @@ require 'yaml'
|
|
9
9
|
require 'fileutils'
|
10
10
|
require 'getoptlong'
|
11
11
|
|
12
|
-
gem 'jasmine'
|
13
|
-
gem 'coffee-script'
|
14
|
-
gem 'rainbow'
|
15
|
-
|
16
12
|
require 'jasmine'
|
17
13
|
require 'coffee-script'
|
18
14
|
require 'rainbow'
|
@@ -20,16 +16,27 @@ require 'rainbow'
|
|
20
16
|
require 'jasmine/cli'
|
21
17
|
include Jasmine::CLI
|
22
18
|
|
19
|
+
if !File.file?(File.join(gem_dir, RUNNER))
|
20
|
+
puts "The Qt WebKit widget is not compiled! Try re-installing this gem."
|
21
|
+
exit 1
|
22
|
+
end
|
23
|
+
|
23
24
|
opts = GetoptLong.new(
|
24
25
|
[ '--colors', '-c', GetoptLong::NO_ARGUMENT ],
|
25
26
|
[ '--no-colors', GetoptLong::NO_ARGUMENT ],
|
26
|
-
[ '--keep', GetoptLong::NO_ARGUMENT ]
|
27
|
+
[ '--keep', GetoptLong::NO_ARGUMENT ],
|
28
|
+
[ '--jasmine-config', '-j', GetoptLong::REQUIRED_ARGUMENT ]
|
27
29
|
)
|
28
30
|
|
29
|
-
options = {
|
31
|
+
options = {
|
32
|
+
:colors => false,
|
33
|
+
:remove_html_file => true,
|
34
|
+
:jasmine_config => 'spec/javascripts/support/jasmine.yml'
|
35
|
+
}
|
30
36
|
|
31
37
|
@process_options = lambda { |*args|
|
32
|
-
opt = args.flatten
|
38
|
+
opt, arg = args.flatten[0..1]
|
39
|
+
|
33
40
|
case opt
|
34
41
|
when '--colors', '-c'
|
35
42
|
options[:colors] = true
|
@@ -37,37 +44,39 @@ options = { :colors => false, :remove_html_file => true }
|
|
37
44
|
options[:colors] = false
|
38
45
|
when '--keep', '-k'
|
39
46
|
options[:remove_html_file] = false
|
47
|
+
when '--jasmine-config', '-j'
|
48
|
+
options[:jasmine_config] = arg
|
40
49
|
end
|
41
50
|
}
|
42
51
|
|
43
|
-
|
52
|
+
read_defaults_files!
|
44
53
|
opts.each(&@process_options)
|
54
|
+
@spec_filter = ARGV.dup
|
45
55
|
|
46
|
-
data = YAML.load_file(
|
47
|
-
|
48
|
-
if !File.file?(File.join(gem_dir, RUNNER))
|
49
|
-
puts "The Qt WebKit widget is not compiled! Try re-installing this gem."
|
50
|
-
exit 1
|
51
|
-
end
|
56
|
+
data = YAML.load_file(options[:jasmine_config])
|
52
57
|
|
53
58
|
puts "Running Jasmine specs..."
|
54
59
|
|
55
60
|
files = %w{jasmine jasmine-html}.collect { |name| File.join(Jasmine.root, "lib/#{name}.js") }
|
61
|
+
files << File.join(gem_dir, 'jasmine/jasmine.headless-reporter.js')
|
56
62
|
|
57
|
-
|
58
|
-
data[searches] ||= DEFAULTS[searches]
|
59
|
-
|
63
|
+
[ [ 'src_files', 'src_dir' ], [ 'stylesheets', 'src_dir' ], [ 'helpers', 'spec_dir' ], [ 'spec_files', 'spec_dir' ] ].each do |searches, root|
|
64
|
+
if data[searches] ||= DEFAULTS[searches]
|
65
|
+
data[root] ||= DEFAULTS[root]
|
60
66
|
|
61
|
-
if data[searches]
|
62
67
|
data[searches].collect do |search|
|
63
68
|
path = search
|
64
69
|
path = File.join(data[root], path) if data[root]
|
65
|
-
Dir[path]
|
70
|
+
found_files = Dir[path]
|
71
|
+
if searches == 'spec_files'
|
72
|
+
found_files = found_files.find_all { |file| use_spec?(file) }
|
73
|
+
end
|
74
|
+
files += found_files
|
66
75
|
end
|
67
76
|
end
|
68
77
|
end
|
69
78
|
|
70
|
-
files = files.
|
79
|
+
files = files.collect { |file|
|
71
80
|
case File.extname(file)
|
72
81
|
when '.js'
|
73
82
|
%{<script type="text/javascript" src="#{file}"></script>}
|
@@ -75,7 +84,7 @@ files = files.flatten.compact.collect { |file|
|
|
75
84
|
begin
|
76
85
|
%{<script type="text/javascript">#{CoffeeScript.compile(fh = File.open(file))}</script>}
|
77
86
|
rescue CoffeeScript::CompilationError => e
|
78
|
-
puts "[%s] %s: %s" % [ 'coffeescript'.color(:red), file.color(:yellow), e.message.color(:white) ]
|
87
|
+
puts "[%s] %s: %s" % [ 'coffeescript'.color(:red), file.color(:yellow), e.message.to_s.color(:white) ]
|
79
88
|
exit 1
|
80
89
|
ensure
|
81
90
|
fh.close
|
data/coffee.watchr
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'coffee-script'
|
2
|
+
|
3
|
+
FILE = 'jasmine/jasmine.headless-reporter.coffee' if !self.class.const_defined?(:FILE)
|
4
|
+
TARGET = FILE.gsub('.coffee', '.js') if !self.class.const_defined?(:TARGET)
|
5
|
+
|
6
|
+
watch(FILE) { coffee }
|
7
|
+
|
8
|
+
def coffee
|
9
|
+
begin
|
10
|
+
File.open(TARGET, 'w') { |fh| fh.print CoffeeScript.compile File.open(FILE) }
|
11
|
+
puts "Wrote #{TARGET}"
|
12
|
+
rescue Exception => e
|
13
|
+
puts e.message
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
coffee
|
18
|
+
|
@@ -66,7 +66,11 @@ public:
|
|
66
66
|
void setColors(bool colors);
|
67
67
|
public slots:
|
68
68
|
void log(const QString &msg);
|
69
|
-
void
|
69
|
+
void specPassed();
|
70
|
+
void specFailed();
|
71
|
+
void printName(const QString &name);
|
72
|
+
void printResult(const QString &result);
|
73
|
+
void finishSuite(const QString &duration, const QString &total, const QString& failed);
|
70
74
|
private slots:
|
71
75
|
void watch(bool ok);
|
72
76
|
void errorLog(const QString &msg, int lineNumber, const QString &sourceID);
|
@@ -81,6 +85,9 @@ private:
|
|
81
85
|
bool hasErrors;
|
82
86
|
bool usedConsole;
|
83
87
|
bool showColors;
|
88
|
+
bool isFinished;
|
89
|
+
bool didFail;
|
90
|
+
bool consoleNotUsedThisRun;
|
84
91
|
|
85
92
|
void red();
|
86
93
|
void green();
|
@@ -94,6 +101,9 @@ HeadlessSpecRunner::HeadlessSpecRunner()
|
|
94
101
|
, hasErrors(false)
|
95
102
|
, usedConsole(false)
|
96
103
|
, showColors(false)
|
104
|
+
, isFinished(false)
|
105
|
+
, didFail(false)
|
106
|
+
, consoleNotUsedThisRun(false)
|
97
107
|
{
|
98
108
|
m_page.settings()->enablePersistentStorage();
|
99
109
|
connect(&m_page, SIGNAL(loadFinished(bool)), this, SLOT(watch(bool)));
|
@@ -104,7 +114,7 @@ HeadlessSpecRunner::HeadlessSpecRunner()
|
|
104
114
|
void HeadlessSpecRunner::load(const QString &spec)
|
105
115
|
{
|
106
116
|
m_ticker.stop();
|
107
|
-
m_page.mainFrame()->addToJavaScriptWindowObject("
|
117
|
+
m_page.mainFrame()->addToJavaScriptWindowObject("JHW", this);
|
108
118
|
m_page.mainFrame()->load(spec);
|
109
119
|
m_page.setPreferredContentsSize(QSize(1024, 600));
|
110
120
|
}
|
@@ -152,6 +162,25 @@ void HeadlessSpecRunner::clear()
|
|
152
162
|
if (showColors) std::cout << "\033[m";
|
153
163
|
}
|
154
164
|
|
165
|
+
void HeadlessSpecRunner::specPassed()
|
166
|
+
{
|
167
|
+
consoleNotUsedThisRun = true;
|
168
|
+
green();
|
169
|
+
std::cout << '.';
|
170
|
+
clear();
|
171
|
+
fflush(stdout);
|
172
|
+
}
|
173
|
+
|
174
|
+
void HeadlessSpecRunner::specFailed()
|
175
|
+
{
|
176
|
+
consoleNotUsedThisRun = true;
|
177
|
+
didFail = true;
|
178
|
+
red();
|
179
|
+
std::cout << 'F';
|
180
|
+
clear();
|
181
|
+
fflush(stdout);
|
182
|
+
}
|
183
|
+
|
155
184
|
void HeadlessSpecRunner::errorLog(const QString &msg, int lineNumber, const QString &sourceID)
|
156
185
|
{
|
157
186
|
red();
|
@@ -177,39 +206,48 @@ void HeadlessSpecRunner::log(const QString &msg)
|
|
177
206
|
{
|
178
207
|
usedConsole = true;
|
179
208
|
green();
|
209
|
+
if (consoleNotUsedThisRun) {
|
210
|
+
std::cout << std::endl;
|
211
|
+
consoleNotUsedThisRun = false;
|
212
|
+
}
|
180
213
|
std::cout << "[console] ";
|
181
214
|
clear();
|
182
215
|
std::cout << qPrintable(msg);
|
183
216
|
std::cout << std::endl;
|
184
217
|
}
|
185
218
|
|
186
|
-
void HeadlessSpecRunner::
|
219
|
+
void HeadlessSpecRunner::printName(const QString &name)
|
187
220
|
{
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
} else {
|
193
|
-
yellow();
|
194
|
-
}
|
195
|
-
std::cout << qPrintable(msg);
|
196
|
-
clear();
|
197
|
-
std::cout << std::endl;
|
221
|
+
std::cout << std::endl << std::endl;
|
222
|
+
red();
|
223
|
+
std::cout << qPrintable(name) << std::endl;
|
224
|
+
clear();
|
198
225
|
}
|
199
226
|
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
227
|
+
void HeadlessSpecRunner::printResult(const QString &result)
|
228
|
+
{
|
229
|
+
red();
|
230
|
+
std::cout << " " << qPrintable(result) << std::endl;
|
231
|
+
clear();
|
232
|
+
}
|
233
|
+
|
234
|
+
void HeadlessSpecRunner::finishSuite(const QString &duration, const QString &total, const QString& failed)
|
235
|
+
{
|
236
|
+
std::cout << std::endl;
|
237
|
+
if (didFail) {
|
238
|
+
red();
|
239
|
+
std::cout << "FAIL: ";
|
240
|
+
} else {
|
241
|
+
green();
|
242
|
+
std::cout << "PASS: ";
|
243
|
+
}
|
244
|
+
|
245
|
+
std::cout << qPrintable(total) << " tests, " << qPrintable(failed) << " failures, " << qPrintable(duration) << " secs.";
|
246
|
+
clear();
|
247
|
+
std::cout << std::endl;
|
248
|
+
|
249
|
+
isFinished = true;
|
250
|
+
}
|
213
251
|
|
214
252
|
void HeadlessSpecRunner::timerEvent(QTimerEvent *event)
|
215
253
|
{
|
@@ -222,28 +260,17 @@ void HeadlessSpecRunner::timerEvent(QTimerEvent *event)
|
|
222
260
|
QApplication::instance()->exit(1);
|
223
261
|
|
224
262
|
if (!hasErrors) {
|
225
|
-
if (
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
}
|
237
|
-
|
238
|
-
if (hasElement(".runner.failed")) {
|
239
|
-
QWebElement desc = m_page.mainFrame()->findFirstElement(".description");
|
240
|
-
red();
|
241
|
-
std::cout << "FAIL: " << qPrintable(desc.toPlainText());
|
242
|
-
clear();
|
243
|
-
std::cout << std::endl;
|
244
|
-
m_page.mainFrame()->evaluateJavaScript(DUMP_MSG);
|
245
|
-
QApplication::instance()->exit(1);
|
246
|
-
return;
|
263
|
+
if (isFinished) {
|
264
|
+
int exitCode = 0;
|
265
|
+
if (didFail) {
|
266
|
+
exitCode = 1;
|
267
|
+
} else {
|
268
|
+
if (usedConsole) {
|
269
|
+
exitCode = 2;
|
270
|
+
}
|
271
|
+
}
|
272
|
+
|
273
|
+
QApplication::instance()->exit(exitCode);
|
247
274
|
}
|
248
275
|
|
249
276
|
if (m_runs > 30) {
|
@@ -0,0 +1,44 @@
|
|
1
|
+
if !jasmine?
|
2
|
+
throw new Exception("jasmine not laoded!")
|
3
|
+
|
4
|
+
class HeadlessReporterResult
|
5
|
+
constructor: (name) ->
|
6
|
+
@name = name
|
7
|
+
@results = []
|
8
|
+
addResult: (message) ->
|
9
|
+
@results.push(message)
|
10
|
+
print: ->
|
11
|
+
JHW.printName(@name)
|
12
|
+
for result in @results
|
13
|
+
do (result) =>
|
14
|
+
JHW.printResult(result)
|
15
|
+
|
16
|
+
class jasmine.HeadlessReporter
|
17
|
+
constructor: ->
|
18
|
+
@results = []
|
19
|
+
@failedCount = 0
|
20
|
+
@length = 0
|
21
|
+
reportRunnerResults: (runner) ->
|
22
|
+
for result in @results
|
23
|
+
do (result) =>
|
24
|
+
result.print()
|
25
|
+
|
26
|
+
JHW.finishSuite((new Date() - @startTime) / 1000.0, @length, @failedCount)
|
27
|
+
reportRunnerStarting: (runner) ->
|
28
|
+
@startTime = new Date()
|
29
|
+
reportSpecResults: (spec) ->
|
30
|
+
results = spec.results()
|
31
|
+
if results.passed()
|
32
|
+
JHW.specPassed()
|
33
|
+
else
|
34
|
+
JHW.specFailed()
|
35
|
+
failureResult = new HeadlessReporterResult(spec.getFullName())
|
36
|
+
for result in results.getItems()
|
37
|
+
do (result) =>
|
38
|
+
if result.type == 'expect' and !result.passed_
|
39
|
+
@failedCount += 1
|
40
|
+
failureResult.addResult(result.message)
|
41
|
+
@results.push(failureResult)
|
42
|
+
reportSpecStarting: (spec) ->
|
43
|
+
reportSuiteResults: (suite) ->
|
44
|
+
@length += suite.specs().length
|
@@ -0,0 +1,79 @@
|
|
1
|
+
(function() {
|
2
|
+
var HeadlessReporterResult;
|
3
|
+
var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
|
4
|
+
if (!(typeof jasmine !== "undefined" && jasmine !== null)) {
|
5
|
+
throw new Exception("jasmine not laoded!");
|
6
|
+
}
|
7
|
+
HeadlessReporterResult = (function() {
|
8
|
+
function HeadlessReporterResult(name) {
|
9
|
+
this.name = name;
|
10
|
+
this.results = [];
|
11
|
+
}
|
12
|
+
HeadlessReporterResult.prototype.addResult = function(message) {
|
13
|
+
return this.results.push(message);
|
14
|
+
};
|
15
|
+
HeadlessReporterResult.prototype.print = function() {
|
16
|
+
var result, _i, _len, _ref, _results;
|
17
|
+
JHW.printName(this.name);
|
18
|
+
_ref = this.results;
|
19
|
+
_results = [];
|
20
|
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
21
|
+
result = _ref[_i];
|
22
|
+
_results.push(__bind(function(result) {
|
23
|
+
return JHW.printResult(result);
|
24
|
+
}, this)(result));
|
25
|
+
}
|
26
|
+
return _results;
|
27
|
+
};
|
28
|
+
return HeadlessReporterResult;
|
29
|
+
})();
|
30
|
+
jasmine.HeadlessReporter = (function() {
|
31
|
+
function HeadlessReporter() {
|
32
|
+
this.results = [];
|
33
|
+
this.failedCount = 0;
|
34
|
+
this.length = 0;
|
35
|
+
}
|
36
|
+
HeadlessReporter.prototype.reportRunnerResults = function(runner) {
|
37
|
+
var result, _fn, _i, _len, _ref;
|
38
|
+
_ref = this.results;
|
39
|
+
_fn = __bind(function(result) {
|
40
|
+
return result.print();
|
41
|
+
}, this);
|
42
|
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
43
|
+
result = _ref[_i];
|
44
|
+
_fn(result);
|
45
|
+
}
|
46
|
+
return JHW.finishSuite((new Date() - this.startTime) / 1000.0, this.length, this.failedCount);
|
47
|
+
};
|
48
|
+
HeadlessReporter.prototype.reportRunnerStarting = function(runner) {
|
49
|
+
return this.startTime = new Date();
|
50
|
+
};
|
51
|
+
HeadlessReporter.prototype.reportSpecResults = function(spec) {
|
52
|
+
var failureResult, result, results, _fn, _i, _len, _ref;
|
53
|
+
results = spec.results();
|
54
|
+
if (results.passed()) {
|
55
|
+
return JHW.specPassed();
|
56
|
+
} else {
|
57
|
+
JHW.specFailed();
|
58
|
+
failureResult = new HeadlessReporterResult(spec.getFullName());
|
59
|
+
_ref = results.getItems();
|
60
|
+
_fn = __bind(function(result) {
|
61
|
+
if (result.type === 'expect' && !result.passed_) {
|
62
|
+
this.failedCount += 1;
|
63
|
+
return failureResult.addResult(result.message);
|
64
|
+
}
|
65
|
+
}, this);
|
66
|
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
67
|
+
result = _ref[_i];
|
68
|
+
_fn(result);
|
69
|
+
}
|
70
|
+
return this.results.push(failureResult);
|
71
|
+
}
|
72
|
+
};
|
73
|
+
HeadlessReporter.prototype.reportSpecStarting = function(spec) {};
|
74
|
+
HeadlessReporter.prototype.reportSuiteResults = function(suite) {
|
75
|
+
return this.length += suite.specs().length;
|
76
|
+
};
|
77
|
+
return HeadlessReporter;
|
78
|
+
})();
|
79
|
+
}).call(this);
|
@@ -87,7 +87,8 @@ module JasmineMixin
|
|
87
87
|
end
|
88
88
|
|
89
89
|
def make_jasmine_cmd
|
90
|
-
|
90
|
+
self.files_to_test.empty? ? '' :
|
91
|
+
%{#{JASMINE_PROGRAM} #{self.files_to_test.keys.collect { |key| %{'#{key}'} }.join(' ')}}.tap { |o| p o }
|
91
92
|
end
|
92
93
|
|
93
94
|
def setup_jasmine_project_mappings
|
data/lib/jasmine/cli.rb
CHANGED
@@ -11,17 +11,22 @@ module Jasmine
|
|
11
11
|
|
12
12
|
RUNNER = 'ext/jasmine-webkit-specrunner/jasmine-webkit-specrunner'
|
13
13
|
DEFAULTS_FILE = '.jasmine-headless-webkit'
|
14
|
+
GLOBAL_DEFAULTS_FILE = File.expand_path("~/#{DEFAULTS_FILE}")
|
14
15
|
|
15
16
|
def process_jasmine_config(overrides = {})
|
16
17
|
DEFAULTS.merge(overrides)
|
17
18
|
end
|
18
19
|
|
19
|
-
def
|
20
|
-
|
20
|
+
def read_defaults_files!
|
21
|
+
[ GLOBAL_DEFAULTS_FILE, DEFAULTS_FILE ].each do |file|
|
22
|
+
if File.file?(file)
|
23
|
+
File.readlines(file).collect { |line| line.strip.split(' ', 2) }.each(&@process_options)
|
24
|
+
end
|
25
|
+
end
|
21
26
|
end
|
22
27
|
|
23
|
-
def
|
24
|
-
|
28
|
+
def use_spec?(file)
|
29
|
+
@spec_filter.empty? || @spec_filter.include?(file)
|
25
30
|
end
|
26
31
|
|
27
32
|
def jasmine_html_template(files)
|
@@ -31,14 +36,14 @@ module Jasmine
|
|
31
36
|
<head>
|
32
37
|
<title>Jasmine Test Runner</title>
|
33
38
|
<script type="text/javascript">
|
34
|
-
window.console = { log: function(data) {
|
39
|
+
window.console = { log: function(data) { JHW.log(JSON.stringify(data)); } };
|
35
40
|
</script>
|
36
|
-
|
41
|
+
#{files.join("\n")}
|
37
42
|
</head>
|
38
43
|
<body>
|
39
44
|
|
40
45
|
<script type="text/javascript">
|
41
|
-
jasmine.getEnv().addReporter(new jasmine.
|
46
|
+
jasmine.getEnv().addReporter(new jasmine.HeadlessReporter());
|
42
47
|
jasmine.getEnv().execute();
|
43
48
|
</script>
|
44
49
|
|
@@ -46,6 +51,11 @@ module Jasmine
|
|
46
51
|
</html>
|
47
52
|
HTML
|
48
53
|
end
|
54
|
+
|
55
|
+
private
|
56
|
+
def read_config_file(file)
|
57
|
+
|
58
|
+
end
|
49
59
|
end
|
50
60
|
end
|
51
61
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Jasmine
|
2
|
+
module Headless
|
3
|
+
class Task
|
4
|
+
attr_accessor :colors, :keep_on_error, :jasmine_config
|
5
|
+
|
6
|
+
def initialize(name = 'jasmine:headless')
|
7
|
+
@colors = false
|
8
|
+
@keep_on_error = false
|
9
|
+
@jasmine_config = nil
|
10
|
+
|
11
|
+
yield self if block_given?
|
12
|
+
|
13
|
+
desc 'Run Jasmine specs headlessly'
|
14
|
+
task name do
|
15
|
+
system %{jasmine-headless-webkit #{@colors ? "-c" : "--no-colors"} #{@keep_on_error ? "--keep" : ""} #{@jasmine_config ? "-j #{@jasmine_config}" : ""}}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -3,21 +3,21 @@ require 'spec_helper'
|
|
3
3
|
describe "jasmine-headless-webkit" do
|
4
4
|
describe 'success' do
|
5
5
|
it "should succeed with error code 0" do
|
6
|
-
%x{bin/jasmine-headless-webkit spec/jasmine/success/success.yml}
|
6
|
+
%x{bin/jasmine-headless-webkit -j spec/jasmine/success/success.yml}
|
7
7
|
$?.exitstatus.should == 0
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
11
|
describe 'failure' do
|
12
12
|
it "should fail with an error code of 1" do
|
13
|
-
%x{bin/jasmine-headless-webkit spec/jasmine/failure/failure.yml}
|
13
|
+
%x{bin/jasmine-headless-webkit -j spec/jasmine/failure/failure.yml}
|
14
14
|
$?.exitstatus.should == 1
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
18
|
describe 'with console.log' do
|
19
19
|
it "should succeed, but has a console.log so an error code of 2" do
|
20
|
-
%x{bin/jasmine-headless-webkit spec/jasmine/console_log/console_log.yml}
|
20
|
+
%x{bin/jasmine-headless-webkit -j spec/jasmine/console_log/console_log.yml}
|
21
21
|
$?.exitstatus.should == 2
|
22
22
|
end
|
23
23
|
end
|
@@ -41,22 +41,49 @@ describe Jasmine::CLI do
|
|
41
41
|
end
|
42
42
|
|
43
43
|
describe '#read_defaults_file' do
|
44
|
-
let(:
|
44
|
+
let(:global_test_data) { %w{first second} }
|
45
|
+
let(:test_data) { %w{third fourth} }
|
45
46
|
|
46
47
|
before do
|
48
|
+
File.open(GLOBAL_DEFAULTS_FILE, 'w') { |fh| fh.puts global_test_data.join(' ') }
|
47
49
|
File.open(DEFAULTS_FILE, 'w') { |fh| fh.puts test_data.join(' ') }
|
48
50
|
end
|
49
51
|
|
50
52
|
it "should read the options" do
|
51
|
-
|
53
|
+
all_data = []
|
54
|
+
@process_options = lambda { |*args| all_data << args.flatten }
|
52
55
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
+
read_defaults_files!
|
57
|
+
|
58
|
+
all_data.should == [ global_test_data, test_data ]
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe '#use_spec?' do
|
63
|
+
let(:spec_file) { 'my/spec.js' }
|
64
|
+
|
65
|
+
context 'no filter provided' do
|
66
|
+
before do
|
67
|
+
@spec_filter = []
|
68
|
+
end
|
56
69
|
|
57
|
-
|
70
|
+
it "should allow the spec" do
|
71
|
+
use_spec?(spec_file).should be_true
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context 'filter provided' do
|
76
|
+
before do
|
77
|
+
@spec_filter = [ spec_file ]
|
78
|
+
end
|
58
79
|
|
59
|
-
|
80
|
+
it "should use the spec" do
|
81
|
+
use_spec?(spec_file).should be_true
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should not use the spec" do
|
85
|
+
use_spec?('other/file').should be_false
|
86
|
+
end
|
60
87
|
end
|
61
88
|
end
|
62
89
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: jasmine-headless-webkit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.
|
5
|
+
version: 0.2.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- John Bintz
|
@@ -12,7 +12,7 @@ autorequire:
|
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
14
|
|
15
|
-
date: 2011-05-
|
15
|
+
date: 2011-05-17 00:00:00 -04:00
|
16
16
|
default_executable:
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
@@ -61,15 +61,19 @@ files:
|
|
61
61
|
- .autotest
|
62
62
|
- .gitignore
|
63
63
|
- .rspec
|
64
|
+
- CHANGELOG.md
|
64
65
|
- Gemfile
|
65
66
|
- README.md
|
66
67
|
- Rakefile
|
67
68
|
- bin/jasmine-headless-webkit
|
69
|
+
- coffee.watchr
|
68
70
|
- ext/jasmine-webkit-specrunner/Info.plist
|
69
71
|
- ext/jasmine-webkit-specrunner/extconf.rb
|
70
72
|
- ext/jasmine-webkit-specrunner/specrunner.cpp
|
71
73
|
- ext/jasmine-webkit-specrunner/specrunner.pro
|
72
74
|
- jasmine-headless-webkit.gemspec
|
75
|
+
- jasmine/jasmine.headless-reporter.coffee
|
76
|
+
- jasmine/jasmine.headless-reporter.js
|
73
77
|
- lib/autotest/discover.rb
|
74
78
|
- lib/autotest/jasmine.rb
|
75
79
|
- lib/autotest/jasmine_mixin.rb
|
@@ -77,6 +81,8 @@ files:
|
|
77
81
|
- lib/jasmine-headless-webkit.rb
|
78
82
|
- lib/jasmine-headless-webkit/version.rb
|
79
83
|
- lib/jasmine/cli.rb
|
84
|
+
- lib/jasmine/headless/railtie.rb
|
85
|
+
- lib/jasmine/headless/task.rb
|
80
86
|
- spec/bin/jasmine-headless-webkit_spec.rb
|
81
87
|
- spec/jasmine/console_log/console_log.js
|
82
88
|
- spec/jasmine/console_log/console_log.yml
|