jbarnette-johnson 1.0.0.200806240111

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 (137) hide show
  1. data/CHANGELOG +5 -0
  2. data/MANIFEST +385 -0
  3. data/MINGW32.mk +124 -0
  4. data/README.rdoc +51 -0
  5. data/Rakefile +166 -0
  6. data/bin/johnson +107 -0
  7. data/cross-compile.txt +38 -0
  8. data/ext/spidermonkey/context.c +122 -0
  9. data/ext/spidermonkey/context.h +19 -0
  10. data/ext/spidermonkey/conversions.c +286 -0
  11. data/ext/spidermonkey/conversions.h +18 -0
  12. data/ext/spidermonkey/debugger.c +208 -0
  13. data/ext/spidermonkey/debugger.h +9 -0
  14. data/ext/spidermonkey/extconf.rb +25 -0
  15. data/ext/spidermonkey/extensions.c +37 -0
  16. data/ext/spidermonkey/extensions.h +12 -0
  17. data/ext/spidermonkey/global.c +40 -0
  18. data/ext/spidermonkey/global.h +11 -0
  19. data/ext/spidermonkey/idhash.c +16 -0
  20. data/ext/spidermonkey/idhash.h +8 -0
  21. data/ext/spidermonkey/immutable_node.c.erb +522 -0
  22. data/ext/spidermonkey/immutable_node.h +22 -0
  23. data/ext/spidermonkey/jroot.h +187 -0
  24. data/ext/spidermonkey/js_land_proxy.c +609 -0
  25. data/ext/spidermonkey/js_land_proxy.h +20 -0
  26. data/ext/spidermonkey/ruby_land_proxy.c +537 -0
  27. data/ext/spidermonkey/ruby_land_proxy.h +17 -0
  28. data/ext/spidermonkey/runtime.c +304 -0
  29. data/ext/spidermonkey/runtime.h +25 -0
  30. data/ext/spidermonkey/spidermonkey.c +20 -0
  31. data/ext/spidermonkey/spidermonkey.h +29 -0
  32. data/js/johnson/browser.js +9 -0
  33. data/js/johnson/browser/env.js +687 -0
  34. data/js/johnson/browser/jquery.js +3444 -0
  35. data/js/johnson/browser/xmlsax.js +1564 -0
  36. data/js/johnson/browser/xmlw3cdom.js +4189 -0
  37. data/js/johnson/cli.js +30 -0
  38. data/js/johnson/prelude.js +80 -0
  39. data/js/johnson/template.js +29 -0
  40. data/lib/hoe.rb +748 -0
  41. data/lib/johnson.rb +46 -0
  42. data/lib/johnson/cli.rb +7 -0
  43. data/lib/johnson/cli/options.rb +56 -0
  44. data/lib/johnson/error.rb +4 -0
  45. data/lib/johnson/nodes.rb +7 -0
  46. data/lib/johnson/nodes/binary_node.rb +64 -0
  47. data/lib/johnson/nodes/for.rb +14 -0
  48. data/lib/johnson/nodes/for_in.rb +12 -0
  49. data/lib/johnson/nodes/function.rb +13 -0
  50. data/lib/johnson/nodes/list.rb +27 -0
  51. data/lib/johnson/nodes/node.rb +68 -0
  52. data/lib/johnson/nodes/ternary_node.rb +20 -0
  53. data/lib/johnson/parser.rb +21 -0
  54. data/lib/johnson/parser/syntax_error.rb +13 -0
  55. data/lib/johnson/runtime.rb +55 -0
  56. data/lib/johnson/spidermonkey/context.rb +10 -0
  57. data/lib/johnson/spidermonkey/debugger.rb +67 -0
  58. data/lib/johnson/spidermonkey/immutable_node.rb +280 -0
  59. data/lib/johnson/spidermonkey/js_land_proxy.rb +62 -0
  60. data/lib/johnson/spidermonkey/mutable_tree_visitor.rb +233 -0
  61. data/lib/johnson/spidermonkey/ruby_land_proxy.rb +52 -0
  62. data/lib/johnson/spidermonkey/runtime.rb +94 -0
  63. data/lib/johnson/version.rb +4 -0
  64. data/lib/johnson/visitable.rb +16 -0
  65. data/lib/johnson/visitors.rb +4 -0
  66. data/lib/johnson/visitors/dot_visitor.rb +167 -0
  67. data/lib/johnson/visitors/ecma_visitor.rb +315 -0
  68. data/lib/johnson/visitors/enumerating_visitor.rb +115 -0
  69. data/lib/johnson/visitors/sexp_visitor.rb +172 -0
  70. data/lib/rails/init.rb +37 -0
  71. data/test/assets/index.html +38 -0
  72. data/test/assets/jquery_test.html +186 -0
  73. data/test/helper.rb +58 -0
  74. data/test/johnson/browser_test.rb +38 -0
  75. data/test/johnson/conversions/array_test.rb +32 -0
  76. data/test/johnson/conversions/boolean_test.rb +17 -0
  77. data/test/johnson/conversions/callable_test.rb +34 -0
  78. data/test/johnson/conversions/file_test.rb +15 -0
  79. data/test/johnson/conversions/nil_test.rb +20 -0
  80. data/test/johnson/conversions/number_test.rb +34 -0
  81. data/test/johnson/conversions/regexp_test.rb +24 -0
  82. data/test/johnson/conversions/string_test.rb +26 -0
  83. data/test/johnson/conversions/struct_test.rb +15 -0
  84. data/test/johnson/conversions/symbol_test.rb +19 -0
  85. data/test/johnson/conversions/thread_test.rb +24 -0
  86. data/test/johnson/error_test.rb +9 -0
  87. data/test/johnson/extensions_test.rb +56 -0
  88. data/test/johnson/nodes/array_literal_test.rb +57 -0
  89. data/test/johnson/nodes/array_node_test.rb +26 -0
  90. data/test/johnson/nodes/binary_node_test.rb +61 -0
  91. data/test/johnson/nodes/bracket_access_test.rb +16 -0
  92. data/test/johnson/nodes/delete_test.rb +11 -0
  93. data/test/johnson/nodes/do_while_test.rb +12 -0
  94. data/test/johnson/nodes/dot_accessor_test.rb +15 -0
  95. data/test/johnson/nodes/export_test.rb +9 -0
  96. data/test/johnson/nodes/for_test.rb +54 -0
  97. data/test/johnson/nodes/function_test.rb +71 -0
  98. data/test/johnson/nodes/if_test.rb +41 -0
  99. data/test/johnson/nodes/import_test.rb +13 -0
  100. data/test/johnson/nodes/label_test.rb +19 -0
  101. data/test/johnson/nodes/object_literal_test.rb +110 -0
  102. data/test/johnson/nodes/return_test.rb +16 -0
  103. data/test/johnson/nodes/semi_test.rb +8 -0
  104. data/test/johnson/nodes/switch_test.rb +55 -0
  105. data/test/johnson/nodes/ternary_test.rb +25 -0
  106. data/test/johnson/nodes/throw_test.rb +9 -0
  107. data/test/johnson/nodes/try_node_test.rb +59 -0
  108. data/test/johnson/nodes/typeof_test.rb +11 -0
  109. data/test/johnson/nodes/unary_node_test.rb +23 -0
  110. data/test/johnson/nodes/void_test.rb +11 -0
  111. data/test/johnson/nodes/while_test.rb +26 -0
  112. data/test/johnson/nodes/with_test.rb +10 -0
  113. data/test/johnson/prelude_test.rb +56 -0
  114. data/test/johnson/runtime_test.rb +46 -0
  115. data/test/johnson/spidermonkey/context_test.rb +21 -0
  116. data/test/johnson/spidermonkey/immutable_node_test.rb +34 -0
  117. data/test/johnson/spidermonkey/js_land_proxy_test.rb +236 -0
  118. data/test/johnson/spidermonkey/ruby_land_proxy_test.rb +225 -0
  119. data/test/johnson/spidermonkey/runtime_test.rb +17 -0
  120. data/test/johnson/version_test.rb +13 -0
  121. data/test/johnson/visitors/dot_visitor_test.rb +39 -0
  122. data/test/johnson/visitors/enumerating_visitor_test.rb +12 -0
  123. data/test/johnson_test.rb +16 -0
  124. data/test/jquery_units/test.js +27 -0
  125. data/test/jquery_units/test_helper.js +197 -0
  126. data/test/jquery_units/units/ajax.js +795 -0
  127. data/test/jquery_units/units/core.js +1563 -0
  128. data/test/jquery_units/units/event.js +299 -0
  129. data/test/jquery_units/units/fx.js +427 -0
  130. data/test/jquery_units/units/offset.js +112 -0
  131. data/test/jquery_units/units/selector.js +224 -0
  132. data/test/jspec/helper.js +7 -0
  133. data/test/jspec/jspec.js +192 -0
  134. data/test/jspec/simple_spec.js +68 -0
  135. data/test/parser_test.rb +276 -0
  136. data/todo/.keep +0 -0
  137. metadata +501 -0
