everqueen 1.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.
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
+ }