shenandoah 0.0.0

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 (49) hide show
  1. data/.braids +8 -0
  2. data/.document +5 -0
  3. data/.gitignore +6 -0
  4. data/ChangeLog.markdown +6 -0
  5. data/LICENSE +20 -0
  6. data/LICENSE-Blue-Ridge +20 -0
  7. data/LICENSE-Screw.Unit +22 -0
  8. data/LICENSE-Smoke +22 -0
  9. data/README.markdown +260 -0
  10. data/Rakefile +70 -0
  11. data/VERSION.yml +4 -0
  12. data/lib/shenandoah/buildr.rb +9 -0
  13. data/lib/shenandoah/buildr/locator.rb +17 -0
  14. data/lib/shenandoah/buildr/shenandoah_tasks.rb +18 -0
  15. data/lib/shenandoah/buildr/test_framework.rb +28 -0
  16. data/lib/shenandoah/css/screw.css +90 -0
  17. data/lib/shenandoah/javascript/browser/runner.js +34 -0
  18. data/lib/shenandoah/javascript/common/jquery-1.3.2.js +4376 -0
  19. data/lib/shenandoah/javascript/common/jquery.fn.js +29 -0
  20. data/lib/shenandoah/javascript/common/jquery.print.js +109 -0
  21. data/lib/shenandoah/javascript/common/screw.behaviors.js +129 -0
  22. data/lib/shenandoah/javascript/common/screw.builder.js +104 -0
  23. data/lib/shenandoah/javascript/common/screw.events.js +45 -0
  24. data/lib/shenandoah/javascript/common/screw.matchers.js +254 -0
  25. data/lib/shenandoah/javascript/common/screw.mocking.js +22 -0
  26. data/lib/shenandoah/javascript/common/smoke.core.js +6 -0
  27. data/lib/shenandoah/javascript/common/smoke.mock.js +130 -0
  28. data/lib/shenandoah/javascript/common/smoke.stub.js +29 -0
  29. data/lib/shenandoah/javascript/console/consoleReportForRake.js +32 -0
  30. data/lib/shenandoah/javascript/console/env.rhino.js +8841 -0
  31. data/lib/shenandoah/javascript/console/js.jar +0 -0
  32. data/lib/shenandoah/javascript/console/runner.js +43 -0
  33. data/lib/shenandoah/javascript/console/shell.js.erb +23 -0
  34. data/lib/shenandoah/locator.rb +17 -0
  35. data/lib/shenandoah/runner.rb +69 -0
  36. data/lib/shenandoah/server.rb +88 -0
  37. data/lib/shenandoah/server/views/index.haml +12 -0
  38. data/lib/shenandoah/tasks.rb +58 -0
  39. data/shenandoah.gemspec +133 -0
  40. data/spec/shenandoah/buildr/locator_spec.rb +33 -0
  41. data/spec/shenandoah/buildr/shenandoah_tasks_spec.rb +27 -0
  42. data/spec/shenandoah/buildr/spec_helper.rb +2 -0
  43. data/spec/shenandoah/buildr/test_framework_spec.rb +77 -0
  44. data/spec/shenandoah/locator_spec.rb +74 -0
  45. data/spec/shenandoah/runner_spec.rb +110 -0
  46. data/spec/shenandoah/server_spec.rb +216 -0
  47. data/spec/shenandoah/tasks_spec.rb +76 -0
  48. data/spec/spec_helper.rb +36 -0
  49. metadata +232 -0