@@ -0,0 +1,57 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "/../../helper"))
2
+
3
+ class ArrayLiteralNodeTest < Johnson::NodeTestCase
4
+ def test_array_literal
5
+ assert_sexp(
6
+ [[:var, [[:assign, [:name, "foo"], [:array, [[:lit, 1]]]]]]],
7
+ @parser.parse('var foo = [1];')
8
+ )
9
+ assert_ecma(
10
+ 'var foo = [1];',
11
+ @parser.parse('var foo = [1];')
12
+ )
13
+ end
14
+
15
+ def test_paren
16
+ assert_ecma("(a && b);", @parser.parse("(a && b)"))
17
+ end
18
+
19
+ def test_array_with_commas
20
+ assert_sexp(
21
+ [[:var, [[:assign, [:name, "foo"], [:array, [
22
+ [:nil],
23
+ [:nil],
24
+ [:lit, 1]
25
+ ]]]]]],
26
+ @parser.parse('var foo = [,,1];')
27
+ )
28
+ assert_ecma(
29
+ 'var foo = [null, null, 1];',
30
+ @parser.parse('var foo = [,,1];')
31
+ )
32
+ assert_sexp(
33
+ [[:var, [[:assign, [:name, "foo"], [:array, [
34
+ [:str, 'foo'],
35
+ [:nil],
36
+ [:lit, 1]
37
+ ]]]]]],
38
+ @parser.parse('var foo = ["foo",,1];')
39
+ )
40
+ assert_ecma(
41
+ 'var foo = ["foo", null, 1];',
42
+ @parser.parse('var foo = ["foo",,1];')
43
+ )
44
+ assert_sexp(
45
+ [[:var, [[:assign, [:name, "foo"], [:array, [
46
+ [:name, 'bar'],
47
+ [:nil],
48
+ [:lit, 1]
49
+ ]]]]]],
50
+ @parser.parse('var foo = [bar,,1];')
51
+ )
52
+ assert_ecma(
53
+ 'var foo = [bar, null, 1];',
54
+ @parser.parse('var foo = [bar,,1];')
55
+ )
56
+ end
57
+ end
@@ -0,0 +1,26 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "/../../helper"))
2
+
3
+ class ArrayNodeTest < Johnson::NodeTestCase
4
+ def test_function_call
5
+ assert_sexp([[:function_call, [[:name, "foo"], [:name, "a"]]]],
6
+ @parser.parse('foo(a)'))
7
+ assert_ecma("foo(a);", @parser.parse("foo(a);"))
8
+ assert_ecma("foo(a, b);", @parser.parse("foo(a,b);"))
9
+ end
10
+
11
+ def test_new
12
+ assert_sexp([[:new, [[:name, "foo"], [:name, "a"]]]],
13
+ @parser.parse('new foo(a)'))
14
+ assert_ecma('new foo(a);', @parser.parse('new foo(a);'))
15
+ assert_ecma('new foo(a, b);', @parser.parse('new foo(a,b);'))
16
+ end
17
+
18
+ def test_comma
19
+ assert_sexp([[:comma,
20
+ [[:op_add_equal, [:name, "result"], [:name, "source"]],
21
+ [:op_equal, [:name, "source"], [:str, ""]]]]],
22
+ @parser.parse('result += source, source = "";'))
23
+ assert_ecma('result += source, source = "";',
24
+ @parser.parse('result += source, source = "";'))
25
+ end
26
+ end
@@ -0,0 +1,61 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "/../../helper"))
2
+
3
+ class BinaryNodeTest < Johnson::NodeTestCase
4
+ {
5
+ :op_equal => '=',
6
+ :op_multiply_equal => '*=',
7
+ :op_divide_equal => '/=',
8
+ :op_add_equal => '+=',
9
+ :op_subtract_equal => '-=',
10
+ :op_lshift_equal => '<<=',
11
+ :op_rshift_equal => '>>=',
12
+ :op_urshift_equal => '>>>=',
13
+ :op_bitand_equal => '&=',
14
+ :op_bitxor_equal => '^=',
15
+ :op_bitor_equal => '|=',
16
+ :op_mod_equal => '%=',
17
+ :op_multiply => '*',
18
+ :op_divide => '/',
19
+ :op_add => '+',
20
+ :op_subtract => '-',
21
+ :op_mod => '%',
22
+ :op_bitand => '&',
23
+ :op_lshift => '<<',
24
+ :op_rshift => '>>',
25
+ :op_urshift => '>>>',
26
+ :op_bitxor => '^',
27
+ :op_bitor => '|',
28
+ :and => '&&',
29
+ :or => '||',
30
+ :not_equal => '!=',
31
+ :equal => '==',
32
+ :strict_equal => '===',
33
+ :strict_not_equal => '!==',
34
+ :lt => '<',
35
+ :lt_equal => '<=',
36
+ :gt => '>',
37
+ :gt_equal => '>=',
38
+ :instanceof => 'instanceof',
39
+ }.each do |op,sym|
40
+ define_method(:"test_#{op}_to_sexp") do
41
+ assert_sexp(
42
+ [[op, [:name, 'i'], [:lit, 10]]],
43
+ @parser.parse("i #{sym} 10")
44
+ )
45
+
46
+ # Test optimized nodes. === and !== are not optimized
47
+ unless [:strict_equal, :strict_not_equal].include?(op)
48
+ assert_sexp(
49
+ [[op, [:name, "h"], [op, [:name, 'i'], [:name, 'j']]]],
50
+ @parser.parse("h #{sym} i #{sym} j")
51
+ )
52
+ end
53
+ end
54
+
55
+ define_method(:"test_#{op}_to_ecma") do
56
+ assert_ecma("i #{sym} 10;", @parser.parse("i #{sym} 10;"))
57
+ assert_ecma("i #{sym} j #{sym} k;",
58
+ @parser.parse("i #{sym} j #{sym} k;"))
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,16 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "/../../helper"))
2
+
3
+ class BracketAccessTest < Johnson::NodeTestCase
4
+ def test_to_sexp
5
+ assert_sexp(
6
+ [
7
+ [:var,
8
+ [[:assign, [:name, 'a'],
9
+ [:bracket_access, [:name, "foo"], [:lit, 10]],
10
+ ]]
11
+ ]
12
+ ],
13
+ @parser.parse('var a = foo[10];'))
14
+ assert_ecma("var a = foo[10];", @parser.parse('var a = foo[10];'))
15
+ end
16
+ end
@@ -0,0 +1,11 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "/../../helper"))
2
+
3
+ class DeleteNodeTest < Johnson::NodeTestCase
4
+ def test_delete_sexp
5
+ assert_sexp(
6
+ [[:delete, [:name, 'foo']]],
7
+ @parser.parse('delete foo;')
8
+ )
9
+ assert_ecma('delete foo;', @parser.parse('delete foo;'))
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "/../../helper"))
2
+
3
+ class DoWhileTest < Johnson::NodeTestCase
4
+ def test_do_while
5
+ assert_sexp([[:do_while, [:var, [[:assign, [:name, "x"], [:lit, 10]]]], [:true]]],
6
+ @parser.parse('do var x = 10; while(true);'))
7
+ assert_ecma('do var x = 10; while(true);',
8
+ @parser.parse('do var x = 10; while(true);'))
9
+ assert_ecma("do {\n var x = 10;\n y = 20;\n} while(true);",
10
+ @parser.parse('do { var x = 10; y = 20; } while(true);'))
11
+ end
12
+ end
@@ -0,0 +1,15 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "/../../helper"))
2
+
3
+ class DotAccessorTest < Johnson::NodeTestCase
4
+ def test_expression_statement
5
+ assert_sexp(
6
+ [[:dot_accessor, [:name, "bar"], [:name, "foo"]]],
7
+ @parser.parse('foo.bar;')
8
+ )
9
+ assert_sexp(
10
+ [[:dot_accessor, [:name, "bar"], [:name, "foo"]]],
11
+ @parser.parse('foo.bar')
12
+ )
13
+ assert_ecma('foo.bar;', @parser.parse('foo.bar;'))
14
+ end
15
+ end
@@ -0,0 +1,9 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "/../../helper"))
2
+
3
+ class ExportTest < Johnson::NodeTestCase
4
+ def test_export
5
+ assert_sexp([[:export, [[:name, "name1"], [:name, "name2"]]]],
6
+ @parser.parse('export name1, name2;'))
7
+ assert_ecma('export name1, name2;', @parser.parse('export name1, name2;'))
8
+ end
9
+ end
@@ -0,0 +1,54 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "/../../helper"))
2
+
3
+ class ForTest < Johnson::NodeTestCase
4
+ def test_empty_for
5
+ assert_sexp([[:for, nil, nil, nil, [:var, [[:assign, [:name, "x"], [:lit, 10]]]]]],
6
+ @parser.parse('for( ; ; ) var x = 10;'))
7
+ assert_ecma('for( ; ; ) var x = 10;',
8
+ @parser.parse('for( ; ; ) var x = 10;'))
9
+ end
10
+
11
+ def test_in_no_bf
12
+ assert_sexp([[:in, [:lit, 0], [:name, "foo"]]],
13
+ @parser.parse('0 in foo')
14
+ )
15
+ assert_ecma('0 in foo;', @parser.parse('0 in foo'))
16
+ end
17
+
18
+ def test_for_in_loop
19
+ assert_sexp(
20
+ [
21
+ [:for_in,
22
+ [:in, [:var, [[:name, "foo"]]], [:name, "bar"]],
23
+ [
24
+ [:var, [[:assign, [:name, "x"], [:lit, 10]]]]
25
+ ]
26
+ ]],
27
+ @parser.parse('for(var foo in bar) { var x = 10; }')
28
+ )
29
+ assert_ecma("for(var foo in bar) {\n var x = 10;\n}",
30
+ @parser.parse('for(var foo in bar) { var x = 10; }'))
31
+ end
32
+
33
+ def test_for_loop
34
+ assert_sexp([
35
+ [:for,
36
+ [:op_equal, [:name, "foo"], [:lit, 10]],
37
+ [:lt, [:name, "foo"], [:lit, 10]],
38
+ [:postfix_inc, [:name, "foo"]],
39
+ [
40
+ [:var, [[:assign, [:name, "x"], [:lit, 10]]]],
41
+ [:var, [[:assign, [:name, "y"], [:lit, 11]]]]
42
+ ]
43
+ ]],
44
+ @parser.parse('for(foo = 10; foo < 10; foo++) {
45
+ var x = 10;
46
+ var y = 11; }')
47
+ )
48
+ assert_ecma("for(foo = 10; foo < 10; foo++) {\n var x = 10;\n var y = 11;\n}",
49
+ @parser.parse('for(foo = 10; foo < 10; foo++) {
50
+ var x = 10;
51
+ var y = 11; }')
52
+ )
53
+ end
54
+ end
@@ -0,0 +1,71 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "/../../helper"))
2
+
3
+ class FunctionTest < Johnson::NodeTestCase
4
+ def test_anon_function_no_args_to_sexp
5
+ assert_sexp(
6
+ [[:var,
7
+ [[:assign, [:name, 'foo'],
8
+ [:func_expr, nil, [], []]
9
+ ]]
10
+ ]],
11
+ @parser.parse("var foo = function() { }"))
12
+ assert_ecma('var foo = function() { };',
13
+ @parser.parse("var foo = function() { }"))
14
+ end
15
+
16
+ def test_anon_function_one_args_to_sexp
17
+ assert_sexp(
18
+ [[:var,
19
+ [[:assign, [:name, 'foo'],
20
+ [:func_expr, nil, ["a"], []]
21
+ ]]
22
+ ]],
23
+ @parser.parse("var foo = function(a) { }"))
24
+ assert_ecma('var foo = function(a) { };',
25
+ @parser.parse("var foo = function(a) { }"))
26
+ end
27
+
28
+ def test_anon_function_two_args_to_sexp
29
+ assert_sexp(
30
+ [[:var,
31
+ [[:assign, [:name, 'foo'],
32
+ [:func_expr, nil, ["a",'b'], []]
33
+ ]]
34
+ ]],
35
+ @parser.parse("var foo = function(a,b) { }"))
36
+ assert_ecma('var foo = function(a, b) { };',
37
+ @parser.parse("var foo = function(a,b) { }"))
38
+ end
39
+
40
+ # 8 args is a threshold in spidermonkey
41
+ def test_anon_function_nine_args_to_sexp
42
+ assert_sexp(
43
+ [[:var,
44
+ [[:assign, [:name, 'foo'],
45
+ [:func_expr, nil, ('a'..'i').to_a, []]
46
+ ]]
47
+ ]],
48
+ @parser.parse("var foo = function(#{('a'..'i').to_a.join(',')}) { }"))
49
+ assert_ecma("var foo = function(#{('a'..'i').to_a.join(', ')}) { };",
50
+ @parser.parse("var foo = function(#{('a'..'i').to_a.join(',')}) { }"))
51
+ end
52
+
53
+ def test_named_function
54
+ assert_sexp(
55
+ [[:func_expr, 'a', ['b'], []]],
56
+ @parser.parse("function a(b) { }")
57
+ )
58
+ assert_ecma("function a(b) { }",
59
+ @parser.parse("function a(b) { }"))
60
+ end
61
+
62
+ def test_named_function_with_body
63
+ assert_sexp(
64
+ [[:func_expr, 'a', ['b'],
65
+ [[:op_equal, [:name, 'b'], [:lit, 10]]]]],
66
+ @parser.parse("function a(b) { b = 10; }")
67
+ )
68
+ assert_ecma("function a(b) {\n b = 10;\n}",
69
+ @parser.parse("function a(b) { b = 10 }"))
70
+ end
71
+ end
@@ -0,0 +1,41 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "/../../helper"))
2
+
3
+ class IfTest < Johnson::NodeTestCase
4
+ def test_if_no_else
5
+ assert_sexp([
6
+ [:if, [:and, [:name, "x"], [:name, "y"]],
7
+ [:var, [[:assign, [:name, "foo"], [:lit, 20]]]],
8
+ nil
9
+ ]], @parser.parse('if(x && y) var foo = 20;')
10
+ )
11
+ assert_ecma('if(x && y) var foo = 20;',
12
+ @parser.parse('if(x && y) var foo = 20;')
13
+ )
14
+ end
15
+
16
+ def test_if_else
17
+ assert_sexp([
18
+ [:if, [:and, [:lit, 5], [:lit, 10]],
19
+ [:var, [[:assign, [:name, "foo"], [:lit, 20]]]],
20
+ [:var, [[:assign, [:name, "bar"], [:lit, 5]]]]
21
+ ]],
22
+ @parser.parse('if(5 && 10) var foo = 20; else var bar = 5;')
23
+ )
24
+ assert_ecma('if(x && y) var foo = 20; else var bar = 5;',
25
+ @parser.parse('if(x && y) var foo = 20; else var bar = 5;')
26
+ )
27
+ end
28
+
29
+ def test_if_else_block
30
+ assert_sexp([
31
+ [:if, [:and, [:lit, 5], [:lit, 10]],
32
+ [[:var, [[:assign, [:name, "foo"], [:lit, 20]]]]],
33
+ [:var, [[:assign, [:name, "bar"], [:lit, 5]]]]
34
+ ]],
35
+ @parser.parse('if(5 && 10){ var foo = 20; } else var bar = 5;')
36
+ )
37
+ assert_ecma("if(5 && 10) {\n var foo = 20;\n} else var bar = 5;",
38
+ @parser.parse('if(5 && 10){ var foo = 20; } else var bar = 5;')
39
+ )
40
+ end
41
+ end
@@ -0,0 +1,13 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "/../../helper"))
2
+
3
+ class ImportTest < Johnson::NodeTestCase
4
+ def test_import
5
+ assert_sexp([[:import,
6
+ [
7
+ [:dot_accessor, [:name, "name1"], [:name, "o"]],
8
+ [:dot_accessor, [:name, "name2"], [:name, "o"]]
9
+ ]]], @parser.parse('import o.name1, o.name2;'))
10
+ assert_ecma('import o.name1, o.name2;',
11
+ @parser.parse('import o.name1, o.name2;'))
12
+ end
13
+ end
@@ -0,0 +1,19 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "/../../helper"))
2
+
3
+ class LabelTest < Johnson::NodeTestCase
4
+ def test_label_statement_to_sexp
5
+ assert_sexp([[:label,
6
+ [:name, "foo"], [:var, [[:assign, [:name, "x"], [:lit, 10]]]]
7
+ ]],
8
+ @parser.parse('foo: var x = 10;')
9
+ )
10
+ assert_sexp([[:label,
11
+ [:name, "foo"], [:var, [[:assign, [:name, "x"], [:lit, 10]]]]
12
+ ]],
13
+ @parser.parse('foo: var x = 10')
14
+ )
15
+ assert_ecma('foo: var x = 10;',
16
+ @parser.parse('foo: var x = 10;')
17
+ )
18
+ end
19
+ end
@@ -0,0 +1,110 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "/../../helper"))
2
+
3
+ class ObjectLiteralTest < Johnson::NodeTestCase
4
+ def test_object_literal
5
+ assert_sexp(
6
+ [[:var,
7
+ [[:assign,
8
+ [:name, "foo"],
9
+ [:object, [[:property, [:name, "bar"], [:lit, 10]]]]
10
+ ]]
11
+ ]],
12
+ @parser.parse('var foo = { bar: 10 }'))
13
+ assert_ecma('var foo = { bar: 10 };',
14
+ @parser.parse('var foo = { bar: 10 }')
15
+ )
16
+ assert_sexp(
17
+ [[:var,
18
+ [[:assign,
19
+ [:name, "foo"],
20
+ [:object, []]
21
+ ]]
22
+ ]],
23
+ @parser.parse('var foo = { }'))
24
+ assert_ecma('var foo = { };',
25
+ @parser.parse('var foo = { }')
26
+ )
27
+ assert_sexp(
28
+ [[:var,
29
+ [[:assign,
30
+ [:name, "foo"],
31
+ [:object, [[:property, [:str, "bar"], [:lit, 10]]]]
32
+ ]]
33
+ ]],
34
+ @parser.parse('var foo = { "bar": 10 }'))
35
+ assert_ecma('var foo = { "bar": 10 };',
36
+ @parser.parse('var foo = { "bar": 10 }')
37
+ )
38
+ assert_sexp(
39
+ [[:var,
40
+ [[:assign,
41
+ [:name, "foo"],
42
+ [:object, [[:property, [:lit, 5], [:lit, 10]]]]
43
+ ]]
44
+ ]],
45
+ @parser.parse('var foo = { 5: 10 }'))
46
+ assert_ecma('var foo = { 5: 10 };',
47
+ @parser.parse('var foo = { 5: 10 }')
48
+ )
49
+ end
50
+
51
+ def test_object_literal_getter
52
+ assert_sexp(
53
+ [[:var,
54
+ [[:assign,
55
+ [:name, "foo"],
56
+ [:object, [[:getter, [:name, 'a'], [:func_expr, nil, [], []]]]]
57
+ ]]
58
+ ]],
59
+ @parser.parse('var foo = { get a() { } }'))
60
+ assert_ecma("var foo = { get a() { } };",
61
+ @parser.parse('var foo = { get a() { } }')
62
+ )
63
+ end
64
+
65
+ def test_object_literal_setter
66
+ assert_sexp(
67
+ [[:var,
68
+ [[:assign,
69
+ [:name, "foo"],
70
+ [:object, [[:setter, [:name, 'a'], [:func_expr, nil, ["bar"], []]]]]
71
+ ]]
72
+ ]],
73
+ @parser.parse('var foo = { set a(bar) { } }'))
74
+ assert_ecma("var foo = { set a(bar) { } };",
75
+ @parser.parse('var foo = { set a(bar) { } }')
76
+ )
77
+ end
78
+
79
+ def test_to_sexp_multi_property
80
+ assert_sexp(
81
+ [[:var,
82
+ [[:assign,
83
+ [:name, "foo"],
84
+ [:object, [
85
+ [:property, [:lit, 5], [:lit, 10]],
86
+ [:property, [:name, "a"], [:lit, 10]]
87
+ ]]
88
+ ]]
89
+ ]],
90
+ @parser.parse('var foo = { 5: 10, a: 10 }'))
91
+ assert_ecma("var foo = { f: 10,\n a: 10 };",
92
+ @parser.parse('var foo = { f: 10, a: 10 }')
93
+ )
94
+ end
95
+
96
+ def test_ol_with_string_keys
97
+ assert_sexp([[:var,
98
+ [[:assign,
99
+ [:name, "foo"],
100
+ [:object,
101
+ [[:property, [:str, "\n"], [:lit, 10]],
102
+ [:property, [:str, "\t"], [:lit, 10]]]]]]]],
103
+ @parser.parse('var foo = { "\n": 10, "\t": 10 }')
104
+ )
105
+ assert_ecma("var foo = { \"\\n\": 10,\n \"\\t\": 10 };",
106
+ @parser.parse('var foo = { "\n": 10, "\t": 10 }'))
107
+
108
+ assert_ecma('"\"";', @parser.parse('"\""'))
109
+ end
110
+ end