evergreen 0.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (104) hide show
  1. data/README.rdoc +101 -3
  2. data/bin/evergreen +2 -2
  3. data/lib/evergreen.rb +14 -2
  4. data/lib/evergreen/evergreen.js +23 -0
  5. data/lib/evergreen/rails.rb +8 -0
  6. data/lib/evergreen/runner.rb +21 -14
  7. data/lib/evergreen/spec.rb +12 -33
  8. data/lib/evergreen/version.rb +1 -1
  9. data/lib/evergreen/views/list.erb +1 -1
  10. data/lib/evergreen/views/spec.erb +9 -22
  11. data/lib/jasmine/README.markdown +21 -28
  12. data/lib/jasmine/Rakefile +98 -68
  13. data/lib/jasmine/example/SpecRunner.html +27 -0
  14. data/lib/jasmine/example/spec/PlayerSpec.js +58 -0
  15. data/lib/jasmine/example/spec/SpecHelper.js +9 -0
  16. data/lib/jasmine/example/src/Player.js +22 -0
  17. data/lib/jasmine/example/src/Song.js +7 -0
  18. data/lib/jasmine/lib/jasmine-html.js +182 -0
  19. data/lib/jasmine/lib/{jasmine-0.10.4.js → jasmine.js} +127 -155
  20. data/lib/jasmine/spec/runner.html +4 -3
  21. data/lib/jasmine/spec/suites/BaseSpec.js +27 -0
  22. data/lib/jasmine/spec/suites/CustomMatchersSpec.js +0 -24
  23. data/lib/jasmine/spec/suites/EnvSpec.js +1 -1
  24. data/lib/jasmine/spec/suites/JsApiReporterSpec.js +16 -9
  25. data/lib/jasmine/spec/suites/MatchersSpec.js +49 -42
  26. data/lib/jasmine/spec/suites/MockClockSpec.js +4 -0
  27. data/lib/jasmine/spec/suites/MultiReporterSpec.js +23 -8
  28. data/lib/jasmine/spec/suites/PrettyPrintSpec.js +2 -2
  29. data/lib/jasmine/spec/suites/ReporterSpec.js +10 -14
  30. data/lib/jasmine/spec/suites/RunnerSpec.js +6 -6
  31. data/lib/jasmine/spec/suites/SpecRunningSpec.js +1 -1
  32. data/lib/jasmine/spec/suites/SpecSpec.js +15 -1
  33. data/lib/jasmine/spec/suites/SpySpec.js +3 -3
  34. data/lib/jasmine/spec/suites/TrivialReporterSpec.js +91 -14
  35. data/lib/jasmine/spec/suites/WaitsForBlockSpec.js +5 -6
  36. data/lib/jasmine/src/JsApiReporter.js +4 -6
  37. data/lib/jasmine/src/Matchers.js +19 -19
  38. data/lib/jasmine/src/MultiReporter.js +8 -1
  39. data/lib/jasmine/src/NestedResults.js +5 -5
  40. data/lib/jasmine/src/PrettyPrinter.js +2 -2
  41. data/lib/jasmine/src/Reporter.js +4 -0
  42. data/lib/jasmine/src/Spec.js +12 -8
  43. data/lib/jasmine/src/base.js +40 -44
  44. data/lib/jasmine/{lib → src/html}/TrivialReporter.js +17 -6
  45. data/lib/jasmine/src/html/jasmine.css +166 -0
  46. data/lib/jasmine/src/mock-timeout.js +22 -16
  47. data/lib/jasmine/src/version.json +2 -2
  48. data/lib/tasks/evergreen.rake +7 -0
  49. data/spec/evergreen_spec.rb +18 -0
  50. data/spec/fixtures/public/jquery.js +152 -0
  51. data/spec/fixtures/spec/javascripts/bar_spec.js +0 -0
  52. data/spec/fixtures/spec/javascripts/failing_spec.js +12 -0
  53. data/spec/fixtures/spec/javascripts/foo_spec.js +0 -0
  54. data/spec/fixtures/spec/javascripts/templates_spec.html +1 -0
  55. data/spec/fixtures/spec/javascripts/templates_spec.js +23 -0
  56. data/spec/fixtures/spec/javascripts/testing_spec.js +11 -0
  57. data/spec/fixtures/spec/javascripts/transactions_spec.js +14 -0
  58. data/spec/meta_spec.rb +17 -0
  59. data/spec/runner_spec.rb +35 -0
  60. data/spec/spec_helper.rb +33 -0
  61. data/spec/spec_spec.rb +30 -0
  62. metadata +64 -48
  63. data/lib/jasmine/doc/files.html +0 -460
  64. data/lib/jasmine/doc/index.html +0 -322
  65. data/lib/jasmine/doc/symbols/_global_.html +0 -918
  66. data/lib/jasmine/doc/symbols/jasmine.Block.html +0 -417
  67. data/lib/jasmine/doc/symbols/jasmine.Clock.html +0 -678
  68. data/lib/jasmine/doc/symbols/jasmine.Env.html +0 -1169
  69. data/lib/jasmine/doc/symbols/jasmine.JsApiReporter.html +0 -822
  70. data/lib/jasmine/doc/symbols/jasmine.Matchers.html +0 -1474
  71. data/lib/jasmine/doc/symbols/jasmine.MultiReporter.html +0 -394
  72. data/lib/jasmine/doc/symbols/jasmine.NestedResults.html +0 -710
  73. data/lib/jasmine/doc/symbols/jasmine.Reporter.html +0 -574
  74. data/lib/jasmine/doc/symbols/jasmine.Runner.html +0 -710
  75. data/lib/jasmine/doc/symbols/jasmine.Spec.html +0 -1253
  76. data/lib/jasmine/doc/symbols/jasmine.Spy.html +0 -855
  77. data/lib/jasmine/doc/symbols/jasmine.Suite.html +0 -705
  78. data/lib/jasmine/doc/symbols/jasmine.html +0 -1345
  79. data/lib/jasmine/doc/symbols/jasmine.util.html +0 -535
  80. data/lib/jasmine/doc/symbols/src/lib_TrivialReporter.js.html +0 -124
  81. data/lib/jasmine/doc/symbols/src/src_Block.js.html +0 -29
  82. data/lib/jasmine/doc/symbols/src/src_Env.js.html +0 -248
  83. data/lib/jasmine/doc/symbols/src/src_JsApiReporter.js.html +0 -111
  84. data/lib/jasmine/doc/symbols/src/src_Matchers.js.html +0 -344
  85. data/lib/jasmine/doc/symbols/src/src_MultiReporter.js.html +0 -36
  86. data/lib/jasmine/doc/symbols/src/src_NestedResults.js.html +0 -88
  87. data/lib/jasmine/doc/symbols/src/src_PrettyPrinter.js.html +0 -130
  88. data/lib/jasmine/doc/symbols/src/src_Queue.js.html +0 -102
  89. data/lib/jasmine/doc/symbols/src/src_Reporter.js.html +0 -35
  90. data/lib/jasmine/doc/symbols/src/src_Reporters.js.html +0 -51
  91. data/lib/jasmine/doc/symbols/src/src_Runner.js.html +0 -75
  92. data/lib/jasmine/doc/symbols/src/src_Spec.js.html +0 -214
  93. data/lib/jasmine/doc/symbols/src/src_Suite.js.html +0 -77
  94. data/lib/jasmine/doc/symbols/src/src_WaitsBlock.js.html +0 -21
  95. data/lib/jasmine/doc/symbols/src/src_WaitsForBlock.js.html +0 -45
  96. data/lib/jasmine/doc/symbols/src/src_base.js.html +0 -585
  97. data/lib/jasmine/doc/symbols/src/src_mock-timeout.js.html +0 -185
  98. data/lib/jasmine/doc/symbols/src/src_util.js.html +0 -75
  99. data/lib/jasmine/example/example_runner.html +0 -22
  100. data/lib/jasmine/example/spec/example_suite.js +0 -11
  101. data/lib/jasmine/spec/jasmine_helper.rb +0 -44
  102. data/lib/jasmine/spec/jasmine_spec.rb +0 -31
  103. data/lib/jasmine/spec/saucelabs.yml +0 -24
  104. data/lib/jasmine/src/Reporters.js +0 -43
