opal 0.3.41 → 0.3.42

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 (285) hide show
  1. data/.gitignore +2 -0
  2. data/.travis.yml +3 -0
  3. data/CHANGELOG.md +14 -1
  4. data/Gemfile +2 -5
  5. data/Rakefile +41 -3
  6. data/bin/opal +33 -0
  7. data/lib/opal.rb +2 -12
  8. data/lib/opal/core_ext.rb +5 -0
  9. data/lib/opal/grammar.rb +2207 -2138
  10. data/lib/opal/grammar.y +21 -0
  11. data/lib/opal/grammar_helpers.rb +360 -0
  12. data/lib/opal/lexer.rb +55 -401
  13. data/lib/opal/lexer_scope.rb +28 -0
  14. data/lib/opal/parser.rb +155 -171
  15. data/lib/opal/target_scope.rb +257 -0
  16. data/lib/opal/version.rb +1 -1
  17. data/opal.gemspec +6 -2
  18. data/opal/opal-parser.js.erb +3 -2
  19. data/opal/opal.rb +20 -18
  20. data/opal/opal/array.rb +21 -12
  21. data/opal/opal/basic_object.rb +2 -1
  22. data/opal/opal/boolean.rb +3 -0
  23. data/opal/opal/browser_loader.js +57 -0
  24. data/opal/opal/class.rb +51 -13
  25. data/opal/opal/date.rb +1 -20
  26. data/opal/opal/enumerable.rb +66 -33
  27. data/opal/opal/error.rb +2 -0
  28. data/opal/opal/hash.rb +1 -1
  29. data/opal/opal/kernel.rb +14 -3
  30. data/opal/opal/nil_class.rb +4 -0
  31. data/opal/opal/proc.rb +9 -1
  32. data/opal/opal/racc.rb +2 -2
  33. data/opal/opal/regexp.rb +1 -1
  34. data/opal/opal/runtime.js +14 -4
  35. data/opal/opal/string.rb +21 -4
  36. data/opal/opal/time.rb +27 -0
  37. data/spec/core/array/allocate_spec.rb +7 -1
  38. data/spec/core/array/append_spec.rb +18 -3
  39. data/spec/core/array/array_spec.rb +7 -0
  40. data/spec/core/array/assoc_spec.rb +23 -8
  41. data/spec/core/array/at_spec.rb +23 -3
  42. data/spec/core/array/choice_spec.rb +20 -0
  43. data/spec/core/array/clear_spec.rb +45 -4
  44. data/spec/core/array/combination_spec.rb +55 -0
  45. data/spec/core/array/compact_spec.rb +72 -1
  46. data/spec/core/array/constructor_spec.rb +13 -2
  47. data/spec/core/array/count_spec.rb +15 -7
  48. data/spec/core/array/delete_at_spec.rb +44 -1
  49. data/spec/core/array/delete_if_spec.rb +52 -2
  50. data/spec/core/array/delete_spec.rb +83 -2
  51. data/spec/core/array/drop_spec.rb +24 -16
  52. data/spec/core/array/drop_while_spec.rb +17 -0
  53. data/spec/core/array/each_index_spec.rb +11 -1
  54. data/spec/core/array/each_spec.rb +20 -2
  55. data/spec/core/array/empty_spec.rb +4 -1
  56. data/spec/core/array/eql_spec.rb +14 -0
  57. data/spec/core/array/fetch_spec.rb +31 -2
  58. data/spec/core/array/find_index_spec.rb +8 -0
  59. data/spec/core/array/first_spec.rb +45 -8
  60. data/spec/core/array/fixtures/classes.rb +538 -0
  61. data/spec/core/array/flatten_spec.rb +200 -7
  62. data/spec/core/array/frozen_spec.rb +32 -0
  63. data/spec/core/array/include_spec.rb +16 -1
  64. data/spec/core/array/index_spec.rb +5 -25
  65. data/spec/core/array/insert_spec.rb +37 -3
  66. data/spec/core/array/inspect_spec.rb +6 -12
  67. data/spec/core/array/intersection_spec.rb +55 -4
  68. data/spec/core/array/join_spec.rb +29 -4
  69. data/spec/core/array/keep_if_spec.rb +13 -6
  70. data/spec/core/array/last_spec.rb +35 -1
  71. data/spec/core/array/length_spec.rb +7 -4
  72. data/spec/core/array/map_spec.rb +9 -47
  73. data/spec/core/array/minus_spec.rb +68 -4
  74. data/spec/core/array/multiply_spec.rb +138 -6
  75. data/spec/core/array/new_spec.rb +92 -3
  76. data/spec/core/array/ntimes_spec.rb +26 -0
  77. data/spec/core/array/plus_spec.rb +48 -2
  78. data/spec/core/array/pop_spec.rb +159 -39
  79. data/spec/core/array/push_spec.rb +29 -1
  80. data/spec/core/array/rassoc_spec.rb +31 -2
  81. data/spec/core/array/reject_spec.rb +89 -2
  82. data/spec/core/array/replace_spec.rb +7 -29
  83. data/spec/core/array/reverse_each_spec.rb +25 -1
  84. data/spec/core/array/reverse_spec.rb +53 -1
  85. data/spec/core/array/rindex_spec.rb +55 -5
  86. data/spec/core/array/select_spec.rb +35 -8
  87. data/spec/core/array/shared/collect.rb +0 -0
  88. data/spec/core/array/shared/enumeratorize.rb +12 -0
  89. data/spec/core/array/shared/eql.rb +95 -0
  90. data/spec/core/array/shared/index.rb +37 -0
  91. data/spec/core/array/shared/inspect.rb +3 -0
  92. data/spec/core/array/shared/join.rb +7 -0
  93. data/spec/core/array/shared/keep_if.rb +0 -0
  94. data/spec/core/array/shared/length.rb +0 -0
  95. data/spec/core/array/shared/replace.rb +0 -0
  96. data/spec/core/array/shared/slice.rb +0 -0
  97. data/spec/core/array/shift_spec.rb +132 -23
  98. data/spec/core/array/shuffle_spec.rb +82 -6
  99. data/spec/core/array/size_spec.rb +7 -4
  100. data/spec/core/array/slice_spec.rb +132 -1
  101. data/spec/core/array/sort_spec.rb +263 -14
  102. data/spec/core/array/take_spec.rb +24 -16
  103. data/spec/core/array/take_while_spec.rb +14 -10
  104. data/spec/core/array/to_a_spec.rb +18 -1
  105. data/spec/core/array/to_ary_spec.rb +15 -1
  106. data/spec/core/array/try_convert_spec.rb +39 -2
  107. data/spec/core/array/uniq_spec.rb +148 -3
  108. data/spec/core/array/unshift_spec.rb +36 -1
  109. data/spec/core/array/zip_spec.rb +36 -1
  110. data/spec/core/class/new_spec.rb +8 -6
  111. data/spec/core/enumerable/all_spec.rb +37 -9
  112. data/spec/core/enumerable/any_spec.rb +45 -7
  113. data/spec/core/enumerable/collect_spec.rb +4 -1
  114. data/spec/core/enumerable/count_spec.rb +4 -1
  115. data/spec/core/enumerable/detect_spec.rb +2 -2
  116. data/spec/core/enumerable/drop_spec.rb +4 -1
  117. data/spec/core/enumerable/drop_while_spec.rb +4 -1
  118. data/spec/core/enumerable/each_slice_spec.rb +2 -1
  119. data/spec/core/enumerable/each_with_index_spec.rb +4 -1
  120. data/spec/core/enumerable/each_with_object_spec.rb +4 -1
  121. data/spec/core/enumerable/entries_spec.rb +4 -1
  122. data/spec/core/enumerable/find_all_spec.rb +4 -1
  123. data/spec/core/enumerable/find_index_spec.rb +4 -1
  124. data/spec/core/enumerable/find_spec.rb +5 -2
  125. data/spec/core/enumerable/first_spec.rb +4 -1
  126. data/spec/core/enumerable/fixtures/classes.rb +198 -2
  127. data/spec/core/enumerable/grep_spec.rb +4 -1
  128. data/spec/core/enumerable/take_spec.rb +4 -1
  129. data/spec/core/enumerable/to_a_spec.rb +4 -1
  130. data/spec/core/false/and_spec.rb +11 -0
  131. data/spec/core/false/inspect_spec.rb +7 -0
  132. data/spec/core/false/or_spec.rb +11 -0
  133. data/spec/core/false/to_s_spec.rb +7 -0
  134. data/spec/core/false/xor_spec.rb +11 -0
  135. data/spec/core/kernel/rand_spec.rb +5 -5
  136. data/spec/core/module/const_get_spec.rb +4 -4
  137. data/spec/core/module/fixtures/classes.rb +434 -0
  138. data/spec/core/module/method_defined_spec.rb +49 -0
  139. data/spec/core/module/module_function_spec.rb +28 -0
  140. data/spec/core/nil/and_spec.rb +3 -1
  141. data/spec/core/nil/dup_spec.rb +7 -0
  142. data/spec/core/nil/inspect_spec.rb +3 -1
  143. data/spec/core/nil/nil_spec.rb +3 -1
  144. data/spec/core/nil/or_spec.rb +4 -2
  145. data/spec/core/nil/to_a_spec.rb +3 -1
  146. data/spec/core/nil/to_f_spec.rb +3 -1
  147. data/spec/core/nil/to_i_spec.rb +3 -1
  148. data/spec/core/nil/to_s_spec.rb +3 -1
  149. data/spec/core/nil/xor_spec.rb +4 -2
  150. data/spec/core/string/element_reference_spec.rb +14 -1
  151. data/spec/core/string/fixtures/classes.rb +0 -0
  152. data/spec/core/true/and_spec.rb +11 -0
  153. data/spec/core/true/inspect_spec.rb +7 -0
  154. data/spec/core/true/or_spec.rb +11 -0
  155. data/spec/core/true/to_s_spec.rb +7 -0
  156. data/spec/core/true/xor_spec.rb +11 -0
  157. data/spec/{core → core_ext}/array/element_reference_spec.rb +0 -0
  158. data/spec/{core → core_ext}/array/equal_value_spec.rb +0 -0
  159. data/spec/{core → core_ext}/array/fill_spec.rb +0 -0
  160. data/spec/{core → core_ext}/array/reduce_spec.rb +0 -0
  161. data/spec/core_ext/basic_object/send_spec.rb +3 -3
  162. data/spec/{core → core_ext}/boolean/singleton_class_spec.rb +0 -0
  163. data/spec/{core → core_ext}/boolean/to_json_spec.rb +0 -0
  164. data/spec/core_ext/class/_inherited_spec.rb +3 -3
  165. data/spec/core_ext/class/proc_methods_spec.rb +2 -2
  166. data/spec/core_ext/class/singleton_methods_spec.rb +8 -8
  167. data/spec/core_ext/method_missing_spec.rb +3 -3
  168. data/spec/core_ext/native/method_missing_spec.rb +3 -2
  169. data/spec/core_ext/native/to_native_spec.rb +3 -2
  170. data/spec/{core → core_ext}/nil/to_json_spec.rb +0 -0
  171. data/spec/date.rb +0 -0
  172. data/spec/fileutils.rb +0 -0
  173. data/spec/filters/ancestors.rb +4 -0
  174. data/spec/filters/array_delete.rb +3 -0
  175. data/spec/filters/array_fetch.rb +3 -0
  176. data/spec/filters/array_first.rb +3 -0
  177. data/spec/filters/array_flatten.rb +14 -0
  178. data/spec/filters/array_intersection.rb +5 -0
  179. data/spec/filters/array_join.rb +6 -0
  180. data/spec/filters/array_subclasses.rb +4 -0
  181. data/spec/filters/block_args.rb +3 -0
  182. data/spec/filters/coerce_integer.rb +9 -0
  183. data/spec/filters/frozen.rb +4 -0
  184. data/spec/filters/mocks.rb +3 -0
  185. data/spec/filters/should_receive.rb +4 -0
  186. data/spec/filters/tainted.rb +7 -0
  187. data/spec/fixtures/class.rb +124 -0
  188. data/spec/fixtures/class_variables.rb +0 -0
  189. data/spec/fixtures/constants.rb +0 -0
  190. data/spec/grammar/alias_spec.rb +1 -1
  191. data/spec/grammar/def_spec.rb +1 -0
  192. data/spec/grammar/lvar_spec.rb +1 -2
  193. data/spec/grammar/nth_ref_spec.rb +13 -0
  194. data/spec/grammar/sclass_spec.rb +6 -7
  195. data/spec/grammar/str_spec.rb +4 -4
  196. data/spec/grammar/string_spec.rb +8 -0
  197. data/spec/grammar/xstr_spec.rb +4 -4
  198. data/spec/iconv.rb +0 -0
  199. data/spec/language/alias_spec.rb +140 -3
  200. data/spec/language/and_spec.rb +14 -7
  201. data/spec/language/array_spec.rb +57 -5
  202. data/spec/language/block_spec.rb +466 -49
  203. data/spec/language/break_spec.rb +294 -44
  204. data/spec/language/case_spec.rb +151 -3
  205. data/spec/language/class_spec.rb +196 -0
  206. data/spec/language/class_variable_spec.rb +56 -0
  207. data/spec/language/def_spec.rb +507 -4
  208. data/spec/language/defined_spec.rb +19 -7
  209. data/spec/language/ensure_spec.rb +26 -39
  210. data/spec/language/execution_spec.rb +15 -0
  211. data/spec/language/fixtures/array.rb +11 -0
  212. data/spec/language/fixtures/block.rb +57 -0
  213. data/spec/language/fixtures/break.rb +240 -0
  214. data/spec/language/fixtures/ensure.rb +72 -0
  215. data/spec/language/fixtures/literal_lambda.rb +7 -0
  216. data/spec/language/fixtures/metaclass.rb +33 -0
  217. data/spec/language/fixtures/module.rb +24 -0
  218. data/spec/language/fixtures/next.rb +78 -12
  219. data/spec/language/fixtures/return.rb +118 -0
  220. data/spec/language/fixtures/send.rb +110 -0
  221. data/spec/language/fixtures/send_1.9.rb +22 -0
  222. data/spec/language/fixtures/super.rb +308 -0
  223. data/spec/language/fixtures/variables.rb +58 -0
  224. data/spec/language/fixtures/yield.rb +5 -0
  225. data/spec/language/for_spec.rb +192 -0
  226. data/spec/language/hash_spec.rb +29 -5
  227. data/spec/language/if_spec.rb +90 -9
  228. data/spec/language/literal_lambda_spec.rb +1 -47
  229. data/spec/language/loop_spec.rb +39 -2
  230. data/spec/language/metaclass_spec.rb +151 -5
  231. data/spec/language/module_spec.rb +56 -0
  232. data/spec/language/next_spec.rb +370 -12
  233. data/spec/language/not_spec.rb +55 -0
  234. data/spec/language/numbers_spec.rb +56 -0
  235. data/spec/language/or_spec.rb +31 -3
  236. data/spec/language/order_spec.rb +79 -0
  237. data/spec/language/precedence_spec.rb +483 -0
  238. data/spec/language/proc_spec.rb +249 -21
  239. data/spec/language/redo_spec.rb +67 -0
  240. data/spec/language/rescue_spec.rb +121 -0
  241. data/spec/language/retry_spec.rb +56 -0
  242. data/spec/language/return_spec.rb +281 -0
  243. data/spec/language/send_spec.rb +141 -48
  244. data/spec/language/singleton_class_spec.rb +1 -1
  245. data/spec/language/string_spec.rb +11 -0
  246. data/spec/language/super_spec.rb +213 -133
  247. data/spec/language/symbol_spec.rb +2 -1
  248. data/spec/language/undef_spec.rb +3 -1
  249. data/spec/language/unless_spec.rb +6 -2
  250. data/spec/language/until_spec.rb +102 -3
  251. data/spec/language/variables_spec.rb +1212 -16
  252. data/spec/language/versions/array_1.9.rb +39 -0
  253. data/spec/language/versions/case_1.9.rb +20 -0
  254. data/spec/language/versions/hash_1.9.rb +18 -0
  255. data/spec/language/versions/literal_lambda_1.9.rb +143 -0
  256. data/spec/language/versions/not_1.9.rb +22 -0
  257. data/spec/language/versions/send_1.9.rb +241 -0
  258. data/spec/language/versions/symbol_1.9.rb +15 -0
  259. data/spec/language/versions/variables_1.9.rb +8 -0
  260. data/spec/language/while_spec.rb +70 -5
  261. data/spec/language/yield_spec.rb +32 -6
  262. data/spec/mspec/guards/block_device.rb +0 -0
  263. data/spec/mspec/guards/endian.rb +0 -0
  264. data/spec/mspec/helpers/environment.rb +0 -0
  265. data/spec/mspec/helpers/language_version.rb +0 -0
  266. data/spec/mspec/helpers/tmp.rb +0 -0
  267. data/spec/ospec/filter.rb +32 -0
  268. data/spec/ospec/main.rb.erb +18 -0
  269. data/spec/ospec/phantom.rb +97 -0
  270. data/spec/ospec/runner.rb +95 -0
  271. data/spec/ospec/sprockets.js +40 -0
  272. data/spec/pp.rb +3 -0
  273. data/spec/rbconfig.rb +5 -0
  274. data/spec/spec_helper.rb +53 -26
  275. data/spec/yaml.rb +0 -0
  276. metadata +275 -31
  277. data/config.ru +0 -8
  278. data/lib/opal/processor.rb +0 -47
  279. data/lib/opal/scope.rb +0 -236
  280. data/lib/opal/server.rb +0 -94
  281. data/spec/core/boolean/and_spec.rb +0 -17
  282. data/spec/core/boolean/inspect_spec.rb +0 -9
  283. data/spec/core/boolean/or_spec.rb +0 -17
  284. data/spec/core/boolean/to_s_spec.rb +0 -9
  285. data/spec/core/boolean/xor_spec.rb +0 -17