@@ -0,0 +1,33 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+ require 'fileutils'
3
+
4
+ require 'shenandoah/buildr/locator'
5
+
6
+ describe Shenandoah::Buildr::Locator do
7
+ include Shenandoah::Spec::Tmpfile
8
+
9
+ before do
10
+ @project = define('sample', :base_dir => tmpdir)
11
+ @loc = Shenandoah::Buildr::Locator.new(@project)
12
+ end
13
+
14
+ it "resolves the specs from the base dir" do
15
+ @loc.spec_path.should == "#{tmpdir}/src/spec/javascript"
16
+ end
17
+
18
+ it "resolves the main source from src main" do
19
+ @loc.main_path.should == "#{tmpdir}/src/main/javascript"
20
+ end
21
+
22
+ it "uses a path under target for tmp" do
23
+ @loc.tmp_path.should == "#{tmpdir}/target/shenandoah"
24
+ end
25
+
26
+ it "allows main to be overriden with test.using" do |variable|
27
+ p = define('another', :base_dir => tmpdir) do
28
+ test.using :main_path => "foo"
29
+ end
30
+
31
+ Shenandoah::Buildr::Locator.new(p).main_path.should == "foo"
32
+ end
33
+ end
@@ -0,0 +1,27 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ require 'shenandoah/buildr'
4
+
5
+ describe Buildr::JavaScript::ShenandoahTasks do
6
+ before do
7
+ define("js") do
8
+ test.using :shenandoah
9
+ end
10
+
11
+ define("java") do
12
+ test.using :junit
13
+ end
14
+ end
15
+
16
+ it "leaves non-shenandoah projects alone" do
17
+ Rake::Task.task_defined?("java:shen:serve").should be_false
18
+ end
19
+
20
+ it "adds a server task" do
21
+ Rake::Task.task_defined?("js:shen:serve").should be_true
22
+ end
23
+
24
+ it "adds a shell task" do
25
+ Rake::Task.task_defined?("js:shen:shell").should be_true
26
+ end
27
+ end
@@ -0,0 +1,2 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+ require File.expand_path(File.dirname(__FILE__) + '/../../../vendor/buildr/spec/spec_helpers')
@@ -0,0 +1,77 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ require 'shenandoah/buildr'
4
+
5
+ describe Buildr::JavaScript::Shenandoah do
6
+ include Shenandoah::Spec::Tmpfile
7
+
8
+ def js_proj(&block)
9
+ define('js-proj', :base_dir => "#{self.tmpdir}/js-proj") do
10
+ test.using :quiet => true
11
+ if block
12
+ instance_eval(&block)
13
+ end
14
+ end
15
+ project('js-proj')
16
+ end
17
+
18
+ before do
19
+ @other_proj = define('other-proj', :base_dir => "#{tmpdir}/other-proj")
20
+ @good = tmpfile "js-proj/src/spec/javascript/good_spec.js", <<-JS
21
+ Screw.Unit(function () {
22
+ describe("success", function () {
23
+ it("passes", function () {
24
+ expect(true).to(be_true);
25
+ });
26
+ });
27
+ });
28
+ JS
29
+ tmpfile "js-proj/src/spec/javascript/good.html", <<-HTML
30
+ <html><body></body></html>
31
+ HTML
32
+ end
33
+
34
+ it "applies to a project with js specs" do
35
+ Buildr::JavaScript::Shenandoah.applies_to?(js_proj).should be_true
36
+ end
37
+
38
+ it "does not apply to a project without specs" do
39
+ Buildr::JavaScript::Shenandoah.applies_to?(@other_proj).should be_false
40
+ end
41
+
42
+ it "is automatically used for a project with js specs" do
43
+ js_proj do
44
+ test.framework.should == :shenandoah
45
+ end
46
+ end
47
+
48
+ it "executes passing specs" do
49
+ good = @good
50
+ js_proj do
51
+ test.invoke
52
+ test.passed_tests.should == [good]
53
+ end
54
+ end
55
+
56
+ it "executes failing specs" do
57
+ bad = tmpfile "js-proj/src/spec/javascript/bad_spec.js", <<-JS
58
+ Screw.Unit(function () {
59
+ describe("failure", function () {
60
+ it("fails", function () {
61
+ expect(1).to(equal, 0)
62
+ });
63
+ });
64
+ });
65
+ JS
66
+ tmpfile "js-proj/src/spec/javascript/bad.html", <<-HTML
67
+ <html><body></body></html>
68
+ HTML
69
+ good = @good
70
+ js_proj do
71
+ lambda { test.invoke }.should raise_error(/Tests failed/)
72
+ test.passed_tests.should == [good]
73
+ test.failed_tests.should == [bad]
74
+ end
75
+ end
76
+
77
+ end
@@ -0,0 +1,74 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ require 'shenandoah/locator'
4
+
5
+ describe Shenandoah::DefaultLocator do
6
+ include Shenandoah::Spec::Tmpfile
7
+
8
+ describe "default attributes" do
9
+ before do
10
+ ENV['TMPDIR'] = nil
11
+ @loc = Shenandoah::DefaultLocator.new
12
+ end
13
+
14
+ it "has main_path = lib" do
15
+ @loc.main_path.should == "lib"
16
+ end
17
+
18
+ it "has spec_path = spec" do
19
+ @loc.spec_path.should == "spec"
20
+ end
21
+
22
+ it "uses the TMPDIR env var for tmp" do
23
+ ENV['TMPDIR'] = "/var/tmp"
24
+ Shenandoah::DefaultLocator.new.tmp_path.should == "/var/tmp"
25
+ end
26
+
27
+ it "has tmp_path = tmp" do
28
+ @loc.tmp_path.should == "tmp"
29
+ end
30
+ end
31
+
32
+ describe "initializing from options" do
33
+ it "uses an explicit main path" do
34
+ Shenandoah::DefaultLocator.new(:main_path => 'main').main_path.should == 'main'
35
+ end
36
+
37
+ it "uses an explicit spec path" do
38
+ Shenandoah::DefaultLocator.new(:spec_path => 'foo').spec_path.should == 'foo'
39
+ end
40
+
41
+ it "uses an explicit tmp path" do
42
+ Shenandoah::DefaultLocator.new(:tmp_path => 'foo').tmp_path.should == 'foo'
43
+ end
44
+ end
45
+
46
+ describe "finding specs" do
47
+ before do
48
+ @loc = Shenandoah::DefaultLocator.new :spec_path => "#{tmpdir}/spec"
49
+ end
50
+
51
+ it "finds specs directly in spec_path" do
52
+ tmpfile "spec/common_spec.js"
53
+ @loc.spec_files.should == ["#{tmpdir}/spec/common_spec.js"]
54
+ end
55
+
56
+ it "finds specs in subdirs" do
57
+ tmpfile "spec/foo/bar_spec.js"
58
+ @loc.spec_files.should == ["#{tmpdir}/spec/foo/bar_spec.js"]
59
+ end
60
+
61
+ it "only finds specs" do
62
+ tmpfile "spec/quux.js"
63
+ tmpfile "spec/foo/bar_spec.js"
64
+ @loc.spec_files.should == ["#{tmpdir}/spec/foo/bar_spec.js"]
65
+ end
66
+
67
+ it "doesn't cache results" do
68
+ tmpfile "spec/bar/etc_spec.js"
69
+ @loc.should have(1).spec_files
70
+ tmpfile "spec/bar/quux_spec.js"
71
+ @loc.should have(2).spec_files
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,110 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
2
+ require 'erb'
3
+ require 'open3'
4
+
5
+ require 'shenandoah/locator'
6
+ require 'shenandoah/runner'
7
+
8
+ describe Shenandoah::Runner do
9
+ include Shenandoah::Spec::Tmpfile
10
+
11
+ before do
12
+ @locator = Shenandoah::DefaultLocator.new(
13
+ :spec_path => "#{tmpdir}/spec",
14
+ :main_path => "#{tmpdir}/main",
15
+ :tmp_path => "#{tmpdir}/tmp"
16
+ )
17
+ %w(spec main).each { |d| FileUtils.mkdir_p "#{tmpdir}/#{d}" }
18
+ @runner = Shenandoah::Runner.new(@locator, :quiet => true)
19
+ end
20
+
21
+ def add_good_spec
22
+ @good = tmpfile "spec/good_spec.js", <<-JS
23
+ Screw.Unit(function () {
24
+ describe("good", function () {
25
+ it("passes", function () {
26
+ expect("good").to(equal, "good");
27
+ });
28
+ });
29
+ })
30
+ JS
31
+ tmpfile "spec/good.html", <<-HTML
32
+ <html><body></body></html>
33
+ HTML
34
+ end
35
+
36
+ def add_bad_spec
37
+ @bad = tmpfile "spec/bad_spec.js", <<-JS
38
+ Screw.Unit(function () {
39
+ describe("bad", function () {
40
+ it("fails", function () {
41
+ expect("bad").to(equal, "good");
42
+ });
43
+ });
44
+ });
45
+ JS
46
+ tmpfile "spec/bad.html", <<-HTML
47
+ <html><body></body></html>
48
+ HTML
49
+ end
50
+
51
+ describe "#run_console" do
52
+ it "runs passing specs" do
53
+ add_good_spec
54
+ @runner.run_console([@good]).should == [@good]
55
+ end
56
+
57
+ it "fails on bad specs" do
58
+ add_bad_spec
59
+ @runner.run_console([@bad]).should == []
60
+ end
61
+
62
+ it "runs all specs" do
63
+ add_good_spec
64
+ add_bad_spec
65
+ @runner.run_console([@bad, @good]).should == [@good]
66
+ end
67
+ end
68
+
69
+ describe "#run_shell" do
70
+ before do
71
+ script_contents = ERB.new(<<-RUBY).result(binding)
72
+ # This is a small script to invoke Runner#run_shell so that it's
73
+ # input and output can be controlled for testing
74
+ <% $LOAD_PATH.select { |p| p =~ /shenandoah/ }.each do |p| %>
75
+ $LOAD_PATH.unshift(<%= p.inspect %>)
76
+ <% end %>
77
+ require 'rubygems'
78
+ require 'shenandoah/runner'
79
+ require 'shenandoah/locator'
80
+
81
+ loc = Shenandoah::DefaultLocator.new(
82
+ :main_path => <%= @locator.main_path.inspect %>,
83
+ :spec_path => <%= @locator.spec_path.inspect %>,
84
+ :tmp_path => <%= @locator.tmp_path.inspect %>
85
+ )
86
+
87
+ Shenandoah::Runner.new(loc).run_shell
88
+ RUBY
89
+ tmpfile "spec_shell.rb", script_contents
90
+ end
91
+
92
+ def run_shell(jslines)
93
+ Open3.popen3("ruby #{tmpdir}/spec_shell.rb") do |stdin, stdout, stderr|
94
+ stdin.write jslines
95
+ stdin.close
96
+ return stdout.read, stderr.read
97
+ end
98
+ end
99
+
100
+ it "runs an interactive shell" do
101
+ out, err = run_shell("1 + 1 + ' foo';\n")
102
+ err.should =~ /2 foo/
103
+ end
104
+
105
+ it "prints a banner" do
106
+ out, err = run_shell("quit();\n")
107
+ out.should =~ / Rhino JavaScript Shell/
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,216 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+ require 'spec/interop/test'
3
+ require 'rspec_hpricot_matchers'
4
+ require 'rack/test'
5
+ require 'time'
6
+ require 'fileutils'
7
+
8
+ require 'shenandoah/server'
9
+ require 'shenandoah/locator'
10
+
11
+ describe Shenandoah::Server do
12
+ include Rack::Test::Methods
13
+ include FileUtils
14
+ include Shenandoah::Spec::Tmpfile
15
+
16
+ def app
17
+ Shenandoah::Server
18
+ end
19
+
20
+ before do
21
+ app.set :environment, :test
22
+ end
23
+
24
+ describe "/shenandoah/browser-runner.js" do
25
+ before do
26
+ get '/shenandoah/browser-runner.js'
27
+ end
28
+
29
+ it "is accessible" do
30
+ last_response.should be_ok
31
+ end
32
+
33
+ it "is javascript" do
34
+ last_response.headers['Content-Type'].should == 'text/javascript'
35
+ end
36
+
37
+ it "includes jQuery" do
38
+ last_response.body.should =~ %r{\* jQuery JavaScript Library v1\.3\.2}
39
+ end
40
+
41
+ it "includes jQuery.fn" do
42
+ last_response.body.should =~ %r{\$.fn.fn = function}
43
+ end
44
+
45
+ it "includes jQuery.print" do
46
+ last_response.body.should =~ %r{\$.print = function}
47
+ end
48
+
49
+ it "includes Screw.Unit" do
50
+ last_response.body.should =~ %r{var Screw = \(function\(\$\)}
51
+ end
52
+
53
+ it "includes Smoke" do
54
+ last_response.body.should =~ %r{Smoke = \{}
55
+ end
56
+
57
+ it "includes the Shenandoah test API" do
58
+ last_response.body.should =~ %r{function require_spec\(}
59
+ last_response.body.should =~ %r{function require_main\(}
60
+ end
61
+
62
+ it "was last modified at the latest date of the combined files" do
63
+ maxTime = Dir["#{File.dirname(__FILE__)}/../../lib/shenandoah/javascript/{browser,common}/*.js"].
64
+ collect { |filename| File.stat(filename).mtime }.max
65
+ Time.httpdate(last_response.headers['Last-Modified']).should == maxTime
66
+ end
67
+
68
+ it "includes the source filenames" do
69
+ last_response.body.should =~ %r{////// javascript/common/jquery-1.3.2.js}
70
+ end
71
+ end
72
+
73
+ %w(main spec).each do |kind|
74
+ describe "/#{kind}/*" do
75
+ before do
76
+ app.set :locator,
77
+ Shenandoah::DefaultLocator.new(
78
+ :"#{kind}_path" => "#{self.tmpdir}/#{kind.hash}")
79
+ end
80
+
81
+ describe "for an existing file" do
82
+ before do
83
+ tmpfile("#{kind.hash}/good.js", "var any = function () { };\n")
84
+ get "/#{kind}/good.js"
85
+ end
86
+
87
+ it "succeeds" do
88
+ last_response.should be_ok
89
+ end
90
+
91
+ it "responds with the content" do
92
+ last_response.body.should == "var any = function () { };\n"
93
+ end
94
+
95
+ it "indicates that the file shouldn't be cached" do
96
+ last_response.headers["Cache-Control"].should == "no-cache"
97
+ end
98
+ end
99
+
100
+ describe "for a non-existent file" do
101
+ before do
102
+ get "/#{kind}/bad.js"
103
+ end
104
+
105
+ it "404s" do
106
+ last_response.status.should == 404
107
+ end
108
+
109
+ it "has a reasonable error message" do
110
+ last_response.body.should ==
111
+ "#{kind.capitalize} file not found: #{self.tmpdir}/#{kind.hash}/bad.js"
112
+ end
113
+ end
114
+ end
115
+ end
116
+
117
+ describe "/screw.css" do
118
+ describe "by default" do
119
+ before do
120
+ get '/screw.css'
121
+ @included = "#{File.dirname(__FILE__)}/../../lib/shenandoah/css/screw.css"
122
+ end
123
+
124
+ it "is available" do
125
+ last_response.should be_ok
126
+ end
127
+
128
+ it "is the included version" do
129
+ last_response.body.should == File.read(@included)
130
+ end
131
+
132
+ it "has the correct last modified version" do
133
+ Time.httpdate(last_response.headers['Last-Modified']).should ==
134
+ File.stat(@included).mtime
135
+ end
136
+
137
+ it "is CSS" do
138
+ last_response.headers['Content-Type'].should == 'text/css'
139
+ end
140
+ end
141
+
142
+ describe "when overridden" do
143
+ before do
144
+ app.set :locator,
145
+ Shenandoah::DefaultLocator.new(:spec_path => self.tmpdir)
146
+ tmpfile "screw.css", ".passed { color: blue }"
147
+ get '/screw.css'
148
+ end
149
+
150
+ it "is available" do
151
+ last_response.should be_ok
152
+ end
153
+
154
+ it "is the version from the spec dir" do
155
+ last_response.body.should == ".passed { color: blue }"
156
+ end
157
+
158
+ it "has the correct last modified version" do
159
+ Time.httpdate(last_response.headers['Last-Modified']).should ==
160
+ File.stat("#{self.tmpdir}/screw.css").mtime
161
+ end
162
+
163
+ it "is CSS" do
164
+ last_response.headers['Content-Type'].should == 'text/css'
165
+ end
166
+ end
167
+ end
168
+
169
+ describe "/" do
170
+ include RspecHpricotMatchers
171
+
172
+ before do
173
+ app.set :locator,
174
+ Shenandoah::DefaultLocator.new(:spec_path => File.join(self.tmpdir, 'spec'))
175
+ tmpfile "spec/common_spec.js", "DC"
176
+ tmpfile "spec/some/thing_spec.js", "DC"
177
+ get "/"
178
+ end
179
+
180
+ it "is available" do
181
+ last_response.should be_ok
182
+ end
183
+
184
+ it "includes an overall heading" do
185
+ app.set :project_name, "Some Proj"
186
+ get "/"
187
+ last_response.body.should have_tag("h1", "Specs for Some Proj")
188
+ end
189
+
190
+ it "does not include an overall heading without the project name" do
191
+ app.set :project_name, nil
192
+ get "/"
193
+ last_response.body.should_not have_tag("h1")
194
+ end
195
+
196
+ it "includes a section heading for the root set" do
197
+ last_response.body.should have_tag("h2", "[root]")
198
+ end
199
+
200
+ it "includes a section heading for each subdirectory" do
201
+ last_response.body.should have_tag("h2", "some")
202
+ end
203
+
204
+ it "includes lists of links" do
205
+ last_response.body.should have_tag("ul a", :count => 2)
206
+ end
207
+
208
+ it "includes a link to a spec in the root" do
209
+ last_response.body.should have_tag("a[@href='spec/common.html']", "common")
210
+ end
211
+
212
+ it "includes link to a spec in a subdirectory" do
213
+ last_response.body.should have_tag("a[@href='spec/some/thing.html']", "thing")
214
+ end
215
+ end
216
+ end