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,9 +1,34 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+ require File.expand_path('../fixtures/classes', __FILE__)
3
+ require File.expand_path('../shared/join', __FILE__)
4
+
1
5
  describe "Array#join" do
2
- it "returns a string formed by concatenating each element with separator" do
3
- [1, 2, 3, 4, 5].join(' | ').should == "1 | 2 | 3 | 4 | 5"
4
- end
6
+ it_behaves_like :array_join_with_string_separator, :join
7
+
8
+ it_behaves_like :array_join_with_default_separator, :join
5
9
 
6
10
  it "does not separate elements when the passed separator is nil" do
7
11
  [1, 2, 3].join(nil).should == '123'
8
12
  end
9
- end
13
+
14
+ it "calls #to_str to convert the separator to a String" do
15
+ sep = mock("separator")
16
+ sep.should_receive(:to_str).and_return(", ")
17
+ [1, 2].join(sep).should == "1, 2"
18
+ end
19
+
20
+ it "does not call #to_str on the separator if the array is empty" do
21
+ sep = mock("separator")
22
+ sep.should_not_receive(:to_str)
23
+ [].join(sep).should == ""
24
+ end
25
+
26
+ it "raises a TypeError if the separator cannot be coerced to a String by calling #to_str" do
27
+ obj = mock("not a string")
28
+ lambda { [1, 2].join(obj) }.should raise_error(TypeError)
29
+ end
30
+
31
+ it "raises a TypeError if passed false as the separator" do
32
+ lambda { [1, 2].join(false) }.should raise_error(TypeError)
33
+ end
34
+ end
@@ -1,7 +1,14 @@
1
- describe "Array#keep_if" do
2
- it "deletes elements for which the block returns a false value" do
3
- array = [1, 2, 3, 4, 5]
4
- array.keep_if { |item| item > 3 }.should equal(array)
5
- array.should == [4, 5]
1
+ require File.expand_path('../shared/keep_if', __FILE__)
2
+
3
+ ruby_version_is "1.9" do
4
+ describe "Array#keep_if" do
5
+ it "returns the same array if no changes were made" do
6
+ array = [1, 2, 3]
7
+ array.keep_if { true }.should equal(array)
8
+ end
9
+
10
+ pending do
11
+ it_behaves_like :keep_if, :keep_if
12
+ end
6
13
  end
7
- end
14
+ end
@@ -1,3 +1,6 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+ require File.expand_path('../fixtures/classes', __FILE__)
3
+
1
4
  describe "Array#last" do
2
5
  it "returns the last element" do
3
6
  [1, 1, 1, 1, 2].last.should == 2
@@ -42,6 +45,37 @@ describe "Array#last" do
42
45
  ary.should == [1, 2, 3, 4, 5]
43
46
  end
44
47
 
48
+ it "properly handles recursive arrays" do
49
+ empty = ArraySpecs.empty_recursive_array
50
+ empty.last.should equal(empty)
51
+
52
+ array = ArraySpecs.recursive_array
53
+ array.last.should equal(array)
54
+ end
55
+
56
+ it "tries to convert the passed argument to an Integer usinig #to_int" do
57
+ obj = mock('to_int')
58
+ def obj.to_int; 2 ; end
59
+ obj.to_int.should == 2
60
+ [1, 2, 3, 4, 5].last(obj).should == [4, 5]
61
+ end
62
+
63
+ it "raises a TypeError if the passed argument is not numeric" do
64
+ lambda { [1,2].last(nil) }.should raise_error(TypeError)
65
+ lambda { [1,2].last("a") }.should raise_error(TypeError)
66
+
67
+ obj = mock("nonnumeric")
68
+ lambda { [1,2].last(obj) }.should raise_error(TypeError)
69
+ end
70
+
71
+ it "does not return subclass instance on Array subclasses" do
72
+ ArraySpecs::MyArray[].last(0).should be_kind_of(Array)
73
+ ArraySpecs::MyArray[].last(2).should be_kind_of(Array)
74
+ ArraySpecs::MyArray[1, 2, 3].last(0).should be_kind_of(Array)
75
+ ArraySpecs::MyArray[1, 2, 3].last(1).should be_kind_of(Array)
76
+ ArraySpecs::MyArray[1, 2, 3].last(2).should be_kind_of(Array)
77
+ end
78
+
45
79
  it "is not destructive" do
46
80
  a = [1, 2, 3]
47
81
  a.last
@@ -51,4 +85,4 @@ describe "Array#last" do
51
85
  a.last(3)
52
86
  a.should == [1, 2, 3]
