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,10 +1,90 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+ require File.expand_path('../fixtures/classes', __FILE__)
3
+
1
4
  describe "Array#flatten" do
2
5
  it "returns a one-dimensional flattening recursively" do
3
- [[[1, [2, 3]], [2, 3, [4, [4, [5, 5]], [1, 2, 3]]], [4]], []].flatten.should == [1, 2, 3, 2, 3, 4, 4, 5, 5, 1, 2, 3, 4]
6
+ [[[1, [2, 3]],[2, 3, [4, [4, [5, 5]], [1, 2, 3]]], [4]], []].flatten.should == [1, 2, 3, 2, 3, 4, 4, 5, 5, 1, 2, 3, 4]
7
+ end
8
+
9
+ ruby_version_is "1.8.7" do
10
+ it "takes an optional argument that determines the level of recursion" do
11
+ [ 1, 2, [3, [4, 5] ] ].flatten(1).should == [1, 2, 3, [4, 5]]
12
+ end
13
+
14
+ ruby_version_is ""..."1.9" do
15
+ it "returns self when the level of recursion is 0" do
16
+ a = [ 1, 2, [3, [4, 5] ] ]
17
+ a.flatten(0).should equal(a)
18
+ end
19
+ end
20
+
21
+ ruby_version_is "1.9" do
22
+ it "returns dup when the level of recursion is 0" do
23
+ a = [ 1, 2, [3, [4, 5] ] ]
24
+ a.flatten(0).should == a
25
+ a.flatten(0).should_not equal(a)
26
+ end
27
+ end
28
+
29
+ it "ignores negative levels" do
30
+ [ 1, 2, [ 3, 4, [5, 6] ] ].flatten(-1).should == [1, 2, 3, 4, 5, 6]
31
+ [ 1, 2, [ 3, 4, [5, 6] ] ].flatten(-10).should == [1, 2, 3, 4, 5, 6]
32
+ end
33
+
34
+ it "tries to convert passed Objects to Integers using #to_int" do
35
+ obj = mock("Converted to Integer")
36
+ obj.should_receive(:to_int).and_return(1)
37
+
38
+ [ 1, 2, [3, [4, 5] ] ].flatten(obj).should == [1, 2, 3, [4, 5]]
39
+ end
40
+
41
+ it "raises a TypeError when the passed Object can't be converted to an Integer" do
42
+ obj = mock("Not converted")
43
+ lambda { [ 1, 2, [3, [4, 5] ] ].flatten(obj) }.should raise_error(TypeError)
44
+ end
45
+ end
46
+
47
+ it "does not call flatten on elements" do
48
+ obj = mock('[1,2]')
49
+ obj.should_not_receive(:flatten)
50
+ [obj, obj].flatten.should == [obj, obj]
51
+
52
+ obj = [5, 4]
53
+ obj.should_not_receive(:flatten)
54
+ [obj, obj].flatten.should == [5, 4, 5, 4]
4
55
  end
5
56
 
6
- it "takes an optional argument that determines the level of recursion" do
7
- [1, 2, [3, [4, 5]]].flatten(1).should == [1, 2, 3, [4, 5]]
57
+ it "raises an ArgumentError on recursive arrays" do
58
+ x = []
59
+ x << x
60
+ lambda { x.flatten }.should raise_error(ArgumentError)
61
+
62
+ x = []
63
+ y = []
64
+ x << y
65
+ y << x
66
+ lambda { x.flatten }.should raise_error(ArgumentError)
67
+ end
68
+
69
+ it "flattens any element which responds to #to_ary, using the return value of said method" do
70
+ x = mock("[3,4]")
71
+ x.should_receive(:to_ary).at_least(:once).and_return([3, 4])
72
+ [1, 2, x, 5].flatten.should == [1, 2, 3, 4, 5]
73
+
74
+ y = mock("MyArray[]")
75
+ y.should_receive(:to_ary).at_least(:once).and_return(ArraySpecs::MyArray[])
76
+ [y].flatten.should == []
77
+
78
+ z = mock("[2,x,y,5]")
79
+ z.should_receive(:to_ary).and_return([2, x, y, 5])
80
+ [1, z, 6].flatten.should == [1, 2, 3, 4, 5, 6]
81
+ end
82
+
83
+ it "returns subclass instance for Array subclasses" do
84
+ ArraySpecs::MyArray[].flatten.should be_kind_of(ArraySpecs::MyArray)
85
+ ArraySpecs::MyArray[1, 2, 3].flatten.should be_kind_of(ArraySpecs::MyArray)
86
+ ArraySpecs::MyArray[1, [2], 3].flatten.should be_kind_of(ArraySpecs::MyArray)
87
+ [ArraySpecs::MyArray[1, 2, 3]].flatten.should be_kind_of(Array)
8
88
  end
