tenderlove-rkelly 0.0.0.20080909095845

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 (196) hide show
  1. data/CHANGELOG.txt +7 -0
  2. data/Manifest.txt +197 -0
  3. data/README.txt +49 -0
  4. data/Rakefile +85 -0
  5. data/lib/parser.y +870 -0
  6. data/lib/rkelly.rb +8 -0
  7. data/lib/rkelly/constants.rb +3 -0
  8. data/lib/rkelly/js.rb +14 -0
  9. data/lib/rkelly/js/array.rb +15 -0
  10. data/lib/rkelly/js/base.rb +91 -0
  11. data/lib/rkelly/js/boolean.rb +21 -0
  12. data/lib/rkelly/js/function.rb +39 -0
  13. data/lib/rkelly/js/function_prototype.rb +15 -0
  14. data/lib/rkelly/js/global_object.rb +52 -0
  15. data/lib/rkelly/js/math.rb +10 -0
  16. data/lib/rkelly/js/nan.rb +18 -0
  17. data/lib/rkelly/js/number.rb +22 -0
  18. data/lib/rkelly/js/object.rb +30 -0
  19. data/lib/rkelly/js/object_prototype.rb +14 -0
  20. data/lib/rkelly/js/property.rb +20 -0
  21. data/lib/rkelly/js/scope.rb +6 -0
  22. data/lib/rkelly/js/string.rb +21 -0
  23. data/lib/rkelly/lexeme.rb +18 -0
  24. data/lib/rkelly/nodes.rb +5 -0
  25. data/lib/rkelly/nodes/binary_node.rb +18 -0
  26. data/lib/rkelly/nodes/bracket_accessor_node.rb +11 -0
  27. data/lib/rkelly/nodes/case_clause_node.rb +11 -0
  28. data/lib/rkelly/nodes/comma_node.rb +11 -0
  29. data/lib/rkelly/nodes/conditional_node.rb +11 -0
  30. data/lib/rkelly/nodes/dot_accessor_node.rb +11 -0
  31. data/lib/rkelly/nodes/for_in_node.rb +12 -0
  32. data/lib/rkelly/nodes/for_node.rb +13 -0
  33. data/lib/rkelly/nodes/function_call_node.rb +16 -0
  34. data/lib/rkelly/nodes/function_decl_node.rb +6 -0
  35. data/lib/rkelly/nodes/function_expr_node.rb +12 -0
  36. data/lib/rkelly/nodes/if_node.rb +12 -0
  37. data/lib/rkelly/nodes/label_node.rb +11 -0
  38. data/lib/rkelly/nodes/new_expr_node.rb +11 -0
  39. data/lib/rkelly/nodes/node.rb +80 -0
  40. data/lib/rkelly/nodes/not_strict_equal_node.rb +6 -0
  41. data/lib/rkelly/nodes/op_equal_node.rb +16 -0
  42. data/lib/rkelly/nodes/postfix_node.rb +11 -0
  43. data/lib/rkelly/nodes/prefix_node.rb +6 -0
  44. data/lib/rkelly/nodes/property_node.rb +13 -0
  45. data/lib/rkelly/nodes/resolve_node.rb +19 -0
  46. data/lib/rkelly/nodes/strict_equal_node.rb +6 -0
  47. data/lib/rkelly/nodes/try_node.rb +13 -0
  48. data/lib/rkelly/nodes/var_decl_node.rb +15 -0
  49. data/lib/rkelly/parser.rb +98 -0
  50. data/lib/rkelly/runtime.rb +36 -0
  51. data/lib/rkelly/runtime/ruby_function.rb +13 -0
  52. data/lib/rkelly/runtime/scope_chain.rb +57 -0
  53. data/lib/rkelly/token.rb +15 -0
  54. data/lib/rkelly/tokenizer.rb +122 -0
  55. data/lib/rkelly/visitable.rb +16 -0
  56. data/lib/rkelly/visitors.rb +4 -0
  57. data/lib/rkelly/visitors/dot_visitor.rb +228 -0
  58. data/lib/rkelly/visitors/ecma_visitor.rb +314 -0
  59. data/lib/rkelly/visitors/enumerable_visitor.rb +18 -0
  60. data/lib/rkelly/visitors/evaluation_visitor.rb +419 -0
  61. data/lib/rkelly/visitors/function_visitor.rb +46 -0
  62. data/lib/rkelly/visitors/pointcut_visitor.rb +18 -0
  63. data/lib/rkelly/visitors/sexp_visitor.rb +374 -0
  64. data/lib/rkelly/visitors/visitor.rb +136 -0
  65. data/test/ecma_script_test_case.rb +21 -0
  66. data/test/execute_test_case.rb +16 -0
  67. data/test/execution_contexts/test_10_1_3-1.rb +32 -0
  68. data/test/expressions/test_11_3_1.rb +64 -0
  69. data/test/expressions/test_11_3_2.rb +64 -0
  70. data/test/expressions/test_11_4_2.rb +13 -0
  71. data/test/expressions/test_11_4_3.rb +52 -0
  72. data/test/expressions/test_11_4_4.rb +68 -0
  73. data/test/expressions/test_11_4_5.rb +69 -0
  74. data/test/expressions/test_11_4_6.rb +88 -0
  75. data/test/expressions/test_11_4_8.rb +28 -0
  76. data/test/expressions/test_11_4_9.rb +103 -0
  77. data/test/expressions/test_11_5_1.rb +51 -0
  78. data/test/expressions/test_11_5_2.rb +80 -0
  79. data/test/expressions/test_11_5_3.rb +88 -0
  80. data/test/expressions/test_11_6_1-1.rb +19 -0
  81. data/test/expressions/test_11_9_1.rb +19 -0
  82. data/test/function/test_15_3_1_1-1.rb +34 -0
  83. data/test/global_object/test_15_1_1_1.rb +29 -0
  84. data/test/global_object/test_15_1_1_2.rb +17 -0
  85. data/test/global_object/test_15_1_1_3.rb +9 -0
  86. data/test/helper.rb +5 -0
  87. data/test/node_test_case.rb +11 -0
  88. data/test/object/test_15_2_1_1.rb +257 -0
  89. data/test/object/test_15_2_1_2.rb +21 -0
  90. data/test/object/test_15_2_2_1.rb +52 -0
  91. data/test/statements/test_12_5-1.rb +27 -0
  92. data/test/test_add_node.rb +8 -0
  93. data/test/test_arguments_node.rb +8 -0
  94. data/test/test_array_node.rb +9 -0
  95. data/test/test_assign_expr_node.rb +8 -0
  96. data/test/test_automatic_semicolon_insertion.rb +137 -0
  97. data/test/test_bit_and_node.rb +8 -0
  98. data/test/test_bit_or_node.rb +8 -0
  99. data/test/test_bit_x_or_node.rb +8 -0
  100. data/test/test_bitwise_not_node.rb +8 -0
  101. data/test/test_block_node.rb +14 -0
  102. data/test/test_bracket_accessor_node.rb +16 -0
  103. data/test/test_break_node.rb +11 -0
  104. data/test/test_case_block_node.rb +11 -0
  105. data/test/test_case_clause_node.rb +15 -0
  106. data/test/test_comma_node.rb +13 -0
  107. data/test/test_comments.rb +44 -0
  108. data/test/test_conditional_node.rb +17 -0
  109. data/test/test_const_statement_node.rb +14 -0
  110. data/test/test_continue_node.rb +11 -0
  111. data/test/test_delete_node.rb +8 -0
  112. data/test/test_divide_node.rb +8 -0
  113. data/test/test_do_while_node.rb +13 -0
  114. data/test/test_dot_accessor_node.rb +9 -0
  115. data/test/test_ecma_visitor.rb +192 -0
  116. data/test/test_element_node.rb +8 -0
  117. data/test/test_empty_statement_node.rb +8 -0
  118. data/test/test_equal_node.rb +8 -0
  119. data/test/test_evaluation_visitor.rb +66 -0
  120. data/test/test_expression_statement_node.rb +10 -0
  121. data/test/test_false_node.rb +8 -0
  122. data/test/test_for_in_node.rb +17 -0
  123. data/test/test_for_node.rb +24 -0
  124. data/test/test_function_body_node.rb +8 -0
  125. data/test/test_function_call_node.rb +10 -0
  126. data/test/test_function_decl_node.rb +16 -0
  127. data/test/test_function_expr_node.rb +16 -0
  128. data/test/test_function_visitor.rb +26 -0
  129. data/test/test_getter_property_node.rb +10 -0
  130. data/test/test_global_object.rb +49 -0
  131. data/test/test_greater_node.rb +8 -0
  132. data/test/test_greater_or_equal_node.rb +8 -0
  133. data/test/test_if_node.rb +17 -0
  134. data/test/test_in_node.rb +8 -0
  135. data/test/test_instance_of_node.rb +8 -0
  136. data/test/test_label_node.rb +13 -0
  137. data/test/test_left_shift_node.rb +8 -0
  138. data/test/test_less_node.rb +8 -0
  139. data/test/test_less_or_equal_node.rb +8 -0
  140. data/test/test_line_number.rb +23 -0
  141. data/test/test_logical_and_node.rb +8 -0
  142. data/test/test_logical_not_node.rb +8 -0
  143. data/test/test_logical_or_node.rb +8 -0
  144. data/test/test_modulus_node.rb +8 -0
  145. data/test/test_multiply_node.rb +8 -0
  146. data/test/test_new_expr_node.rb +9 -0
  147. data/test/test_not_equal_node.rb +8 -0
  148. data/test/test_not_strict_equal_node.rb +8 -0
  149. data/test/test_null_node.rb +8 -0
  150. data/test/test_number_node.rb +8 -0
  151. data/test/test_object_literal_node.rb +9 -0
  152. data/test/test_op_and_equal_node.rb +10 -0
  153. data/test/test_op_divide_equal_node.rb +10 -0
  154. data/test/test_op_equal_node.rb +10 -0
  155. data/test/test_op_l_shift_equal_node.rb +10 -0
  156. data/test/test_op_minus_equal_node.rb +10 -0
  157. data/test/test_op_mod_equal_node.rb +10 -0
  158. data/test/test_op_multiply_equal_node.rb +10 -0
  159. data/test/test_op_or_equal_node.rb +10 -0
  160. data/test/test_op_plus_equal_node.rb +10 -0
  161. data/test/test_op_r_shift_equal_node.rb +10 -0
  162. data/test/test_op_u_r_shift_equal_node.rb +10 -0
  163. data/test/test_op_x_or_equal_node.rb +10 -0
  164. data/test/test_parameter_node.rb +8 -0
  165. data/test/test_parser.rb +1355 -0
  166. data/test/test_pointcut_visitor.rb +34 -0
  167. data/test/test_postfix_node.rb +8 -0
  168. data/test/test_prefix_node.rb +8 -0
  169. data/test/test_property_node.rb +8 -0
  170. data/test/test_regexp_node.rb +8 -0
  171. data/test/test_resolve_node.rb +22 -0
  172. data/test/test_return_node.rb +11 -0
  173. data/test/test_right_shift_node.rb +8 -0
  174. data/test/test_runtime.rb +12 -0
  175. data/test/test_scope_chain.rb +50 -0
  176. data/test/test_setter_property_node.rb +10 -0
  177. data/test/test_source_elements.rb +9 -0
  178. data/test/test_strict_equal_node.rb +8 -0
  179. data/test/test_string_node.rb +8 -0
  180. data/test/test_subtract_node.rb +8 -0
  181. data/test/test_switch_node.rb +12 -0
  182. data/test/test_this_node.rb +8 -0
  183. data/test/test_throw_node.rb +7 -0
  184. data/test/test_tokenizer.rb +143 -0
  185. data/test/test_true_node.rb +8 -0
  186. data/test/test_try_node.rb +59 -0
  187. data/test/test_type_of_node.rb +8 -0
  188. data/test/test_unary_minus_node.rb +8 -0
  189. data/test/test_unary_plus_node.rb +8 -0
  190. data/test/test_unsigned_right_shift_node.rb +8 -0
  191. data/test/test_var_decl_node.rb +21 -0
  192. data/test/test_var_statement_node.rb +14 -0
  193. data/test/test_void_node.rb +8 -0
  194. data/test/test_while_node.rb +15 -0
  195. data/test/test_with_node.rb +8 -0
  196. metadata +385 -0