53
87
  end
54
- end
88
+ end
@@ -1,6 +1,9 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+ require File.expand_path('../fixtures/classes', __FILE__)
3
+ require File.expand_path('../shared/length', __FILE__)
4
+
1
5
  describe "Array#length" do
2
- it "returns the number of elements" do
3
- [].length.should == 0
4
- [1, 2, 3].length.should == 3
6
+ pending do
7
+ it_behaves_like(:array_length, :length)
5
8
  end
6
- end
9
+ end
@@ -1,53 +1,15 @@
1
- describe "Array#map" do
2
- it "returns a copy of array with each element replaced by the value returned by block" do
3
- a = ['a', 'b', 'c', 'd']
4
- b = a.map { |i| i + '!' }
5
- b.should == ['a!', 'b!', 'c!', 'd!']
6
- b.object_id.should_not == a.object_id
7
- end
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+ require File.expand_path('../fixtures/classes', __FILE__)
3
+ require File.expand_path('../shared/collect', __FILE__)
8
4
 
9
- it "does not change self" do
10
- a = ['a', 'b', 'c', 'd']
11
- b = a.map { |i| i + '!' }
12
- a.should == ['a', 'b', 'c', 'd']
13
- end
14
-
15
- it "returns the evaluated value of block if it broke in the block" do
16
- a = ['a', 'b', 'c', 'd']
17
- b = a.map {|i|
18
- if i == 'c'
19
- break 0
20
- else
21
- i + '!'
22
- end
23
- }
24
- b.should == 0
5
+ describe "Array#map" do
6
+ pending do
7
+ it_behaves_like(:array_collect, :map)
25
8
  end
26
9
  end
27
10
 
28
11
  describe "Array#map!" do
29
- it "replaces each element with the value returned by block" do
30
- a = [7, 9, 3, 5]
31
- a.map! { |i| i - 1 }.should equal(a)
32
- a.should == [6, 8, 2, 4]
12
+ pending do
13
+ it_behaves_like(:array_collect_b, :map!)
33
14
  end
34
-
35
- it "returns self" do
36
- a = [1, 2, 3, 4, 5]
37
- b = a.map! {|i| i+1 }
38
- a.object_id.should == b.object_id
39
- end
40
-
41
- it "returns the evaluated value of block but its contents is partially modified, if it broke in the block" do
42
- a = ['a', 'b', 'c', 'd']
43
- b = a.map! {|i|
44
- if i == 'c'
45
- break 0
46
- else
47
- i + '!'
48
- end
49
- }
50
- b.should == 0
51
- a.should == ['a!', 'b!', 'c', 'd']
52
- end
53
- end
15
+ end
@@ -1,23 +1,87 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+ require File.expand_path('../fixtures/classes', __FILE__)
3
+
1
4
  describe "Array#-" do
2
5
  it "creates an array minus any items from other array" do
3
- ([] - [1, 2, 4]).should == []
6
+ ([] - [ 1, 2, 4 ]).should == []
4
7
  ([1, 2, 4] - []).should == [1, 2, 4]
5
- ([1, 2, 3, 4, 5] - [1, 2, 4]).should == [3, 5]
8
+ ([ 1, 2, 3, 4, 5 ] - [ 1, 2, 4 ]).should == [3, 5]
6
9
  end
7
10
 
8
11
  it "removes multiple items on the lhs equal to one on the rhs" do
9
12
  ([1, 1, 2, 2, 3, 3, 4, 5] - [1, 2, 4]).should == [3, 3, 5]
10
13
  end
11
14
 