9
89
 
10
90
  it "is not destructive" do
@@ -12,10 +92,30 @@ describe "Array#flatten" do
12
92
  ary.flatten
13
93
  ary.should == [1, [2, 3]]
14
94
  end
95
+
96
+ describe "with a non-Array object in the Array" do
97
+ before :each do
98
+ @obj = mock("Array#flatten")
99
+ end
100
+
101
+ it "does not call #to_ary if the method does not exist" do
102
+ [@obj].flatten.should == [@obj]
103
+ end
104
+
105
+ it "ignores the return value of #to_ary if it is nil" do
106
+ @obj.should_receive(:to_ary).and_return(nil)
107
+ [@obj].flatten.should == [@obj]
108
+ end
109
+
110
+ it "raises a TypeError if the return value of #to_ary is not an Array" do
111
+ @obj.should_receive(:to_ary).and_return(1)
112
+ lambda { [@obj].flatten }.should raise_error(TypeError)
113
+ end
114
+ end
15
115
  end
16
116
 
17
117
  describe "Array#flatten!" do
18
- it "modified array to produce a one-dimensional flattening recursively" do
118
+ it "modifies array to produce a one-dimensional flattening recursively" do
19
119
  a = [[[1, [2, 3]],[2, 3, [4, [4, [5, 5]], [1, 2, 3]]], [4]], []]
20
120
  a.flatten!
21
121
  a.should == [1, 2, 3, 2, 3, 4, 4, 5, 5, 1, 2, 3, 4]
@@ -33,7 +133,100 @@ describe "Array#flatten!" do
33
133
  a.flatten!.should_not == nil
34
134
  end
35
135
 
36
- it "takes an optional argument that determines the level of recursion" do
37
- [1, 2, [3, [4, 5]]].flatten!(1).should == [1, 2, 3, [4, 5]]
136
+ ruby_version_is "1.8.7" do
137
+ it "takes an optional argument that determines the level of recursion" do
138
+ [ 1, 2, [3, [4, 5] ] ].flatten!(1).should == [1, 2, 3, [4, 5]]
139
+ end
140
+
141
+ ruby_bug "redmine #1440", "1.9.1" do
142
+ it "returns nil when the level of recursion is 0" do
143
+ a = [ 1, 2, [3, [4, 5] ] ]
144
+ a.flatten!(0).should == nil
145
+ end
146
+ end
147
+
148
+ it "treats negative levels as no arguments" do
149
+ [ 1, 2, [ 3, 4, [5, 6] ] ].flatten!(-1).should == [1, 2, 3, 4, 5, 6]
150
+ [ 1, 2, [ 3, 4, [5, 6] ] ].flatten!(-10).should == [1, 2, 3, 4, 5, 6]
151
+ end
152
+
153
+ it "tries to convert passed Objects to Integers using #to_int" do
154
+ obj = mock("Converted to Integer")
155
+ obj.should_receive(:to_int).and_return(1)
156
+
157
+ [ 1, 2, [3, [4, 5] ] ].flatten!(obj).should == [1, 2, 3, [4, 5]]
158
+ end
159
+
160
+ it "raises a TypeError when the passed Object can't be converted to an Integer" do
161
+ obj = mock("Not converted")
162
+ lambda { [ 1, 2, [3, [4, 5] ] ].flatten!(obj) }.should raise_error(TypeError)
163
+ end
164
+ end
165
+
166
+ it "does not call flatten! on elements" do
167
+ obj = mock('[1,2]')
168
+ obj.should_not_receive(:flatten!)
169
+ [obj, obj].flatten!.should == nil
170
+
171
+ obj = [5, 4]
172
+ obj.should_not_receive(:flatten!)
173
+ [obj, obj].flatten!.should == [5, 4, 5, 4]
174
+ end
175
+
176
+ it "raises an ArgumentError on recursive arrays" do
177
+ x = []
178
+ x << x
179
+ lambda { x.flatten! }.should raise_error(ArgumentError)
180
+
181
+ x = []
182
+ y = []
183
+ x << y
184
+ y << x
185
+ lambda { x.flatten! }.should raise_error(ArgumentError)
38
186
  end
