rspectacles 0.0.1
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/.gitignore +1 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +46 -0
- data/Rakefile +1 -0
- data/bin/rspectacles +16 -0
- data/lib/rspectacles/app/public/css/style.css +24 -0
- data/lib/rspectacles/app/public/js/chart.js +129 -0
- data/lib/rspectacles/app/public/js/d3.js +8810 -0
- data/lib/rspectacles/app/public/js/exampleStream.js +42 -0
- data/lib/rspectacles/app/public/js/jquery.js +8829 -0
- data/lib/rspectacles/app/public/js/pathtree.js +51 -0
- data/lib/rspectacles/app/public/js/plates.js +666 -0
- data/lib/rspectacles/app/public/js/require.js +2053 -0
- data/lib/rspectacles/app/public/js/riffle.js +200 -0
- data/lib/rspectacles/app/public/js/script.js +26 -0
- data/lib/rspectacles/app/views/index.erb +29 -0
- data/lib/rspectacles/app.rb +60 -0
- data/lib/rspectacles/redis_formatter.rb +84 -0
- data/lib/rspectacles/version.rb +3 -0
- data/lib/rspectacles.rb +1 -0
- data/rspectacles.gemspec +27 -0
- data/spec/javascripts/resources/qunit.css +244 -0
- data/spec/javascripts/resources/qunit.js +2212 -0
- data/spec/javascripts/test.html +20 -0
- data/spec/javascripts/tests/pathtree_spec.js +21 -0
- metadata +155 -0
@@ -0,0 +1,200 @@
|
|
1
|
+
(function (definition) {
|
2
|
+
// AMD
|
3
|
+
if (typeof define === "function") {
|
4
|
+
define(definition);
|
5
|
+
// CommonJS
|
6
|
+
} else if (typeof exports === "object") {
|
7
|
+
definition(this, exports);
|
8
|
+
// Browser
|
9
|
+
} else {
|
10
|
+
definition(this);
|
11
|
+
}
|
12
|
+
}(function (require, exports, module) {
|
13
|
+
"use strict";
|
14
|
+
var old,
|
15
|
+
_;
|
16
|
+
|
17
|
+
exports = exports || window;
|
18
|
+
|
19
|
+
if (!window.setTimeout) {
|
20
|
+
return;
|
21
|
+
}
|
22
|
+
|
23
|
+
function stream(userSuppliedStreamFn) {
|
24
|
+
var chain = {};
|
25
|
+
|
26
|
+
function defaultStreamFn(output) {
|
27
|
+
var inputs = _.argumentsToArray(arguments);
|
28
|
+
inputs.shift();
|
29
|
+
if (inputs.length === 0) {
|
30
|
+
window.setTimeout(function () {
|
31
|
+
output();
|
32
|
+
}, 0);
|
33
|
+
}
|
34
|
+
_.each(inputs, function invokeOutput(input) {
|
35
|
+
if (!_.isUndefined(input)) {
|
36
|
+
window.setTimeout(function delayedInvokeOutput() {
|
37
|
+
output(input);
|
38
|
+
}, 0);
|
39
|
+
}
|
40
|
+
});
|
41
|
+
}
|
42
|
+
|
43
|
+
(function () {
|
44
|
+
var outputFns = [], streamFn;
|
45
|
+
function outputAllFns() {
|
46
|
+
var outputs = _.argumentsToArray(arguments);
|
47
|
+
_.each(outputFns, function applyFunction(f) {
|
48
|
+
_.applyArgsToFn(f, outputs);
|
49
|
+
});
|
50
|
+
}
|
51
|
+
streamFn = _.isFunction(userSuppliedStreamFn) ? userSuppliedStreamFn : defaultStreamFn;
|
52
|
+
chain.invoke = function invoke() {
|
53
|
+
var outputs = _.argumentsToArray(arguments);
|
54
|
+
outputs.unshift(outputAllFns);
|
55
|
+
_.applyArgsToFn(streamFn, outputs);
|
56
|
+
return chain;
|
57
|
+
};
|
58
|
+
chain.onOutput = function onOutput(f) {
|
59
|
+
if (!_.isFunction(f)) {
|
60
|
+
throw new Error('onOutput expecting callback function');
|
61
|
+
}
|
62
|
+
outputFns.push(f);
|
63
|
+
return chain;
|
64
|
+
};
|
65
|
+
chain.offOutput = function offOutput(f) {
|
66
|
+
if (!_.isFunction(f)) {
|
67
|
+
throw new Error('offOutput expecting callback function');
|
68
|
+
}
|
69
|
+
outputFns = _.reject(outputFns, function isSameAsReferenceInScope(x) {
|
70
|
+
return x === f;
|
71
|
+
});
|
72
|
+
return chain;
|
73
|
+
};
|
74
|
+
}());
|
75
|
+
|
76
|
+
(function () {
|
77
|
+
var callbacks = [],
|
78
|
+
inputStreams = [];
|
79
|
+
function wait(streams, idx) {
|
80
|
+
var unbindStreams = inputStreams[idx];
|
81
|
+
function invokeWithOneArg(x) {
|
82
|
+
var outputs = [];
|
83
|
+
outputs.length = idx + 1;
|
84
|
+
outputs[idx] = x;
|
85
|
+
chain.invoke.apply(window, _.isUndefined(x) ? [] : outputs);
|
86
|
+
}
|
87
|
+
if (unbindStreams) {
|
88
|
+
_.each(unbindStreams, function unbindInputs(s) {
|
89
|
+
s.offOutput(callbacks[idx]);
|
90
|
+
});
|
91
|
+
delete callbacks[idx];
|
92
|
+
delete inputStreams[idx];
|
93
|
+
}
|
94
|
+
_.each(streams, function registerOnOutput(stream) {
|
95
|
+
stream.onOutput(invokeWithOneArg);
|
96
|
+
});
|
97
|
+
callbacks[idx] = invokeWithOneArg;
|
98
|
+
inputStreams[idx] = streams;
|
99
|
+
}
|
100
|
+
chain.input = function input() {
|
101
|
+
var i, removeStreamIndexes = [];
|
102
|
+
_.each(arguments, function bindInputs(inputs, inIdx) {
|
103
|
+
if (stream.isStream(inputs)) {
|
104
|
+
inputs = [inputs];
|
105
|
+
}
|
106
|
+
if (_.isArray(inputs)) {
|
107
|
+
inputs = _.reject(inputs, function isNotStream(obj) {
|
108
|
+
return !stream.isStream(obj);
|
109
|
+
});
|
110
|
+
wait(inputs, inIdx);
|
111
|
+
}
|
112
|
+
});
|
113
|
+
for (i = arguments.length; i < inputStreams.length; i += 1) {
|
114
|
+
removeStreamIndexes.push(i);
|
115
|
+
}
|
116
|
+
_.each(removeStreamIndexes, function (idx) {
|
117
|
+
_.each(inputStreams[idx], function (stream) { stream.offOutput(callbacks[idx]); });
|
118
|
+
delete callbacks[idx];
|
119
|
+
delete inputStreams[idx];
|
120
|
+
});
|
121
|
+
return chain;
|
122
|
+
};
|
123
|
+
}());
|
124
|
+
return chain;
|
125
|
+
}
|
126
|
+
|
127
|
+
stream.isStream = function isStream(x) {
|
128
|
+
return !!(x && x.invoke && x.onOutput && x.offOutput && x.input);
|
129
|
+
};
|
130
|
+
|
131
|
+
old = exports.stream;
|
132
|
+
stream.noConflict = function noConflict() {
|
133
|
+
exports.stream = old;
|
134
|
+
return stream;
|
135
|
+
};
|
136
|
+
exports.stream = stream;
|
137
|
+
|
138
|
+
_ = {
|
139
|
+
breaker: {},
|
140
|
+
arrayProto: Array.prototype,
|
141
|
+
objProto: Object.prototype,
|
142
|
+
isArray: Array.isArray || function isArray(obj) {
|
143
|
+
return _.objProto.toString.call(obj) === '[object Array]';
|
144
|
+
},
|
145
|
+
isFunction: function isFunction(obj) {
|
146
|
+
return _.objProto.toString.call(obj) === '[object Function]';
|
147
|
+
},
|
148
|
+
isUndefined: function isUndefined(obj) {
|
149
|
+
return obj === void 0;
|
150
|
+
},
|
151
|
+
argumentsToArray: function argumentsToArray(args) {
|
152
|
+
return _.arrayProto.slice.call(args);
|
153
|
+
},
|
154
|
+
applyArgsToFn: function applyArgsToFn(fn, args) {
|
155
|
+
try {
|
156
|
+
fn.apply(window, args);
|
157
|
+
} catch (e) {
|
158
|
+
if (console && console.exception) {
|
159
|
+
console.exception(e);
|
160
|
+
}
|
161
|
+
}
|
162
|
+
},
|
163
|
+
each: function each(obj, iterator, context) {
|
164
|
+
var i, l, key;
|
165
|
+
if (obj === null) {
|
166
|
+
return;
|
167
|
+
}
|
168
|
+
if (_.arrayProto.forEach && obj.forEach === _.arrayProto.forEach) {
|
169
|
+
obj.forEach(iterator, context);
|
170
|
+
} else if (obj.length === +obj.length) {
|
171
|
+
for (i = 0, l = obj.length; i < l; i += 1) {
|
172
|
+
if (obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj) === _.breaker) {
|
173
|
+
return;
|
174
|
+
}
|
175
|
+
}
|
176
|
+
} else {
|
177
|
+
for (key in obj) {
|
178
|
+
if (obj.hasOwnProperty(key)) {
|
179
|
+
if (iterator.call(context, obj[key], key, obj) === _.breaker) {
|
180
|
+
return;
|
181
|
+
}
|
182
|
+
}
|
183
|
+
}
|
184
|
+
}
|
185
|
+
},
|
186
|
+
reject: function reject(obj, iterator, context) {
|
187
|
+
var results = [];
|
188
|
+
if (obj === null) {
|
189
|
+
return results;
|
190
|
+
}
|
191
|
+
_.each(obj, function exclude(value, index, list) {
|
192
|
+
if (!iterator.call(context, value, index, list)) {
|
193
|
+
results[results.length] = value;
|
194
|
+
}
|
195
|
+
});
|
196
|
+
return results;
|
197
|
+
}
|
198
|
+
};
|
199
|
+
|
200
|
+
}));
|
@@ -0,0 +1,26 @@
|
|
1
|
+
/*global require: true */
|
2
|
+
require(['chart', 'exampleStream'], function (chart, examples) {
|
3
|
+
'use strict';
|
4
|
+
|
5
|
+
var
|
6
|
+
bodyEl = document.querySelector('body')
|
7
|
+
, uri = bodyEl.dataset.streamUrl
|
8
|
+
, streams = examples(uri)
|
9
|
+
, c = chart()
|
10
|
+
;
|
11
|
+
|
12
|
+
streams.start.onOutput(function (data) {
|
13
|
+
c.reset();
|
14
|
+
});
|
15
|
+
|
16
|
+
streams.message.onOutput(function (data) {
|
17
|
+
console.log('message logged', data);
|
18
|
+
});
|
19
|
+
|
20
|
+
streams.example.onOutput(function (data) {
|
21
|
+
c.push(data);
|
22
|
+
});
|
23
|
+
|
24
|
+
c.render();
|
25
|
+
window.c = c;
|
26
|
+
});
|
@@ -0,0 +1,29 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
|
3
|
+
<html>
|
4
|
+
<head>
|
5
|
+
<title>RSpectacles</title>
|
6
|
+
<link rel='stylesheet' href='<%= url 'css/style.css' %>' />
|
7
|
+
</head>
|
8
|
+
<body data-stream-url=<%= url '/stream' %>>
|
9
|
+
<form>
|
10
|
+
<label><input type="radio" name="mode" value="size" checked> Time</label>
|
11
|
+
<label><input type="radio" name="mode" value="count"> Count</label>
|
12
|
+
</form>
|
13
|
+
|
14
|
+
<div class='example-wrapper' id='template'>
|
15
|
+
<ul class='example-details'>
|
16
|
+
<li id='name'></li>
|
17
|
+
<li>Line Number: <span id='line_number'></span></li>
|
18
|
+
<li>Status: <span id='status'></span></li>
|
19
|
+
<li>
|
20
|
+
<span id='value'></span> <span id='time_or_count'></span>
|
21
|
+
</li>
|
22
|
+
</ul>
|
23
|
+
</div>
|
24
|
+
|
25
|
+
<script type='text/javascript' src='<%= url '/js/d3.js' %>'></script>
|
26
|
+
<script type='text/javascript' src='<%= url '/js/plates.js' %>'></script>
|
27
|
+
<script type='text/javascript' data-main='<%= url 'js/script' %>' src='<%= url '/js/require.js' %>'></script>
|
28
|
+
</body>
|
29
|
+
</html>
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'sinatra/base'
|
3
|
+
require 'json'
|
4
|
+
require 'em-hiredis'
|
5
|
+
require 'uri'
|
6
|
+
require 'thin'
|
7
|
+
require 'pry'
|
8
|
+
|
9
|
+
# Helpers
|
10
|
+
# require './lib/render_partial'
|
11
|
+
# require './db/config'
|
12
|
+
|
13
|
+
|
14
|
+
module RSpectacles
|
15
|
+
class App < Sinatra::Base
|
16
|
+
connections = []
|
17
|
+
dir = File.dirname(File.expand_path(__FILE__))
|
18
|
+
set :app_file, __FILE__
|
19
|
+
set :root, dir
|
20
|
+
set :views, "#{dir}/app/views"
|
21
|
+
set :static, true
|
22
|
+
|
23
|
+
if respond_to? :public_folder
|
24
|
+
set :public_folder, "#{dir}/app/public"
|
25
|
+
else
|
26
|
+
set :public, "#{dir}/app/public"
|
27
|
+
end
|
28
|
+
|
29
|
+
uri = URI.parse 'redis://127.0.0.1:6379/'
|
30
|
+
$emredis = nil
|
31
|
+
|
32
|
+
# Routes
|
33
|
+
get '/' do
|
34
|
+
erb :index
|
35
|
+
end
|
36
|
+
|
37
|
+
get '/stream', :provides => 'text/event-stream' do
|
38
|
+
stream :keep_open do |out|
|
39
|
+
connections << out
|
40
|
+
out.callback { connections.delete(out) }
|
41
|
+
dump_last_run out
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def dump_last_run(out)
|
46
|
+
$emredis.lrange('redis-rspec-last-run', 0, -1) do |list|
|
47
|
+
list.each { |msg| out << "data: #{msg}\n\n" }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
EM.next_tick do
|
52
|
+
$emredis = EM::Hiredis.connect(uri)
|
53
|
+
|
54
|
+
$emredis.pubsub.subscribe 'redis-rspec-examples' do |message|
|
55
|
+
connections.each { |out| out << "data: #{message}\n\n" }
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'rspec/core/formatters/base_formatter'
|
2
|
+
require 'ostruct'
|
3
|
+
require 'redis'
|
4
|
+
|
5
|
+
module RSpectacles
|
6
|
+
class RedisFormatter < RSpec::Core::Formatters::BaseFormatter
|
7
|
+
attr_accessor :redis
|
8
|
+
|
9
|
+
class << self
|
10
|
+
def config
|
11
|
+
OpenStruct.new({
|
12
|
+
channel_name: 'redis-rspec-examples',
|
13
|
+
last_run_key: 'redis-rspec-last-run',
|
14
|
+
port: 6379,
|
15
|
+
host: '127.0.0.1',
|
16
|
+
password: ''
|
17
|
+
})
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize(output)
|
22
|
+
self.redis = Redis.new host: config.host, port: config.port
|
23
|
+
end
|
24
|
+
|
25
|
+
def message(message)
|
26
|
+
log "message:#{message}"
|
27
|
+
end
|
28
|
+
|
29
|
+
def start(example_count)
|
30
|
+
log 'status:start'
|
31
|
+
redis.del config.last_run_key
|
32
|
+
end
|
33
|
+
|
34
|
+
def stop
|
35
|
+
log 'status:stop'
|
36
|
+
end
|
37
|
+
|
38
|
+
def example_started(example)
|
39
|
+
end
|
40
|
+
|
41
|
+
def example_passed(example)
|
42
|
+
log_formatted example
|
43
|
+
end
|
44
|
+
|
45
|
+
def example_pending(example)
|
46
|
+
log_formatted example
|
47
|
+
end
|
48
|
+
|
49
|
+
def example_failed(example)
|
50
|
+
log_formatted example
|
51
|
+
end
|
52
|
+
|
53
|
+
def close
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def config
|
59
|
+
self.class.config
|
60
|
+
end
|
61
|
+
|
62
|
+
def log(message)
|
63
|
+
redis.publish config.channel_name, message
|
64
|
+
redis.lpush config.last_run_key, message
|
65
|
+
end
|
66
|
+
|
67
|
+
def log_formatted(example)
|
68
|
+
message = format_example(example)
|
69
|
+
redis.publish config.channel_name, message
|
70
|
+
redis.lpush config.last_run_key, message
|
71
|
+
end
|
72
|
+
|
73
|
+
def format_example(example)
|
74
|
+
{
|
75
|
+
:description => example.description,
|
76
|
+
:full_description => example.full_description,
|
77
|
+
:status => example.execution_result[:status],
|
78
|
+
:duration => example.execution_result[:run_time],
|
79
|
+
:file_path => example.metadata[:file_path],
|
80
|
+
:line_number => example.metadata[:line_number]
|
81
|
+
}.to_json
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
data/lib/rspectacles.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'rspectacles/app.rb'
|
data/rspectacles.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path('../lib', __FILE__)
|
3
|
+
require 'rspectacles/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = 'rspectacles'
|
7
|
+
s.version = RSpectacles::VERSION
|
8
|
+
s.authors = ['Michael Wheeler']
|
9
|
+
s.email = ['mwheeler@g2crowd.com']
|
10
|
+
s.homepage = 'https://github.com/wheeyls/rspectacles'
|
11
|
+
s.summary = %q{Visualize rspec test running in the browser}
|
12
|
+
s.description = %q{Visualize rspec test running in the browser}
|
13
|
+
|
14
|
+
s.rubyforge_project = 'rspectacles'
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ['lib']
|
20
|
+
|
21
|
+
# specify any dependencies here; for example:
|
22
|
+
s.add_development_dependency 'rspec'
|
23
|
+
s.add_dependency 'rake'
|
24
|
+
s.add_dependency 'thin', '>= 1.5.0'
|
25
|
+
s.add_dependency 'sinatra', '~> 1.4.3'
|
26
|
+
s.add_dependency 'em-hiredis', '~> 0.2.1'
|
27
|
+
end
|
@@ -0,0 +1,244 @@
|
|
1
|
+
/**
|
2
|
+
* QUnit v1.12.0 - A JavaScript Unit Testing Framework
|
3
|
+
*
|
4
|
+
* http://qunitjs.com
|
5
|
+
*
|
6
|
+
* Copyright 2012 jQuery Foundation and other contributors
|
7
|
+
* Released under the MIT license.
|
8
|
+
* http://jquery.org/license
|
9
|
+
*/
|
10
|
+
|
11
|
+
/** Font Family and Sizes */
|
12
|
+
|
13
|
+
#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {
|
14
|
+
font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
|
15
|
+
}
|
16
|
+
|
17
|
+
#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
|
18
|
+
#qunit-tests { font-size: smaller; }
|
19
|
+
|
20
|
+
|
21
|
+
/** Resets */
|
22
|
+
|
23
|
+
#qunit-tests, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {
|
24
|
+
margin: 0;
|
25
|
+
padding: 0;
|
26
|
+
}
|
27
|
+
|
28
|
+
|
29
|
+
/** Header */
|
30
|
+
|
31
|
+
#qunit-header {
|
32
|
+
padding: 0.5em 0 0.5em 1em;
|
33
|
+
|
34
|
+
color: #8699a4;
|
35
|
+
background-color: #0d3349;
|
36
|
+
|
37
|
+
font-size: 1.5em;
|
38
|
+
line-height: 1em;
|
39
|
+
font-weight: normal;
|
40
|
+
|
41
|
+
border-radius: 5px 5px 0 0;
|
42
|
+
-moz-border-radius: 5px 5px 0 0;
|
43
|
+
-webkit-border-top-right-radius: 5px;
|
44
|
+
-webkit-border-top-left-radius: 5px;
|
45
|
+
}
|
46
|
+
|
47
|
+
#qunit-header a {
|
48
|
+
text-decoration: none;
|
49
|
+
color: #c2ccd1;
|
50
|
+
}
|
51
|
+
|
52
|
+
#qunit-header a:hover,
|
53
|
+
#qunit-header a:focus {
|
54
|
+
color: #fff;
|
55
|
+
}
|
56
|
+
|
57
|
+
#qunit-testrunner-toolbar label {
|
58
|
+
display: inline-block;
|
59
|
+
padding: 0 .5em 0 .1em;
|
60
|
+
}
|
61
|
+
|
62
|
+
#qunit-banner {
|
63
|
+
height: 5px;
|
64
|
+
}
|
65
|
+
|
66
|
+
#qunit-testrunner-toolbar {
|
67
|
+
padding: 0.5em 0 0.5em 2em;
|
68
|
+
color: #5E740B;
|
69
|
+
background-color: #eee;
|
70
|
+
overflow: hidden;
|
71
|
+
}
|
72
|
+
|
73
|
+
#qunit-userAgent {
|
74
|
+
padding: 0.5em 0 0.5em 2.5em;
|
75
|
+
background-color: #2b81af;
|
76
|
+
color: #fff;
|
77
|
+
text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
|
78
|
+
}
|
79
|
+
|
80
|
+
#qunit-modulefilter-container {
|
81
|
+
float: right;
|
82
|
+
}
|
83
|
+
|
84
|
+
/** Tests: Pass/Fail */
|
85
|
+
|
86
|
+
#qunit-tests {
|
87
|
+
list-style-position: inside;
|
88
|
+
}
|
89
|
+
|
90
|
+
#qunit-tests li {
|
91
|
+
padding: 0.4em 0.5em 0.4em 2.5em;
|
92
|
+
border-bottom: 1px solid #fff;
|
93
|
+
list-style-position: inside;
|
94
|
+
}
|
95
|
+
|
96
|
+
#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running {
|
97
|
+
display: none;
|
98
|
+
}
|
99
|
+
|
100
|
+
#qunit-tests li strong {
|
101
|
+
cursor: pointer;
|
102
|
+
}
|
103
|
+
|
104
|
+
#qunit-tests li a {
|
105
|
+
padding: 0.5em;
|
106
|
+
color: #c2ccd1;
|
107
|
+
text-decoration: none;
|
108
|
+
}
|
109
|
+
#qunit-tests li a:hover,
|
110
|
+
#qunit-tests li a:focus {
|
111
|
+
color: #000;
|
112
|
+
}
|
113
|
+
|
114
|
+
#qunit-tests li .runtime {
|
115
|
+
float: right;
|
116
|
+
font-size: smaller;
|
117
|
+
}
|
118
|
+
|
119
|
+
.qunit-assert-list {
|
120
|
+
margin-top: 0.5em;
|
121
|
+
padding: 0.5em;
|
122
|
+
|
123
|
+
background-color: #fff;
|
124
|
+
|
125
|
+
border-radius: 5px;
|
126
|
+
-moz-border-radius: 5px;
|
127
|
+
-webkit-border-radius: 5px;
|
128
|
+
}
|
129
|
+
|
130
|
+
.qunit-collapsed {
|
131
|
+
display: none;
|
132
|
+
}
|
133
|
+
|
134
|
+
#qunit-tests table {
|
135
|
+
border-collapse: collapse;
|
136
|
+
margin-top: .2em;
|
137
|
+
}
|
138
|
+
|
139
|
+
#qunit-tests th {
|
140
|
+
text-align: right;
|
141
|
+
vertical-align: top;
|
142
|
+
padding: 0 .5em 0 0;
|
143
|
+
}
|
144
|
+
|
145
|
+
#qunit-tests td {
|
146
|
+
vertical-align: top;
|
147
|
+
}
|
148
|
+
|
149
|
+
#qunit-tests pre {
|
150
|
+
margin: 0;
|
151
|
+
white-space: pre-wrap;
|
152
|
+
word-wrap: break-word;
|
153
|
+
}
|
154
|
+
|
155
|
+
#qunit-tests del {
|
156
|
+
background-color: #e0f2be;
|
157
|
+
color: #374e0c;
|
158
|
+
text-decoration: none;
|
159
|
+
}
|
160
|
+
|
161
|
+
#qunit-tests ins {
|
162
|
+
background-color: #ffcaca;
|
163
|
+
color: #500;
|
164
|
+
text-decoration: none;
|
165
|
+
}
|
166
|
+
|
167
|
+
/*** Test Counts */
|
168
|
+
|
169
|
+
#qunit-tests b.counts { color: black; }
|
170
|
+
#qunit-tests b.passed { color: #5E740B; }
|
171
|
+
#qunit-tests b.failed { color: #710909; }
|
172
|
+
|
173
|
+
#qunit-tests li li {
|
174
|
+
padding: 5px;
|
175
|
+
background-color: #fff;
|
176
|
+
border-bottom: none;
|
177
|
+
list-style-position: inside;
|
178
|
+
}
|
179
|
+
|
180
|
+
/*** Passing Styles */
|
181
|
+
|
182
|
+
#qunit-tests li li.pass {
|
183
|
+
color: #3c510c;
|
184
|
+
background-color: #fff;
|
185
|
+
border-left: 10px solid #C6E746;
|
186
|
+
}
|
187
|
+
|
188
|
+
#qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; }
|
189
|
+
#qunit-tests .pass .test-name { color: #366097; }
|
190
|
+
|
191
|
+
#qunit-tests .pass .test-actual,
|
192
|
+
#qunit-tests .pass .test-expected { color: #999999; }
|
193
|
+
|
194
|
+
#qunit-banner.qunit-pass { background-color: #C6E746; }
|
195
|
+
|
196
|
+
/*** Failing Styles */
|
197
|
+
|
198
|
+
#qunit-tests li li.fail {
|
199
|
+
color: #710909;
|
200
|
+
background-color: #fff;
|
201
|
+
border-left: 10px solid #EE5757;
|
202
|
+
white-space: pre;
|
203
|
+
}
|
204
|
+
|
205
|
+
#qunit-tests > li:last-child {
|
206
|
+
border-radius: 0 0 5px 5px;
|
207
|
+
-moz-border-radius: 0 0 5px 5px;
|
208
|
+
-webkit-border-bottom-right-radius: 5px;
|
209
|
+
-webkit-border-bottom-left-radius: 5px;
|
210
|
+
}
|
211
|
+
|
212
|
+
#qunit-tests .fail { color: #000000; background-color: #EE5757; }
|
213
|
+
#qunit-tests .fail .test-name,
|
214
|
+
#qunit-tests .fail .module-name { color: #000000; }
|
215
|
+
|
216
|
+
#qunit-tests .fail .test-actual { color: #EE5757; }
|
217
|
+
#qunit-tests .fail .test-expected { color: green; }
|
218
|
+
|
219
|
+
#qunit-banner.qunit-fail { background-color: #EE5757; }
|
220
|
+
|
221
|
+
|
222
|
+
/** Result */
|
223
|
+
|
224
|
+
#qunit-testresult {
|
225
|
+
padding: 0.5em 0.5em 0.5em 2.5em;
|
226
|
+
|
227
|
+
color: #2b81af;
|
228
|
+
background-color: #D2E0E6;
|
229
|
+
|
230
|
+
border-bottom: 1px solid white;
|
231
|
+
}
|
232
|
+
#qunit-testresult .module-name {
|
233
|
+
font-weight: bold;
|
234
|
+
}
|
235
|
+
|
236
|
+
/** Fixture */
|
237
|
+
|
238
|
+
#qunit-fixture {
|
239
|
+
position: absolute;
|
240
|
+
top: -10000px;
|
241
|
+
left: -10000px;
|
242
|
+
width: 1000px;
|
243
|
+
height: 1000px;
|
244
|
+
}
|