15
+ ruby_bug "#", "1.8.6.277" do
16
+ pending "properly handles recursive arrays" do
17
+ empty = ArraySpecs.empty_recursive_array
18
+ (empty - empty).should == []
19
+
20
+ ([] - ArraySpecs.recursive_array).should == []
21
+
22
+ array = ArraySpecs.recursive_array
23
+ (array - array).should == []
24
+ end
25
+ end
26
+
27
+ pending "tries to convert the passed arguments to Arrays using #to_ary" do
28
+ obj = mock('[2,3,3,4]')
29
+ obj.should_receive(:to_ary).and_return([2, 3, 3, 4])
30
+ ([1, 1, 2, 2, 3, 4] - obj).should == [1, 1]
31
+ end
32
+
33
+ pending "raises a TypeError if the argument cannot be coerced to an Array by calling #to_ary" do
34
+ obj = mock('not an array')
35
+ lambda { [1, 2, 3] - obj }.should raise_error(TypeError)
36
+ end
37
+
38
+ it "does not return subclass instance for Array subclasses" do
39
+ (ArraySpecs::MyArray[1, 2, 3] - []).should be_kind_of(Array)
40
+ (ArraySpecs::MyArray[1, 2, 3] - ArraySpecs::MyArray[]).should be_kind_of(Array)
41
+ ([1, 2, 3] - ArraySpecs::MyArray[]).should be_kind_of(Array)
42
+ end
43
+
44
+ it "does not call to_ary on array subclasses" do
45
+ ([5, 6, 7] - ArraySpecs::ToAryArray[7]).should == [5, 6]
46
+ end
47
+
48
+ pending "removes an item identified as equivalent via #hash and #eql?" do
49
+ obj1 = mock('1')
50
+ obj2 = mock('2')
51
+ obj1.should_receive(:hash).and_return(0)
52
+ obj2.should_receive(:hash).and_return(0)
53
+ obj1.should_receive(:eql?).with(obj2).and_return(true)
54
+
55
+ ([obj1] - [obj2]).should == []
56
+ end
57
+
58
+ pending "doesn't remove an item with the same hash but not #eql?" do
59
+ obj1 = mock('1')
60
+ obj2 = mock('2')
61
+ obj1.should_receive(:hash).and_return(0)
62
+ obj2.should_receive(:hash).and_return(0)
63
+ obj1.should_receive(:eql?).with(obj2).and_return(false)
64
+
65
+ ([obj1] - [obj2]).should == [obj1]
66
+ end
67
+
68
+ pending "removes an identical item even when its #eql? isn't reflexive" do
69
+ x = mock('x')
70
+ x.should_receive(:hash).any_number_of_times.and_return(42)
71
+ x.stub!(:eql?).and_return(false) # Stubbed for clarity and latitude in implementation; not actually sent by MRI.
72
+
73
+ ([x] - [x]).should == []
74
+ end
75
+
12
76
  it "is not destructive" do
13
77
  a = [1, 2, 3]
14
78
  a - []
15
79
  a.should == [1, 2, 3]
16
80
  a - [1]
17
81
  a.should == [1, 2, 3]
18
- a - [1, 2, 3]
82
+ a - [1,2,3]
19
83
  a.should == [1, 2, 3]
20
84
  a - [:a, :b, :c]
21
85
  a.should == [1, 2, 3]
22
86
  end
23
- end
87
+ end
@@ -1,13 +1,145 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+ require File.expand_path('../fixtures/classes', __FILE__)
3
+ require File.expand_path('../shared/join', __FILE__)
4
+
5
+ describe "Array#*" do
6
+ pending "tries to convert the passed argument to a String using #to_str" do
7
+ obj = mock('separator')
8
+ obj.should_receive(:to_str).and_return('::')
9
+ ([1, 2, 3, 4] * obj).should == '1::2::3::4'
10
+ end
11
+
12
+ pending "tires to convert the passed argument to an Integer using #to_int" do
13
+ obj = mock('count')
14
+ obj.should_receive(:to_int).and_return(2)
15
+ ([1, 2, 3, 4] * obj).should == [1, 2, 3, 4, 1, 2, 3, 4]
16
+ end
17
+
18
+ pending "raises a TypeError if the argument can neither be converted to a string nor an integer" do
19
+ obj = mock('not a string or integer')
20
+ lambda{ [1,2] * obj }.should raise_error(TypeError)
21
+ end
22
+
23
+ pending "converts the passed argument to a String rather than an Integer" do
24
+ obj = mock('2')
25
+ def obj.to_int() 2 end
26
+ def obj.to_str() "2" end
27
+ ([:a, :b, :c] * obj).should == "a2b2c"
28
+ end
29
+
30
+ pending "raises a TypeError is the passed argument is nil" do
31
+ lambda{ [1,2] * nil }.should raise_error(TypeError)
32
+ end
33
+
34
+ it "raises an ArgumentError when passed 2 or more arguments" do
35
+ lambda{ [1,2].send(:*, 1, 2) }.should raise_error(ArgumentError)
36
+ end
37
+
38
+ it "raises an ArgumentError when passed no arguments" do
39
+ lambda{ [1,2].send(:*) }.should raise_error(ArgumentError)
40
+ end
41
+ end
42
+
1
43
  describe "Array#* with an integer" do
2
44
  it "concatenates n copies of the array when passed an integer" do
