jasmine-headless-webkit 0.7.1 → 0.7.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/CHANGELOG.md +27 -0
- data/Rakefile +15 -3
- data/bin/jasmine-headless-webkit +1 -8
- data/ext/jasmine-webkit-specrunner/ConsoleOutput.cpp +10 -1
- data/ext/jasmine-webkit-specrunner/ConsoleOutput.h +1 -0
- data/ext/jasmine-webkit-specrunner/test.rb +9 -2
- data/jasmine/jasmine.headless-reporter.coffee +162 -107
- data/jasmine/jasmine.headless-reporter.js +207 -143
- data/lib/jasmine/files_list.rb +76 -24
- data/lib/jasmine/headless/cacheable_action.rb +6 -2
- data/lib/jasmine/headless/options.rb +5 -1
- data/lib/jasmine/headless/runner.rb +21 -8
- data/lib/jasmine/headless/spec_file_analyzer.rb +10 -3
- data/lib/jasmine/headless/template_writer.rb +41 -0
- data/lib/jasmine/headless/version.rb +1 -1
- data/lib/jasmine/headless.rb +24 -0
- data/lib/jasmine-headless-webkit.rb +1 -16
- data/skel/template.html.erb +71 -0
- data/spec/bin/jasmine-headless-webkit_spec.rb +14 -2
- data/spec/javascripts/jasmine.headless-reporter_spec.coffee +19 -0
- data/spec/lib/jasmine/files_list_spec.rb +32 -3
- data/spec/lib/jasmine/headless/cacheable_action_spec.rb +8 -1
- data/spec/lib/jasmine/headless/runner_spec.rb +59 -0
- data/spec/lib/jasmine/headless/template_writer_spec.rb +84 -0
- metadata +16 -14
- data/lib/jasmine/template_writer.rb +0 -86
- data/spec/lib/jasmine/template_writer_spec.rb +0 -37
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,30 @@
|
|
1
|
+
## 0.7.2
|
2
|
+
|
3
|
+
* Improved finding of CoffeeScript spec line locations
|
4
|
+
* Improved Runner reporting of which expectations failed
|
5
|
+
* Initial vendored helper support, paving the way for Sprockets integratioon (maybe!)
|
6
|
+
* Add 1.9.3-rc1 test support and fixes
|
7
|
+
* Add console.peek()
|
8
|
+
|
9
|
+
## 0.7.1
|
10
|
+
|
11
|
+
* Bugfix for missing digest/sha1 import
|
12
|
+
|
13
|
+
## 0.7.0
|
14
|
+
|
15
|
+
* Major C++ cleanup, now much more modular
|
16
|
+
* Greatly improved object inspection and printing provided by jsDump and beautify-js
|
17
|
+
|
18
|
+
## 0.6.3
|
19
|
+
|
20
|
+
* Ensure Rubygems is available before doing version comparison
|
21
|
+
* Fix other build problems
|
22
|
+
* Better output for jQuery nodes
|
23
|
+
|
24
|
+
## 0.6.2
|
25
|
+
|
26
|
+
* Clean up C++ and test running
|
27
|
+
|
1
28
|
## 0.6.1
|
2
29
|
|
3
30
|
* Ensure YAML is loaded before use
|
data/Rakefile
CHANGED
@@ -14,12 +14,23 @@ require 'jasmine/headless/task'
|
|
14
14
|
|
15
15
|
Jasmine::Headless::Task.new
|
16
16
|
|
17
|
+
PLATFORMS = %w{1.8.7 1.9.2 ree 1.9.3-rc1}
|
18
|
+
|
19
|
+
def rvm_bundle(command = '')
|
20
|
+
Bundler.with_clean_env do
|
21
|
+
system %{bash -c 'unset BUNDLE_BIN_PATH && unset BUNDLE_GEMFILE && rvm #{PLATFORMS.join(',')} do bundle #{command}'}
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class SpecFailure < StandardError; end
|
26
|
+
class BundleFailure < StandardError; end
|
27
|
+
|
17
28
|
namespace :spec do
|
18
29
|
desc "Run on three Rubies"
|
19
30
|
task :platforms do
|
20
|
-
|
21
|
-
|
22
|
-
raise
|
31
|
+
rvm_bundle
|
32
|
+
rvm_bundle "exec rspec spec"
|
33
|
+
raise SpecError.new if $?.exitstatus != 0
|
23
34
|
end
|
24
35
|
end
|
25
36
|
|
@@ -31,3 +42,4 @@ task :build_runner do
|
|
31
42
|
system %{ruby extconf.rb}
|
32
43
|
end
|
33
44
|
end
|
45
|
+
|
data/bin/jasmine-headless-webkit
CHANGED
@@ -10,19 +10,12 @@ end
|
|
10
10
|
$:.unshift(File.join(gem_dir, 'lib'))
|
11
11
|
require 'jasmine-headless-webkit'
|
12
12
|
|
13
|
-
require 'jasmine/headless/errors'
|
14
|
-
require 'jasmine/headless/runner'
|
15
|
-
require 'jasmine/headless/options'
|
16
|
-
|
17
13
|
begin
|
18
14
|
options = Jasmine::Headless::Options.from_command_line
|
19
15
|
runner = Jasmine::Headless::Runner.new(options)
|
20
16
|
|
21
17
|
if options[:do_list]
|
22
|
-
files_list = Jasmine::FilesList.new(
|
23
|
-
:config => runner.jasmine_config
|
24
|
-
)
|
25
|
-
|
18
|
+
files_list = Jasmine::FilesList.new(:config => runner.jasmine_config)
|
26
19
|
files_list.files.each { |file| puts file }
|
27
20
|
else
|
28
21
|
puts "Running Jasmine specs...".color(:white)
|
@@ -82,8 +82,17 @@ void ConsoleOutput::logSpecFilename(const QString &name) {
|
|
82
82
|
}
|
83
83
|
|
84
84
|
void ConsoleOutput::logSpecResult(const QString &result) {
|
85
|
+
QStringList lines = result.split("\n");
|
86
|
+
QStringListIterator linesIterator(lines);
|
87
|
+
|
85
88
|
red();
|
86
|
-
|
89
|
+
while (linesIterator.hasNext()) {
|
90
|
+
QString line = linesIterator.next();
|
91
|
+
if (!linesIterator.hasNext())
|
92
|
+
yellow();
|
93
|
+
*outputIO << " " << qPrintable(line) << std::endl;
|
94
|
+
}
|
95
|
+
|
87
96
|
clear();
|
88
97
|
}
|
89
98
|
|
@@ -7,6 +7,8 @@ system %{make clean}
|
|
7
7
|
$: << File.expand_path("../../../lib", __FILE__)
|
8
8
|
require 'qt/qmake'
|
9
9
|
|
10
|
+
result = 0
|
11
|
+
|
10
12
|
Dir['*_test.pro'].each do |test|
|
11
13
|
FileUtils.rm_f('jhw-test')
|
12
14
|
|
@@ -15,10 +17,15 @@ Dir['*_test.pro'].each do |test|
|
|
15
17
|
if File.file?('jhw-test')
|
16
18
|
system %{./jhw-test}
|
17
19
|
if $?.exitstatus != 0
|
18
|
-
|
20
|
+
result = 1
|
21
|
+
break
|
19
22
|
end
|
20
23
|
else
|
21
|
-
|
24
|
+
result = 1
|
25
|
+
break
|
22
26
|
end
|
23
27
|
end
|
24
28
|
|
29
|
+
Qt::Qmake.make!('jasmine-headless-webkit', 'specrunner.pro')
|
30
|
+
|
31
|
+
exit result
|
@@ -1,120 +1,175 @@
|
|
1
1
|
if !jasmine?
|
2
2
|
throw new Error("jasmine not laoded!")
|
3
3
|
|
4
|
+
if window.JHW
|
4
5
|
# Jasmine extensions
|
5
|
-
getSplitName = (parts) ->
|
6
|
-
|
7
|
-
|
6
|
+
getSplitName = (parts) ->
|
7
|
+
parts.push(String(@description).replace(/[\n\r]/g, ' '))
|
8
|
+
parts
|
8
9
|
|
9
|
-
jasmine.Suite.prototype.getSuiteSplitName = ->
|
10
|
-
|
10
|
+
jasmine.Suite.prototype.getSuiteSplitName = ->
|
11
|
+
this.getSplitName(if @parentSuite then @parentSuite.getSuiteSplitName() else [])
|
11
12
|
|
12
|
-
jasmine.Spec.prototype.getSpecSplitName = ->
|
13
|
-
|
13
|
+
jasmine.Spec.prototype.getSpecSplitName = ->
|
14
|
+
this.getSplitName(@suite.getSuiteSplitName())
|
14
15
|
|
15
|
-
jasmine.Suite.prototype.getSplitName = getSplitName
|
16
|
-
jasmine.Spec.prototype.getSplitName = getSplitName
|
16
|
+
jasmine.Suite.prototype.getSplitName = getSplitName
|
17
|
+
jasmine.Spec.prototype.getSplitName = getSplitName
|
17
18
|
|
18
|
-
jasmine.Spec.prototype.getJHWSpecInformation = ->
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
19
|
+
jasmine.Spec.prototype.getJHWSpecInformation = ->
|
20
|
+
parts = this.getSpecSplitName()
|
21
|
+
specLineInfo = HeadlessReporterResult.findSpecLine(parts)
|
22
|
+
if specLineInfo.file
|
23
|
+
parts.push("#{specLineInfo.file}:#{specLineInfo.lineNumber}")
|
24
|
+
else
|
25
|
+
parts.push('')
|
26
|
+
parts.join("||")
|
27
|
+
|
28
|
+
jasmine.Spec.prototype.fail = (e) ->
|
29
|
+
if e and e.sourceURL and window.CoffeeScriptToFilename
|
30
|
+
filename = e.sourceURL.split('/').pop()
|
31
|
+
if realFilename = window.CoffeeScriptToFilename[filename]
|
32
|
+
e = {
|
33
|
+
name: e.name,
|
34
|
+
message: e.message,
|
35
|
+
lineNumber: "~" + String(e.line),
|
36
|
+
sourceURL: realFilename
|
37
|
+
}
|
38
|
+
|
39
|
+
expectationResult = new jasmine.ExpectationResult({
|
40
|
+
passed: false,
|
41
|
+
message: if e then jasmine.util.formatException(e) else 'Exception',
|
42
|
+
trace: { stack: e.stack }
|
43
|
+
})
|
44
|
+
@results_.addResult(expectationResult)
|
45
|
+
|
46
|
+
jasmine.NestedResults.isValidSpecLine = (line) ->
|
47
|
+
line.match(/^\s*expect/) != null || line.match(/^\s*return\s*expect/) != null
|
48
|
+
|
49
|
+
jasmine.NestedResults.parseFunction = (func) ->
|
50
|
+
lines = []
|
51
|
+
lineCount = 0
|
52
|
+
for line in func.split("\n")
|
53
|
+
if jasmine.NestedResults.isValidSpecLine(line)
|
54
|
+
line = line.replace(/^\s*/, '').replace(/\s*$/, '').replace(/^return\s*/, '')
|
55
|
+
lines.push([line, lineCount])
|
56
|
+
lineCount += 1
|
57
|
+
lines
|
58
|
+
|
59
|
+
jasmine.NestedResults.parseAndStore = (func) ->
|
60
|
+
if !jasmine.NestedResults.ParsedFunctions[func]
|
61
|
+
jasmine.NestedResults.ParsedFunctions[func] = jasmine.NestedResults.parseFunction(func)
|
62
|
+
jasmine.NestedResults.ParsedFunctions[func]
|
63
|
+
|
64
|
+
jasmine.NestedResults.ParsedFunctions = []
|
65
|
+
|
66
|
+
if !jasmine.WaitsBlock.prototype._execute
|
67
|
+
jasmine.WaitsBlock.prototype._execute = jasmine.WaitsBlock.prototype.execute
|
68
|
+
jasmine.WaitsForBlock.prototype._execute = jasmine.WaitsForBlock.prototype.execute
|
69
|
+
|
70
|
+
pauseAndRun = (onComplete) ->
|
71
|
+
JHW.timerPause()
|
72
|
+
this._execute ->
|
73
|
+
JHW.timerDone()
|
74
|
+
onComplete()
|
75
|
+
|
76
|
+
jasmine.WaitsBlock.prototype.execute = pauseAndRun
|
77
|
+
jasmine.WaitsForBlock.prototype.execute = pauseAndRun
|
78
|
+
|
79
|
+
jasmine.NestedResults.prototype.addResult_ = jasmine.NestedResults.prototype.addResult
|
80
|
+
jasmine.NestedResults.prototype.addResult = (result) ->
|
81
|
+
result.expectations = []
|
82
|
+
# always three up?
|
83
|
+
|
84
|
+
result.expectations = jasmine.NestedResults.parseAndStore(arguments.callee.caller.caller.caller.toString())
|
85
|
+
|
86
|
+
this.addResult_(result)
|
39
87
|
|
40
88
|
# Try to get the line number of a failed spec
|
41
|
-
class window.HeadlessReporterResult
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
89
|
+
class window.HeadlessReporterResult
|
90
|
+
constructor: (@name, @splitName) ->
|
91
|
+
@results = []
|
92
|
+
addResult: (message) ->
|
93
|
+
@results.push(message)
|
94
|
+
print: ->
|
95
|
+
output = @name
|
96
|
+
bestChoice = HeadlessReporterResult.findSpecLine(@splitName)
|
97
|
+
output += " (#{bestChoice.file}:#{bestChoice.lineNumber})" if bestChoice.file
|
98
|
+
|
99
|
+
JHW.printName(output)
|
100
|
+
for result in @results
|
101
|
+
output = result.message
|
102
|
+
if result.lineNumber
|
103
|
+
output += " (line ~#{bestChoice.lineNumber + result.lineNumber})\n #{result.line}"
|
104
|
+
JHW.printResult(output)
|
105
|
+
@findSpecLine: (splitName) ->
|
106
|
+
bestChoice = { accuracy: 0, file: null, lineNumber: null }
|
107
|
+
|
108
|
+
for file, lines of HeadlessReporterResult.specLineNumbers
|
109
|
+
index = 0
|
110
|
+
lineNumber = 0
|
111
|
+
while newLineNumberInfo = lines[splitName[index]]
|
112
|
+
if newLineNumberInfo.length == 0
|
113
|
+
lineNumber = newLineNumberInfo[0]
|
114
|
+
else
|
115
|
+
lastLine = null
|
116
|
+
for line in newLineNumberInfo
|
117
|
+
lastLine = line
|
118
|
+
break if line > lineNumber
|
119
|
+
|
120
|
+
lineNumber = lastLine
|
121
|
+
|
122
|
+
index++
|
123
|
+
|
124
|
+
if index > bestChoice.accuracy
|
125
|
+
bestChoice = { accuracy: index, file: file, lineNumber: lineNumber }
|
126
|
+
|
127
|
+
bestChoice
|
77
128
|
|
78
129
|
# The reporter itself.
|
79
|
-
class jasmine.HeadlessReporter
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
130
|
+
class jasmine.HeadlessReporter
|
131
|
+
constructor: (@callback = null) ->
|
132
|
+
@results = []
|
133
|
+
@failedCount = 0
|
134
|
+
@length = 0
|
135
|
+
reportRunnerResults: (runner) ->
|
136
|
+
return if this.hasError()
|
137
|
+
|
138
|
+
for result in @results
|
139
|
+
result.print()
|
140
|
+
|
141
|
+
this.callback() if @callback
|
142
|
+
JHW.finishSuite((new Date() - @startTime) / 1000.0, @length, @failedCount)
|
143
|
+
|
144
|
+
reportRunnerStarting: (runner) ->
|
145
|
+
@startTime = new Date()
|
146
|
+
|
147
|
+
reportSpecResults: (spec) ->
|
148
|
+
return if this.hasError()
|
149
|
+
|
150
|
+
results = spec.results()
|
151
|
+
@length++
|
152
|
+
if results.passed()
|
153
|
+
JHW.specPassed(spec.getJHWSpecInformation())
|
154
|
+
else
|
155
|
+
JHW.specFailed(spec.getJHWSpecInformation())
|
156
|
+
@failedCount++
|
157
|
+
failureResult = new HeadlessReporterResult(spec.getFullName(), spec.getSpecSplitName())
|
158
|
+
testCount = 1
|
159
|
+
for result in results.getItems()
|
160
|
+
if result.type == 'expect' and !result.passed_
|
161
|
+
if foundLine = result.expectations[testCount - 1]
|
162
|
+
[ result.line, result.lineNumber ] = foundLine
|
163
|
+
failureResult.addResult(result)
|
164
|
+
testCount += 1
|
165
|
+
@results.push(failureResult)
|
166
|
+
|
167
|
+
reportSpecStarting: (spec) ->
|
168
|
+
if this.hasError()
|
169
|
+
spec.finish()
|
170
|
+
spec.suite.finish()
|
171
|
+
|
172
|
+
reportSuiteResults: (suite) ->
|
173
|
+
hasError: ->
|
174
|
+
JHW.hasError()
|
120
175
|
|