@@ -0,0 +1,56 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+ require File.expand_path('../fixtures/module', __FILE__)
3
+
4
+ describe "The module keyword" do
5
+ pending "creates a new module with a non-qualified constant name" do
6
+ module ModuleSpecsToplevel; end
7
+ ModuleSpecsToplevel.should be_an_instance_of(Module)
8
+ end
9
+
10
+ pending "creates a new module with a qualified constant name" do
11
+ module ModuleSpecs::Nested; end
12
+ ModuleSpecs::Nested.should be_an_instance_of(Module)
13
+ end
14
+
15
+ pending "creates a new module with a variable qualified constant name" do
16
+ m = Module.new
17
+ module m::N; end
18
+ m::N.should be_an_instance_of(Module)
19
+ end
20
+
21
+ pending "reopens an existing module" do
22
+ module ModuleSpecs; Reopened = true; end
23
+ ModuleSpecs::Reopened.should be_true
24
+ end
25
+
26
+ pending "reopens a module included in Object" do
27
+ module IncludedModuleSpecs; Reopened = true; end
28
+ ModuleSpecs::IncludedInObject::IncludedModuleSpecs::Reopened.should be_true
29
+ end
30
+
31
+ pending "raises a TypeError if the constant is a Class" do
32
+ lambda do
33
+ module ModuleSpecs::Modules::Klass; end
34
+ end.should raise_error(TypeError)
35
+ end
36
+
37
+ pending "raises a TypeError if the constant is a String" do
38
+ lambda { module ModuleSpecs::Modules::A; end }.should raise_error(TypeError)
39
+ end
40
+
41
+ pending "raises a TypeError if the constant is a Fixnum" do
42
+ lambda { module ModuleSpecs::Modules::B; end }.should raise_error(TypeError)
43
+ end
44
+
45
+ pending "raises a TypeError if the constant is nil" do
46
+ lambda { module ModuleSpecs::Modules::C; end }.should raise_error(TypeError)
47
+ end
48
+
49
+ pending "raises a TypeError if the constant is true" do
50
+ lambda { module ModuleSpecs::Modules::D; end }.should raise_error(TypeError)
51
+ end
52
+
53
+ pending "raises a TypeError if the constant is false" do
54
+ lambda { module ModuleSpecs::Modules::D; end }.should raise_error(TypeError)
55
+ end
56
+ end
@@ -1,3 +1,4 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
1
2
  require File.expand_path('../fixtures/next', __FILE__)
