shenandoah 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
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