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
@@ -1,3 +1,5 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
1
3
  describe "Hash literal" do
2
4
  it "{} should return an empty hash" do
3
5
  {}.size.should == 0
@@ -7,10 +9,10 @@ describe "Hash literal" do
7
9
  it "{} should return a new hash populated with the given elements" do
8
10
  h = {:a => 'a', 'b' => 3, 44 => 2.3}
9
11
  h.size.should == 3
10
- h.should == {:a => 'a', 'b' => 3, 44 => 2.3}
12
+ h.should == {:a => "a", "b" => 3, 44 => 2.3}
11
13
  end
12
14
 
13
- it "treats empty expressions an nils" do
15
+ it "treats empty expressions as nils" do
14
16
  h = {() => ()}
15
17
  h.keys.should == [nil]
16
18
  h.values.should == [nil]
@@ -21,12 +23,22 @@ describe "Hash literal" do
21
23
  h.values.should == [:value]
22
24
  h[nil].should == :value
23
25
 
24
- h = {:keys => ()}
25
- h.keys.should == [:keys]
26
+ h = {:key => ()}
27
+ h.keys.should == [:key]
26
28
  h.values.should == [nil]
27
29
  h[:key].should == nil
28
30
  end
29
31
 
32
+ pending "freezes string keys on initialization" do
33
+ key = "foo"
34
+ h = {key => "bar"}
35
+ key.reverse!
36
+ h["foo"].should == "bar"
37
+ h.keys.first.should == "foo"
38
+ h.keys.first.frozen?.should == true
39
+ key.should == "oof"
40
+ end
41
+
30
42
  it "checks duplicated keys on initialization" do
31
43
  h = {:foo => :bar, :foo => :foo}
32
44
  h.keys.size.should == 1
@@ -38,4 +50,16 @@ describe "Hash literal" do
38
50
  h.size.should == 2
39
51
  h.should == {:a => 1, :b => 2}
40
52
  end
41
- end
53
+
54
+ it "recognizes '=' at the end of the key" do
55
+ eval("{:a==>1}").should == {:"a=" => 1}
56
+ eval("{:a= =>1}").should == {:"a=" => 1}
57
+ eval("{:a= => 1}").should == {:"a=" => 1}
58
+ end
59
+
60
+ it "with '==>' in the middle raises SyntaxError" do
61
+ lambda {eval("{:a ==> 1}")}.should raise_error(SyntaxError)
62
+ end
63
+ end
64
+
65
+ # language_version __FILE__, "hash"
@@ -1,3 +1,5 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
1
3
  describe "The if expression" do
2
4
  it "evaluates body if expression is true" do
3
5
  a = []
@@ -7,7 +9,7 @@ describe "The if expression" do
7
9
  a.should == [123]
8
10
  end
9
11
 
10
- it "does not evaluate body if expression if false" do
12
+ it "does not evaluate body if expression is false" do
11
13
  a = []
12
14
  if false
13
15
  a << 123
@@ -113,7 +115,7 @@ describe "The if expression" do
113
115
  end
114
116
 
115
117
  it "considers a non-nil and non-boolean object in expression result as true" do
116
- if 'x'
118
+ if mock('x')
117
119
  123
118
120
  else
119
121
  456
@@ -135,7 +137,7 @@ describe "The if expression" do
135
137
  end.should == 456
136
138
  end
137
139
 
138
- it "evaluates subsequent elsif statements and executes body of first matching" do
140
+ it "evaluates subsequent elsif statements and execute body of first matching" do
139
141
  if false
140
142
  123
141
143
  elsif false
@@ -210,6 +212,83 @@ describe "The if expression" do
210
212
 
211
213
  if false then 123; else 456; end.should == 456
212
214
  end