2
3
 
3
4
  describe "The next statement from within the block" do
@@ -38,17 +39,33 @@ describe "The next statement from within the block" do
38
39
  }.should == :method_return_value
39
40
 
40
41
  NextSpecs.yielding_method(1) {
41
- next 1;
42
+ next 1
42
43
  fail("next didn't end the block execution")
43
44
  }.should == :method_return_value
44
45
 
45
46
  NextSpecs.yielding_method([1, 2, 3]) {
46
- next 1, 2, 3;
47
+ next 1, 2, 3
47
48
  fail("next didn't end the block execution")
48
49
  }.should == :method_return_value
49
50
  end
50
51
 
51
- it "returns to the currently yielding method in case of chained calls" do
52
+ pending "returns to the currently yielding method in case of chained calls" do
53
+ class ChainedNextTest
54
+ def self.meth_with_yield(&b)
55
+ yield.should == :next_return_value
56
+ :method_return_value
57
+ end
58
+ def self.invoking_method(&b)
59
+ meth_with_yield(&b)
60
+ end
61
+ def self.enclosing_method
62
+ invoking_method do
63
+ next :next_return_value
64
+ :wrong_return_value
65
+ end
66
+ end
67
+ end
68
+
52
69
  ChainedNextTest.enclosing_method.should == :method_return_value
