jbarnette-johnson 1.0.0.200806240111
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +5 -0
- data/MANIFEST +385 -0
- data/MINGW32.mk +124 -0
- data/README.rdoc +51 -0
- data/Rakefile +166 -0
- data/bin/johnson +107 -0
- data/cross-compile.txt +38 -0
- data/ext/spidermonkey/context.c +122 -0
- data/ext/spidermonkey/context.h +19 -0
- data/ext/spidermonkey/conversions.c +286 -0
- data/ext/spidermonkey/conversions.h +18 -0
- data/ext/spidermonkey/debugger.c +208 -0
- data/ext/spidermonkey/debugger.h +9 -0
- data/ext/spidermonkey/extconf.rb +25 -0
- data/ext/spidermonkey/extensions.c +37 -0
- data/ext/spidermonkey/extensions.h +12 -0
- data/ext/spidermonkey/global.c +40 -0
- data/ext/spidermonkey/global.h +11 -0
- data/ext/spidermonkey/idhash.c +16 -0
- data/ext/spidermonkey/idhash.h +8 -0
- data/ext/spidermonkey/immutable_node.c.erb +522 -0
- data/ext/spidermonkey/immutable_node.h +22 -0
- data/ext/spidermonkey/jroot.h +187 -0
- data/ext/spidermonkey/js_land_proxy.c +609 -0
- data/ext/spidermonkey/js_land_proxy.h +20 -0
- data/ext/spidermonkey/ruby_land_proxy.c +537 -0
- data/ext/spidermonkey/ruby_land_proxy.h +17 -0
- data/ext/spidermonkey/runtime.c +304 -0
- data/ext/spidermonkey/runtime.h +25 -0
- data/ext/spidermonkey/spidermonkey.c +20 -0
- data/ext/spidermonkey/spidermonkey.h +29 -0
- data/js/johnson/browser.js +9 -0
- data/js/johnson/browser/env.js +687 -0
- data/js/johnson/browser/jquery.js +3444 -0
- data/js/johnson/browser/xmlsax.js +1564 -0
- data/js/johnson/browser/xmlw3cdom.js +4189 -0
- data/js/johnson/cli.js +30 -0
- data/js/johnson/prelude.js +80 -0
- data/js/johnson/template.js +29 -0
- data/lib/hoe.rb +748 -0
- data/lib/johnson.rb +46 -0
- data/lib/johnson/cli.rb +7 -0
- data/lib/johnson/cli/options.rb +56 -0
- data/lib/johnson/error.rb +4 -0
- data/lib/johnson/nodes.rb +7 -0
- data/lib/johnson/nodes/binary_node.rb +64 -0
- data/lib/johnson/nodes/for.rb +14 -0
- data/lib/johnson/nodes/for_in.rb +12 -0
- data/lib/johnson/nodes/function.rb +13 -0
- data/lib/johnson/nodes/list.rb +27 -0
- data/lib/johnson/nodes/node.rb +68 -0
- data/lib/johnson/nodes/ternary_node.rb +20 -0
- data/lib/johnson/parser.rb +21 -0
- data/lib/johnson/parser/syntax_error.rb +13 -0
- data/lib/johnson/runtime.rb +55 -0
- data/lib/johnson/spidermonkey/context.rb +10 -0
- data/lib/johnson/spidermonkey/debugger.rb +67 -0
- data/lib/johnson/spidermonkey/immutable_node.rb +280 -0
- data/lib/johnson/spidermonkey/js_land_proxy.rb +62 -0
- data/lib/johnson/spidermonkey/mutable_tree_visitor.rb +233 -0
- data/lib/johnson/spidermonkey/ruby_land_proxy.rb +52 -0
- data/lib/johnson/spidermonkey/runtime.rb +94 -0
- data/lib/johnson/version.rb +4 -0
- data/lib/johnson/visitable.rb +16 -0
- data/lib/johnson/visitors.rb +4 -0
- data/lib/johnson/visitors/dot_visitor.rb +167 -0
- data/lib/johnson/visitors/ecma_visitor.rb +315 -0
- data/lib/johnson/visitors/enumerating_visitor.rb +115 -0
- data/lib/johnson/visitors/sexp_visitor.rb +172 -0
- data/lib/rails/init.rb +37 -0
- data/test/assets/index.html +38 -0
- data/test/assets/jquery_test.html +186 -0
- data/test/helper.rb +58 -0
- data/test/johnson/browser_test.rb +38 -0
- data/test/johnson/conversions/array_test.rb +32 -0
- data/test/johnson/conversions/boolean_test.rb +17 -0
- data/test/johnson/conversions/callable_test.rb +34 -0
- data/test/johnson/conversions/file_test.rb +15 -0
- data/test/johnson/conversions/nil_test.rb +20 -0
- data/test/johnson/conversions/number_test.rb +34 -0
- data/test/johnson/conversions/regexp_test.rb +24 -0
- data/test/johnson/conversions/string_test.rb +26 -0
- data/test/johnson/conversions/struct_test.rb +15 -0
- data/test/johnson/conversions/symbol_test.rb +19 -0
- data/test/johnson/conversions/thread_test.rb +24 -0
- data/test/johnson/error_test.rb +9 -0
- data/test/johnson/extensions_test.rb +56 -0
- data/test/johnson/nodes/array_literal_test.rb +57 -0
- data/test/johnson/nodes/array_node_test.rb +26 -0
- data/test/johnson/nodes/binary_node_test.rb +61 -0
- data/test/johnson/nodes/bracket_access_test.rb +16 -0
- data/test/johnson/nodes/delete_test.rb +11 -0
- data/test/johnson/nodes/do_while_test.rb +12 -0
- data/test/johnson/nodes/dot_accessor_test.rb +15 -0
- data/test/johnson/nodes/export_test.rb +9 -0
- data/test/johnson/nodes/for_test.rb +54 -0
- data/test/johnson/nodes/function_test.rb +71 -0
- data/test/johnson/nodes/if_test.rb +41 -0
- data/test/johnson/nodes/import_test.rb +13 -0
- data/test/johnson/nodes/label_test.rb +19 -0
- data/test/johnson/nodes/object_literal_test.rb +110 -0
- data/test/johnson/nodes/return_test.rb +16 -0
- data/test/johnson/nodes/semi_test.rb +8 -0
- data/test/johnson/nodes/switch_test.rb +55 -0
- data/test/johnson/nodes/ternary_test.rb +25 -0
- data/test/johnson/nodes/throw_test.rb +9 -0
- data/test/johnson/nodes/try_node_test.rb +59 -0
- data/test/johnson/nodes/typeof_test.rb +11 -0
- data/test/johnson/nodes/unary_node_test.rb +23 -0
- data/test/johnson/nodes/void_test.rb +11 -0
- data/test/johnson/nodes/while_test.rb +26 -0
- data/test/johnson/nodes/with_test.rb +10 -0
- data/test/johnson/prelude_test.rb +56 -0
- data/test/johnson/runtime_test.rb +46 -0
- data/test/johnson/spidermonkey/context_test.rb +21 -0
- data/test/johnson/spidermonkey/immutable_node_test.rb +34 -0
- data/test/johnson/spidermonkey/js_land_proxy_test.rb +236 -0
- data/test/johnson/spidermonkey/ruby_land_proxy_test.rb +225 -0
- data/test/johnson/spidermonkey/runtime_test.rb +17 -0
- data/test/johnson/version_test.rb +13 -0
- data/test/johnson/visitors/dot_visitor_test.rb +39 -0
- data/test/johnson/visitors/enumerating_visitor_test.rb +12 -0
- data/test/johnson_test.rb +16 -0
- data/test/jquery_units/test.js +27 -0
- data/test/jquery_units/test_helper.js +197 -0
- data/test/jquery_units/units/ajax.js +795 -0
- data/test/jquery_units/units/core.js +1563 -0
- data/test/jquery_units/units/event.js +299 -0
- data/test/jquery_units/units/fx.js +427 -0
- data/test/jquery_units/units/offset.js +112 -0
- data/test/jquery_units/units/selector.js +224 -0
- data/test/jspec/helper.js +7 -0
- data/test/jspec/jspec.js +192 -0
- data/test/jspec/simple_spec.js +68 -0
- data/test/parser_test.rb +276 -0
- data/todo/.keep +0 -0
- metadata +501 -0
@@ -0,0 +1,225 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "/../../helper"))
|
2
|
+
|
3
|
+
module Johnson
|
4
|
+
module SpiderMonkey
|
5
|
+
class RubyLandProxyTest < Johnson::TestCase
|
6
|
+
def setup
|
7
|
+
@runtime = Johnson::Runtime.new(Johnson::SpiderMonkey::Runtime)
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_constructing_a_proxy_directly_asplodes
|
11
|
+
assert_raise(Johnson::Error) { Johnson::SpiderMonkey::RubyLandProxy.new }
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_objects_get_wrapped_as_proxies
|
15
|
+
assert_kind_of(Johnson::SpiderMonkey::RubyLandProxy, @runtime.evaluate("x = {}"))
|
16
|
+
assert_kind_of(Johnson::SpiderMonkey::RubyLandProxy, @runtime.evaluate("new Object()"))
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_proxies_get_unwrapped_when_roundtripping
|
20
|
+
proxy = @runtime.evaluate("x = {}")
|
21
|
+
@runtime["y"] = proxy
|
22
|
+
assert(@runtime.evaluate("x === y"))
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_array_indexable
|
26
|
+
proxy = @runtime.evaluate("var x = [1,2,3]; x")
|
27
|
+
assert_equal(1, proxy[0])
|
28
|
+
assert_equal(1, proxy['0'])
|
29
|
+
|
30
|
+
proxy[0] = 10
|
31
|
+
assert_js_equal(10, 'x[0]')
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_hash_indexable
|
35
|
+
proxy = @runtime.evaluate("var x = { 0: 1, 1: 2, 2: 3 }; x")
|
36
|
+
assert_equal(1, proxy[0])
|
37
|
+
assert_equal(1, proxy['0'])
|
38
|
+
|
39
|
+
proxy[0] = 10
|
40
|
+
assert_js_equal(10, 'x[0]')
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_functions_get_wrapped_as_proxies
|
44
|
+
f = @runtime.evaluate("function() {}")
|
45
|
+
assert_kind_of(Johnson::SpiderMonkey::RubyLandProxy, f)
|
46
|
+
assert(f.function?)
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_function?
|
50
|
+
f = @runtime.evaluate("function() {}")
|
51
|
+
assert_kind_of(Johnson::SpiderMonkey::RubyLandProxy, f)
|
52
|
+
assert(f.function?)
|
53
|
+
|
54
|
+
f = @runtime.evaluate("new Object()")
|
55
|
+
assert_kind_of(Johnson::SpiderMonkey::RubyLandProxy, f)
|
56
|
+
assert(!f.function?)
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_calling_non_functions_complains
|
60
|
+
assert_raise(RuntimeError) { @runtime.evaluate("new Object()").call }
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_functions_can_be_called
|
64
|
+
f = @runtime.evaluate("function() { return 42; }")
|
65
|
+
assert_equal(42, f.call)
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_functions_can_be_called_with_args
|
69
|
+
f = @runtime.evaluate("function(x) { return x * 2; }")
|
70
|
+
assert_equal(84, f.call(42))
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_functions_can_be_used_as_procs
|
74
|
+
f = @runtime.evaluate("function(x) { return x * 2; }")
|
75
|
+
a = [1, 2, 3]
|
76
|
+
|
77
|
+
assert_equal([2, 4, 6], a.collect(&f))
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_function_proxies_are_called_with_a_global_this
|
81
|
+
f = @runtime.evaluate("x = 42; function() { return this.x; }")
|
82
|
+
assert_equal(42, f.call)
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_can_be_indexed_by_string
|
86
|
+
proxy = @runtime.evaluate("x = { foo: 42 }")
|
87
|
+
assert_kind_of(Johnson::SpiderMonkey::RubyLandProxy, proxy)
|
88
|
+
|
89
|
+
assert_equal(42, proxy["foo"])
|
90
|
+
|
91
|
+
proxy["foo"] = 99
|
92
|
+
proxy["bar"] = 42
|
93
|
+
|
94
|
+
assert_js_equal(99, "x.foo")
|
95
|
+
assert_equal(99, proxy["foo"])
|
96
|
+
assert_equal(42, proxy["bar"])
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_multilevel_indexing_works
|
100
|
+
proxy = @runtime.evaluate("x = { foo: { bar: 42 , baz: function() { return 42 } } }")
|
101
|
+
assert_equal(42, proxy["foo"]["bar"])
|
102
|
+
assert_equal(42, proxy["foo"]["baz"].call)
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_respond_to_works
|
106
|
+
proxy = @runtime.evaluate("x = { foo: 42 }")
|
107
|
+
assert(!proxy.respond_to?(:bar))
|
108
|
+
assert(proxy.respond_to?(:foo))
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_respond_to_always_returns_true_for_assignment
|
112
|
+
proxy = @runtime.evaluate("x = {}")
|
113
|
+
assert(proxy.respond_to?(:bar=))
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_accessor
|
117
|
+
proxy = @runtime.evaluate("x = { foo: 42 }")
|
118
|
+
assert_equal(42, proxy.foo)
|
119
|
+
end
|
120
|
+
|
121
|
+
def test_mutator
|
122
|
+
proxy = @runtime.evaluate("x = {}")
|
123
|
+
proxy.foo = 42
|
124
|
+
|
125
|
+
assert_js_equal(42, "x.foo")
|
126
|
+
assert_equal(42, proxy.foo)
|
127
|
+
end
|
128
|
+
|
129
|
+
def test_method_with_no_arguments
|
130
|
+
proxy = @runtime.evaluate("x = { foo: function() { return 42 } }")
|
131
|
+
assert_equal(42, proxy.foo)
|
132
|
+
end
|
133
|
+
|
134
|
+
def test_method_with_one_argument
|
135
|
+
proxy = @runtime.evaluate("f = { f: function(x) { return x * 2 } }")
|
136
|
+
assert_equal(84, proxy.f(42))
|
137
|
+
end
|
138
|
+
|
139
|
+
def test_method_with_multiple_arguments
|
140
|
+
proxy = @runtime.evaluate("x = { add: function(x, y) { return x + y } }")
|
141
|
+
assert_equal(42, proxy.add(40, 2))
|
142
|
+
end
|
143
|
+
|
144
|
+
def test_supports_each_on_arrays
|
145
|
+
proxy = @runtime.evaluate("[1, 2, 3]")
|
146
|
+
values = []
|
147
|
+
|
148
|
+
proxy.each { |n| values << n }
|
149
|
+
assert_equal([1, 2, 3], values)
|
150
|
+
end
|
151
|
+
|
152
|
+
def test_supports_each_on_things_that_arent_arrays
|
153
|
+
proxy = @runtime.evaluate("x = { foo: 'fooval', bar: 'barval' }; x[0] = 42; x")
|
154
|
+
values = {}
|
155
|
+
|
156
|
+
proxy.each { |k, v| values[k] = v }
|
157
|
+
assert_equal({ 'foo' => 'fooval', 'bar' => 'barval', 0 => 42 }, values)
|
158
|
+
end
|
159
|
+
|
160
|
+
def test_each_passes_an_exception
|
161
|
+
proxy = @runtime.evaluate("x = { foo: 'fooval', bar: 'barval' }; x[0] = 42; x")
|
162
|
+
values = {}
|
163
|
+
|
164
|
+
assert_raise(RuntimeError) do
|
165
|
+
proxy.each do |k, v|
|
166
|
+
values[k] = v
|
167
|
+
raise "splat" if values.keys.size == 2
|
168
|
+
end
|
169
|
+
end
|
170
|
+
assert_equal({ 'foo' => 'fooval', 'bar' => 'barval' }, values)
|
171
|
+
end
|
172
|
+
|
173
|
+
def test_is_enumerable
|
174
|
+
proxy = @runtime.evaluate("[1, 2, 3]")
|
175
|
+
assert_kind_of(Enumerable, proxy)
|
176
|
+
|
177
|
+
assert_equal([2, 4, 6], proxy.collect { |n| n * 2 })
|
178
|
+
end
|
179
|
+
|
180
|
+
def test_has_a_length
|
181
|
+
proxy = @runtime.evaluate("[1, 2, 3]")
|
182
|
+
assert_equal(3, proxy.length)
|
183
|
+
end
|
184
|
+
|
185
|
+
def test_length_is_aliased_as_size
|
186
|
+
proxy = @runtime.evaluate("[1, 2, 3]")
|
187
|
+
assert_equal(3, proxy.size)
|
188
|
+
end
|
189
|
+
|
190
|
+
def test_length_for_arrays_ignores_non_numeric_properties
|
191
|
+
proxy = @runtime.evaluate("x = [1, 2, 3]; x['foo'] = 'bar'; x")
|
192
|
+
assert_equal(3, proxy.length)
|
193
|
+
end
|
194
|
+
|
195
|
+
def test_length_for_objects_includes_all_properties
|
196
|
+
proxy = @runtime.evaluate("x = { foo: 'foo', bar: 'bar', 0: 42 }")
|
197
|
+
assert_equal(3, proxy.length)
|
198
|
+
end
|
199
|
+
|
200
|
+
def test_raises_in_js
|
201
|
+
err = RuntimeError.new("an exception")
|
202
|
+
asplode = lambda { raise err }
|
203
|
+
assert_js_equal(err, "x = null; try { foo(); } catch(ex) { x = ex; }; x", :foo => asplode)
|
204
|
+
end
|
205
|
+
|
206
|
+
# FIXME: If you uncomment this test, we get this error:
|
207
|
+
#
|
208
|
+
# JS API usage error: the address passed to JS_AddNamedRoot currently holds an
|
209
|
+
# invalid jsval. This is usually caused by a missing call to JS_RemoveRoot.
|
210
|
+
# The root's name is "ruby_land_proxy.c[210]:native_call: proxy_value".
|
211
|
+
# Assertion failure: root_points_to_gcArenaList, at jsgc.c:2618
|
212
|
+
#
|
213
|
+
# WTF?
|
214
|
+
#
|
215
|
+
# -Aaron
|
216
|
+
#
|
217
|
+
#def test_throwing_in_js_goes_to_ruby
|
218
|
+
# func = @runtime.evaluate('function () { throw "foo"; }')
|
219
|
+
# assert_raise(Johnson::Error) {
|
220
|
+
# func.call
|
221
|
+
# }
|
222
|
+
#end
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "/../../helper"))
|
2
|
+
|
3
|
+
module Johnson
|
4
|
+
module SpiderMonkey
|
5
|
+
class RuntimeTest < Johnson::TestCase
|
6
|
+
def setup
|
7
|
+
@runtime = Johnson::SpiderMonkey::Runtime.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_can_create_more_than_one_without_barfing
|
11
|
+
assert_nothing_raised {
|
12
|
+
Johnson::SpiderMonkey::Runtime.new
|
13
|
+
}
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "/../helper"))
|
2
|
+
|
3
|
+
module Johnson
|
4
|
+
class VersionTest < Johnson::TestCase
|
5
|
+
def test_has_a_version
|
6
|
+
assert_not_nil(Johnson::VERSION)
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_has_a_spidermonkey_version
|
10
|
+
assert_not_nil(Johnson::SpiderMonkey::VERSION)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "/../../helper"))
|
2
|
+
|
3
|
+
class DotVisitorTest < Test::Unit::TestCase
|
4
|
+
def test_var_foo
|
5
|
+
dot = Johnson.parse('var foo;').to_dot
|
6
|
+
assert_equal(3, dot.nodes.length)
|
7
|
+
assert_equal(2, dot.links.length)
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_for
|
11
|
+
dot = Johnson.parse('for(var x = 0; x < 10; x++) { }').to_dot
|
12
|
+
assert_equal(12, dot.nodes.length)
|
13
|
+
assert_equal(11, dot.links.length)
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_for_in
|
17
|
+
dot = Johnson.parse('for(var x in johnson(1,2,"asdf")) { }').to_dot
|
18
|
+
assert_equal(11, dot.nodes.length)
|
19
|
+
assert_equal(10, dot.links.length)
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_try
|
23
|
+
dot = Johnson.parse('try { var x = 10; } finally { var x = 20; }').to_dot
|
24
|
+
assert_equal(12, dot.nodes.length)
|
25
|
+
assert_equal(11, dot.links.length)
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_try_catch
|
29
|
+
dot = Johnson.parse('try { var x = 10; } catch(a) { var x = 20; x++; }').to_dot
|
30
|
+
assert_equal(16, dot.nodes.length)
|
31
|
+
assert_equal(15, dot.links.length)
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_function
|
35
|
+
dot = Johnson.parse("var foo = function(a,b) { }").to_dot
|
36
|
+
assert_equal(6, dot.nodes.length)
|
37
|
+
assert_equal(5, dot.links.length)
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "/../../helper"))
|
2
|
+
|
3
|
+
class EnumeratingVisitorTest < Test::Unit::TestCase
|
4
|
+
def test_for
|
5
|
+
ast = Johnson.parse('for(var x = 0; x < 10; x++) { }')
|
6
|
+
counter = 0
|
7
|
+
ast.each do |node|
|
8
|
+
counter += 1
|
9
|
+
end
|
10
|
+
assert_equal(12, counter)
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "helper"))
|
2
|
+
|
3
|
+
class JohnsonTest < Test::Unit::TestCase
|
4
|
+
def test_shortcut_evaluate
|
5
|
+
assert_equal(4, Johnson.evaluate("2 + 2"))
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_can_provide_context_vars_to_evaluate
|
9
|
+
assert_equal(4, Johnson.evaluate("2 + foo", :foo => 2))
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_evaluate_uses_a_new_runtime_each_time
|
13
|
+
assert_equal(4, Johnson.evaluate("foo", :foo => 4))
|
14
|
+
assert_raise(Johnson::Error) { Johnson.evaluate("foo") }
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
// Init
|
2
|
+
Johnson.require("johnson/browser");
|
3
|
+
Johnson.require("johnson/browser/jquery");
|
4
|
+
|
5
|
+
Johnson.waitForThreads = function() {
|
6
|
+
// FIXME: This sucks ass
|
7
|
+
Ruby.eval("(Thread.list - [Thread.main]).each {|t| t.join}");
|
8
|
+
};
|
9
|
+
|
10
|
+
window.location = "file://" + Ruby.File.expand_path(Ruby.Dir.pwd()) + "/test/assets/jquery_test.html";
|
11
|
+
Ruby.eval("(Thread.list - [Thread.main]).each {|t| t.join}");
|
12
|
+
|
13
|
+
// Load the test runner
|
14
|
+
Johnson.require("test/jquery_units/test_helper.js");
|
15
|
+
|
16
|
+
Johnson.require("test/jquery_units/units/core.js");
|
17
|
+
// // Load the tests
|
18
|
+
// load(
|
19
|
+
// "test/unit/core.js",
|
20
|
+
// "test/unit/selector.js",
|
21
|
+
// "test/unit/event.js"
|
22
|
+
// //"test/unit/fx.js",
|
23
|
+
// //"test/unit/ajax.js"
|
24
|
+
// );
|
25
|
+
|
26
|
+
// Display the results
|
27
|
+
results();
|
@@ -0,0 +1,197 @@
|
|
1
|
+
function test(name, fn){
|
2
|
+
expected = -1;
|
3
|
+
numTests = 0;
|
4
|
+
reset();
|
5
|
+
|
6
|
+
fn();
|
7
|
+
|
8
|
+
if ( expected != -1 && expected != numTests )
|
9
|
+
log( false, "Wrong number of tests run. " + numTests + " ran, expected " + expected );
|
10
|
+
}
|
11
|
+
|
12
|
+
var orig = document.getElementById('main').innerHTML;
|
13
|
+
|
14
|
+
/**
|
15
|
+
* Resets the test setup. Useful for tests that modify the DOM.
|
16
|
+
*/
|
17
|
+
function reset() {
|
18
|
+
document.getElementById('main').innerHTML = orig;
|
19
|
+
}
|
20
|
+
|
21
|
+
var currentModule = "";
|
22
|
+
|
23
|
+
// call on start of module test to prepend name to all tests
|
24
|
+
function module(moduleName) {
|
25
|
+
currentModule = moduleName;
|
26
|
+
}
|
27
|
+
|
28
|
+
var expected = -1;
|
29
|
+
|
30
|
+
/**
|
31
|
+
* Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through.
|
32
|
+
*/
|
33
|
+
function expect(asserts) {
|
34
|
+
expected = asserts;
|
35
|
+
}
|
36
|
+
|
37
|
+
/**
|
38
|
+
* Asserts true.
|
39
|
+
* @example ok( $("a").size() > 5, "There must be at least 5 anchors" );
|
40
|
+
*/
|
41
|
+
function ok(a, msg) {
|
42
|
+
log( !!a, msg );
|
43
|
+
}
|
44
|
+
|
45
|
+
/**
|
46
|
+
* Asserts that two arrays are the same
|
47
|
+
*/
|
48
|
+
function isSet(a, b, msg) {
|
49
|
+
var ret = true;
|
50
|
+
if ( a && b && a.length != undefined && a.length == b.length ) {
|
51
|
+
for ( var i = 0; i < a.length; i++ ) {
|
52
|
+
if ( a[i] != b[i] )
|
53
|
+
ret = false;
|
54
|
+
}
|
55
|
+
} else
|
56
|
+
ret = false;
|
57
|
+
if ( !ret )
|
58
|
+
log( ret, msg + " expected: " + serialArray(b) + " result: " + serialArray(a) );
|
59
|
+
else
|
60
|
+
log( ret, msg );
|
61
|
+
}
|
62
|
+
|
63
|
+
/**
|
64
|
+
* Asserts that two objects are equivalent
|
65
|
+
*/
|
66
|
+
function isObj(a, b, msg) {
|
67
|
+
var ret = true;
|
68
|
+
|
69
|
+
if ( a && b ) {
|
70
|
+
for ( var i in a )
|
71
|
+
if ( a[i] != b[i] )
|
72
|
+
ret = false;
|
73
|
+
|
74
|
+
for ( i in b )
|
75
|
+
if ( a[i] != b[i] )
|
76
|
+
ret = false;
|
77
|
+
} else
|
78
|
+
ret = false;
|
79
|
+
|
80
|
+
log( ret, msg );
|
81
|
+
}
|
82
|
+
|
83
|
+
function serialArray( a ) {
|
84
|
+
var r = [];
|
85
|
+
|
86
|
+
if ( a && a.length )
|
87
|
+
for ( var i = 0; i < a.length; i++ ) {
|
88
|
+
var str = a[i] ? a[i].nodeName : "";
|
89
|
+
if ( str ) {
|
90
|
+
str = str.toLowerCase();
|
91
|
+
if ( a[i].id )
|
92
|
+
str += "#" + a[i].id;
|
93
|
+
} else
|
94
|
+
str = a[i];
|
95
|
+
r.push( str );
|
96
|
+
}
|
97
|
+
|
98
|
+
return "[ " + r.join(", ") + " ]"
|
99
|
+
}
|
100
|
+
|
101
|
+
/**
|
102
|
+
* Returns an array of elements with the given IDs, eg.
|
103
|
+
* @example q("main", "foo", "bar")
|
104
|
+
* @result [<div id="main">, <span id="foo">, <input id="bar">]
|
105
|
+
*/
|
106
|
+
function q() {
|
107
|
+
var r = [];
|
108
|
+
for ( var i = 0; i < arguments.length; i++ )
|
109
|
+
r.push( document.getElementById( arguments[i] ) );
|
110
|
+
return r;
|
111
|
+
}
|
112
|
+
|
113
|
+
/**
|
114
|
+
* Asserts that a select matches the given IDs
|
115
|
+
* @example t("Check for something", "//[a]", ["foo", "baar"]);
|
116
|
+
* @result returns true if "//[a]" return two elements with the IDs 'foo' and 'baar'
|
117
|
+
*/
|
118
|
+
function t(a,b,c) {
|
119
|
+
var f = jQuery(b);
|
120
|
+
var s = "";
|
121
|
+
for ( var i = 0; i < f.length; i++ )
|
122
|
+
s += (s && ",") + '"' + f[i].id + '"';
|
123
|
+
isSet(f, q.apply(q,c), a + " (" + b + ")");
|
124
|
+
}
|
125
|
+
|
126
|
+
/**
|
127
|
+
* Checks that the first two arguments are equal, with an optional message.
|
128
|
+
* Prints out both expected and actual values on failure.
|
129
|
+
*
|
130
|
+
* Prefered to ok( expected == actual, message )
|
131
|
+
*
|
132
|
+
* @example equals( "Expected 2 characters.", v.formatMessage("Expected {0} characters.", 2) );
|
133
|
+
*
|
134
|
+
* @param Object expected
|
135
|
+
* @param Object actual
|
136
|
+
* @param String message (optional)
|
137
|
+
*/
|
138
|
+
function equals(expected, actual, message) {
|
139
|
+
var result = expected == actual;
|
140
|
+
message = message || (result ? "okay" : "failed");
|
141
|
+
log( result, result ? message + ": " + expected : message + " expected: " + expected + " actual: " + actual );
|
142
|
+
}
|
143
|
+
|
144
|
+
var numTests = 0, total = 0, pass = 0, fail = 0;
|
145
|
+
|
146
|
+
function log(state, msg){
|
147
|
+
print( (state ? "PASS" : "FAIL") + " (" + (++total) + ") " +
|
148
|
+
(currentModule ? "[" + currentModule + "] " : "") + msg );
|
149
|
+
|
150
|
+
numTests++;
|
151
|
+
|
152
|
+
if ( state )
|
153
|
+
pass++;
|
154
|
+
else
|
155
|
+
fail++;
|
156
|
+
}
|
157
|
+
|
158
|
+
function results(){
|
159
|
+
print( pass + " Passed, " + fail + " Failed" );
|
160
|
+
}
|
161
|
+
|
162
|
+
function start(){}
|
163
|
+
function stop(){}
|
164
|
+
|
165
|
+
/**
|
166
|
+
* Trigger an event on an element.
|
167
|
+
*
|
168
|
+
* @example triggerEvent( document.body, "click" );
|
169
|
+
*
|
170
|
+
* @param DOMElement elem
|
171
|
+
* @param String type
|
172
|
+
*/
|
173
|
+
function triggerEvent( elem, type, event ) {
|
174
|
+
/*
|
175
|
+
if ( jQuery.browser.mozilla || jQuery.browser.opera ) {
|
176
|
+
event = document.createEvent("MouseEvents");
|
177
|
+
event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView,
|
178
|
+
0, 0, 0, 0, 0, false, false, false, false, 0, null);
|
179
|
+
elem.dispatchEvent( event );
|
180
|
+
} else if ( jQuery.browser.msie ) {
|
181
|
+
elem.fireEvent("on"+type);
|
182
|
+
}
|
183
|
+
*/
|
184
|
+
}
|
185
|
+
|
186
|
+
/**
|
187
|
+
* Add random number to url to stop IE from caching
|
188
|
+
*
|
189
|
+
* @example url("data/test.html")
|
190
|
+
* @result "data/test.html?10538358428943"
|
191
|
+
*
|
192
|
+
* @example url("data/test.php?foo=bar")
|
193
|
+
* @result "data/test.php?foo=bar&10538358345554"
|
194
|
+
*/
|
195
|
+
function url(value) {
|
196
|
+
return value + (/\?/.test(value) ? "&" : "?") + new Date().getTime() + "" + parseInt(Math.random()*100000);
|
197
|
+
}
|