everqueen 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. data/README.rdoc +163 -0
  2. data/bin/everqueen +18 -0
  3. data/config/routes.rb +3 -0
  4. data/lib/everqueen.rb +66 -0
  5. data/lib/everqueen/application.rb +47 -0
  6. data/lib/everqueen/assets/elabs.png +0 -0
  7. data/lib/everqueen/assets/everqueen.scss.css +370 -0
  8. data/lib/everqueen/assets/jquery.js +152 -0
  9. data/lib/everqueen/assets/json2.js +25 -0
  10. data/lib/everqueen/assets/list.js.coffee +35 -0
  11. data/lib/everqueen/assets/run.js.coffee.erb +39 -0
  12. data/lib/everqueen/assets/start.js.coffee +6 -0
  13. data/lib/everqueen/assets/test_helper.js +3 -0
  14. data/lib/everqueen/cli.rb +29 -0
  15. data/lib/everqueen/rails.rb +14 -0
  16. data/lib/everqueen/runner.rb +151 -0
  17. data/lib/everqueen/server.rb +19 -0
  18. data/lib/everqueen/suite.rb +32 -0
  19. data/lib/everqueen/tasks.rb +10 -0
  20. data/lib/everqueen/test.rb +44 -0
  21. data/lib/everqueen/version.rb +3 -0
  22. data/lib/everqueen/views/_test_error.erb +4 -0
  23. data/lib/everqueen/views/layout.erb +17 -0
  24. data/lib/everqueen/views/list.erb +19 -0
  25. data/lib/everqueen/views/run.erb +20 -0
  26. data/lib/qunit/History.md +330 -0
  27. data/lib/qunit/README.md +37 -0
  28. data/lib/qunit/addons/canvas/README.md +16 -0
  29. data/lib/qunit/addons/canvas/canvas-test.js +76 -0
  30. data/lib/qunit/addons/canvas/canvas.html +19 -0
  31. data/lib/qunit/addons/canvas/qunit-canvas.js +6 -0
  32. data/lib/qunit/addons/close-enough/README.md +17 -0
  33. data/lib/qunit/addons/close-enough/close-enough-test.js +37 -0
  34. data/lib/qunit/addons/close-enough/close-enough.html +18 -0
  35. data/lib/qunit/addons/close-enough/qunit-close-enough.js +32 -0
  36. data/lib/qunit/addons/composite/README.md +7 -0
  37. data/lib/qunit/addons/composite/composite-demo-test.html +33 -0
  38. data/lib/qunit/addons/composite/composite-test.html +20 -0
  39. data/lib/qunit/addons/composite/composite-test.js +159 -0
  40. data/lib/qunit/addons/composite/dummy-qunit-test.html +19 -0
  41. data/lib/qunit/addons/composite/dummy-same-test.html +19 -0
  42. data/lib/qunit/addons/composite/index.html +35 -0
  43. data/lib/qunit/addons/composite/qunit-composite.css +13 -0
  44. data/lib/qunit/addons/composite/qunit-composite.js +82 -0
  45. data/lib/qunit/addons/step/README.md +18 -0
  46. data/lib/qunit/addons/step/qunit-step.js +25 -0
  47. data/lib/qunit/addons/step/step-test.js +13 -0
  48. data/lib/qunit/addons/step/step.html +19 -0
  49. data/lib/qunit/package.json +28 -0
  50. data/lib/qunit/qunit/qunit.css +226 -0
  51. data/lib/qunit/qunit/qunit.js +1597 -0
  52. data/lib/qunit/test/headless.html +24 -0
  53. data/lib/qunit/test/index.html +21 -0
  54. data/lib/qunit/test/logs.html +17 -0
  55. data/lib/qunit/test/logs.js +153 -0
  56. data/lib/qunit/test/same.js +1432 -0
  57. data/lib/qunit/test/swarminject.js +9 -0
  58. data/lib/qunit/test/test.js +524 -0
  59. data/lib/tasks/everqueen.rake +8 -0
  60. data/spec/everqueen_spec.rb +52 -0
  61. data/spec/meta_spec.rb +40 -0
  62. data/spec/runner_spec.rb +32 -0
  63. data/spec/spec_helper.rb +49 -0
  64. data/spec/suite1/public/jquery.js +152 -0
  65. data/spec/suite1/public/styles.css +3 -0
  66. data/spec/suite1/test/javascripts/bar_test.js +0 -0
  67. data/spec/suite1/test/javascripts/coffeescript_test.coffee +7 -0
  68. data/spec/suite1/test/javascripts/failing_test.js +9 -0
  69. data/spec/suite1/test/javascripts/foo_test.js +0 -0
  70. data/spec/suite1/test/javascripts/libs/lucid_test.js +0 -0
  71. data/spec/suite1/test/javascripts/models/game_test.js +0 -0
  72. data/spec/suite1/test/javascripts/slow_test.coffee +8 -0
  73. data/spec/suite1/test/javascripts/test_helper.js +1 -0
  74. data/spec/suite1/test/javascripts/testing_test.js +9 -0
  75. data/spec/suite1/test/javascripts/transactions_test.js +10 -0
  76. data/spec/suite1/test/javascripts/with_helper_test.js +4 -0
  77. data/spec/suite2/config/everqueen.rb +4 -0
  78. data/spec/suite2/public_html/foo.js +1 -0
  79. data/spec/suite2/test/awesome_test.js +7 -0
  80. data/spec/suite2/test/failing_test.js +4 -0
  81. data/spec/suite_spec.rb +19 -0
  82. data/spec/test_spec.rb +21 -0
  83. metadata +295 -0