53
70
  end
54
71
 
@@ -64,6 +81,24 @@ describe "The next statement from within the block" do
64
81
 
65
82
  ScratchPad.recorded.should == [:begin, :ensure]
66
83
  end
84
+
85
+ it "skips following code outside an exception block" do
86
+ 3.times do |i|
87
+ begin
88
+ ScratchPad << :begin
89
+ next if i == 0
90
+ break if i == 2
91
+ ScratchPad << :begin_end
92
+ ensure
93
+ ScratchPad << :ensure
94
+ end
95
+
96
+ ScratchPad << :after
97
+ end
98
+
99
+ ScratchPad.recorded.should == [
100
+ :begin, :ensure, :begin, :begin_end, :ensure, :after, :begin, :ensure]
101
+ end
67
102
  end
68
103
 
69
104
  describe "The next statement" do
@@ -73,10 +108,6 @@ describe "The next statement" do
73
108
 
74
109
  describe "in a while loop" do
75
110
  describe "when not passed an argument" do
76
- before :each do
77
- ScratchPad.record []
78
- end
79
-
80
111
  it "causes ensure blocks to run" do
81
112
  NextSpecs.while_next(false)
82
113
 
@@ -91,10 +122,6 @@ describe "The next statement" do
91
122
  end
92
123
 