39
- end
187
+
188
+ it "flattens any elements which responds to #to_ary, using the return value of said method" do
189
+ x = mock("[3,4]")
190
+ x.should_receive(:to_ary).at_least(:once).and_return([3, 4])
191
+ [1, 2, x, 5].flatten!.should == [1, 2, 3, 4, 5]
192
+
193
+ y = mock("MyArray[]")
194
+ y.should_receive(:to_ary).at_least(:once).and_return(ArraySpecs::MyArray[])
195
+ [y].flatten!.should == []
196
+
197
+ z = mock("[2,x,y,5]")
198
+ z.should_receive(:to_ary).and_return([2, x, y, 5])
199
+ [1, z, 6].flatten!.should == [1, 2, 3, 4, 5, 6]
200
+
201
+ ary = [ArraySpecs::MyArray[1, 2, 3]]
202
+ ary.flatten!
203
+ ary.should be_kind_of(Array)
204
+ ary.should == [1, 2, 3]
205
+ end
206
+
207
+ ruby_version_is ""..."1.9" do
208
+ it "raises a TypeError on frozen arrays when the array is modified" do
209
+ nested_ary = [1, 2, []]
210
+ nested_ary.freeze
211
+ lambda { nested_ary.flatten! }.should raise_error(TypeError)
212
+ end
213
+
214
+ it "does not raise on frozen arrays when the array would not be modified" do
215
+ ArraySpecs.frozen_array.flatten!.should be_nil
216
+ end
217
+ end
218
+
219
+ ruby_version_is "1.9" do
220
+ it "raises a RuntimeError on frozen arrays when the array is modified" do
221
+ nested_ary = [1, 2, []]
222
+ nested_ary.freeze
223
+ lambda { nested_ary.flatten! }.should raise_error(RuntimeError)
224
+ end
225
+
226
+ # see [ruby-core:23663]
227
+ it "raises a RuntimeError on frozen arrays when the array would not be modified" do
228
+ lambda { ArraySpecs.frozen_array.flatten! }.should raise_error(RuntimeError)
229
+ lambda { ArraySpecs.empty_frozen_array.flatten! }.should raise_error(RuntimeError)
230
+ end
231
+ end
232
+ end
@@ -0,0 +1,32 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+ require File.expand_path('../fixtures/classes', __FILE__)
3
+
4
+ describe "Array#frozen?" do
5
+ it "returns true if array is frozen" do
6
+ a = [1, 2, 3]
7
+ a.frozen?.should == false
8
+ a.freeze
9
+ a.frozen?.should == true
10
+ end
11
+
12
+ not_compliant_on :rubinius do
13
+ ruby_version_is "" .. "1.9" do
14
+ it "returns true for an array being sorted by #sort!" do
15
+ a = [1, 2, 3]
16
+ a.sort! { |x,y| a.frozen?.should == true; x <=> y }
17
+ end
18
+ end
19
+
20
+ ruby_version_is "1.9" do
21
+ it "returns false for an array being sorted by #sort!" do
22
+ a = [1, 2, 3]
23
+ a.sort! { |x,y| a.frozen?.should == false; x <=> y }
24
+ end
25
+ end
26
+
27
+ it "returns false for an array being sorted by #sort" do
28
+ a = [1, 2, 3]
29
+ a.sort { |x,y| a.frozen?.should == false; x <=> y }
30
+ end
31
+ end
32
+ 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#include?" do
2
5
  it "returns true if object is present, false otherwise" do
3
6
  [1, 2, "a", "b"].include?("c").should == false
@@ -15,4 +18,16 @@ describe "Array#include?" do
15
18
 