@@ -0,0 +1,163 @@
1
+ = Everqueen
2
+
3
+ {<img src="http://travis-ci.org/hornairs/everqueen.png" />}[http://travis-ci.org/hornairs/everqueen]
4
+
5
+ "Because QUnit is just really simple."
6
+
7
+ Everqueen is a tool to run javascript unit tests for client side JavaScript. It
8
+ combines a server which allows you to serve up and run your tests in a browser,
9
+ as well as a runner which uses Capybara and any of its drivers to run your
10
+ tests. Everqueen uses the QUnit unit testing framework for JavaScript.
11
+
12
+ http://github.com/hornairs/everqueen
13
+
14
+ == Fork Note
15
+
16
+ Everqueen is a serious fork of {Evergreen}[http://github.com/jnicklas/evergreen] by Jonas Nicklas.
17
+ Evergreen rocks, but we wanted to use QUnit instead of Jasmine, and use Sprockets for serving up
18
+ test files instead of the homebrew require system in Evergreen. Thank Jonas for his awesome
19
+ OSS work on Evergreen, because he took us 99% of the way there.
20
+
21
+ == Philosophy
22
+
23
+ Everqueen is a unit testing tool. Its purpose is to test JavaScript in
24
+ isolation from your application. If you need a tool that tests how your
25
+ JavaScript integrates with your application you should use an integration
26
+ testing framework, such as {Capybara}[http://github.com/jnicklas/capybara].
27
+
28
+ == Installation
29
+
30
+ Install as a Ruby gem:
31
+
32
+ gem install everqueen
33
+
34
+ == Usage
35
+
36
+ Everqueen assumes a file and directory structure, place all your javascript
37
+ code inside ./public and all test files inside ./test/javascripts. All test
38
+ files should end in _test.js. For example:
39
+
40
+ public/javascripts/widget.js
41
+ test/javascripts/widget_test.js
42
+
43
+ You can require files from the public directory inside your test file:
44
+
45
+ require('/javascripts/widget.js')
46
+
47
+ test('a widget', function() {
48
+ ...
49
+ });
50
+
51
+ You can now look at your test files inside a browser by starting up the
52
+ Everqueen server:
53
+
54
+ everqueen serve
55
+
56
+ Alternatively you can run the tests headlessly by running:
57
+
58
+ everqueen run
59
+
60
+ == Integrating with Rails 3
61
+
62
+ Add Everqueen to your Gemfile:
63
+
64
+ gem 'everqueen', :require => 'everqueen/rails'
65
+
66
+ Start your rails application and navigate to /everqueen. You should now see a
67
+ list of all test files, click on one to run it.
68
+
69
+ There's a rake task provided for you that you can use to run your tests:
70
+
71
+ rake test:javascripts
72
+
73
+ == Integrating with Rails 2
74
+
75
+ Add the following line to your Rakefile:
76
+
77
+ require 'everqueen/tasks'
78
+
79
+ This will give you the `test:javascripts` rake task. Note that mounting is not
80
+ possible under Rails 2 and that `require 'everqueen/rails'` will fail.
81
+
82
+ == Configuration
83
+
84
+ By default, Everqueen uses Selenium to run your tests and assumes a certain
85
+ directory structure. If this standard is fine for you, then you don't need to
86
+ do anything else. If you need to configure Everqueen to suit your needs,
87
+ Everqueen will automatically look for and load the following files:
88
+
89
+ config/everqueen.rb
90
+ .everqueen
91
+ ~/.everqueen
92
+
93
+ The content of these files could look like this:
94
+
95
+ require 'capybara-webkit'
96
+
97
+ Everqueen.configure do |config|
98
+ config.driver = :webkit
99
+ config.public_dir = 'public_html'
100
+ config.test_dir = 'test'
101
+ end
102
+
103
+
104
+ == Test Helper
105
+
106
+ If you add a test_helper file like so:
107
+
108
+ test/javascripts/test_helper.js
109
+
110
+ It will automatically be loaded. This is a great place for adding custom
111
+ matchers and the like.
112
+
113
+ == CoffeeScript
114
+
115
+ Everqueen supports tests written in
116
+ {CoffeeScript}[http://github.com/jashkenas/coffee-script] via Sprockets. Just name your test
117
+ file _test.coffee and it will automatically be translated for you.
118
+
119
+ You can also add a CoffeeScript test helper, but remember that CoffeeScript
120
+ encloses individual files in a closure, if you need something you define in the
121
+ test helper to be available in your test files, attach it to the window object:
122
+
123
+ # test/javascripts/test_helper.coffee
124
+
125
+ MyThing: "foo" # local to test helper
126
+ window.MyThing: "foo" # global
127
+
128
+ == Development
129
+
130
+ If you plan to work on Everqueen, you need to checkout the QUnit library, which
131
+ is added as a git submodule. Run the following command:
132
+
133
+ git submodule update --init
134
+
135
+ If you're using a version of Everqueen from git with bundler, you need to tell
136
+ bundler to use submodules, this can be achieved with the following command:
137
+
138
+ gem 'everqueen', :submodules => true, :git => 'git://github.com/jnicklas/everqueen.git'
139
+
140
+ == License:
141
+
142
+ (The MIT License)
143
+
144
+ Copyright (c) 2009 Jonas Nicklas
145
+
146
+ Permission is hereby granted, free of charge, to any person obtaining
147
+ a copy of this software and associated documentation files (the
148
+ 'Software'), to deal in the Software without restriction, including
149
+ without limitation the rights to use, copy, modify, merge, publish,
150
+ distribute, sublicense, and/or sell copies of the Software, and to
151
+ permit persons to whom the Software is furnished to do so, subject to
152
+ the following conditions:
153
+
154
+ The above copyright notice and this permission notice shall be
155
+ included in all copies or substantial portions of the Software.
156
+
157
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
158
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
159
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
160
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
161
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
162
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
163
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift(File.dirname(__FILE__) + '/../lib') unless $:.include?(File.dirname(__FILE__) + '/../lib')
4
+
5
+ require 'everqueen'
6
+
7
+ begin
8
+ # The dup is to keep ARGV intact, so that tools like ruby-debug can respawn.
9
+ success = Everqueen::Cli.execute(ARGV.dup)
10
+ Kernel.exit(success ? 0 : 1)
11
+ rescue SystemExit => e
12
+ Kernel.exit(e.status)
13
+ rescue Exception => e
14
+ STDERR.puts("#{e.message} (#{e.class})")
15
+ STDERR.puts(e.backtrace.join("\n"))
16
+ Kernel.exit(1)
17
+ end
18
+
@@ -0,0 +1,3 @@
1
+ Rails.application.routes.draw do
2
+ mount Everqueen::Application, :at => '/everqueen'
3
+ end
@@ -0,0 +1,66 @@
1
+ require 'rubygems'
2
+ require 'sinatra/base'
3
+ require 'capybara'
4
+ require 'launchy'
5
+ require 'coffee-script'
6
+ require 'everqueen/version'
7
+ require 'everqueen/application'
8
+ require 'json'
9
+
10
+ module Everqueen
11
+ autoload :Cli, 'everqueen/cli'
12
+ autoload :Server, 'everqueen/server'
13
+ autoload :Runner, 'everqueen/runner'
14
+ autoload :Suite, 'everqueen/suite'
15
+ autoload :Test, 'everqueen/test'
16
+
17
+ class << self
18
+ attr_accessor :driver, :public_dir, :test_dir, :root, :mounted_at, :application
19
+
20
+ def configure
21
+ yield self
22
+ end
23
+
24
+ def use_defaults!
25
+ configure do |config|
26
+ config.application = Everqueen::Application
27
+ config.driver = :selenium
28
+ config.public_dir = 'public'
29
+ config.test_dir = 'test/javascripts'
30
+ config.mounted_at = ""
31
+ end
32
+ end
33
+
34
+ def test_dir=(new_dir)
35
+ update_asset_paths(new_dir, test_dir)
36
+ @test_dir = new_dir
37
+ end
38
+
39
+ def public_dir=(new_dir)
40
+ update_asset_paths(new_dir, public_dir)
41
+ @public_dir = new_dir
42
+ end
43
+
44
+ def root=(new_root)
45
+ @root = new_root
46
+ update_asset_paths(test_dir, test_dir)
47
+ update_asset_paths(public_dir, public_dir)
48
+ @root
49
+ end
50
+
51
+ private
52
+
53
+ def update_asset_paths(new_dir, old_dir)
54
+ return if root.nil?
55
+ old_dir = File.expand_path(old_dir, root)
56
+ new_dir = File.expand_path(new_dir, root)
57
+ old_paths = Everqueen::AssetsEnvironment.clear_paths
58
+ old_paths.delete(old_dir)
59
+ old_paths.unshift(new_dir).each do |dir|
60
+ Everqueen::AssetsEnvironment.append_path(dir)
61
+ end
62
+ end
63
+ end
64
+ end
65
+
66
+ Everqueen.use_defaults!
@@ -0,0 +1,47 @@
1
+ require 'sprockets'
2
+
3
+ module Everqueen
4
+ class TestApplication < Sinatra::Base
5
+
6
+ set :static, false
7
+ set :root, File.expand_path('.', File.dirname(__FILE__))
8
+
9
+ helpers do
10
+ def url(path)
11
+ Everqueen.mounted_at.to_s + path.to_s
12
+ end
13
+ end
14
+
15
+ get '/' do
16
+ @suite = Everqueen::Suite.new
17
+ erb :list
18
+ end
19
+
20
+ get '/run/all' do
21
+ @suite = Everqueen::Suite.new
22
+ erb :run
23
+ end
24
+
25
+ get '/run/*' do |name|
26
+ @suite = Everqueen::Suite.new
27
+ @test = @suite.get_test(name)
28
+ erb :run
29
+ end
30
+ end
31
+
32
+ AssetsEnvironment = Sprockets::Environment.new
33
+ assets_path = File.expand_path(File.join(File.dirname(__FILE__), 'assets'))
34
+ AssetsEnvironment.append_path assets_path
35
+ qunit_assets_path = File.expand_path(File.join(File.dirname(__FILE__), '..', 'qunit', 'qunit'))
36
+ AssetsEnvironment.append_path qunit_assets_path
37
+
38
+ Application = Rack::Builder.app do
39
+ map '/assets' do
40
+ run AssetsEnvironment
41
+ end
42
+
43
+ map '/' do
44
+ run TestApplication
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,370 @@
1
+ body {
2
+ font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
3
+ background: #f0f0f0;
4
+ }
5
+
6
+ a {
7
+ color: #2A24A5;
8
+ }
9
+
10
+ #page, #test, .jasmine_reporter {
11
+ background: white;
12
+ -moz-border-radius: 3px;
13
+ padding: 20px;
14
+ margin: 10px auto 30px;
15
+ border: 1px solid #ddd;
16
+ box-shadow: 0 1px 3px 1px rgba(0,0,0,0.05)
17
+ }
18
+
19
+ #test {
20
+ min-height: 50px;
21
+ max-height: 300px;
22
+ overflow: auto;
23
+ margin: 30px auto 30px;
24
+ }
25
+
26
+ .jasmine_reporter {
27
+ margin: 30px auto 30px;
28
+ }
29
+
30
+ #page h1 {
31
+ font-size: 24px;
32
+ margin: 0 0 15px;
33
+ border-bottom: 3px solid #AEAEAE;
34
+ padding-bottom: 4px;
35
+ }
36
+
37
+ #page a.back {
38
+ font-size: 12px;
39
+ }
40
+
41
+ #page #all {
42
+ border-bottom: 3px solid #ECECEC;
43
+ padding: 12px 0;
44
+ margin-bottom: 20px;
45
+ overflow: hidden;
46
+ }
47
+
48
+ #page ul {
49
+ margin: 0;
50
+ padding: 0;
51
+ }
52
+
53
+ #page ul li {
54
+ list-style: none;
55
+ border-bottom: 1px solid #ECECEC;
56
+ margin: 1px 0 0;
57
+ padding: 8px 0;
58
+ position: relative;
59
+ overflow: hidden;
60
+ }
61
+
62
+ #page ul li:last-child {
63
+ border: none;
64
+ }
65
+
66
+ /*#page ul li:hover, #page #all:hover {
67
+ background: #FBFBFB;
68
+ }*/
69
+
70
+ #page ul li a:first-child, #page #all a:first-child {
71
+ margin-top: 3px;
72
+ float: left;
73
+ padding: 4px 2px;
74
+ }
75
+
76
+ #page ul li a:first-child:hover, #page #all a:first-child:hover {
77
+ background: #242DA5;
78
+ color: #fff;
79
+ text-decoration: none;
80
+ border-radius: 3px;
81
+ }
82
+
83
+ #page a.run {
84
+ display: block;
85
+ float: right;
86
+ border-radius: 3px;
87
+ padding: 4px 10px;
88
+ color: #484848;
89
+ text-decoration: none;
90
+ border: 1px solid #CBCBCB;
91
+ border-bottom-color: #BDBDBD;
92
+ background: #D8D8D8;
93
+ background: -moz-linear-gradient(top, #eaeaea 1%, #d1d1d1 100%); /* FF3.6+ */
94
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(1%,#eaeaea), color-stop(100%,#d1d1d1)); /* Chrome,Safari4+ */
95
+ background: -webkit-linear-gradient(top, #eaeaea 1%,#d1d1d1 100%); /* Chrome10+,Safari5.1+ */
96
+ background: -o-linear-gradient(top, #eaeaea 1%,#d1d1d1 100%); /* Opera11.10+ */
97
+ background: -ms-linear-gradient(top, #eaeaea 1%,#d1d1d1 100%); /* IE10+ */
98
+ background: linear-gradient(top, #eaeaea 1%,#d1d1d1 100%); /* W3C */
99
+ }
100
+
101
+ #page a.run:hover {
102
+ box-shadow: inset 0 1px 6px 2px rgba(255,255,255,0.8);
103
+ text-shadow: 0px 0px 4px rgba(255,255,255,0.7);
104
+ }
105
+
106
+ #page a.run.pass {
107
+ border-color: #45991E;
108
+ color: #fff;
109
+ background: #4DA524;
110
+ background: -moz-linear-gradient(top, #4DA524 1%, #408B1D 100%); /* FF3.6+ */
111
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(1%,#4DA524), color-stop(100%,#408B1D)); /* Chrome,Safari4+ */
112
+ background: -webkit-linear-gradient(top, #4DA524 1%,#408B1D 100%); /* Chrome10+,Safari5.1+ */
113
+ background: -o-linear-gradient(top, #4DA524 1%,#408B1D 100%); /* Opera11.10+ */
114
+ background: -ms-linear-gradient(top, #4DA524 1%,#408B1D 100%); /* IE10+ */
115
+ background: linear-gradient(top, #4DA524 1%,#408B1D 100%); /* W3C */
116
+ box-shadow: inset 0 1px 6px 1px rgba(255,255,255,0.2);
117
+ text-shadow: 0px 0px 4px rgba(255,255,255,0.2);
118
+ }
119
+
120
+ #page a.run.fail {
121
+ border-color: #CB3737;
122
+ color: #fff;
123
+ background: #E24040;
124
+ background: -moz-linear-gradient(top, #E24040 1%, #C53838 100%); /* FF3.6+ */
125
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(1%,#E24040), color-stop(100%,#C53838)); /* Chrome,Safari4+ */
126
+ background: -webkit-linear-gradient(top, #E24040 1%,#C53838 100%); /* Chrome10+,Safari5.1+ */
127
+ background: -o-linear-gradient(top, #E24040 1%,#C53838 100%); /* Opera11.10+ */
128
+ background: -ms-linear-gradient(top, #E24040 1%,#C53838 100%); /* IE10+ */
129
+ background: linear-gradient(top, #E24040 1%,#C53838 100%); /* W3C */
130
+ }
131
+
132
+ #page a.run.pass:hover, #page a.run.fail:hover {
133
+ box-shadow: inset 0 1px 6px 2px rgba(255,255,255,0.3);
134
+ text-shadow: 0px 0px 4px rgba(255,255,255,0.3)
135
+ }
136
+
137
+ #page a.run.running, #page a.run.running:hover {
138
+ border-color: blue;
139
+ background-image: url("data:image/gif,GIF89a%10%00%10%00%F2%00%00%FF%FF%FF%00%00%00%C2%C2%C2BBB%00%00%00bbb%82%82%82%92%92%92!%FE%1ACreated%20with%20ajaxload.info%00!%F9%04%00%0A%00%00%00!%FF%0BNETSCAPE2.0%03%01%00%00%00%2C%00%00%00%00%10%00%10%00%00%033%08%BA%DC%FE0%CAIk%13c%08%3A%08%19%9C%07N%98f%09E%B11%C2%BA%14%99%C1%B6.%60%C4%C2q%D0-%5B%189%DD%A6%079%18%0C%07Jk%E7H%00%00!%F9%04%00%0A%00%01%00%2C%00%00%00%00%10%00%10%00%00%034%08%BA%DC%FEN%8C!%20%1B%84%0C%BB%B0%E6%8ADqBQT%601%19%20%60LE%5B%1A%A8%7C%1C%B5u%DF%EDa%18%07%80%20%D7%18%E2%86C%19%B2%25%24*%12%00!%F9%04%00%0A%00%02%00%2C%00%00%00%00%10%00%10%00%00%036%08%BA2%23%2B%CAA%C8%90%CC%94V%2F%06%85c%1C%0E%F4%19N%F1IBa%98%ABp%1C%F0%0A%CC%B3%BD%1C%C6%A8%2B%02Y%ED%17%FC%01%83%C3%0F2%A9d%1A%9F%BF%04%00!%F9%04%00%0A%00%03%00%2C%00%00%00%00%10%00%10%00%00%033%08%BAb%25%2B%CA2%86%91%EC%9CV_%85%8B%A6%09%85!%0C%041D%87a%1C%11%AAF%82%B0%D1%1F%03bR%5D%F3%3D%1F08%2C%1A%8F%C8%A4r9L%00%00!%F9%04%00%0A%00%04%00%2C%00%00%00%00%10%00%10%00%00%032%08%BAr'%2BJ%E7d%14%F0%18%F3L%81%0C%26v%C3%60%5CbT%94%85%84%B9%1EhYB)%CF%CA%40%10%03%1E%E9%3C%1F%C3%26%2C%1A%8F%C8%A4R%92%00%00!%F9%04%00%0A%00%05%00%2C%00%00%00%00%10%00%10%00%00%033%08%BA%20%C2%909%17%E3t%E7%BC%DA%9E0%19%C7%1C%E0!.B%B6%9D%CAW%AC%A21%0C%06%0B%14sa%BB%B05%F7%95%01%810%B0%09%89%BB%9Fm)J%00%00!%F9%04%00%0A%00%06%00%2C%00%00%00%00%10%00%10%00%00%032%08%BA%DC%FE%F0%09%11%D9%9CU%5D%9A%01%EE%DAqp%95%60%88%DDa%9C%DD4%96%85AF%C50%14%90%60%9B%B6%01%0D%04%C2%40%10%9B1%80%C2%D6%CE%91%00%00!%F9%04%00%0A%00%07%00%2C%00%00%00%00%10%00%10%00%00%032%08%BA%DC%FE0%CAI%ABeB%D4%9C)%D7%1E%08%08%C3%20%8E%C7q%0E%0410%A9%CA%B0%AEP%18%C2a%18%07V%DA%A5%02%20ub%18%82%9E%5B%11%90%00%00%3B%00%00%00%00%00%00%00%00%00");
140
+ background-repeat: no-repeat;
141
+ background-position: center center;
142
+ text-indent: -999999px;
143
+ padding-right: 14px;
144
+ padding-left: 14px;
145
+ border-color: #EDEDED;
146
+ }
147
+
148
+ #footer {
149
+ margin: 0 auto 30px;
150
+ width: 600px;
151
+ text-align: center;
152
+ font-size: 13px;
153
+ color: #aaa;
154
+ }
155
+
156
+ #footer a.elabs {
157
+ position: relative;
158
+ padding-left: 30px;
159
+ }
160
+
161
+ #footer a.elabs img {
162
+ width: 23px;
163
+ opacity: 0.6;
164
+ position: absolute;
165
+ top: -4px;
166
+ left: 3px;
167
+ }
168
+ #footer a.elabs:hover img {
169
+ opacity: 1;
170
+ }
171
+
172
+ /**
173
+ * QUnit v1.3.0pre - A JavaScript Unit Testing Framework
174
+ *
175
+ * http://docs.jquery.com/QUnit
176
+ *
177
+ * Copyright (c) 2011 John Resig, Jörn Zaefferer
178
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
179
+ * or GPL (GPL-LICENSE.txt) licenses.
180
+ */
181
+
182
+ /** Font Family and Sizes */
183
+
184
+
185
+ #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
186
+ #qunit-tests { font-size: smaller; }
187
+
188
+
189
+ /** Resets */
190
+
191
+ #qunit-tests, #qunit-tests ol, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult {
192
+ margin: 0;
193
+ padding: 0;
194
+ }
195
+
196
+
197
+ #qunit-header a:hover,
198
+ #qunit-header a:focus {
199
+ color: #fff;
200
+ }
201
+
202
+ #qunit-testrunner-toolbar {
203
+ padding: 0.5em 0 0.5em 2em;
204
+ color: #5E740B;
205
+ }
206
+
207
+ #qunit-userAgent {
208
+ padding: 0.5em 0 0.5em 2.5em;
209
+ color: #366097;
210
+ border-bottom: 1px solid #fff;
211
+ }
212
+
213
+
214
+ /** Tests: Pass/Fail */
215
+
216
+ #qunit-tests {
217
+ list-style-position: inside;
218
+ }
219
+
220
+ #qunit-tests li {
221
+ padding: 0.4em 0.5em 0.4em 2.5em;
222
+ border-bottom: 1px solid #fff;
223
+ list-style-position: inside;
224
+ }
225
+
226
+ #qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running {
227
+ display: none;
228
+ }
229
+
230
+ #qunit-tests li strong {
231
+ cursor: pointer;
232
+ }
233
+
234
+ #qunit-tests li a {
235
+ padding: 0.5em;
236
+ color: #c2ccd1;
237
+ text-decoration: none;
238
+ }
239
+ #qunit-tests li a:hover,
240
+ #qunit-tests li a:focus {
241
+ color: #000;
242
+ }
243
+
244
+ #qunit-tests ol {
245
+ margin-top: 0.5em;
246
+ padding: 0.5em;
247
+
248
+ background-color: #fff;
249
+
250
+ border-radius: 5px;
251
+ -moz-border-radius: 5px;
252
+ -webkit-border-radius: 5px;
253
+
254
+ box-shadow: inset 0px 2px 3px #999;
255
+ -moz-box-shadow: inset 0px 2px 3px #999;
256
+ -webkit-box-shadow: inset 0px 2px 3px #999;
257
+ }
258
+
259
+ #qunit-tests table {
260
+ border-collapse: collapse;
261
+ margin-top: .2em;
262
+ }
263
+
264
+ #qunit-tests th {
265
+ text-align: right;
266
+ vertical-align: top;
267
+ padding: 0 .5em 0 0;
268
+ }
269
+
270
+ #qunit-tests td {
271
+ vertical-align: top;
272
+ }
273
+
274
+ #qunit-tests pre {
275
+ margin: 0;
276
+ white-space: pre-wrap;
277
+ word-wrap: break-word;
278
+ }
279
+
280
+ #qunit-tests del {
281
+ background-color: #e0f2be;
282
+ color: #374e0c;
283
+ text-decoration: none;
284
+ }
285
+
286
+ #qunit-tests ins {
287
+ background-color: #ffcaca;
288
+ color: #500;
289
+ text-decoration: none;
290
+ }
291
+
292
+ /*** Test Counts */
293
+
294
+ #qunit-tests b.counts { color: black; }
295
+ #qunit-tests b.passed { color: #5E740B; }
296
+ #qunit-tests b.failed { color: #710909; }
297
+
298
+ #qunit-tests li li {
299
+ margin: 0.5em;
300
+ padding: 0.4em 0.5em 0.4em 0.5em;
301
+ background-color: #fff;
302
+ border-bottom: none;
303
+ list-style-position: inside;
304
+ }
305
+
306
+ /*** Passing Styles */
307
+
308
+ #qunit-tests li li.pass {
309
+ color: #5E740B;
310
+ background-color: #fff;
311
+ border-left: 26px solid #C6E746;
312
+ }
313
+
314
+ #qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; }
315
+ #qunit-tests .pass .test-name { color: #366097; }
316
+
317
+ #qunit-tests .pass .test-actual,
318
+ #qunit-tests .pass .test-expected { color: #999999; }
319
+
320
+ #qunit-banner.qunit-pass { background-color: #C6E746; }
321
+
322
+ /*** Failing Styles */
323
+
324
+ #qunit-tests li li.fail {
325
+ color: #710909;
326
+ background-color: #fff;
327
+ border-left: 26px solid #EE5757;
328
+ white-space: pre;
329
+ }
330
+
331
+ #qunit-tests > li:last-child {
332
+ border-radius: 0 0 15px 15px;
333
+ -moz-border-radius: 0 0 15px 15px;
334
+ -webkit-border-bottom-right-radius: 15px;
335
+ -webkit-border-bottom-left-radius: 15px;
336
+ }
337
+
338
+ #qunit-tests .fail { color: #000000; background-color: #EE5757; }
339
+ #qunit-tests .fail .test-name,
340
+ #qunit-tests .fail .module-name { color: #000000; }
341
+
342
+ #qunit-tests .fail .test-actual { color: #EE5757; }
343
+ #qunit-tests .fail .test-expected { color: green; }
344
+
345
+ #qunit-banner.qunit-fail { background-color: #EE5757; }
346
+
347
+
348
+ /** Result */
349
+
350
+ #qunit-testresult {
351
+ padding: 0.5em 0.5em 0.5em 2.5em;
352
+
353
+ color: #2b81af;
354
+ background-color: #D2E0E6;
355
+
356
+ border-bottom: 1px solid white;
357
+ border-radius: 15px 15px 0 0;
358
+ -moz-border-radius: 15px 15px 0 0;
359
+ -webkit-border-top-right-radius: 15px;
360
+ -webkit-border-top-left-radius: 15px;
361
+
362
+ }
363
+
364
+ /** Fixture */
365
+
366
+ #qunit-fixture {
367
+ position: absolute;
368
+ top: -10000px;
369
+ left: -10000px;
370
+ }