@@ -1,38 +1,34 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), "spec/jasmine_helper.rb"))
2
-
3
1
  def jasmine_sources
4
2
  sources = ["src/base.js", "src/util.js", "src/Env.js", "src/Reporter.js", "src/Block.js"]
5
- sources += Dir.glob('src/*.js').reject{|f| f == 'src/base.js' || sources.include?(f)}.sort
3
+ sources += Dir.glob('src/*.js').reject { |f| f == 'src/base.js' || sources.include?(f) }.sort
6
4
  sources
7
5
  end
8
6
 
9
- def jasmine_filename(version)
10
- "jasmine-#{version['major']}.#{version['minor']}.#{version['build']}.js"
7
+ def jasmine_html_sources
8
+ ["src/html/TrivialReporter.js"]
11
9
  end
12
10
 
13
- def version_hash
14
- JSON.parse(File.new("src/version.json").read);
11
+ def jasmine_version
12
+ "#{version_hash['major']}.#{version_hash['minor']}.#{version_hash['build']}"
15
13
  end
16
14
 
17
- def start_jasmine_server(jasmine_includes = nil)
18
- require File.expand_path(File.join(JasmineHelper.jasmine_root, "contrib/ruby/jasmine_spec_builder"))
19
-
20
- puts "your tests are here:"
21
- puts " http://localhost:8888/run.html"
22
-
23
- Jasmine::SimpleServer.start(
24
- 8888,
25
- lambda { JasmineHelper.specs },
26
- JasmineHelper.dir_mappings,
27
- :jasmine_files => jasmine_includes)
15
+ def version_hash
16
+ require 'json'
17
+ @version ||= JSON.parse(File.new("src/version.json").read);
28
18
  end