215
+
216
+ describe "with a boolean range ('flip-flop' operator)" do
217
+ before :each do
218
+ ScratchPad.record []
219
+ end
220
+
221
+ after :each do
222
+ ScratchPad.clear
223
+ end
224
+
225
+ pending "mimics an awk conditional with a single-element inclusive-end range" do
226
+ 10.times { |i| ScratchPad << i if (i == 4)..(i == 4) }
227
+ ScratchPad.recorded.should == [4]
228
+ end
229
+
230
+ pending "mimics an awk conditional with a many-element inclusive-end range" do
231
+ 10.times { |i| ScratchPad << i if (i == 4)..(i == 7) }
232
+ ScratchPad.recorded.should == [4, 5, 6, 7]
233
+ end
234
+
235
+ pending "mimics a sed conditional with a zero-element exclusive-end range" do
236
+ 10.times { |i| ScratchPad << i if (i == 4)...(i == 4) }
237
+ ScratchPad.recorded.should == [4, 5, 6, 7, 8, 9]
238
+ end
239
+
240
+ pending "mimics a sed conditional with a many-element exclusive-end range" do
241
+ 10.times { |i| ScratchPad << i if (i == 4)...(i == 5) }
242
+ ScratchPad.recorded.should == [4, 5]
243
+ end
244
+
245
+ pending "allows combining two flip-flops" do
246
+ 10.times { |i| ScratchPad << i if (i == 4)...(i == 5) or (i == 7)...(i == 8) }
247
+ ScratchPad.recorded.should == [4, 5, 7, 8]
248
+ end
249
+
250
+ pending "evaluates the first conditions lazily with inclusive-end range" do
251
+ collector = proc { |i| ScratchPad << i }
252
+ 10.times { |i| i if collector[i]...false }
253
+ ScratchPad.recorded.should == [0]
254
+ end
255
+
256
+ pending "evaluates the first conditions lazily with exclusive-end range" do
257
+ collector = proc { |i| ScratchPad << i }
258
+ 10.times { |i| i if collector[i]..false }
259
+ ScratchPad.recorded.should == [0]
260
+ end
261
+
262
+ pending "evaluates the second conditions lazily with inclusive-end range" do
263
+ collector = proc { |i| ScratchPad << i }
264
+ 10.times { |i| i if (i == 4)...collector[i] }
265
+ ScratchPad.recorded.should == [5]
266
+ end
267
+
268
+ pending "evaluates the second conditions lazily with exclusive-end range" do
269
+ collector = proc { |i| ScratchPad << i }
270
+ 10.times { |i| i if (i == 4)..collector[i] }
271
+ ScratchPad.recorded.should == [4]
272
+ end
273
+
274
+ pending "scopes state by flip-flop" do
275
+ store_me = proc { |i| ScratchPad << i if (i == 4)..(i == 7) }
276
+ store_me[1]
277
+ store_me[4]
278
+ proc { store_me[1] }.call
279
+ store_me[7]
280
+ store_me[5]
281
+ ScratchPad.recorded.should == [4, 1, 7]
282
+ end
283
+
284
+ pending "keeps flip-flops from interfering" do
285
+ a = proc { |i| ScratchPad << i if (i == 4)..(i == 7) }
286
+ b = proc { |i| ScratchPad << i if (i == 4)..(i == 7) }
287
+ 6.times(&a)
288
+ 6.times(&b)
289
+ ScratchPad.recorded.should == [4, 5, 4, 5]
290
+ end
291
+ end
213
292
  end
214
293
 
215
294
  describe "The postfix if form" do
@@ -219,7 +298,7 @@ describe "The postfix if form" do
219
298
  a.should == [123]
220
299
  end
221
300
 
222
- it "does not evaluate statement if expression if false" do
301
+ it "does not evaluate statement if expression is false" do
223
302
  a = []
224
303
  a << 123 if false
225
304
  a.should == []
@@ -229,7 +308,7 @@ describe "The postfix if form" do
229
308
  (123 if true).should == 123
230
309
  end
231
310
 
232
- it "returns nil if value is false" do
311
+ it "returns nil if expression is false" do
233
312
  (123 if false).should == nil
234
313
  end
235
314
 
@@ -238,7 +317,7 @@ describe "The postfix if form" do
238
317
  end
239
318
 
240
319
  it "considers a non-nil object as true" do
241
- (123 if 'x').should == 123
320
+ (123 if mock('x')).should == 123
242
321
  end
243
322
 
244
323
  it "evaluates then-body in containing scope" do
@@ -249,12 +328,12 @@ describe "The postfix if form" do
249
328
  b.should == 124
250
329
  end
251
330
 
252
- it "evaluates else-body if containing scope" do
331
+ it "evaluates else-body in containing scope" do
253
332
  a = 123
254
333
  if false
255
334
  b = a+1
256
335
  else
257
- b= a+2
336
+ b = a+2
258
337
  end
259
338
  b.should == 125
260
339
  end
@@ -272,4 +351,6 @@ describe "The postfix if form" do
272
351
  end