@@ -0,0 +1,21 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class ECMAScriptTestCase < Test::Unit::TestCase
4
+ include RKelly::JS
5
+
6
+ undef :default_test
7
+
8
+ def setup
9
+ @runtime = RKelly::Runtime.new
10
+ @runtime.define_function(:assert_equal) do |*args|
11
+ assert_equal(*args)
12
+ end
13
+ @runtime.define_function(:assert_in_delta) do |*args|
14
+ assert_in_delta(*args)
15
+ end
16
+ end
17
+
18
+ def js_assert_equal(expected, actual)
19
+ @runtime.execute("assert_equal(#{expected}, #{actual});")
20
+ end
21
+ end
@@ -0,0 +1,16 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class ExecuteTestCase < Test::Unit::TestCase
4
+ include RKelly::Nodes
5
+
6
+ undef :default_test
7
+
8
+ def assert_execute(expected, code)
9
+ scope_chain = @runtime.execute(code)
10
+ expected.each do |name, value|
11
+ assert scope_chain.has_property?(name)
12
+ assert_equal value, scope_chain[name].value
13
+ end
14
+ end
15
+ end
16
+
@@ -0,0 +1,32 @@
1
+ require File.dirname(__FILE__) + "/../helper"
2
+
3
+ class ExecutionContext_10_1_3_1_Test < Test::Unit::TestCase
4
+ def setup
5
+ @runtime = RKelly::Runtime.new
6
+ @runtime.define_function(:assert_equal) do |*args|
7
+ assert_equal(*args)
8
+ end
9
+ end
10
+
11
+ def test_myfun3_void_0
12
+ scope_chain = @runtime.execute("
13
+ function myfun3(a, b, a) {
14
+ return a;
15
+ }
16
+ var x = myfun3(2,4);
17
+ ")
18
+ assert scope_chain.has_property?('x')
19
+ #assert_equal :undefined, scope_chain['x'].value
20
+ end
21
+
22
+ def test_myfun3
23
+ scope_chain = @runtime.execute("
24
+ function myfun3(a, b, a) {
25
+ return a;
26
+ }
27
+ var x = myfun3(2,4,8);
28
+ ")
29
+ assert scope_chain.has_property?('x')
30
+ assert_equal 8, scope_chain['x'].value
31
+ end
32
+ end
@@ -0,0 +1,64 @@
1
+ require File.dirname(__FILE__) + "/../helper"
2
+
3
+ class Expressions_11_3_1_Test < ECMAScriptTestCase
4
+ def test_uninitialized
5
+ @runtime.execute("var MYVAR; assert_equal(NaN, MYVAR++); assert_equal(NaN, MYVAR);")
6
+ end
7
+
8
+ @@tests = [
9
+ :undefined => [ '(void 0)', 'NaN', 'NaN'],
10
+ :null => [ 'null', '0', '1'],
11
+ :true => [ 'true', '1', '2'],
12
+ :false => [ 'false', '0', '1'],
13
+ :positive_infinity => [ 'Number.POSITIVE_INFINITY',
14
+ 'Number.POSITIVE_INFINITY',
15
+ 'Number.POSITIVE_INFINITY'],
16
+ :negative_infinity => [ 'Number.NEGATIVE_INFINITY',
17
+ 'Number.NEGATIVE_INFINITY',
18
+ 'Number.NEGATIVE_INFINITY'],
19
+ :nan => [ 'Number.NaN', 'Number.NaN', 'Number.NaN'],
20
+ :zero => [ '0', '0', '1'],
21
+ :boolean_false => ['new Boolean(false)', '0', '1'],
22
+ :boolean_true => ['new Boolean(true)', '1', '2'],
23
+ :string_string => ["'string'", 'Number.NaN', 'Number.NaN'],
24
+ :number_s => ["'12345'", '12345', '12346'],
25
+ :negative_s => ["'-12345'", '-12345', '-12344'],
26
+ :hex_s => ["'0Xf'", '15', '16'],
27
+ :num_0_s => ["'077'", '77', '78'],
28
+ :empty_s => ["''", '0', '1'],
29
+ :obj_string_string => ['new String("string")', 'Number.NaN', 'Number.NaN'],
30
+ :obj_string_num => ['new String("12345")', '12345', '12346'],
31
+ :obj_negative => ['new String("-12345")', '-12345', '-12344'],
32
+ :obj_hex => ['new String("0Xf")', '15', '16'],
33
+ :obj_0_s => ['new String("077")', '77', '78'],
34
+ :obj_empty => ['new String("")', '0', '1'],
35
+ ]
36
+
37
+ def test_positive_float
38
+ @runtime.execute("
39
+ var MYVAR=0.2345;
40
+ assert_equal(0.2345, MYVAR++);
41
+ assert_in_delta(1.2345, MYVAR, 0.00001);
42
+ ")
43
+ end
44
+
45
+ def test_negative_float
46
+ @runtime.execute("
47
+ var MYVAR=-0.2345;
48
+ assert_equal(-0.2345, MYVAR++);
49
+ assert_in_delta(0.7655, MYVAR, 0.00001);
50
+ ")
51
+ end
52
+
53
+ @@tests.each do |testing|
54
+ testing.each do |name, values|
55
+ define_method(:"test_#{name}") do
56
+ @runtime.execute("
57
+ var MYVAR=#{values[0]};
58
+ assert_equal(#{values[1]}, MYVAR++);
59
+ assert_equal(#{values[2]}, MYVAR);
60
+ ")
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,64 @@
1
+ require File.dirname(__FILE__) + "/../helper"
2
+
3
+ class Expressions_11_3_2_Test < ECMAScriptTestCase
4
+ def test_uninitialized
5
+ @runtime.execute("var MYVAR; assert_equal(NaN, MYVAR--); assert_equal(NaN, MYVAR);")
6
+ end
7
+
8
+ @@tests = [
9
+ :undefined => [ '(void 0)', 'NaN', 'NaN'],
10
+ :null => [ 'null', '0', '-1'],
11
+ :true => [ 'true', '1', '0'],
12
+ :false => [ 'false', '0', '-1'],
13
+ :positive_infinity => [ 'Number.POSITIVE_INFINITY',
14
+ 'Number.POSITIVE_INFINITY',
15
+ 'Number.POSITIVE_INFINITY'],
16
+ :negative_infinity => [ 'Number.NEGATIVE_INFINITY',
17
+ 'Number.NEGATIVE_INFINITY',
18
+ 'Number.NEGATIVE_INFINITY'],
19
+ :nan => [ 'Number.NaN', 'Number.NaN', 'Number.NaN'],
20
+ :zero => [ '0', '0', '-1'],
21
+ :boolean_false => ['new Boolean(false)', '0', '-1'],
22
+ :boolean_true => ['new Boolean(true)', '1', '0'],
23
+ :string_string => ["'string'", 'Number.NaN', 'Number.NaN'],
24
+ :number_s => ["'12345'", '12345', '12344'],
25
+ :negative_s => ["'-12345'", '-12345', '-12346'],
26
+ :hex_s => ["'0Xf'", '15', '14'],
27
+ :num_0_s => ["'077'", '77', '76'],
28
+ :empty_s => ["''", '0', '-1'],
29
+ :obj_string_string => ['new String("string")', 'Number.NaN', 'Number.NaN'],
30
+ :obj_string_num => ['new String("12345")', '12345', '12344'],
31
+ :obj_negative => ['new String("-12345")', '-12345', '-12346'],
32
+ :obj_hex => ['new String("0Xf")', '15', '14'],
33
+ :obj_0_s => ['new String("077")', '77', '76'],
34
+ :obj_empty => ['new String("")', '0', '-1'],
35
+ ]
36
+
37
+ def test_positive_float
38
+ @runtime.execute("
39
+ var MYVAR=0.2345;
40
+ assert_equal(0.2345, MYVAR--);
41
+ assert_in_delta(-0.7655, MYVAR, 0.00001);
42
+ ")
43
+ end
44
+
45
+ def test_negative_float
46
+ @runtime.execute("
47
+ var MYVAR=-0.2345;
48
+ assert_equal(-0.2345, MYVAR--);
49
+ assert_in_delta(-1.2345, MYVAR, 0.00001);
50
+ ")
51
+ end
52
+
53
+ @@tests.each do |testing|
54
+ testing.each do |name, values|
55
+ define_method(:"test_#{name}") do
56
+ @runtime.execute("
57
+ var MYVAR=#{values[0]};
58
+ assert_equal(#{values[1]}, MYVAR--);
59
+ assert_equal(#{values[2]}, MYVAR);
60
+ ")
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,13 @@
1
+ require File.dirname(__FILE__) + "/../helper"
2
+
3
+ class Expressions_11_4_2_Test < Test::Unit::TestCase
4
+ def setup
5
+ @runtime = RKelly::Runtime.new
6
+ end
7
+
8
+ def test_void_1
9
+ scope_chain = @runtime.execute("var x = void(10);")
10
+ assert scope_chain.has_property?('x')
11
+ assert_equal :undefined, scope_chain['x'].value
12
+ end
13
+ end
@@ -0,0 +1,52 @@
1
+ require File.dirname(__FILE__) + "/../helper"
2
+
3
+ class Typeof_11_4_3_Test < ExecuteTestCase
4
+ def setup
5
+ @runtime = RKelly::Runtime.new
6
+ end
7
+
8
+ def test_typeof_null
9
+ assert_execute({ 'x' => 'object' },
10
+ "var x = typeof(null);")
11
+ end
12
+
13
+ def test_typeof_void_0
14
+ assert_execute({ 'x' => 'undefined' },
15
+ "var x = typeof(void(0));")
16
+ end
17
+
18
+ def test_typeof_true
19
+ assert_execute({ 'x' => 'boolean' },
20
+ "var x = typeof(true);")
21
+ end
22
+
23
+ def test_typeof_false
24
+ assert_execute({ 'x' => 'boolean' },
25
+ "var x = typeof(false);")
26
+ end
27
+
28
+ def test_typeof_nan
29
+ assert_execute({ 'x' => 'number' },
30
+ "var x = typeof(NaN);")
31
+ end
32
+
33
+ def test_typeof_zero
34
+ assert_execute({ 'x' => 'number' }, "var x = typeof(0);")
35
+ end
36
+
37
+ def test_typeof_one
38
+ assert_execute({ 'x' => 'number' }, "var x = typeof(1);")
39
+ end
40
+
41
+ def test_typeof_minus_one
42
+ assert_execute({ 'x' => 'number' }, "var x = typeof(-1);")
43
+ end
44
+
45
+ def test_typeof_plus_one
46
+ assert_execute({ 'x' => 'number' }, "var x = typeof(+1);")
47
+ end
48
+
49
+ def test_typeof_zero_string
50
+ assert_execute({ 'x' => 'string' }, "var x = typeof('0');")
51
+ end
52
+ end
@@ -0,0 +1,68 @@
1
+ require File.dirname(__FILE__) + "/../helper"
2
+
3
+ class Expressions_11_4_4_Test < ECMAScriptTestCase
4
+ def test_uninitialized
5
+ @runtime.execute("
6
+ var MYVAR;
7
+ assert_equal(NaN, ++MYVAR);
8
+ assert_equal(NaN, MYVAR);
9
+ ")
10
+ end
11
+
12
+ @@tests = [
13
+ :undefined => ['(void 0)', 'NaN'],
14
+ :null => ['null', '1'],
15
+ :true => ['true', '2'],
16
+ :false => ['false', '1'],
17
+ :positive_infinity => ['Number.POSITIVE_INFINITY',
18
+ 'Number.POSITIVE_INFINITY'],
19
+ :negative_infinity => ['Number.NEGATIVE_INFINITY',
20
+ 'Number.NEGATIVE_INFINITY'],
21
+ :nan => ['Number.NaN', 'Number.NaN'],
22
+ :zero => ['0', '1'],
23
+ #:pos_float => ['0.2345', '1.2345'],
24
+ #:neg_float => ['-0.2345', '0.7655'],
25
+ :boolean_false => ['new Boolean(false)', '1'],
26
+ :boolean_true => ['new Boolean(true)', '2'],
27
+ :string_string => ["'string'", 'Number.NaN'],
28
+ :number_s => ["'12345'", '12346'],
29
+ :negative_s => ["'-12345'", '-12344'],
30
+ :hex_s => ["'0Xf'", '16'],
31
+ :num_0_s => ["'077'", '78'],
32
+ :empty_s => ["''", '1'],
33
+ :obj_string_string => ['new String("string")', 'Number.NaN'],
34
+ :obj_string_num => ['new String("12345")', '12346'],
35
+ :obj_negative => ['new String("-12345")', '-12344'],
36
+ :obj_hex => ['new String("0Xf")', '16'],
37
+ :obj_0_s => ['new String("077")', '78'],
38
+ :obj_empty => ['new String("")', '1'],
39
+ ]
40
+
41
+ def test_positive_float
42
+ @runtime.execute("
43
+ var MYVAR=0.2345;
44
+ assert_in_delta(1.2345, ++MYVAR, 0.00001);
45
+ assert_in_delta(1.2345, MYVAR, 0.00001);
46
+ ")
47
+ end
48
+
49
+ def test_negative_float
50
+ @runtime.execute("
51
+ var MYVAR=-0.2345;
52
+ assert_in_delta(0.7655, ++MYVAR, 0.00001);
53
+ assert_in_delta(0.7655, MYVAR, 0.00001);
54
+ ")
55
+ end
56
+
57
+ @@tests.each do |testing|
58
+ testing.each do |name, values|
59
+ define_method(:"test_#{name}") do
60
+ @runtime.execute("
61
+ var MYVAR=#{values[0]};
62
+ assert_equal(#{values[1]}, ++MYVAR);
63
+ assert_equal(#{values[1]}, MYVAR);
64
+ ")
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,69 @@
1
+ require File.dirname(__FILE__) + "/../helper"
2
+
3
+ class Expressions_11_4_5_Test < ECMAScriptTestCase
4
+ def test_uninitialized
5
+ @runtime.execute("
6
+ var MYVAR;
7
+ assert_equal(NaN, --MYVAR);
8
+ assert_equal(NaN, MYVAR);
9
+ ")
10
+ end
11
+
12
+ @@tests = [
13
+ :undefined => ['(void 0)', 'NaN'],
14
+ :null => ['null', '-1'],
15
+ :true => ['true', '0'],
16
+ :false => ['false', '-1'],
17
+ :positive_infinity => ['Number.POSITIVE_INFINITY',
18
+ 'Number.POSITIVE_INFINITY'],
19
+ :negative_infinity => ['Number.NEGATIVE_INFINITY',
20
+ 'Number.NEGATIVE_INFINITY'],
21
+ :nan => ['Number.NaN', 'Number.NaN'],
22
+ :zero => ['0', '-1'],
23
+ #:pos_float => ['0.2345', '1.2345'],
24
+ #:neg_float => ['-0.2345', '0.7655'],
25
+ :boolean_false => ['new Boolean(false)', '-1'],
26
+ :boolean_true => ['new Boolean(true)', '0'],
27
+ :string_string => ["'string'", 'Number.NaN'],
28
+ :number_s => ["'12345'", '12344'],
29
+ :negative_s => ["'-12345'", '-12346'],
30
+ :hex_s => ["'0Xf'", '14'],
31
+ :num_0_s => ["'077'", '76'],
32
+ :empty_s => ["''", '-1'],
33
+ :obj_string_string => ['new String("string")', 'Number.NaN'],
34
+ :obj_string_num => ['new String("12345")', '12344'],
35
+ :obj_negative => ['new String("-12345")', '-12346'],
36
+ :obj_hex => ['new String("0Xf")', '14'],
37
+ :obj_0_s => ['new String("077")', '76'],
38
+ :obj_empty => ['new String("")', '-1'],
39
+ ]
40
+
41
+ def test_positive_float
42
+ @runtime.execute("
43
+ var MYVAR=0.2345;
44
+ assert_in_delta(-0.7655, --MYVAR, 0.00001);
45
+ assert_in_delta(-0.7655, MYVAR, 0.00001);
46
+ ")
47
+ end
48
+
49
+ def test_negative_float
50
+ @runtime.execute("
51
+ var MYVAR=-0.2345;
52
+ assert_in_delta(-1.2345, --MYVAR, 0.00001);
53
+ assert_in_delta(-1.2345, MYVAR, 0.00001);
54
+ ")
55
+ end
56
+
57
+ @@tests.each do |testing|
58
+ testing.each do |name, values|
59
+ define_method(:"test_#{name}") do
60
+ @runtime.execute("
61
+ var MYVAR=#{values[0]};
62
+ assert_equal(#{values[1]}, --MYVAR);
63
+ assert_equal(#{values[1]}, MYVAR);
64
+ ")
65
+ end
66
+ end
67
+ end
68
+ end
69
+
@@ -0,0 +1,88 @@
1
+ require File.dirname(__FILE__) + "/../helper"
2
+
3
+ class Expressions_11_4_6_Test < ECMAScriptTestCase
4
+ @@tests = {
5
+ :empty_string => ["''", 0],
6
+ :space_string => ["' '", 0],
7
+ :tab_string => ["'\t'", 0],
8
+ :newline_string => ["'\n'", 0],
9
+ :cr_string => ["'\r'", 0],
10
+ :f_string => ["'\f'", 0],
11
+ :char_code_09 => ['String.fromCharCode(0x0009)', 0],
12
+ :char_code_20 => ['String.fromCharCode(0x0020)', 0],
13
+ :char_code_0C => ['String.fromCharCode(0x000C)', 0],
14
+ :char_code_0B => ['String.fromCharCode(0x000B)', 0],
15
+ :char_code_0A => ['String.fromCharCode(0x000A)', 0],
16
+ :lh_space_add => ["' ' + 999", 999],
17
+ :lh_newline_add => ["'\n' + 999", 999],
18
+ :lh_cr_add => ["'\r' + 999", 999],
19
+ :lh_tab_add => ["'\t' + 999", 999],
20
+ :lh_tab_f => ["'\f' + 999", 999],
21
+ :rh_space_add => ["999 + ' '", 999],
22
+ :rh_newline_add => ["999 + '\n'", 999],
23
+ :rh_cr_add => ["999 + '\r'", 999],
24
+ :rh_tab_add => ["999 + '\t'", 999],
25
+ :rh_tab_f => ["999 + '\f'", 999],
26
+ :bs_space_add => ["' ' + 999 + ' '", 999],
27
+ :bs_newline_add => ["'\n' + 999 + '\n'", 999],
28
+ :bs_cr_add => ["'\r' + 999 + '\r'", 999],
29
+ :bs_tab_add => ["'\t' + 999 + '\t'", 999],
30
+ :bs_tab_f => ["'\f' + 999 + '\f'", 999],
31
+ :cl_09 => ["String.fromCharCode(0x0009) + 99", 99],
32
+ :cl_20 => ["String.fromCharCode(0x0020) + 99", 99],
33
+ :cl_0C => ["String.fromCharCode(0x000C) + 99", 99],
34
+ :cl_0B => ["String.fromCharCode(0x000B) + 99", 99],
35
+ :cl_0A => ["String.fromCharCode(0x000A) + 99", 99],
36
+ :cr_09 => ["99 + String.fromCharCode(0x0009)", 99],
37
+ :cr_20 => ["99 + String.fromCharCode(0x0020)", 99],
38
+ :cr_0C => ["99 + String.fromCharCode(0x000C)", 99],
39
+ :cr_0B => ["99 + String.fromCharCode(0x000B)", 99],
40
+ :cr_0A => ["99 + String.fromCharCode(0x000A)", 99],
41
+ :bs_09 => ["String.fromCharCode(0x0009) + 99 + String.fromCharCode(0x0009)", 99],
42
+ :bs_20 => ["String.fromCharCode(0x0020) + 99 + String.fromCharCode(0x0020)", 99],
43
+ :bs_0C => ["String.fromCharCode(0x000C) + 99 + String.fromCharCode(0x000C)", 99],
44
+ :bs_0B => ["String.fromCharCode(0x000B) + 99 + String.fromCharCode(0x000B)", 99],
45
+ :bs_0A => ["String.fromCharCode(0x000A) + 99 + String.fromCharCode(0x000A)", 99],
46
+ :infinity => ["'Infinity'", 'Number.POSITIVE_INFINITY'],
47
+ :neg_infinity => ["'-Infinity'", 'Number.NEGATIVE_INFINITY'],
48
+ :pos_infinity => ["'+Infinity'", 'Number.POSITIVE_INFINITY'],
49
+ }
50
+ @@sign_tests = [
51
+ [3.14159, 3.14159],
52
+ ['3.', 3],
53
+ ['3.e1', 30],
54
+ ['3.e+1', 30],
55
+ ['3.e-1', 0.30],
56
+ ['.00001', 0.00001],
57
+ ['.01e2', 1],
58
+ ['.01e+2', 1],
59
+ ['.01e-2', 0.0001],
60
+ ['1234e5', 123400000],
61
+ ['1234e+5', 123400000],
62
+ ['1234e-5', 0.01234],
63
+ ]
64
+ 0.upto(9) { |x| @@sign_tests << [x, x] }
65
+ 0.upto(15) { |x|
66
+ @@sign_tests << [sprintf("%#x", x), x]
67
+ @@sign_tests << [sprintf("%#x", x).gsub(/x/, 'X'), x]
68
+ if sprintf("%#x", x) =~ /[a-f]/
69
+ @@sign_tests << [sprintf("%#x", x).gsub(/([a-f])/) { |m| m.upcase }, x]
70
+ @@sign_tests << [sprintf("%#x", x).upcase, x]
71
+ end
72
+ }
73
+ @@sign_tests.each { |actual, expected|
74
+ define_method(:"test_num_#{actual.to_s.gsub(/[\.+]/, '_')}") do
75
+ @runtime.execute("
76
+ assert_equal(#{expected}, +('#{actual}'));
77
+ assert_equal(#{expected}, +('+#{actual}'));
78
+ assert_equal(-#{expected}, +('-#{actual}'));
79
+ ")
80
+ end
81
+ }
82
+
83
+ @@tests.each do |name,(actual, expected)|
84
+ define_method(:"test_#{name}") do
85
+ @runtime.execute("assert_equal(#{expected}, +(#{actual}));")
86
+ end
87
+ end
88
+ end