29
19
 
30
20
  task :default => 'jasmine:dist'
31
21
 
22
+ def substitute_jasmine_version(filename)
23
+ contents = File.read(filename)
24
+ contents = contents.gsub(/##JASMINE_VERSION##/, (jasmine_version))
25
+ File.open(filename, 'w') { |f| f.write(contents) }
26
+ end
27
+
32
28
  namespace :jasmine do
33
29
 
34
30
  desc 'Prepares for distribution'
35
- task :dist => ['jasmine:build', 'jasmine:doc']
31
+ task :dist => ['jasmine:build', 'jasmine:doc', 'jasmine:build_example_project', 'jasmine:fill_index_downloads']
36
32
 
37
33
  desc 'Check jasmine sources for coding problems'
38
34
  task :lint do
@@ -46,6 +42,11 @@ namespace :jasmine do
46
42
  puts "Dangerous undefined at #{src}:#{i}:\n > #{line}"
47
43
  passed = false
48
44
  end
45
+
46
+ if line.scan(/window/).length > 0
47
+ puts "Dangerous window at #{src}:#{i}:\n > #{line}"
48
+ passed = false
49
+ end
49
50
  end
50
51
  end
51
52
 
@@ -58,89 +59,118 @@ namespace :jasmine do
58
59
  desc 'Builds lib/jasmine from source'
59
60
  task :build => :lint do
60
61
  puts 'Building Jasmine from source'
61
- require 'json'
62
62
 
63
63
  sources = jasmine_sources
64
64
  version = version_hash
65
65
 
66
66
  old_jasmine_files = Dir.glob('lib/jasmine*.js')
67
- old_jasmine_files.each do |file|
68
- File.delete(file)
69
- end
70
-
71
- jasmine = File.new("lib/#{jasmine_filename version}", 'w')
67
+ old_jasmine_files.each { |file| File.delete(file) }
72
68
 
73
- sources.each do |source_filename|
74
- jasmine.puts(File.read(source_filename))
75
- end
69
+ File.open("lib/jasmine.js", 'w') do |jasmine|
70
+ sources.each do |source_filename|
71
+ jasmine.puts(File.read(source_filename))
72
+ end
76
73
 
77
- jasmine.puts %{
74
+ jasmine.puts %{
78
75
  jasmine.version_= {
79
76
  "major": #{version['major']},
80
77
  "minor": #{version['minor']},
81
78
  "build": #{version['build']},
82
79
  "revision": #{Time.now.to_i}
83
- };
80
+ };
84
81
  }
82
+ end
83
+
84
+ File.open("lib/jasmine-html.js", 'w') do |jasmine_html|
85
+ jasmine_html_sources.each do |source_filename|
86
+ jasmine_html.puts(File.read(source_filename))
87
+ end
88
+ end
89
+
90
+ FileUtils.cp("src/html/jasmine.css", "lib/jasmine.css")
91
+ end
85
92
 
86
- jasmine.close
93
+ task :need_pages_submodule do
94
+ unless File.exists?('pages/index.html')
95
+ raise "Jasmine pages submodule isn't present. Run git submodule update --init"
96
+ end
87
97
  end
88
98
 
89
99
  desc "Build jasmine documentation"
90
- task :doc do
100
+ task :doc => :need_pages_submodule do
91
101
  puts 'Creating Jasmine Documentation'
92
102
  require 'rubygems'
93
103
  #sudo gem install ragaskar-jsdoc_helper
94
104
  require 'jsdoc_helper'
95
105
 
106
+ FileUtils.rm_r "pages/jsdoc", :force => true
96
107
 
97
108
  JsdocHelper::Rake::Task.new(:lambda_jsdoc) do |t|
98
- t[:files] = jasmine_sources << 'lib/TrivialReporter.js'
109
+ t[:files] = jasmine_sources << jasmine_html_sources
99
110
  t[:options] = "-a"
111
+ t[:out] = "pages/jsdoc"
100
112
  end
101
113
  Rake::Task[:lambda_jsdoc].invoke
102
114
  end
103
115
 
116
+ desc "Build example project"
117
+ task :build_example_project => :need_pages_submodule do
118
+ require 'tmpdir'
119
+
120
+ temp_dir = File.join(Dir.tmpdir, 'jasmine-standalone-project')
121
+ puts "Building Example Project in #{temp_dir}"
122
+ FileUtils.rm_r temp_dir if File.exists?(temp_dir)
123
+ Dir.mkdir(temp_dir)
124
+
125
+ root = File.expand_path(File.dirname(__FILE__))
126
+ FileUtils.cp_r File.join(root, 'example/.'), File.join(temp_dir)
127
+ substitute_jasmine_version(File.join(temp_dir, "SpecRunner.html"))
128
+
129
+ lib_dir = File.join(temp_dir, "lib/jasmine-#{jasmine_version}")
130
+ FileUtils.mkdir_p(lib_dir)
131
+ {
132
+ "lib/jasmine.js" => "jasmine.js",
133
+ "lib/jasmine-html.js" => "jasmine-html.js",
134
+ "src/html/jasmine.css" => "jasmine.css"
135
+ }.each_pair do |src, dest|
136
+ FileUtils.cp(File.join(root, src), File.join(lib_dir, dest))
137
+ end
104
138
 
105
- task :server do
106
- files = jasmine_sources + ['lib/TrivialReporter.js', 'lib/consolex.js']
107
- jasmine_includes = lambda {
108
- raw_jasmine_includes = files.collect { |f| File.expand_path(File.join(JasmineHelper.jasmine_root, f)) }
109
- Jasmine.cachebust(raw_jasmine_includes).collect {|f| f.sub(JasmineHelper.jasmine_src_dir, "/src").sub(JasmineHelper.jasmine_lib_dir, "/lib") }
110
- }
111
- start_jasmine_server(jasmine_includes)
112
- end
113
-
114
- task :server_build => 'jasmine:build' do
115
-
116
- start_jasmine_server
139
+ dist_dir = File.join(root, 'pages/downloads')
140
+ zip_file_name = File.join(dist_dir, "jasmine-standalone-#{jasmine_version}.zip")
141
+ puts "Zipping Example Project and moving to #{zip_file_name}"
142
+ FileUtils.mkdir(dist_dir) unless File.exist?(dist_dir)
143
+ if File.exist?(zip_file_name)
144
+ puts "WARNING!!! #{zip_file_name} already exists!"
145
+ FileUtils.rm(zip_file_name)
146
+ end
147
+ exec "cd #{temp_dir} && zip -r #{zip_file_name} . -x .[a-zA-Z0-9]*"
117
148
  end
118
149
 
119
- namespace :test do
120
- task :ci => :'ci:local'
121
- namespace :ci do
122
-
123
- task :local => 'jasmine:build' do
124
- require "spec"
125
- require 'spec/rake/spectask'
126
- Spec::Rake::SpecTask.new(:lambda_ci) do |t|
127
- t.spec_opts = ["--color", "--format", "specdoc"]
128
- t.spec_files = ["spec/jasmine_spec.rb"]
129
- end
130
- Rake::Task[:lambda_ci].invoke
131
- end
132
-
133
- task :saucelabs => ['jasmine:copy_saucelabs_config', 'jasmine:build'] do
134
- ENV['SAUCELABS'] = 'true'
135
- Rake::Task['jasmine:test:ci:local'].invoke
136
- end
150
+ task :fill_index_downloads do
151
+ require 'digest/sha1'
152
+
153
+ download_html = "<!-- START_DOWNLOADS -->\n"
154
+ download_html += "<table>\n<tr><th/><th>Version</th><th>Size</th><th>Date</th><th>SHA1</th></tr>\n"
155
+ Dir.glob('pages/downloads/*.zip').sort.reverse.each do |f|
156
+ sha1 = Digest::SHA1.hexdigest File.read(f)
157
+
158
+ fn = f.sub(/^pages\//, '')
159
+ version = /jasmine-standalone-(.*).zip/.match(f)[1]
160
+ download_html += "<td><a href='#{fn}'>#{fn.sub(/downloads\//, '')}</a></td>"
161
+ download_html += "<td>#{version}</td>\n"
162
+ download_html += "<td>#{File.size(f) / 1024}k</td>\n"
163
+ download_html += "<td>#{File.mtime(f).strftime("%Y/%m/%d %H:%M:%S")}</td>\n"
164
+ download_html += "<td>#{sha1}</td>\n"
137
165
  end
138
- end
166
+ download_html += "</table>\n<!-- END_DOWNLOADS -->"
139
167
 
140
- desc 'Copy saucelabs.yml to work directory'
141
- task 'copy_saucelabs_config' do
142
- FileUtils.cp '../saucelabs.yml', 'spec'
168
+ index_page = File.read('pages/index.html')
169
+ matcher = /<!-- START_DOWNLOADS -->.*<!-- END_DOWNLOADS -->/m
170
+ index_page = index_page.sub(matcher, download_html)
171
+ File.open('pages/index.html', 'w') {|f| f.write(index_page)}
172
+ puts "rewrote that file"
143
173
  end
144
174
  end
145
175
 
146
- task :jasmine => ['jasmine:server']
176
+ task :jasmine => ['jasmine:dist']
@@ -0,0 +1,27 @@
1
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
2
+ "http://www.w3.org/TR/html4/loose.dtd">
3
+ <html>
4
+ <head>
5
+ <title>Jasmine Test Runner</title>
6
+ <link rel="stylesheet" type="text/css" href="lib/jasmine-##JASMINE_VERSION##/jasmine.css">
7
+ <script type="text/javascript" src="lib/jasmine-##JASMINE_VERSION##/jasmine.js"></script>
8
+ <script type="text/javascript" src="lib/jasmine-##JASMINE_VERSION##/jasmine-html.js"></script>
9
+
10
+ <!-- include source files here... -->
11
+ <script type="text/javascript" src="src/Player.js"></script>
12
+ <script type="text/javascript" src="src/Song.js"></script>
13
+
14
+ <!-- include spec files here... -->
15
+ <script type="text/javascript" src="spec/SpecHelper.js"></script>
16
+ <script type="text/javascript" src="spec/PlayerSpec.js"></script>
17
+
18
+ </head>
19
+ <body>
20
+ <script type="text/javascript">
21
+ jasmine.getEnv().addReporter(new jasmine.TrivialReporter());
22
+ jasmine.getEnv().execute();
23
+ </script>
24
+
25
+ </body>
26
+ </html>
27
+
@@ -0,0 +1,58 @@
1
+ describe("Player", function() {
2
+ var player;
3
+ var song;
4
+
5
+ beforeEach(function() {
6
+ player = new Player();
7
+ song = new Song();
8
+ });
9
+
10
+ it("should be able to play a Song", function() {
11
+ player.play(song);
12
+ expect(player.currentlyPlayingSong).toEqual(song);
13
+
14
+ //demonstrates use of custom matcher
15
+ expect(player).toBePlaying(song);
16
+ });
17
+
18
+ describe("when song has been paused", function() {
19
+ beforeEach(function() {
20
+ player.play(song);
21
+ player.pause();
22
+ });
23
+
24
+ it("should indicate that the song is currently paused", function() {
25
+ expect(player.isPlaying).toBeFalsy();
26
+
27
+ // demonstrates use of 'not' with a custom matcher
28
+ expect(player).not.toBePlaying(song);
29
+ });
30
+
31
+ it("should be possible to resume", function() {
32
+ player.resume();
33
+ expect(player.isPlaying).toBeTruthy();
34
+ expect(player.currentlyPlayingSong).toEqual(song);
35
+ });
36
+ });
37
+
38
+ // demonstrates use of spies to intercept and test method calls
39
+ it("tells the current song if the user has made it a favorite", function() {
40
+ spyOn(song, 'persistFavoriteStatus');
41
+
42
+ player.play(song);
43
+ player.makeFavorite();
44
+
45
+ expect(song.persistFavoriteStatus).toHaveBeenCalledWith(true);
46
+ });
47
+
48
+ //demonstrates use of expected exceptions
49
+ describe("#resume", function() {
50
+ it("should throw an exception if song is already playing", function() {
51
+ player.play(song);
52
+
53
+ expect(function() {
54
+ player.resume();
55
+ }).toThrow("song is already playing");
56
+ });
57
+ });
58
+ });
@@ -0,0 +1,9 @@
1
+ beforeEach(function() {
2
+ this.addMatchers({
3
+ toBePlaying: function(expectedSong) {
4
+ var player = this.actual;
5
+ return player.currentlyPlayingSong === expectedSong
6
+ && player.isPlaying;
7
+ }
8
+ })
9
+ });
@@ -0,0 +1,22 @@
1
+ function Player() {
2
+ }
3
+ Player.prototype.play = function(song) {
4
+ this.currentlyPlayingSong = song;
5
+ this.isPlaying = true;
6
+ };
7
+
8
+ Player.prototype.pause = function() {
9
+ this.isPlaying = false;
10
+ };
11
+
12
+ Player.prototype.resume = function() {
13
+ if (this.isPlaying) {
14
+ throw new Error("song is already playing");
15
+ }
16
+
17
+ this.isPlaying = true;
18
+ };
19
+
20
+ Player.prototype.makeFavorite = function() {
21
+ this.currentlyPlayingSong.persistFavoriteStatus(true);
22
+ };
@@ -0,0 +1,7 @@
1
+ function Song() {
2
+ }
3
+
4
+ Song.prototype.persistFavoriteStatus = function(value) {
5
+ // something complicated
6
+ throw new Error("not yet implemented");
7
+ };
@@ -0,0 +1,182 @@
1
+ jasmine.TrivialReporter = function(doc) {
2
+ this.document = doc || document;
3
+ this.suiteDivs = {};
4
+ this.logRunningSpecs = false;
5
+ };
6
+
7
+ jasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarArgs) {
8
+ var el = document.createElement(type);
9
+
10
+ for (var i = 2; i < arguments.length; i++) {
11
+ var child = arguments[i];
12
+
13
+ if (typeof child === 'string') {
14
+ el.appendChild(document.createTextNode(child));
15
+ } else {
16
+ if (child) { el.appendChild(child); }
17
+ }
18
+ }
19
+
20
+ for (var attr in attrs) {
21
+ if (attr == "className") {
22
+ el[attr] = attrs[attr];
23
+ } else {
24
+ el.setAttribute(attr, attrs[attr]);
25
+ }
26
+ }
27
+
28
+ return el;
29
+ };
30
+
31
+ jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) {
32
+ var showPassed, showSkipped;
33
+
34
+ this.outerDiv = this.createDom('div', { className: 'jasmine_reporter' },
35
+ this.createDom('div', { className: 'banner' },
36
+ this.createDom('div', { className: 'logo' },
37
+ "Jasmine",
38
+ this.createDom('span', { className: 'version' }, runner.env.versionString())),
39
+ this.createDom('div', { className: 'options' },
40
+ "Show ",
41
+ showPassed = this.createDom('input', { id: "__jasmine_TrivialReporter_showPassed__", type: 'checkbox' }),
42
+ this.createDom('label', { "for": "__jasmine_TrivialReporter_showPassed__" }, " passed "),
43
+ showSkipped = this.createDom('input', { id: "__jasmine_TrivialReporter_showSkipped__", type: 'checkbox' }),
44
+ this.createDom('label', { "for": "__jasmine_TrivialReporter_showSkipped__" }, " skipped")
45
+ )
46
+ ),
47
+
48
+ this.runnerDiv = this.createDom('div', { className: 'runner running' },
49
+ this.createDom('a', { className: 'run_spec', href: '?' }, "run all"),
50
+ this.runnerMessageSpan = this.createDom('span', {}, "Running..."),
51
+ this.finishedAtSpan = this.createDom('span', { className: 'finished-at' }, ""))
52
+ );
53
+
54
+ this.document.body.appendChild(this.outerDiv);
55
+
56
+ var suites = runner.suites();
57
+ for (var i = 0; i < suites.length; i++) {
58
+ var suite = suites[i];
59
+ var suiteDiv = this.createDom('div', { className: 'suite' },
60
+ this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, "run"),
61
+ this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, suite.description));
62
+ this.suiteDivs[suite.id] = suiteDiv;
63
+ var parentDiv = this.outerDiv;
64
+ if (suite.parentSuite) {
65
+ parentDiv = this.suiteDivs[suite.parentSuite.id];
66
+ }
67
+ parentDiv.appendChild(suiteDiv);
68
+ }
69
+
70
+ this.startedAt = new Date();
71
+
72
+ var self = this;
73
+ showPassed.onchange = function(evt) {
74
+ if (evt.target.checked) {
75
+ self.outerDiv.className += ' show-passed';
76
+ } else {
77
+ self.outerDiv.className = self.outerDiv.className.replace(/ show-passed/, '');
78
+ }
79
+ };
80
+
81
+ showSkipped.onchange = function(evt) {
82
+ if (evt.target.checked) {
83
+ self.outerDiv.className += ' show-skipped';
84
+ } else {
85
+ self.outerDiv.className = self.outerDiv.className.replace(/ show-skipped/, '');
86
+ }
87
+ };
88
+ };
89
+
90
+ jasmine.TrivialReporter.prototype.reportRunnerResults = function(runner) {
91
+ var results = runner.results();
92
+ var className = (results.failedCount > 0) ? "runner failed" : "runner passed";
93
+ this.runnerDiv.setAttribute("class", className);
94
+ //do it twice for IE
95
+ this.runnerDiv.setAttribute("className", className);
96
+ var specs = runner.specs();
97
+ var specCount = 0;
98
+ for (var i = 0; i < specs.length; i++) {
99
+ if (this.specFilter(specs[i])) {
100
+ specCount++;
101
+ }
102
+ }
103
+ var message = "" + specCount + " spec" + (specCount == 1 ? "" : "s" ) + ", " + results.failedCount + " failure" + ((results.failedCount == 1) ? "" : "s");
104
+ message += " in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s";
105
+ this.runnerMessageSpan.replaceChild(this.createDom('a', { className: 'description', href: '?'}, message), this.runnerMessageSpan.firstChild);
106
+
107
+ this.finishedAtSpan.appendChild(document.createTextNode("Finished at " + new Date().toString()));
108
+ };
109
+
110
+ jasmine.TrivialReporter.prototype.reportSuiteResults = function(suite) {
111
+ var results = suite.results();
112
+ var status = results.passed() ? 'passed' : 'failed';
113
+ if (results.totalCount == 0) { // todo: change this to check results.skipped
114
+ status = 'skipped';
115
+ }
116
+ this.suiteDivs[suite.id].className += " " + status;
117
+ };
118
+
119
+ jasmine.TrivialReporter.prototype.reportSpecStarting = function(spec) {
120
+ if (this.logRunningSpecs) {
121
+ this.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...');
122
+ }
123
+ };
124
+
125
+ jasmine.TrivialReporter.prototype.reportSpecResults = function(spec) {
126
+ var results = spec.results();
127
+ var status = results.passed() ? 'passed' : 'failed';
128
+ if (results.skipped) {
129
+ status = 'skipped';
130
+ }
131
+ var specDiv = this.createDom('div', { className: 'spec ' + status },
132
+ this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(spec.getFullName()) }, "run"),
133
+ this.createDom('a', {
134
+ className: 'description',
135
+ href: '?spec=' + encodeURIComponent(spec.getFullName()),
136
+ title: spec.getFullName()
137
+ }, spec.description));
138
+
139
+
140
+ var resultItems = results.getItems();
141
+ var messagesDiv = this.createDom('div', { className: 'messages' });
142
+ for (var i = 0; i < resultItems.length; i++) {
143
+ var result = resultItems[i];
144
+
145
+ if (result.type == 'log') {
146
+ messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString()));
147
+ } else if (result.type == 'expect' && result.passed && !result.passed()) {
148
+ messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message));
149
+
150
+ if (result.trace.stack) {
151
+ messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack));
152
+ }
153
+ }
154
+ }
155
+
156
+ if (messagesDiv.childNodes.length > 0) {
157
+ specDiv.appendChild(messagesDiv);
158
+ }
159
+
160
+ this.suiteDivs[spec.suite.id].appendChild(specDiv);
161
+ };
162
+
163
+ jasmine.TrivialReporter.prototype.log = function() {
164
+ var console = jasmine.getGlobal().console;
165
+ if (console && console.log) console.log.apply(console, arguments);
166
+ };
167
+
168
+ jasmine.TrivialReporter.prototype.getLocation = function() {
169
+ return this.document.location;
170
+ };
171
+
172
+ jasmine.TrivialReporter.prototype.specFilter = function(spec) {
173
+ var paramMap = {};
174
+ var params = this.getLocation().search.substring(1).split('&');
175
+ for (var i = 0; i < params.length; i++) {
176
+ var p = params[i].split('=');
177
+ paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);
178
+ }
179
+
180
+ if (!paramMap["spec"]) return true;
181
+ return spec.getFullName().indexOf(paramMap["spec"]) == 0;
182
+ };