headless-squirrel 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (130) hide show
  1. data/README.rdoc +55 -0
  2. data/Rakefile +27 -0
  3. data/bin/jstest +10 -0
  4. data/lib/headless_squirrel.rb +2 -0
  5. data/lib/headless_squirrel/console.rb +24 -0
  6. data/lib/headless_squirrel/runner.rb +70 -0
  7. data/lib/headless_squirrel/test.rb +17 -0
  8. data/lib/headless_squirrel/test_case.rb +158 -0
  9. data/test/fixtures/a_unit_test.html +27 -0
  10. data/test/fixtures/a_unit_test.js +22 -0
  11. data/test/fixtures/syntax_error.html +27 -0
  12. data/test/fixtures/syntax_error.js +5 -0
  13. data/test/fixtures/type_error.html +27 -0
  14. data/test/fixtures/type_error.js +1 -0
  15. data/test/regression/prototype/unit/ajax_test.html +29 -0
  16. data/test/regression/prototype/unit/array_test.html +28 -0
  17. data/test/regression/prototype/unit/assets/prototype.js +4900 -0
  18. data/test/regression/prototype/unit/assets/unittest.css +50 -0
  19. data/test/regression/prototype/unit/assets/unittest.js +615 -0
  20. data/test/regression/prototype/unit/assets/unittest_transport.js +1 -0
  21. data/test/regression/prototype/unit/base_test.html +27 -0
  22. data/test/regression/prototype/unit/class_test.html +27 -0
  23. data/test/regression/prototype/unit/date_test.html +27 -0
  24. data/test/regression/prototype/unit/dom_test.html +304 -0
  25. data/test/regression/prototype/unit/element_mixins_test.html +30 -0
  26. data/test/regression/prototype/unit/enumerable_test.html +35 -0
  27. data/test/regression/prototype/unit/event_test.html +31 -0
  28. data/test/regression/prototype/unit/fixtures/ajax.html +2 -0
  29. data/test/regression/prototype/unit/fixtures/ajax.js +42 -0
  30. data/test/regression/prototype/unit/fixtures/array.html +1 -0
  31. data/test/regression/prototype/unit/fixtures/class.js +83 -0
  32. data/test/regression/prototype/unit/fixtures/content.html +1 -0
  33. data/test/regression/prototype/unit/fixtures/data.json +1 -0
  34. data/test/regression/prototype/unit/fixtures/dom.css +84 -0
  35. data/test/regression/prototype/unit/fixtures/dom.html +278 -0
  36. data/test/regression/prototype/unit/fixtures/dom.js +17 -0
  37. data/test/regression/prototype/unit/fixtures/element_mixins.html +4 -0
  38. data/test/regression/prototype/unit/fixtures/element_mixins.js +2 -0
  39. data/test/regression/prototype/unit/fixtures/empty.html +0 -0
  40. data/test/regression/prototype/unit/fixtures/empty.js +1 -0
  41. data/test/regression/prototype/unit/fixtures/enumerable.html +8 -0
  42. data/test/regression/prototype/unit/fixtures/enumerable.js +23 -0
  43. data/test/regression/prototype/unit/fixtures/event.html +4 -0
  44. data/test/regression/prototype/unit/fixtures/form.html +108 -0
  45. data/test/regression/prototype/unit/fixtures/function.js +13 -0
  46. data/test/regression/prototype/unit/fixtures/hash.js +25 -0
  47. data/test/regression/prototype/unit/fixtures/hello.js +1 -0
  48. data/test/regression/prototype/unit/fixtures/logo.gif +0 -0
  49. data/test/regression/prototype/unit/fixtures/object.html +6 -0
  50. data/test/regression/prototype/unit/fixtures/object.js +7 -0
  51. data/test/regression/prototype/unit/fixtures/position.html +9 -0
  52. data/test/regression/prototype/unit/fixtures/selector.html +71 -0
  53. data/test/regression/prototype/unit/fixtures/string.js +8 -0
  54. data/test/regression/prototype/unit/fixtures/unittest.html +18 -0
  55. data/test/regression/prototype/unit/form_test.html +135 -0
  56. data/test/regression/prototype/unit/function_test.html +27 -0
  57. data/test/regression/prototype/unit/hash_test.html +27 -0
  58. data/test/regression/prototype/unit/number_test.html +27 -0
  59. data/test/regression/prototype/unit/object_test.html +32 -0
  60. data/test/regression/prototype/unit/periodical_executer_test.html +27 -0
  61. data/test/regression/prototype/unit/position_test.html +36 -0
  62. data/test/regression/prototype/unit/prototype_test.html +27 -0
  63. data/test/regression/prototype/unit/range_test.html +27 -0
  64. data/test/regression/prototype/unit/regexp_test.html +27 -0
  65. data/test/regression/prototype/unit/selector_test.html +98 -0
  66. data/test/regression/prototype/unit/string_test.html +27 -0
  67. data/test/regression/prototype/unit/tests/ajax_test.js +379 -0
  68. data/test/regression/prototype/unit/tests/array_test.js +186 -0
  69. data/test/regression/prototype/unit/tests/base_test.js +43 -0
  70. data/test/regression/prototype/unit/tests/class_test.js +136 -0
  71. data/test/regression/prototype/unit/tests/date_test.js +5 -0
  72. data/test/regression/prototype/unit/tests/dom_test.js +1493 -0
  73. data/test/regression/prototype/unit/tests/element_mixins_test.js +32 -0
  74. data/test/regression/prototype/unit/tests/enumerable_test.js +271 -0
  75. data/test/regression/prototype/unit/tests/event_test.js +235 -0
  76. data/test/regression/prototype/unit/tests/form_test.js +382 -0
  77. data/test/regression/prototype/unit/tests/function_test.js +133 -0
  78. data/test/regression/prototype/unit/tests/hash_test.js +178 -0
  79. data/test/regression/prototype/unit/tests/number_test.js +44 -0
  80. data/test/regression/prototype/unit/tests/object_test.js +180 -0
  81. data/test/regression/prototype/unit/tests/periodical_executer_test.js +15 -0
  82. data/test/regression/prototype/unit/tests/position_test.js +44 -0
  83. data/test/regression/prototype/unit/tests/prototype_test.js +43 -0
  84. data/test/regression/prototype/unit/tests/range_test.js +58 -0
  85. data/test/regression/prototype/unit/tests/regexp_test.js +42 -0
  86. data/test/regression/prototype/unit/tests/selector_test.js +408 -0
  87. data/test/regression/prototype/unit/tests/string_test.js +548 -0
  88. data/test/regression/prototype/unit/tests/unittest_test.js +148 -0
  89. data/test/regression/prototype/unit/unittest_test.html +45 -0
  90. data/test/regression/prototype/upstream +1 -0
  91. data/test/regression/scriptaculous/unit/_ajax_inplaceeditor_ipce_alt_text.html +1 -0
  92. data/test/regression/scriptaculous/unit/_ajax_inplaceeditor_ipce_collection.js +1 -0
  93. data/test/regression/scriptaculous/unit/_ajax_inplaceeditor_result.html +1 -0
  94. data/test/regression/scriptaculous/unit/_ajax_inplaceeditor_result2.html +1 -0
  95. data/test/regression/scriptaculous/unit/_ajax_inplaceeditor_tagged.html +1 -0
  96. data/test/regression/scriptaculous/unit/_ajax_inplaceeditor_text.html +1 -0
  97. data/test/regression/scriptaculous/unit/_ajax_updater_result.html +20 -0
  98. data/test/regression/scriptaculous/unit/_autocomplete_result.html +11 -0
  99. data/test/regression/scriptaculous/unit/_autocomplete_result_nobr.html +1 -0
  100. data/test/regression/scriptaculous/unit/ajax_autocompleter_test.html +243 -0
  101. data/test/regression/scriptaculous/unit/ajax_inplaceeditor_test.html +895 -0
  102. data/test/regression/scriptaculous/unit/assets/builder.js +134 -0
  103. data/test/regression/scriptaculous/unit/assets/controls.js +963 -0
  104. data/test/regression/scriptaculous/unit/assets/dragdrop.js +973 -0
  105. data/test/regression/scriptaculous/unit/assets/effects.js +1122 -0
  106. data/test/regression/scriptaculous/unit/assets/javascripttest.rb +203 -0
  107. data/test/regression/scriptaculous/unit/assets/prototype.js +4320 -0
  108. data/test/regression/scriptaculous/unit/assets/scriptaculous.js +66 -0
  109. data/test/regression/scriptaculous/unit/assets/slider.js +273 -0
  110. data/test/regression/scriptaculous/unit/assets/sound.js +57 -0
  111. data/test/regression/scriptaculous/unit/assets/unittest.js +566 -0
  112. data/test/regression/scriptaculous/unit/bdd_test.html +150 -0
  113. data/test/regression/scriptaculous/unit/builder_test.html +262 -0
  114. data/test/regression/scriptaculous/unit/dragdrop_test.html +131 -0
  115. data/test/regression/scriptaculous/unit/effects_test.html +547 -0
  116. data/test/regression/scriptaculous/unit/element_test.html +116 -0
  117. data/test/regression/scriptaculous/unit/icon.png +0 -0
  118. data/test/regression/scriptaculous/unit/index.html +70 -0
  119. data/test/regression/scriptaculous/unit/loading_test.html +41 -0
  120. data/test/regression/scriptaculous/unit/position_clone_test.html +312 -0
  121. data/test/regression/scriptaculous/unit/slider_test.html +437 -0
  122. data/test/regression/scriptaculous/unit/sortable_test.html +205 -0
  123. data/test/regression/scriptaculous/unit/string_test.html +71 -0
  124. data/test/regression/scriptaculous/unit/unittest_test.html +154 -0
  125. data/test/regression/scriptaculous/upstream +1 -0
  126. data/test/test_helper.rb +20 -0
  127. data/test/unit/runner_test.rb +165 -0
  128. data/test/unit/test_case_test.rb +207 -0
  129. data/test/unit/test_test.rb +24 -0
  130. metadata +209 -0