16
19
  [1, 2.0, 3].include?(2).should == true
17
20
  end
18
- end
21
+
22
+ it "calls == on elements from left to right until success" do
23
+ key = "x"
24
+ one = mock('one')
25
+ two = mock('two')
26
+ three = mock('three')
27
+ one.should_receive(:==).any_number_of_times.and_return(false)
28
+ two.should_receive(:==).any_number_of_times.and_return(true)
29
+ three.should_not_receive(:==)
30
+ ary = [one, two, three]
31
+ ary.include?(key).should == true
32
+ end
33
+ end
@@ -1,26 +1,6 @@
1
- describe "Array#index" do
2
- it "returns the index of the first element == to object" do
3
- [1, 2, 3, 4, 5, 6].index(3).should == 2
4
- [1, 2, 3, 4, 5, 6].index(4).should == 3
5
- end
6
-
7
- it "returns 0 if first element == to object" do
8
- [2, 1, 3, 2, 5].index(2).should == 0
9
- end
10
-
11
- it "returns size-1 if only last element == to object" do
12
- [2, 1, 3, 1, 5].index(5).should == 4
13
- end
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+ require File.expand_path('../shared/index', __FILE__)
14
3
 
15
- it "returns nil if no element == to object" do
16
- [2, 1, 1, 1, 1].index(3).should == nil
17
- end
18
-
19
- it "accepts a block instead of an argument" do
20
- [4, 2, 1, 5, 1, 3].index { |x| x < 2 }.should == 2
21
- end
22
-
23
- it "ignores the block if there is an argument" do
24
- [4, 2, 1, 5, 1, 3].index(5) { |x| x < 2 }.should == 3
25
- end
26
- end
4
+ describe "Array#index" do
5
+ it_behaves_like(:array_index, :index)
6
+ 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#insert" do
2
5
  it "returns self" do
3
6
  ary = []
@@ -43,14 +46,45 @@ describe "Array#insert" do
43
46
  end
44
47
 
45
48
  it "raises an IndexError if the negative index is out of bounds" do
46
- lambda { [].insert(-2, 1) }.should raise_error(IndexError)
49
+ lambda { [].insert(-2, 1) }.should raise_error(IndexError)
47
50
  lambda { [1].insert(-3, 2) }.should raise_error(IndexError)
48
51
  end
49
52
 
50
- it "does nothing if no object is passed" do
53
+ it "does nothing of no object is passed" do
51
54
  [].insert(0).should == []
52
55
  [].insert(-1).should == []
53
56
  [].insert(10).should == []
54
57
  [].insert(-2).should == []
55
58
  end
56
- end
59
+
60
+ it "tries to convert the passed position argument to an Integer using #to_int" do
61
+ obj = mock('2')
62
+ obj.should_receive(:to_int).and_return(2)
63
+ [].insert(obj, 'x').should == [nil, nil, 'x']
64
+ end
65
+
66
+ it "raises an ArgumentError if no argument passed" do
67
+ lambda { [].insert() }.should raise_error(ArgumentError)
68
+ end
69
+
70
+ ruby_version_is ""..."1.9" do
71
+ it "raises a TypeError on frozen arrays when the array is modified" do
72
+ lambda { ArraySpecs.frozen_array.insert(0, 'x') }.should raise_error(TypeError)
73
+ end
74
+
75
+ it "does not raise on frozen arrays when the array would not be modified" do
76
+ ArraySpecs.frozen_array.insert(0).should == [1, 2, 3]
77
+ end
78
+ end
79
+
80
+ ruby_version_is "1.9" do
81
+ it "raises a RuntimeError on frozen arrays when the array is modified" do
82
+ lambda { ArraySpecs.frozen_array.insert(0, 'x') }.should raise_error(RuntimeError)
83
+ end
84
+
85
+ # see [ruby-core:23666]
86
+ it "raises a RuntimeError on frozen arrays when the array would not be modified" do
87
+ lambda { ArraySpecs.frozen_array.insert(0) }.should raise_error(RuntimeError)
88
+ end
89
+ end
90
+ end
@@ -1,13 +1,7 @@
1
- describe "Array#inspect" do
2
- it "returns a String" do
3
- [1, 2, 3].inspect.should be_kind_of(String)
4
- end
5
-
6
- it "returns '[]' for an empty Array" do
7
- [].inspect.should == "[]"
8
- end
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+ require File.expand_path('../fixtures/classes', __FILE__)
3
+ require File.expand_path('../shared/inspect', __FILE__)
9
4
 