273
352
  b.should == 126
274
353
  end
275
- end
354
+ end
355
+
356
+ # language_version __FILE__, "if"
@@ -1,47 +1 @@
1
- describe "->(){}" do
2
- it "can be specified as a literal" do
3
- lambda { ->(){} }.call
4
- end
5
-
6
- it "returns a Proc object" do
7
- ->(){}.should be_kind_of(Proc)
8
- end
9
-
10
- it "returns a lambda" do
11
- ->(){}.lambda?.should be_true
12
- end
13
-
14
- it "can be assigned to a variable" do
15
- var = ->(){}
16
- var.lambda?.should be_true
17
- end
18
-
19
- it "understands a do/end block in place of {}" do
20
- lambda do
21
- ->() do
22
- end
23
- end.call
24
- end
25
-
26
- it "can be interpolated into a String" do
27
- "1+2=#{->{ 1 + 2 }.call}".should == "1+2=3"
28
- end
29
-
30
- it "can be used as a Hash key" do
31
- h = {}
32
- h[->(){ 1 + 2 }.call] = :value
33
- h.key?(3).should be_true
34
- end
35
-
36
- it "can be used in method parameter lists" do
37
- def glark7654(a=-> { :foo })
38
- a.call
39
- end
40
- glark7654.should == :foo
41
- end
42
-
43
- it "accepts an paramter list between the paranthesis" do
44
- lambda { ->(a) {} }.call
45
- lambda { ->(a,b) {} }.call
46
- end
47
- end
1
+ # language_version __FILE__, "literal_lambda"
@@ -1,3 +1,5 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
1
3
  describe "The loop expression" do
2
4
  it "repeats the given block until a break is called" do
3
5
  outer_loop = 0
@@ -8,7 +10,7 @@ describe "The loop expression" do
8
10
  outer_loop.should == 10
9
11
  end
10
12
 
11
- it "executes code in its own scope" do
13
+ pending "executes code in its own scope" do
12
14
  loop do
13
15
  inner_loop = 123
14
16
  break
@@ -27,4 +29,39 @@ describe "The loop expression" do
27
29
  break
28
30
  end.should == nil
29
31
  end
30
- end
32
+
33
+ it "skips to end of body with next" do
34
+ a = []
35
+ i = 0
36
+ loop do
37
+ break if (i+=1) >= 5
38
+ next if i == 3
39
+ a << i
40
+ end
41
+ a.should == [1, 2, 4]
42
+ end
43
+
44
+ pending "restarts the current iteration with redo" do
45
+ a = []
46
+ loop do
47
+ a << 1
48
+ redo if a.size < 2
49
+ a << 2
50
+ break if a.size == 3
51
+ end
52
+ a.should == [1, 1, 2]
53
+ end
54
+
55
+ pending "uses a spaghetti nightmare of redo, next and break" do
56
+ a = []
57
+ loop do
58
+ a << 1
59
+ redo if a.size == 1
60
+ a << 2
61
+ next if a.size == 3
62
+ a << 3
63
+ break if a.size > 6
64
+ end
65
+ a.should == [1, 1, 2, 1, 2, 3, 1, 2, 3]
66
+ end
67
+ end
@@ -1,13 +1,159 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+ require File.expand_path('../../fixtures/class', __FILE__)
3
+ require File.expand_path('../fixtures/metaclass', __FILE__)
4
+
1
5
  describe "self in a metaclass body (class << obj)" do
2
- it "is Boolean for true" do
3
- class << true; self; end.should == Boolean
6
+ it "is TrueClass for true" do
7
+ class << true; self; end.should == TrueClass
4
8
  end
5
9
 
6
- it "is Boolean for false" do
7
- class << false; self; end.should == Boolean
10
+ it "is FalseClass for false" do
11
+ class << false; self; end.should == FalseClass
8
12
  end
9
13
 
10
14
  it "is NilClass for nil" do
11
15
  class << nil; self; end.should == NilClass
12
16
  end