93
124
  describe "when passed an argument" do
94
- before :each do
95
- ScratchPad.record []
96
- end
97
-
98
125
  it "causes ensure blocks to run" do
99
126
  NextSpecs.while_next(true)
100
127
 
@@ -107,5 +134,336 @@ describe "The next statement" do
107
134
  ScratchPad.recorded.should == [:begin, :ensure]
108
135
  end
109
136
  end
137
+
138
+ it "causes nested ensure blocks to run" do
139
+ x = true
140
+ while x
141
+ begin
142
+ ScratchPad << :outer_begin
143
+ x = false
144
+ begin
145
+ ScratchPad << :inner_begin
146
+ next
147
+ ensure
148
+ ScratchPad << :inner_ensure
149
+ end
150
+ ensure
151
+ ScratchPad << :outer_ensure
152
+ end
153
+ end
154
+
155
+ ScratchPad.recorded.should == [:outer_begin, :inner_begin, :inner_ensure, :outer_ensure]
156
+ end
157
+
158
+ it "causes ensure blocks to run when mixed with break" do
159
+ x = 1
160
+ while true
161
+ begin
162
+ ScratchPad << :begin
163
+ break if x > 1
164
+ x += 1
165
+ next
166
+ ensure
167
+ ScratchPad << :ensure
168
+ end
169
+ end
170
+
171
+ ScratchPad.recorded.should == [:begin, :ensure, :begin, :ensure]
172
+ end
173
+ end
174
+
175
+ describe "in an until loop" do
176
+ describe "when not passed an argument" do
177
+ it "causes ensure blocks to run" do
178
+ NextSpecs.until_next(false)
179
+
180
+ ScratchPad.recorded.should == [:begin, :ensure]
181
+ end
182
+
183
+ it "causes ensure blocks to run when nested in an block" do
184
+ NextSpecs.until_within_iter(false)
185
+
186
+ ScratchPad.recorded.should == [:begin, :ensure]
187
+ end
188
+ end
189
+
190
+ describe "when passed an argument" do
191
+ it "causes ensure blocks to run" do
192
+ NextSpecs.until_next(true)
193
+
194
+ ScratchPad.recorded.should == [:begin, :ensure]
195
+ end
196
+
197
+ it "causes ensure blocks to run when nested in an block" do
198
+ NextSpecs.until_within_iter(true)
199
+
200
+ ScratchPad.recorded.should == [:begin, :ensure]
201
+ end
202
+ end
203
+
204
+ it "causes nested ensure blocks to run" do
205
+ x = false
206
+ until x
207
+ begin
208
+ ScratchPad << :outer_begin
209
+ x = true
210
+ begin
211
+ ScratchPad << :inner_begin
212
+ next
213
+ ensure
214
+ ScratchPad << :inner_ensure
215
+ end
216
+ ensure
217
+ ScratchPad << :outer_ensure
218
+ end
219
+ end
220
+
221
+ ScratchPad.recorded.should == [:outer_begin, :inner_begin, :inner_ensure, :outer_ensure]
222
+ end
223
+
224
+ it "causes ensure blocks to run when mixed with break" do
225
+ x = 1
226
+ until false
227
+ begin
228
+ ScratchPad << :begin
229
+ break if x > 1
230
+ x += 1
231
+ next
232
+ ensure
233
+ ScratchPad << :ensure
234
+ end
235
+ end
236
+
237
+ ScratchPad.recorded.should == [:begin, :ensure, :begin, :ensure]
238
+ end
239
+ end
240
+
241
+ describe "in a loop" do
242
+ describe "when not passed an argument" do
243
+ it "causes ensure blocks to run" do
244
+ NextSpecs.loop_next(false)
245
+
246
+ ScratchPad.recorded.should == [:begin, :ensure]
247
+ end
248
+
249
+ it "causes ensure blocks to run when nested in an block" do
250
+ NextSpecs.loop_within_iter(false)
251
+
252
+ ScratchPad.recorded.should == [:begin, :ensure]
253
+ end
254
+ end
255
+
256
+ describe "when passed an argument" do
257
+ it "causes ensure blocks to run" do
258
+ NextSpecs.loop_next(true)
259
+
260
+ ScratchPad.recorded.should == [:begin, :ensure]
261
+ end
262
+
263
+ it "causes ensure blocks to run when nested in an block" do
264
+ NextSpecs.loop_within_iter(true)
265
+
266
+ ScratchPad.recorded.should == [:begin, :ensure]
267
+ end
268
+ end
269
+
270
+ it "causes nested ensure blocks to run" do
271
+ x = 1
272
+ loop do
273
+ break if x == 2
274
+
275
+ begin
276
+ ScratchPad << :outer_begin
277
+ begin
278
+ ScratchPad << :inner_begin
279
+ x += 1
280
+ next
281
+ ensure
282
+ ScratchPad << :inner_ensure
283
+ end
284
+ ensure
285
+ ScratchPad << :outer_ensure
286
+ end
287
+ end
288
+
289
+ ScratchPad.recorded.should == [:outer_begin, :inner_begin, :inner_ensure, :outer_ensure]
290
+ end
291
+
292
+ it "causes ensure blocks to run when mixed with break" do
293
+ x = 1
294
+ loop do
295
+ begin
296
+ ScratchPad << :begin
297
+ break if x > 1
298
+ x += 1
299
+ next
300
+ ensure
301
+ ScratchPad << :ensure
302
+ end
303
+ end
304
+
305
+ ScratchPad.recorded.should == [:begin, :ensure, :begin, :ensure]
306
+ end
307
+ end
308
+ end
309
+
310
+ describe "Assignment via next" do
311
+ it "assigns objects" do
312
+ def r(val); a = yield(); val.should == a; end
313
+ r(nil){next}
314
+ r(nil){next nil}
315
+ r(1){next 1}
316
+ r([]){next []}
317
+ r([1]){next [1]}
318
+ r([nil]){next [nil]}
319
+ r([[]]){next [[]]}
320
+ r([]){next [*[]]}
321
+ r([1]){next [*[1]]}
322
+ r([1,2]){next [*[1,2]]}
323
+ end
324
+
325
+ ruby_version_is ""..."1.9" do
326
+ it "assigns splatted objects" do
327
+ def r(val); a = yield(); val.should == a; end
328
+ r(nil){next *nil}
329
+ r(1){next *1}
330
+ r(nil){next *[]}
331
+ r(1){next *[1]}
332
+ r(nil){next *[nil]}
333
+ r([]){next *[[]]}
334
+ r(nil){next *[*[]]}
335
+ r(1){next *[*[1]]}
336
+ r([1,2]){next *[*[1,2]]}
337
+ end
338
+ end
339
+
340
+ ruby_version_is "1.9" do
341
+ pending "assigns splatted objects" do
342
+ def r(val); a = yield(); val.should == a; end
343
+ r([]){next *nil}
344
+ r([1]){next *1}
345
+ r([]){next *[]}
346
+ r([1]){next *[1]}
347
+ r([nil]){next *[nil]}
348
+ r([[]]){next *[[]]}
349
+ r([]){next *[*[]]}
350
+ r([1]){next *[*[1]]}
351
+ r([1,2]){next *[*[1,2]]}
352
+ end
353
+ end
354
+
355
+ ruby_version_is ""..."1.9" do
356
+ it "assigns objects to a splatted reference" do
357
+ def r(val); *a = yield(); val.should == a; end
358
+ r([nil]){next}
359
+ r([nil]){next nil}
360
+ r([1]){next 1}
361
+ r([[]]){next []}
362
+ r([[1]]){next [1]}
363
+ r([[nil]]){next [nil]}
364
+ r([[[]]]){next [[]]}
365
+ r([[1,2]]){next [1,2]}
366
+ r([[]]){next [*[]]}
367
+ r([[1]]){next [*[1]]}
368
+ r([[1,2]]){next [*[1,2]]}
369
+ end
110
370
  end