@@ -0,0 +1,55 @@
1
+ = Headless Squirrel
2
+
3
+ A JavaScript test runner to run tests from the comfort of your terminal.
4
+
5
+ http://github.com/Fingertips/headless-squirrel/raw/master/html/images/headless-squirrel.png
6
+
7
+ == Why?
8
+
9
+ Because we want to run tests in a real browser environment, in our case WebKit,
10
+ but in the same fashion we run out other (Rails) unit tests.
11
+
12
+ And we want to write the tests in a way that we can easily run them on other
13
+ browsers as well, you know, html and js… This way we can run the tests from the
14
+ terminal during regular development but still test on other browsers by loading
15
+ the html/js files manually.
16
+
17
+ Read more at http://superalloy.nl/2009/04/13/js-test-san.html
18
+
19
+ == Install & Usage
20
+
21
+ $ sudo gem install Fingertips-headless-squirrel -s http://gems.github.com
22
+ $ jstest path/to/a/unit_test.html
23
+
24
+ To automatically run your test see http://github.com/alloy/kicker/tree/master.
25
+
26
+ == Problems?
27
+
28
+ You betcha! (See the example.)
29
+
30
+ But these shouldn't likely be a typical use case, I hope. So it actually works
31
+ quite well seeing how many tests pass ;) The one that does fail has to do with
32
+ the fact that there's no window at all. I haven't yet tried if it will simply
33
+ work with a NSWindow. Also not sure yet why the end result says 2 failures…
34
+
35
+ == Example:
36
+
37
+ This is the output of the regression tests which are the Prototype unit tests:
38
+
39
+ $ ./bin/jstest test/regression/prototype/unit/*_test.html
40
+ ...................................................................................................................................
41
+ .......F...........................................................................................................................
42
+ ..............................................................................................
43
+
44
+ 1) Failed:
45
+ testViewportDimensions (Unit test file | Dom | default template | 2009-04-11 15:28) [test/regression/prototype/unit/dom_test.html]:
46
+ Failure: NOTE: YOU MUST ALLOW JAVASCRIPT TO RESIZE YOUR WINDOW FOR THIS TEST TO PASS
47
+ expected: <50>, actual: <0>
48
+ Failure: NOTE: YOU MUST ALLOW JAVASCRIPT TO RESIZE YOUR WINDOW FOR THIS TEST TO PASS
49
+ expected: <50>, actual: <0>
50
+
51
+ Finished in 17.725139 seconds.
52
+
53
+ 356 tests, 2246 assertions, 2 failures, 0 errors
54
+
55
+ See regression_test.rdoc[http://github.com/Fingertips/headless-squirrel/blob/master/regression_test.rdoc] for more tests.
@@ -0,0 +1,27 @@
1
+ task :default => :test
2
+
3
+ desc "Run the tests"
4
+ task :test do
5
+ sh "ruby -r#{Dir['test/unit/*_test.rb'].join(' -r')} -e ''"
6
+ end
7
+
8
+ # HeadlessSquirrel::Rake::Runner.new :regression do |t|
9
+ # t.files = Dir['test/regression/prototype/unit/*.html']
10
+ # end
11
+
12
+ desc "Run all the regression tests"
13
+ task :ci do
14
+ sh "./bin/jstest #{Dir['test/regression/**/unit/*_test.html'].join(' ')}"
15
+ end
16
+
17
+ namespace :ci do
18
+ desc "Run the prototype regression tests"
19
+ task :prototype do
20
+ sh "./bin/jstest #{Dir['test/regression/prototype/unit/*_test.html'].join(' ')}"
21
+ end
22
+
23
+ desc "Run the scriptaculous regression tests"
24
+ task :scriptaculous do
25
+ sh "./bin/jstest #{Dir['test/regression/scriptaculous/unit/*_test.html'].join(' ')}"
26
+ end
27
+ end
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift File.expand_path('../../lib', __FILE__)
4
+ require 'headless_squirrel'
5
+
6
+ if ARGV.empty?
7
+ puts "Usage: #{$0} [html files]"
8
+ else
9
+ HeadlessSquirrel::Runner.alloc.initWithHTMLFiles(ARGV).run
10
+ end
@@ -0,0 +1,2 @@
1
+ require 'headless_squirrel/test_case'
2
+ require 'headless_squirrel/runner'
@@ -0,0 +1,24 @@
1
+ # TODO: Needs converage.
2
+ module HeadlessSquirrel
3
+ class Console < OSX::NSObject
4
+ objc_class_method 'isSelectorExcludedFromWebScript:', [:BOOL, :sel]
5
+ def self.isSelectorExcludedFromWebScript(selector)
6
+ selector != 'log:'
7
+ end
8
+
9
+ objc_class_method 'webScriptNameForSelector:', [:id, :sel]
10
+ def self.webScriptNameForSelector(selector)
11
+ 'log' if selector == 'log:'
12
+ end
13
+
14
+ objc_method 'log:', [:void, :id]
15
+ def log(object)
16
+ puts object.description
17
+ end
18
+ end
19
+ end
20
+
21
+ # For some reason RC looks for the Console class in the OSX namespace.
22
+ before, $VERBOSE = $VERBOSE, nil
23
+ OSX::Console = HeadlessSquirrel::Console
24
+ $VERBOSE = before
@@ -0,0 +1,70 @@
1
+ require 'osx/cocoa'
2
+
3
+ module HeadlessSquirrel
4
+ class Runner < OSX::NSObject
5
+ attr_reader :test_cases, :queued, :did_not_pass
6
+
7
+ def initWithHTMLFiles(html_files)
8
+ if init
9
+ @test_cases = []
10
+ @test_cases = html_files.map { |file| TestCase.alloc.initWithHTMLFile_delegate(file, self) }
11
+ @queued = @test_cases.dup
12
+ @did_not_pass = []
13
+
14
+ $stdout.sync = true
15
+
16
+ self
17
+ end
18
+ end
19
+
20
+ def run
21
+ @start_time = Time.now
22
+ @queued.first.run
23
+ OSX::NSApplication.sharedApplication.run
24
+ end
25
+
26
+ def tests; sum :tests end
27
+ def assertions; sum :assertions end
28
+ def failures; sum :failures end
29
+ def errors; sum :errors end
30
+
31
+ def test_ran(test)
32
+ @did_not_pass << test unless test.state == :passed
33
+
34
+ print case test.state
35
+ when :passed
36
+ '.'
37
+ when :failed
38
+ 'F'
39
+ when :error
40
+ 'E'
41
+ end
42
+ end
43
+
44
+ def test_case_finished(test_case)
45
+ @queued.delete(test_case)
46
+ @queued.empty? ? finalize : @queued.first.run
47
+ end
48
+
49
+ def finished?
50
+ @finished
51
+ end
52
+
53
+ private
54
+
55
+ def sum(attr)
56
+ @test_cases.inject(0) { |sum, tc| sum += tc.send(attr) }
57
+ end
58
+
59
+ def finalize
60
+ @finished = true
61
+
62
+ puts
63
+ @did_not_pass.each_with_index { |test, index| puts "\n #{index+1}) #{test}" }
64
+ puts "Finished in #{Time.now - @start_time} seconds."
65
+ puts "\n#{tests} tests, #{assertions} assertions, #{failures} failures, #{errors} errors"
66
+
67
+ OSX::NSApplication.sharedApplication.terminate(self)
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,17 @@
1
+ module HeadlessSquirrel
2
+ class TestCase < OSX::NSObject
3
+ class Test
4
+ attr_reader :test_case, :name, :state, :output
5
+
6
+ def initialize(test_case, name, state, output)
7
+ @test_case, @name, @state, @output = test_case, name, state, output
8
+ end
9
+
10
+ def to_s
11
+ %{#{@state.to_s.capitalize}:
12
+ #{@name} (#{@test_case.title}) [#{@test_case.html_file}]:
13
+ #{@output}}
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,158 @@
1
+ require "osx/cocoa"
2
+ OSX.require_framework 'WebKit'
3
+
4
+ require 'headless_squirrel/test'
5
+ require 'headless_squirrel/console'
6
+
7
+ module HeadlessSquirrel
8
+ class TestCase < OSX::NSObject
9
+ class FileDoesNotExistError < StandardError; end
10
+
11
+ def self.sharedWebView
12
+ @sharedWebView ||= OSX::WebView.alloc.init
13
+ end
14
+
15
+ RESULTS_REGEXP_KEYS = [:report, :_, :tests, :assertions, :failures, :errors]
16
+ RESULTS_REGEXP = /((\d+) tests, )?(\d+) assertions, (\d+) failures, (\d+) errors\n?/
17
+
18
+ STATES = %w{ passed failed error }
19
+
20
+ attr_reader :html_file, :delegate, :title
21
+ attr_reader :tests, :assertions, :failures, :errors
22
+
23
+ def initWithHTMLFile_delegate(html_file, delegate)
24
+ if init
25
+ raise FileDoesNotExistError, "The file `#{html_file}' does not exist." unless File.exist?(html_file)
26
+ @html_file, @delegate = html_file, delegate
27
+ @tests = @assertions = @failures = @errors = 0
28
+ @title = ''
29
+ self
30
+ end
31
+ end
32
+
33
+ def run
34
+ webView
35
+ end
36
+
37
+ def finished?
38
+ @finished
39
+ end
40
+
41
+ def webView
42
+ @webView ||= load_webView
43
+ end
44
+
45
+ def document
46
+ webView.mainFrame.DOMDocument
47
+ end
48
+
49
+ def log
50
+ document.getElementsByClassName('logsummary').item(0) || document.getElementById('logsummary')
51
+ end
52
+
53
+ def loglines
54
+ document.getElementsByClassName('loglines').item(0) || document.getElementById('loglines')
55
+ end
56
+
57
+ # Not yet sure why the extra check for log not being nil is necessary.
58
+ # Might be a test only thing.
59
+ def webView_didFinishLoadForFrame(_, __)
60
+ @title = webView.mainFrameTitle.to_s
61
+ [log, loglines].each do |element|
62
+ element.addEventListener___('DOMSubtreeModified', self, true) if element
63
+ end
64
+ end
65
+
66
+ def webView_didClearWindowObject_forFrame(_, scriptObject, __)
67
+ scriptObject.setValue_forKey(HeadlessSquirrel::Console.alloc.init, 'console')
68
+ end
69
+
70
+ # Catches resource load errors:
71
+ #
72
+ # webView.resourceLoadDelegate = self
73
+ #
74
+ # def webView_resource_didFailLoadingWithError_fromDataSource(w,r,e,d)
75
+ # message = "#{e.userInfo['NSLocalizedDescription']}: #{e.userInfo['NSErrorFailingURLStringKey']}"
76
+ # @delegate.test_ran(Test.new(self, "Unable to load test case", :failed, message))
77
+ # @delegate.test_case_finished(self)
78
+ # end
79
+
80
+ def webView_addMessageToConsole(_, info)
81
+ puts format_js_log(info)
82
+ OSX::NSApplication.sharedApplication.terminate(self) if info['message'].to_s =~ /^[A-Z]\w+Error/
83
+ end
84
+
85
+ def handleEvent(event)
86
+ element = event.target
87
+
88
+ case element
89
+ when OSX::DOMText
90
+ contents = element.wholeText.to_s
91
+ when OSX::DOMHTMLTableCellElement, OSX::DOMHTMLDivElement
92
+ contents = element.innerText.to_s
93
+ end
94
+
95
+ if contents
96
+ if result = self.class.parse_result(contents)
97
+ if result[:tests]
98
+ finalize_test_suite(result)
99
+ else
100
+ finalize_test(result)
101
+ end
102
+ end
103
+ end
104
+ end
105
+
106
+ private
107
+
108
+ def load_webView
109
+ url = OSX::NSURL.fileURLWithPath(@html_file)
110
+ req = OSX::NSURLRequest.requestWithURL(url)
111
+ webView = self.class.sharedWebView
112
+ webView.mainFrame.loadRequest(req)
113
+ webView.frameLoadDelegate = self
114
+ webView.setUIDelegate(self)
115
+ webView
116
+ end
117
+
118
+ def format_js_log(info)
119
+ "#{info['sourceURL'][7..-1]}:#{info['lineNumber']}: #{info['message']}"
120
+ end
121
+
122
+ def finalize_test(result)
123
+ last_line = loglines.children.item(loglines.children.length-1)
124
+ log_row = self.class.parse_log_row(last_line)
125
+
126
+ @delegate.test_ran(Test.new(self, log_row[:name], log_row[:state].to_sym, result[:message]))
127
+ end
128
+
129
+ def finalize_test_suite(result)
130
+ @finished = true
131
+ @tests, @assertions, @failures, @errors = result[:tests].to_i, result[:assertions].to_i, result[:failures].to_i, result[:errors].to_i
132
+ @delegate.test_case_finished(self)
133
+ end
134
+
135
+ def self.parse_result(line)
136
+ if match = RESULTS_REGEXP.match(line)
137
+ result = Hash[*RESULTS_REGEXP_KEYS.zip(match.to_a).flatten]
138
+ result[:message] = line.sub(result[:report], '')
139
+ result
140
+ end
141
+ end
142
+
143
+ def self.parse_log_row(row)
144
+ parts = []
145
+ 0.upto(row.children.length-1) do |i|
146
+ parts << row.children.item(i).innerText.to_s.strip
147
+ end
148
+
149
+ # Recent version of unittest.js
150
+ if STATES.include?(parts.first)
151
+ { :state => parts[0], :name => parts[1] }
152
+ # Older version
153
+ else
154
+ { :state => parts[1], :name => parts[0] }
155
+ end
156
+ end
157
+ end
158
+ end
@@ -0,0 +1,27 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <title>A HeadlessSquirrel Unit Test HTML File</title>
6
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
7
+
8
+ <script type="text/javascript" charset="utf-8">
9
+ var eventResults = {};
10
+ var originalElement = window.Element;
11
+ </script>
12
+
13
+ <script src="../regression/prototype/unit/assets/prototype.js" type="text/javascript" charset="utf-8"></script>
14
+ <script src="../regression/prototype/unit/assets/unittest.js" type="text/javascript" charset="utf-8"></script>
15
+ <script src="a_unit_test.js" type="text/javascript" charset="utf-8"></script>
16
+ </head>
17
+ <body>
18
+
19
+ <div id="testlog"></div>
20
+
21
+ <div id="content"></div>
22
+
23
+ </body>
24
+ </html>
25
+ <script type="text/javascript" charset="utf-8">
26
+ eventResults.endOfDocument = true;
27
+ </script>
@@ -0,0 +1,22 @@
1
+ // 3 tests, 2 assertions, 1 failures, 1 errors
2
+
3
+ new Test.Unit.Runner({
4
+ setup: function() {
5
+ this.content = $('content');
6
+ this.content.update('');
7
+ },
8
+
9
+ testHelloWorldSuccess: function() {
10
+ this.assertEqual("", this.content.innerHTML);
11
+ this.content.update('Hello world!');
12
+ this.assertEqual("Hello world!", this.content.innerHTML);
13
+ },
14
+
15
+ testHelloWorldFailure: function() {
16
+ this.assertEqual("Hello world!", this.content.innerHTML);
17
+ },
18
+
19
+ testHelloWorldError: function() {
20
+ this.content.foo();
21
+ },
22
+ });
@@ -0,0 +1,27 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <title>A HeadlessSquirrel Unit Test HTML File With Syntax Error</title>
6
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
7
+
8
+ <script type="text/javascript" charset="utf-8">
9
+ var eventResults = {};
10
+ var originalElement = window.Element;
11
+ </script>
12
+
13
+ <script src="../regression/prototype/unit/assets/prototype.js" type="text/javascript" charset="utf-8"></script>
14
+ <script src="../regression/prototype/unit/assets/unittest.js" type="text/javascript" charset="utf-8"></script>
15
+ <script src="syntax_error.js" type="text/javascript" charset="utf-8"></script>
16
+ </head>
17
+ <body>
18
+
19
+ <div id="testlog"></div>
20
+
21
+ <div id="content"></div>
22
+
23
+ </body>
24
+ </html>
25
+ <script type="text/javascript" charset="utf-8">
26
+ eventResults.endOfDocument = true;
27
+ </script>