13
- end
17
+
18
+ pending "raises a TypeError for numbers" do
19
+ lambda { class << 1; self; end }.should raise_error(TypeError)
20
+ end
21
+
22
+ pending "raises a TypeError for symbols" do
23
+ lambda { class << :symbol; self; end }.should raise_error(TypeError)
24
+ end
25
+
26
+ it "is a singleton Class instance" do
27
+ cls = class << mock('x'); self; end
28
+ cls.is_a?(Class).should == true
29
+ cls.should_not equal(Object)
30
+ end
31
+ end
32
+
33
+ describe "A constant on a metaclass" do
34
+ before(:each) do
35
+ @object = Object.new
36
+ class << @object
37
+ CONST = self
38
+ end
39
+ end
40
+
41
+ pending "can be accessed after the metaclass body is reopened" do
42
+ class << @object
43
+ CONST.should == self
44
+ end
45
+ end
46
+
47
+ pending "can be accessed via self::CONST" do
48
+ class << @object
49
+ self::CONST.should == self
50
+ end
51
+ end
52
+
53
+ pending "can be accessed via const_get" do
54
+ class << @object
55
+ const_get(:CONST).should == self
56
+ end
57
+ end
58
+
59
+ pending "is not defined on the object's class" do
60
+ @object.class.const_defined?(:CONST).should be_false
61
+ end
62
+
63
+ pending "is not defined in the metaclass opener's scope" do
64
+ class << @object
65
+ CONST
66
+ end
67
+ lambda { CONST }.should raise_error(NameError)
68
+ end
69
+
70
+ pending "cannot be accessed via object::CONST" do
71
+ lambda do
72
+ @object::CONST
73
+ end.should raise_error(TypeError)
74
+ end
75
+
76
+ pending "raises a NameError for anonymous_module::CONST" do
77
+ @object = Class.new
78
+ class << @object
79
+ CONST = 100
80
+ end
81
+
82
+ lambda do
83
+ @object::CONST
84
+ end.should raise_error(NameError)
85
+ end
86
+
87
+ ruby_version_is ""..."1.9" do
88
+ it "appears in the metaclass constant list" do
89
+ constants = class << @object; constants; end
90
+ constants.should include("CONST")
91
+ end
92
+
93
+ it "does not appear in the object's class constant list" do
94
+ @object.class.constants.should_not include("CONST")
95
+ end
96
+ end
97
+
98
+ ruby_version_is "1.9" do
99
+ pending "appears in the metaclass constant list" do
100
+ constants = class << @object; constants; end
101
+ constants.should include(:CONST)
102
+ end
103
+
104
+ pending "does not appear in the object's class constant list" do
105
+ @object.class.constants.should_not include(:CONST)
106
+ end
107
+ end
108
+
109
+ pending "is not preserved when the object is duped" do
110
+ @object = @object.dup
111
+
112
+ lambda do
113
+ class << @object; CONST; end
114
+ end.should raise_error(NameError)
115
+ end
116
+
117
+ pending "is preserved when the object is cloned" do
118
+ @object = @object.clone
119
+
120
+ class << @object
121
+ CONST.should_not be_nil
122
+ end
123
+ end
124
+ end
125
+
126
+ describe "calling methods on the metaclass" do
127
+
128
+ it "calls a method on the metaclass" do
129
+ MetaClassSpecs::A.cheese.should == 'edam'
130
+ MetaClassSpecs::B.cheese.should == 'stilton'
131
+ end
132
+
133
+ it "calls a method on the instance's metaclass" do
134
+ b = MetaClassSpecs::B.new
135
+ b_meta = MetaClassSpecs.metaclass_of b
136
+ b_meta.send(:define_method, :cheese) {'cheshire'}
137
+ b.cheese.should == 'cheshire'
138
+ end
139
+
140
+ pending "calls a method in deeper chains of metaclasses" do
141
+ b = MetaClassSpecs::B.new
142
+ b_meta = MetaClassSpecs.metaclass_of b
143
+ b_meta_meta = MetaClassSpecs.metaclass_of b_meta
144
+ b_meta_meta.send(:define_method, :cheese) {'gouda'}
145
+ b_meta.cheese.should == 'gouda'
146
+
147
+ b_meta_meta_meta = MetaClassSpecs.metaclass_of b_meta_meta
148
+ b_meta_meta_meta.send(:define_method, :cheese) {'wensleydale'}
149
+ b_meta_meta.cheese.should == 'wensleydale'
150
+ end
151
+
152
+ ruby_version_is "1.9" do
153
+ it "calls a method defined on the metaclass of the metaclass" do
154
+ d_meta = MetaClassSpecs::D.singleton_class
155
+ d_meta.ham.should == 'iberico'
156
+ end
157
+ end
158
+
159
+ end