10
- it "calls inspect on its elements and joins the results with commas" do
11
- [0, 1, 2].inspect.should == "[0, 1, 2]"
12
- end
13
- end
5
+ describe "Array#inspect" do
6
+ it_behaves_like :array_inspect, :inspect
7
+ end
@@ -1,17 +1,20 @@
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 with elements common to both arrays (intersection)" do
3
6
  ([] & []).should == []
4
7
  ([1, 2] & []).should == []
5
8
  ([] & [1, 2]).should == []
6
- ([1, 3, 5] & [1, 2, 3]).should == [1, 3]
9
+ ([ 1, 3, 5 ] & [ 1, 2, 3 ]).should == [1, 3]
7
10
  end
8
11
 
9
12
  it "creates an array with no duplicates" do
10
- ([1, 1, 3, 5] & [1, 2, 3]).uniq!.should == nil
13
+ ([ 1, 1, 3, 5 ] & [ 1, 2, 3 ]).uniq!.should == nil
11
14
  end
12
15
 
13
16
  it "creates an array with elements in order they are first encountered" do
14
- ([1, 2, 3, 2, 5] & [5, 2, 3, 4]).should == [2, 3, 5]
17
+ ([ 1, 2, 3, 2, 5 ] & [ 5, 2, 3, 4 ]).should == [2, 3, 5]
15
18
  end
16
19
 
17
20
  it "does not modify the original Array" do
@@ -19,4 +22,52 @@ describe "Array#&" do
19
22
  a & [1, 2, 3]
20
23
  a.should == [1, 1, 3, 5]
21
24
  end
22
- end
25
+
26
+ ruby_bug "ruby-core #1448", "1.9.1" do
27
+ it "properly handles recursive arrays" do
28
+ empty = ArraySpecs.empty_recursive_array
29
+ (empty & empty).should == empty
30
+
31
+ (ArraySpecs.recursive_array & []).should == []
32
+ ([] & ArraySpecs.recursive_array).should == []
33
+
34
+ (ArraySpecs.recursive_array & ArraySpecs.recursive_array).should == [1, 'two', 3.0, ArraySpecs.recursive_array]
35
+ end
36
+ end
37
+
38
+ it "tries to convert the passed argument to an Array using #to_ary" do
39
+ obj = mock('[1,2,3]')
40
+ obj.should_receive(:to_ary).and_return([1, 2, 3])
41
+ ([1, 2] & obj).should == ([1, 2])
42
+ end
43
+
44
+ it "determines equivalence between elements in the sense of eql?" do
45
+ ([5.0, 4.0] & [5, 4]).should == []
46
+ str = "x"
47
+ ([str] & [str.dup]).should == [str]
48
+
49
+ obj1 = mock('1')
50
+ obj2 = mock('2')
51
+ def obj1.hash; 0; end
52
+ def obj2.hash; 0; end
53
+ def obj1.eql? a; true; end
54
+ def obj2.eql? a; true; end
55
+
56
+ ([obj1] & [obj2]).should == [obj1]
57
+
58
+ def obj1.eql? a; false; end
59
+ def obj2.eql? a; false; end
60
+
61
+ ([obj1] & [obj2]).should == []
62
+ end
63
+
64
+ it "does return subclass instances for Array subclasses" do
65
+ (ArraySpecs::MyArray[1, 2, 3] & []).should be_kind_of(Array)
66
+ (ArraySpecs::MyArray[1, 2, 3] & ArraySpecs::MyArray[1, 2, 3]).should be_kind_of(Array)
67
+ ([] & ArraySpecs::MyArray[1, 2, 3]).should be_kind_of(Array)
68
+ end
69
+
70
+ it "does not call to_ary on array subclasses" do
71
+ ([5, 6] & ArraySpecs::ToAryArray[1, 2, 5, 6]).should == [5, 6]
72
+ end
73
+ end