111
- end
371
+
372
+ ruby_version_is "1.9" do
373
+ pending "assigns objects to a splatted reference" do
374
+ def r(val); *a = yield(); val.should == a; end
375
+ r([nil]){next}
376
+ r([nil]){next nil}
377
+ r([1]){next 1}
378
+ r([]){next []}
379
+ r([1]){next [1]}
380
+ r([nil]){next [nil]}
381
+ r([[]]){next [[]]}
382
+ r([1,2]){next [1,2]}
383
+ r([]){next [*[]]}
384
+ r([1]){next [*[1]]}
385
+ r([1,2]){next [*[1,2]]}
386
+ end
387
+ end
388
+
389
+ ruby_version_is ""..."1.9" do
390
+ it "assigns splatted objects to a splatted reference via a splatted yield" do
391
+ def r(val); *a = *yield(); val.should == a; end
392
+ r([nil]){next *nil}
393
+ r([1]){next *1}
394
+ r([nil]){next *[]}
395
+ r([1]){next *[1]}
396
+ r([nil]){next *[nil]}
397
+ r([]){next *[[]]}
398
+ r([1,2]){next *[1,2]}
399
+ r([nil]){next *[*[]]}
400
+ r([1]){next *[*[1]]}
401
+ r([1,2]){next *[*[1,2]]}
402
+ end
403
+ end
404
+
405
+ ruby_version_is "1.9" do
406
+ pending "assigns splatted objects to a splatted reference via a splatted yield" do
407
+ def r(val); *a = *yield(); val.should == a; end
408
+ r([]){next *nil}
409
+ r([1]){next *1}
410
+ r([]){next *[]}
411
+ r([1]){next *[1]}
412
+ r([nil]){next *[nil]}
413
+ r([[]]){next *[[]]}
414
+ r([1,2]){next *[1,2]}
415
+ r([]){next *[*[]]}
416
+ r([1]){next *[*[1]]}
417
+ r([1,2]){next *[*[1,2]]}
418
+ end
419
+ end
420
+
421
+ it "assigns objects to multiple variables" do
422
+ def r(val); a,b,*c = yield(); val.should == [a,b,c]; end
423
+ r([nil,nil,[]]){next}
424
+ r([nil,nil,[]]){next nil}
425
+ r([1,nil,[]]){next 1}
426
+ r([nil,nil,[]]){next []}
427
+ r([1,nil,[]]){next [1]}
428
+ r([nil,nil,[]]){next [nil]}
429
+ r([[],nil,[]]){next [[]]}
430
+ r([1,2,[]]){next [1,2]}
431
+ r([nil,nil,[]]){next [*[]]}
432
+ r([1,nil,[]]){next [*[1]]}
433
+ r([1,2,[]]){next [*[1,2]]}
434
+ end
435
+
436
+ ruby_version_is ""..."1.9" do
437
+ it "assigns splatted objects to multiple variables" do
438
+ def r(val); a,b,*c = *yield(); val.should == [a,b,c]; end
439
+ r([nil,nil,[]]){next *nil}
440
+ r([1,nil,[]]){next *1}
441
+ r([nil,nil,[]]){next *[]}
442
+ r([1,nil,[]]){next *[1]}
443
+ r([nil,nil,[]]){next *[nil]}
444
+ r([nil,nil,[]]){next *[[]]}
445
+ r([1,2,[]]){next *[1,2]}
446
+ r([nil,nil,[]]){next *[*[]]}
447
+ r([1,nil,[]]){next *[*[1]]}
448
+ r([1,2,[]]){next *[*[1,2]]}
449
+ end
450
+ end
451
+
452
+ ruby_version_is "1.9" do
453
+ pending "assigns splatted objects to multiple variables" do
454
+ def r(val); a,b,*c = *yield(); val.should == [a,b,c]; end
455
+ r([nil,nil,[]]){next *nil}
456
+ r([1,nil,[]]){next *1}
457
+ r([nil,nil,[]]){next *[]}
458
+ r([1,nil,[]]){next *[1]}
459
+ r([nil,nil,[]]){next *[nil]}
460
+ r([[],nil,[]]){next *[[]]}
461
+ r([1,2,[]]){next *[1,2]}
462
+ r([nil,nil,[]]){next *[*[]]}
463
+ r([1,nil,[]]){next *[*[1]]}
464
+ r([1,2,[]]){next *[*[1,2]]}
465
+ end
466
+ end
467
+ end
468
+
469
+ # language_version __FILE__, "next"