3
- ([1, 2, 3] * 0).should == []
4
- ([1, 2, 3] * 1).should == [1, 2, 3]
5
- ([1, 2, 3] * 3).should == [1, 2, 3, 1, 2, 3, 1, 2, 3]
45
+ ([ 1, 2, 3 ] * 0).should == []
46
+ ([ 1, 2, 3 ] * 1).should == [1, 2, 3]
47
+ ([ 1, 2, 3 ] * 3).should == [1, 2, 3, 1, 2, 3, 1, 2, 3]
48
+ ([] * 10).should == []
49
+ end
50
+
51
+ it "does not return self even if the passed integer is 1" do
52
+ ary = [1, 2, 3]
53
+ (ary * 1).should_not equal(ary)
54
+ end
55
+
56
+ pending "properly handles recursive arrays" do
57
+ empty = ArraySpecs.empty_recursive_array
58
+ (empty * 0).should == []
59
+ (empty * 1).should == empty
60
+ (empty * 3).should == [empty, empty, empty]
61
+
62
+ array = ArraySpecs.recursive_array
63
+ (array * 0).should == []
64
+ (array * 1).should == array
65
+ end
66
+
67
+ pending "raises an ArgumentError when passed a negative integer" do
68
+ lambda { [ 1, 2, 3 ] * -1 }.should raise_error(ArgumentError)
69
+ lambda { [] * -1 }.should raise_error(ArgumentError)
70
+ end
71
+
72
+ describe "with a subclass of Array" do
73
+ before :each do
74
+ ScratchPad.clear
75
+
76
+ @array = ArraySpecs::MyArray[1, 2, 3, 4, 5]
77
+ end
78
+
79
+ pending "returns a subclass instance" do
80
+ (@array * 0).should be_an_instance_of(ArraySpecs::MyArray)
81
+ (@array * 1).should be_an_instance_of(ArraySpecs::MyArray)
82
+ (@array * 2).should be_an_instance_of(ArraySpecs::MyArray)
83
+ end
84
+
85
+ it "does not call #initialize on the subclass instance" do
86
+ (@array * 2).should == [1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
87
+ ScratchPad.recorded.should be_nil
88
+ end
89
+ end
90
+
91
+ ruby_version_is '' ... '1.9' do
92
+ it "does not copy the taint status of the original array if the passed count is 0" do
93
+ ary = [1, 2, 3]
94
+ ary.taint
95
+ (ary * 0).tainted?.should == false
96
+ end
97
+ end
98
+ ruby_version_is '1.9' do
99
+ pending "copies the taint status of the original array even if the passed count is 0" do
100
+ ary = [1, 2, 3]
101
+ ary.taint
102
+ (ary * 0).tainted?.should == true
103
+ end
104
+ end
105
+
106
+ pending "copies the taint status of the original array even if the array is empty" do
107
+ ary = []
108
+ ary.taint
109
+ (ary * 3).tainted?.should == true
110
+ end
111
+
112
+ pending "copies the taint status of the original array if the passed count is not 0" do
113
+ ary = [1, 2, 3]
114
+ ary.taint
115
+ (ary * 1).tainted?.should == true
116
+ (ary * 2).tainted?.should == true
117
+ end
118
+
119
+ ruby_version_is '1.9' do
120
+ pending "copies the untrusted status of the original array even if the passed count is 0" do
121
+ ary = [1, 2, 3]
122
+ ary.untrust
123
+ (ary * 0).untrusted?.should == true
124
+ end
125
+
126
+ pending "copies the untrusted status of the original array even if the array is empty" do
127
+ ary = []
128
+ ary.untrust
129
+ (ary * 3).untrusted?.should == true
130
+ end
131
+
132
+ pending "copies the untrusted status of the original array if the passed count is not 0" do
133
+ ary = [1, 2, 3]
134
+ ary.untrust
135
+ (ary * 1).untrusted?.should == true
136
+ (ary * 2).untrusted?.should == true
137
+ end
6
138
  end
7
139
  end
8
140
 
9
141
  describe "Array#* with a string" do
10
- it "returns a string formed by concatenating each element with separator" do
11
- ([1, 2, 3, 4, 5] * ' | ').should == "1 | 2 | 3 | 4 | 5"
142
+ pending do
143
+ it_behaves_like :array_join_with_string_separator, :*
12
144
  end
13
- end
145
+ end
@@ -1,12 +1,32 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+ require File.expand_path('../fixtures/classes', __FILE__)
3
+
1
4
  describe "Array.new" do
2
5
  it "returns an instance of Array" do
3
6
  Array.new.should be_kind_of(Array)
4
7
  end
8
+
9
+ pending "returns an instance of a subclass" do
10
+ ArraySpecs::MyArray.new(1, 2).should be_an_instance_of(ArraySpecs::MyArray)
11
+ end
12
+
13
+ pending "raise an ArgumentError if passed 3 or more arguments" do
14
+ lambda do
15
+ [1, 2].send :initialize, 1, 'x', true
16
+ end.should raise_error(ArgumentError)
17
+ lambda do
18
+ [1, 2].send(:initialize, 1, 'x', true) {}
19
+ end.should raise_error(ArgumentError)
20
+ end
5
21
  end
6
22
 
7
23
  describe "Array.new with no arguments" do
8
- it "returns an empty array" do
9
- Array.new.empty?.should be_true
24
+ pending "returns an empty array" do
25
+ Array.new.should be_empty
26
+ end
27
+
28
+ it "does not use the given block" do
29
+ lambda{ Array.new { raise } }.should_not raise_error
10
30
  end
11
31
  end
12
32
 
@@ -15,6 +35,27 @@ describe "Array.new with (array)" do
15
35
  b = [4, 5, 6]
16
36
  Array.new(b).should == b
17
37
  end
38
+
39
+ it "does not use the given block" do
40
+ lambda{ Array.new([1, 2]) { raise } }.should_not raise_error
41
+ end
42
+
43
+ pending "calls #to_ary to convert the value to an array" do
44
+ a = mock("array")
45
+ a.should_receive(:to_ary).and_return([1, 2])
46
+ a.should_not_receive(:to_int)
47
+ Array.new(a).should == [1, 2]
48
+ end
49
+
50
+ pending "does not call #to_ary on instances of Array or subclasses of Array" do
51
+ a = [1, 2]
52
+ a.should_not_receive(:to_ary)
53
+ Array.new(a)
54
+ end
55
+
56
+ pending "raises a TypeError if an Array type argument and a default object" do
57
+ lambda { Array.new([1, 2], 1) }.should raise_error(TypeError)
58
+ end
18
59
  end
19
60
 
20
61
  describe "Array.new with (size, object=nil)" do
@@ -30,6 +71,45 @@ describe "Array.new with (size, object=nil)" do
30
71
  Array.new(3).should == [nil, nil, nil]
31
72
  end
32
73
 
74
+ pending "raises an ArgumentError if size is negative" do
75
+ lambda { Array.new(-1, :a) }.should raise_error(ArgumentError)
76
+ lambda { Array.new(-1) }.should raise_error(ArgumentError)
77
+ end
78
+
79
+ pending do
80
+ platform_is :wordsize => 32 do
81
+ it "raises an ArgumentError if size is too large" do
82
+ max_size = ArraySpecs.max_32bit_size
83
+ lambda { Array.new(max_size + 1) }.should raise_error(ArgumentError)
84
+ end
85
+ end
86
+
87
+ platform_is :wordsize => 64 do
88
+ it "raises an ArgumentError if size is too large" do
89
+ max_size = ArraySpecs.max_64bit_size
90
+ lambda { Array.new(max_size + 1) }.should raise_error(ArgumentError)
91
+ end
92
+ end
93
+ end
94
+
95
+ pending "calls #to_int to convert the size argument to an Integer when object is given" do
96
+ obj = mock('1')
97
+ obj.should_receive(:to_int).and_return(1)
98
+ Array.new(obj, :a).should == [:a]
99
+ end
100
+
101
+ pending "calls #to_int to convert the size argument to an Integer when object is not given" do
102
+ obj = mock('1')
103
+ obj.should_receive(:to_int).and_return(1)
104
+ Array.new(obj).should == [nil]
105
+ end
106
+
107
+ pending "raises a TypeError if the size argument is not an Integer type" do
108
+ obj = mock('nonnumeric')
109
+ obj.stub!(:to_ary).and_return([1, 2])
110
+ lambda{ Array.new(obj, :a) }.should raise_error(TypeError)
111
+ end
112
+
33
113
  it "yields the index of the element and sets the element to the value of the block" do
34
114
  Array.new(3) { |i| i.to_s }.should == ['0', '1', '2']
35
115
  end
@@ -37,4 +117,13 @@ describe "Array.new with (size, object=nil)" do
37
117
  it "uses the block value instead of using the default value" do
38
118
  Array.new(3, :obj) { |i| i.to_s }.should == ['0', '1', '2']
39
119
  end
40
- end
120
+
121
+ pending "returns the value passed to break" do
122
+ a = Array.new(3) do |i|
123
+ break if i == 2
124
+ i.to_s
125
+ end
126
+
127
+ a.should == nil
128
+ end
129
+ end