opal 0.3.18 → 0.3.19

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 (259) hide show
  1. data/.gitignore +1 -1
  2. data/Gemfile +1 -3
  3. data/README.md +472 -10
  4. data/Rakefile +10 -52
  5. data/core/array.rb +9 -14
  6. data/core/basic_object.rb +7 -10
  7. data/core/boolean.rb +5 -1
  8. data/core/class.rb +15 -38
  9. data/core/dir.rb +89 -0
  10. data/core/enumerable.rb +133 -57
  11. data/core/error.rb +15 -1
  12. data/core/file.rb +85 -0
  13. data/core/hash.rb +186 -32
  14. data/core/kernel.rb +30 -31
  15. data/core/load_order +4 -2
  16. data/core/module.rb +42 -62
  17. data/core/numeric.rb +7 -1
  18. data/core/object.rb +1 -1
  19. data/core/proc.rb +6 -2
  20. data/core/range.rb +16 -28
  21. data/core/regexp.rb +3 -3
  22. data/core/runtime.js +281 -350
  23. data/core/string.rb +100 -110
  24. data/docs/CNAME +1 -0
  25. data/docs/Rakefile +55 -0
  26. data/docs/css/styles.css +50 -0
  27. data/docs/css/syntax.css +63 -0
  28. data/docs/layout/post.html +3 -0
  29. data/docs/layout/pre.html +11 -0
  30. data/examples/dependencies/app.rb +3 -0
  31. data/lib/opal.rb +2 -1
  32. data/lib/opal/builder.rb +36 -10
  33. data/lib/opal/builder_task.rb +51 -24
  34. data/lib/opal/grammar.rb +2509 -2439
  35. data/lib/opal/grammar.y +38 -5
  36. data/lib/opal/lexer.rb +18 -2
  37. data/lib/opal/parser.rb +375 -349
  38. data/lib/opal/scope.rb +24 -2
  39. data/lib/opal/version.rb +1 -1
  40. data/spec/builder/build_order_spec.rb +20 -0
  41. data/spec/builder/lib_name_for_spec.rb +24 -0
  42. data/spec/grammar/call_spec.rb +9 -6
  43. data/spec/grammar/lambda_spec.rb +64 -0
  44. data/spec/grammar/sclass_spec.rb +5 -3
  45. data/{core/spec → test}/core/array/allocate_spec.rb +0 -0
  46. data/{core/spec → test}/core/array/append_spec.rb +0 -0
  47. data/{core/spec → test}/core/array/assoc_spec.rb +0 -0
  48. data/{core/spec → test}/core/array/at_spec.rb +0 -0
  49. data/{core/spec → test}/core/array/clear_spec.rb +0 -0
  50. data/{core/spec → test}/core/array/clone_spec.rb +0 -0
  51. data/{core/spec → test}/core/array/collect_spec.rb +0 -0
  52. data/{core/spec → test}/core/array/compact_spec.rb +0 -0
  53. data/{core/spec → test}/core/array/concat_spec.rb +0 -0
  54. data/{core/spec → test}/core/array/constructor_spec.rb +0 -0
  55. data/{core/spec → test}/core/array/count_spec.rb +0 -0
  56. data/{core/spec → test}/core/array/delete_at_spec.rb +0 -0
  57. data/{core/spec → test}/core/array/delete_if_spec.rb +0 -0
  58. data/{core/spec → test}/core/array/delete_spec.rb +0 -0
  59. data/{core/spec → test}/core/array/each_index_spec.rb +0 -0
  60. data/{core/spec → test}/core/array/each_spec.rb +0 -0
  61. data/{core/spec → test}/core/array/element_reference_spec.rb +0 -0
  62. data/{core/spec → test}/core/array/empty_spec.rb +0 -0
  63. data/{core/spec → test}/core/array/eql_spec.rb +0 -0
  64. data/{core/spec → test}/core/array/fetch_spec.rb +0 -0
  65. data/{core/spec → test}/core/array/first_spec.rb +0 -0
  66. data/{core/spec → test}/core/array/flatten_spec.rb +0 -0
  67. data/{core/spec → test}/core/array/include_spec.rb +0 -0
  68. data/{core/spec → test}/core/array/insert_spec.rb +0 -0
  69. data/{core/spec → test}/core/array/last_spec.rb +0 -0
  70. data/{core/spec → test}/core/array/length_spec.rb +0 -0
  71. data/{core/spec → test}/core/array/map_spec.rb +0 -0
  72. data/{core/spec → test}/core/array/plus_spec.rb +0 -0
  73. data/{core/spec → test}/core/array/pop_spec.rb +0 -0
  74. data/{core/spec → test}/core/array/push_spec.rb +0 -0
  75. data/{core/spec → test}/core/array/rassoc_spec.rb +0 -0
  76. data/{core/spec → test}/core/array/reject_spec.rb +0 -0
  77. data/{core/spec → test}/core/array/replace_spec.rb +0 -0
  78. data/{core/spec → test}/core/array/reverse_each_spec.rb +0 -0
  79. data/{core/spec → test}/core/array/reverse_spec.rb +0 -0
  80. data/{core/spec → test}/core/array/size_spec.rb +0 -0
  81. data/{core/spec → test}/core/array/to_ary_spec.rb +0 -0
  82. data/{core/spec → test}/core/array/uniq_spec.rb +0 -0
  83. data/{core/spec → test}/core/array/zip_spec.rb +0 -0
  84. data/test/core/class/fixtures/classes.rb +9 -0
  85. data/test/core/class/new_spec.rb +108 -0
  86. data/{core/spec → test}/core/enumerable/all_spec.rb +0 -0
  87. data/{core/spec → test}/core/enumerable/any_spec.rb +0 -0
  88. data/{core/spec → test}/core/enumerable/collect_spec.rb +0 -0
  89. data/{core/spec → test}/core/enumerable/count_spec.rb +0 -0
  90. data/test/core/enumerable/detect_spec.rb +48 -0
  91. data/test/core/enumerable/drop_spec.rb +17 -0
  92. data/test/core/enumerable/drop_while_spec.rb +24 -0
  93. data/test/core/enumerable/each_with_index_spec.rb +11 -0
  94. data/test/core/enumerable/each_with_object_spec.rb +17 -0
  95. data/test/core/enumerable/entries_spec.rb +6 -0
  96. data/test/core/enumerable/find_all_spec.rb +13 -0
  97. data/test/core/enumerable/find_index_spec.rb +45 -0
  98. data/test/core/enumerable/find_spec.rb +48 -0
  99. data/test/core/enumerable/first_spec.rb +40 -0
  100. data/{core/spec → test}/core/enumerable/fixtures/classes.rb +19 -0
  101. data/test/core/enumerable/grep_spec.rb +21 -0
  102. data/test/core/enumerable/take_spec.rb +40 -0
  103. data/test/core/enumerable/to_a_spec.rb +6 -0
  104. data/{core/spec → test}/core/false/and_spec.rb +0 -0
  105. data/{core/spec → test}/core/false/inspect_spec.rb +0 -0
  106. data/{core/spec → test}/core/false/or_spec.rb +0 -0
  107. data/{core/spec → test}/core/false/to_s_spec.rb +0 -0
  108. data/{core/spec → test}/core/false/xor_spec.rb +0 -0
  109. data/test/core/file/expand_path_spec.rb +20 -0
  110. data/{core/spec → test}/core/hash/allocate_spec.rb +0 -0
  111. data/{core/spec → test}/core/hash/assoc_spec.rb +0 -0
  112. data/{core/spec → test}/core/hash/clear_spec.rb +0 -0
  113. data/{core/spec → test}/core/hash/clone_spec.rb +0 -0
  114. data/test/core/hash/default_spec.rb +9 -0
  115. data/{core/spec → test}/core/hash/delete_if_spec.rb +0 -0
  116. data/test/core/hash/each_key_spec.rb +15 -0
  117. data/test/core/hash/each_pair_spec.rb +30 -0
  118. data/test/core/hash/each_spec.rb +30 -0
  119. data/test/core/hash/each_value_spec.rb +15 -0
  120. data/{core/spec → test}/core/hash/element_reference_spec.rb +14 -0
  121. data/{core/spec → test}/core/hash/element_set_spec.rb +1 -0
  122. data/test/core/hash/empty_spec.rb +10 -0
  123. data/test/core/hash/fetch_spec.rb +24 -0
  124. data/test/core/hash/flatten_spec.rb +46 -0
  125. data/test/core/hash/has_key_spec.rb +24 -0
  126. data/test/core/hash/has_value_spec.rb +12 -0
  127. data/test/core/hash/include_spec.rb +24 -0
  128. data/test/core/hash/index_spec.rb +13 -0
  129. data/test/core/hash/indexes_spec.rb +9 -0
  130. data/test/core/hash/indices_spec.rb +9 -0
  131. data/test/core/hash/invert_spec.rb +12 -0
  132. data/test/core/hash/keep_if_spec.rb +18 -0
  133. data/test/core/hash/key_spec.rb +24 -0
  134. data/test/core/hash/keys_spec.rb +10 -0
  135. data/test/core/hash/length_spec.rb +10 -0
  136. data/test/core/hash/member_spec.rb +24 -0
  137. data/{core/spec → test}/core/hash/merge_spec.rb +0 -0
  138. data/{core/spec → test}/core/hash/new_spec.rb +0 -0
  139. data/test/core/hash/rassoc_spec.rb +34 -0
  140. data/test/core/hash/replace_spec.rb +7 -0
  141. data/test/core/hash/select_spec.rb +52 -0
  142. data/test/core/hash/shift_spec.rb +19 -0
  143. data/test/core/hash/size_spec.rb +10 -0
  144. data/test/core/hash/update_spec.rb +17 -0
  145. data/test/core/hash/value_spec.rb +12 -0
  146. data/test/core/hash/values_at_spec.rb +9 -0
  147. data/test/core/hash/values_spec.rb +7 -0
  148. data/test/core/kernel/eql_spec.rb +15 -0
  149. data/test/core/kernel/equal_value_spec.rb +12 -0
  150. data/test/core/kernel/loop_spec.rb +23 -0
  151. data/test/core/kernel/nil_spec.rb +7 -0
  152. data/test/core/kernel/proc_spec.rb +9 -0
  153. data/test/core/kernel/rand_spec.rb +14 -0
  154. data/test/core/kernel/respond_to_spec.rb +24 -0
  155. data/test/core/kernel/send_spec.rb +56 -0
  156. data/test/core/kernel/tap_spec.rb +10 -0
  157. data/test/core/kernel/to_s_spec.rb +5 -0
  158. data/{core/spec → test}/core/matchdata/to_a_spec.rb +0 -0
  159. data/{core/spec → test}/core/nil/and_spec.rb +0 -0
  160. data/{core/spec → test}/core/nil/inspect_spec.rb +0 -0
  161. data/{core/spec → test}/core/nil/nil_spec.rb +0 -0
  162. data/{core/spec → test}/core/nil/or_spec.rb +0 -0
  163. data/{core/spec → test}/core/nil/to_a_spec.rb +0 -0
  164. data/{core/spec → test}/core/nil/to_f_spec.rb +0 -0
  165. data/{core/spec → test}/core/nil/to_i_spec.rb +0 -0
  166. data/{core/spec → test}/core/nil/to_s_spec.rb +0 -0
  167. data/{core/spec → test}/core/nil/xor_spec.rb +0 -0
  168. data/{core/spec → test}/core/numeric/equal_value_spec.rb +0 -0
  169. data/test/core/range/begin_spec.rb +9 -0
  170. data/test/core/range/case_compare_spec.rb +16 -0
  171. data/test/core/range/end_spec.rb +9 -0
  172. data/{core/spec → test}/core/regexp/match_spec.rb +0 -0
  173. data/test/core/string/capitalize_spec.rb +10 -0
  174. data/test/core/string/casecmp_spec.rb +16 -0
  175. data/test/core/string/chomp_spec.rb +43 -0
  176. data/test/core/string/chop_spec.rb +10 -0
  177. data/test/core/string/chr_spec.rb +13 -0
  178. data/test/core/string/comparison_spec.rb +13 -0
  179. data/test/core/string/downcase_spec.rb +6 -0
  180. data/test/core/string/element_reference_spec.rb +72 -0
  181. data/test/core/string/empty_spec.rb +8 -0
  182. data/test/core/string/end_with_spec.rb +12 -0
  183. data/test/core/string/fixtures/classes.rb +3 -0
  184. data/test/core/string/gsub_spec.rb +17 -0
  185. data/test/core/string/include_spec.rb +12 -0
  186. data/test/core/string/intern_spec.rb +9 -0
  187. data/test/core/string/length_spec.rb +9 -0
  188. data/test/core/string/lstrip_spec.rb +7 -0
  189. data/test/core/string/match_spec.rb +27 -0
  190. data/test/core/string/next_spec.rb +10 -0
  191. data/test/core/string/ord_spec.rb +9 -0
  192. data/test/core/string/partition_spec.rb +10 -0
  193. data/test/core/string/reverse_spec.rb +7 -0
  194. data/test/core/string/rstrip_spec.rb +7 -0
  195. data/test/core/string/size_spec.rb +9 -0
  196. data/test/core/string/slice_spec.rb +72 -0
  197. data/test/core/string/split_spec.rb +5 -0
  198. data/test/core/string/start_with_spec.rb +12 -0
  199. data/test/core/string/strip_spec.rb +6 -0
  200. data/test/core/string/sub_spec.rb +22 -0
  201. data/test/core/string/succ_spec.rb +10 -0
  202. data/test/core/string/sum_spec.rb +5 -0
  203. data/test/core/string/swapcase_spec.rb +18 -0
  204. data/test/core/string/to_a_spec.rb +9 -0
  205. data/test/core/string/to_f_spec.rb +14 -0
  206. data/test/core/string/to_i_spec.rb +25 -0
  207. data/test/core/string/to_s_spec.rb +13 -0
  208. data/test/core/string/to_str_spec.rb +13 -0
  209. data/test/core/string/to_sym_spec.rb +9 -0
  210. data/test/core/string/upcase_spec.rb +6 -0
  211. data/test/core/symbol/to_proc_spec.rb +12 -0
  212. data/{core/spec → test}/core/true/and_spec.rb +0 -0
  213. data/{core/spec → test}/core/true/inspect_spec.rb +0 -0
  214. data/{core/spec → test}/core/true/or_spec.rb +0 -0
  215. data/{core/spec → test}/core/true/to_s_spec.rb +0 -0
  216. data/{core/spec → test}/core/true/xor_spec.rb +0 -0
  217. data/test/index.html +11 -0
  218. data/{core/spec → test}/language/alias_spec.rb +4 -0
  219. data/{core/spec → test}/language/and_spec.rb +0 -0
  220. data/{core/spec → test}/language/array_spec.rb +0 -0
  221. data/{core/spec → test}/language/block_spec.rb +0 -0
  222. data/{core/spec → test}/language/break_spec.rb +0 -0
  223. data/{core/spec → test}/language/case_spec.rb +0 -0
  224. data/{core/spec → test}/language/defined_spec.rb +0 -0
  225. data/{core/spec → test}/language/ensure_spec.rb +0 -0
  226. data/test/language/fixtures/yield.rb +23 -0
  227. data/{core/spec → test}/language/hash_spec.rb +0 -0
  228. data/{core/spec → test}/language/if_spec.rb +0 -0
  229. data/test/language/literal_lambda_spec.rb +47 -0
  230. data/{core/spec → test}/language/loop_spec.rb +0 -0
  231. data/{core/spec → test}/language/metaclass_spec.rb +0 -0
  232. data/{core/spec → test}/language/next_spec.rb +0 -0
  233. data/{core/spec → test}/language/or_spec.rb +0 -0
  234. data/{core/spec → test}/language/predefined_spec.rb +0 -0
  235. data/{core/spec → test}/language/regexp_spec.rb +0 -0
  236. data/{core/spec → test}/language/send_spec.rb +0 -0
  237. data/{core/spec → test}/language/singleton_class_spec.rb +0 -0
  238. data/{core/spec → test}/language/super_spec.rb +0 -0
  239. data/{core/spec → test}/language/symbol_spec.rb +0 -0
  240. data/{core/spec → test}/language/undef_spec.rb +0 -0
  241. data/{core/spec → test}/language/unless_spec.rb +0 -0
  242. data/{core/spec → test}/language/until_spec.rb +0 -0
  243. data/{core/spec → test}/language/variables_spec.rb +0 -0
  244. data/{core/spec → test}/language/while_spec.rb +0 -0
  245. data/test/language/yield_spec.rb +100 -0
  246. data/test/opal/array/subclassing_spec.rb +32 -0
  247. data/test/opal/class/bridge_class_spec.rb +37 -0
  248. data/test/opal/exception/subclassing_spec.rb +17 -0
  249. data/test/opal/runtime/_methods_spec.rb +48 -0
  250. data/test/opal/runtime/class_hierarchy_spec.rb +22 -0
  251. data/test/opal/runtime/def_spec.rb +23 -0
  252. data/test/opal/string/subclassing_spec.rb +26 -0
  253. data/test/spec_helper.rb +3 -0
  254. metadata +437 -111
  255. data/core/spec/core/class/new_spec.rb +0 -16
  256. data/core/spec/core/hash/default_spec.rb +0 -4
  257. data/core/spec/core/symbol/to_proc_spec.rb +0 -6
  258. data/core/spec/index.html +0 -11
  259. data/spec/builder/build_source_spec.rb +0 -52
@@ -0,0 +1,48 @@
1
+ describe "Enumerable#detect" do
2
+ before :each do
3
+ ScratchPad.record []
4
+ @elements = [2, 4, 6, 8, 10]
5
+ @numerous = EnumerableSpecs::Numerous.new(*@elements)
6
+ @empty = []
7
+ end
8
+
9
+ it "passes each entry in enum to block while block when block is false" do
10
+ visited_elements = []
11
+ @numerous.detect do |element|
12
+ visited_elements << element
13
+ false
14
+ end
15
+ visited_elements.should == @elements
16
+ end
17
+
18
+ it "returns nil when the block is false and there is no ifnone proc given" do
19
+ @numerous.detect {|e| false}.should == nil
20
+ end
21
+
22
+ it "returns the first element for which the block is not false" do
23
+ @elements.each do |element|
24
+ @numerous.detect {|e| e > element -1 }.should == element
25
+ end
26
+ end
27
+
28
+ it "returns the value of the ifnone proc if the block is false" do
29
+ fail_proc = lambda { "cheeseburgers" }
30
+ @numerous.detect(fail_proc) {|e| false }.should == "cheeseburgers"
31
+ end
32
+
33
+ it "doesn't call the ifnone proc if an element is found" do
34
+ fail_proc = lambda { raise "This should't have been called" }
35
+ @numerous.detect(fail_proc) {|e| 2 == @elements.first }.should == 2
36
+ end
37
+
38
+ it "calls the ifnone proc only once when the block is false" do
39
+ times = 0
40
+ fail_proc = lambda { times += 1; raise if times > 1; "cheeseburgers" }
41
+ @numerous.detect(fail_proc) {|e| false }.should == "cheeseburgers"
42
+ end
43
+
44
+ it "calls the ifnone proc when there are no elements" do
45
+ fail_proc = lambda { "yay" }
46
+ @empty.detect(fail_proc) {|e| true}.should == "yay"
47
+ end
48
+ end
@@ -0,0 +1,17 @@
1
+ describe "Enumerable#drop" do
2
+ before :each do
3
+ @enum = EnumerableSpecs::Numerous.new(3, 2, 1, :go)
4
+ end
5
+
6
+ describe "passed a number n as an argument" do
7
+ it "returns [] for empty enumerables" do
8
+ EnumerableSpecs::Empty.new.drop(0).should == []
9
+ EnumerableSpecs::Empty.new.drop(2).should == []
10
+ end
11
+
12
+ it "returns [] if dropping all" do
13
+ @enum.drop(5).should == []
14
+ EnumerableSpecs::Numerous.new(3, 2, 1, :go).drop(4).should == []
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,24 @@
1
+ describe "Enumerable#drop_while" do
2
+ before :each do
3
+ @enum = EnumerableSpecs::Numerous.new(3, 2, 1, :go)
4
+ end
5
+
6
+ it "returns an Enumerator if no block given" do
7
+ @enum.drop_while.should be_kind_of(Enumerator)
8
+ end
9
+
10
+ it "returns no/all elements for {true/false} block" do
11
+ @enum.drop_while {true}.should == []
12
+ @enum.drop_while {false}.should == @enum.to_a
13
+ end
14
+
15
+ it "accepts returns other than true/false" do
16
+ @enum.drop_while{1}.should == []
17
+ @enum.drop_while{nil}.should == @enum.to_a
18
+ end
19
+
20
+ it "passed elements to the block until the first false" do
21
+ a = []
22
+ @enum.drop_while{|obj| (a << obj).size < 3}.should == [1, :go]
23
+ end
24
+ end
@@ -0,0 +1,11 @@
1
+ describe "Enumerable#each_with_index" do
2
+ before :each do
3
+ @b = EnumerableSpecs::Numerous.new(2, 5, 3, 6, 1, 4)
4
+ end
5
+
6
+ it "passes each element and its index to block" do
7
+ @a = []
8
+ @b.each_with_index { |o, i| @a << [o, i] }
9
+ @a.should == [[2, 0], [5, 1], [3, 2], [6, 3], [1, 4], [4, 5]]
10
+ end
11
+ end
@@ -0,0 +1,17 @@
1
+ describe "Enumerable#each_with_object" do
2
+ before :each do
3
+ @values = [2, 5, 3, 6, 1, 4]
4
+ @enum = EnumerableSpecs::Numerous.new(*@values)
5
+ @initial = "memo"
6
+ end
7
+
8
+ it "passes each element and its argument to the block" do
9
+ acc = []
10
+ @enum.each_with_object(@initial) do |elem, obj|
11
+ obj.should equal(@initial)
12
+ obj = 42
13
+ acc << elem
14
+ end.should equal(@initial)
15
+ acc.should == @values
16
+ end
17
+ end
@@ -0,0 +1,6 @@
1
+ describe "Enumerable#entries" do
2
+ it "returns an array containing the elements" do
3
+ numerous = EnumerableSpecs::Numerous.new(1, nil, 'a', 2, false, true)
4
+ numerous.entries.should == [1, nil, "a", 2, false, true]
5
+ end
6
+ end
@@ -0,0 +1,13 @@
1
+ describe "Enumerable#find_all" do
2
+ before :each do
3
+ ScratchPad.record []
4
+ @elements = [1, 2, 3, 4, 5, 6, 7, 8, 9]
5
+ @numerous = EnumerableSpecs::Numerous.new(*@elements)
6
+ end
7
+
8
+ it "returns all elements for which the block is not false" do
9
+ @numerous.find_all {|i| i % 3 == 0 }.should == [3, 6, 9]
10
+ @numerous.find_all {|i| true }.should == @elements
11
+ @numerous.find_all {|i| false }.should == []
12
+ end
13
+ end
@@ -0,0 +1,45 @@
1
+ describe "Enumerable#find_index" do
2
+ before :each do
3
+ @elements = [2, 4, 6, 8, 10]
4
+ @numerous = EnumerableSpecs::Numerous.new(*@elements)
5
+ end
6
+
7
+ it "passes each entry in enum to block while block when block is false" do
8
+ visited_elements = []
9
+ @numerous.find_index do |element|
10
+ visited_elements << element
11
+ false
12
+ end
13
+ visited_elements.should == @elements
14
+ end
15
+
16
+ it "returns nil when the block is false" do
17
+ @numerous.find_index {|e| false }.should == nil
18
+ end
19
+
20
+ it "returns the first index for which the block is not false" do
21
+ @elements.each_with_index do |element, index|
22
+ @numerous.find_index {|e| e > element - 1 }.should == index
23
+ end
24
+ end
25
+
26
+ it "returns the first found index" do
27
+ repeated = [10, 11, 11, 13, 11, 13, 10, 10, 13, 11]
28
+ numerous_repeat = EnumerableSpecs::Numerous.new(*repeated)
29
+ repeated.each do |element|
30
+ numerous_repeat.find_index(element).should == element - 10
31
+ end
32
+ end
33
+
34
+ it "returns nil when the element not found" do
35
+ @numerous.find_index(-1).should == nil
36
+ end
37
+
38
+ it "ignores the block if an argument is given" do
39
+ @numerous.find_index(-1) {|e| true }.should == nil
40
+ end
41
+
42
+ it "returns an Enumerator if no block given" do
43
+ @numerous.find_index.should be_kind_of(Enumerator)
44
+ end
45
+ end
@@ -0,0 +1,48 @@
1
+ describe "Enumerable#find" do
2
+ before :each do
3
+ ScratchPad.record []
4
+ @elements = [2, 4, 6, 8, 10]
5
+ @numerous = EnumerableSpecs::Numerous.new(*@elements)
6
+ @empty = []
7
+ end
8
+
9
+ it "passes each entry in enum to block while block when block is false" do
10
+ visited_elements = []
11
+ @numerous.find do |element|
12
+ visited_elements << element
13
+ false
14
+ end
15
+ visited_elements.should == @elements
16
+ end
17
+
18
+ it "returns nil when the block is false and there is no ifnone proc given" do
19
+ @numerous.find {|e| false}.should == nil
20
+ end
21
+
22
+ it "returns the first element for which the block is not false" do
23
+ @elements.each do |element|
24
+ @numerous.find {|e| e > element -1 }.should == element
25
+ end
26
+ end
27
+
28
+ it "returns the value of the ifnone proc if the block is false" do
29
+ fail_proc = lambda { "cheeseburgers" }
30
+ @numerous.find(fail_proc) {|e| false }.should == "cheeseburgers"
31
+ end
32
+
33
+ it "doesn't call the ifnone proc if an element is found" do
34
+ fail_proc = lambda { raise "This should't have been called" }
35
+ @numerous.find(fail_proc) {|e| 2 == @elements.first }.should == 2
36
+ end
37
+
38
+ it "calls the ifnone proc only once when the block is false" do
39
+ times = 0
40
+ fail_proc = lambda { times += 1; raise if times > 1; "cheeseburgers" }
41
+ @numerous.find(fail_proc) {|e| false }.should == "cheeseburgers"
42
+ end
43
+
44
+ it "calls the ifnone proc when there are no elements" do
45
+ fail_proc = lambda { "yay" }
46
+ @empty.find(fail_proc) {|e| true}.should == "yay"
47
+ end
48
+ end
@@ -0,0 +1,40 @@
1
+ describe "Enumerable#first" do
2
+ before :each do
3
+ @values = [4,3,2,1,0,-1]
4
+ @enum = EnumerableSpecs::Numerous.new(*@values)
5
+ end
6
+
7
+ it "returns the first element" do
8
+ EnumerableSpecs::Numerous.new.first.should == 2
9
+ EnumerableSpecs::Empty.new.first.should == nil
10
+ end
11
+
12
+ it "returns nil if self is empty" do
13
+ EnumerableSpecs::Empty.new.first.should == nil
14
+ end
15
+
16
+ it "returns the first count elements if given a count" do
17
+ @enum.first(2).should == [4, 3]
18
+ @enum.first(4).should == [4, 3, 2, 1]
19
+ end
20
+
21
+ it "returns an empty array when passed a count on an empty array" do
22
+ empty = EnumerableSpecs::Empty.new
23
+ empty.first(0).should == []
24
+ empty.first(1).should == []
25
+ empty.first(2).should == []
26
+ end
27
+
28
+ it "returns an empty array when passed count == 0" do
29
+ @enum.first(0).should == []
30
+ end
31
+
32
+ it "returns an array containing the first element when passed count == 1" do
33
+ @enum.first(1).should == [4]
34
+ end
35
+
36
+ it "returns the entire array when count > length" do
37
+ @enum.first(100).should == @values
38
+ @enum.first(8).should == @values
39
+ end
40
+ end
@@ -22,4 +22,23 @@ module EnumerableSpecs
22
22
  raise "from each"
23
23
  end
24
24
  end
25
+
26
+ class EachDefiner
27
+ include Enumerable
28
+
29
+ attr_reader :arr
30
+
31
+ def initialize(*args)
32
+ @arr = arr
33
+ end
34
+
35
+ def each
36
+ i = 0
37
+ loop do
38
+ break if i == @arr.size
39
+ yield @arr[i]
40
+ i += 1
41
+ end
42
+ end
43
+ end
25
44
  end
@@ -0,0 +1,21 @@
1
+ class EnumerableSpecGrep
2
+ def ===(obj); obj == '2'; end
3
+ end
4
+
5
+ class EnumerableSpecGrep2
6
+ def ===(obj); /^ca/ =~ obj; end
7
+ end
8
+
9
+ describe "Enumerable#grep" do
10
+ before(:each) do
11
+ @a = EnumerableSpecs::EachDefiner.new(2, 4, 6, 8, 10)
12
+ end
13
+
14
+ it "grep without a block should return an array of all elements === pattern" do
15
+ EnumerableSpecs::Numerous.new('2', 'a', 'nil', '3', false).grep(EnumerableSpecGrep.new).should == ['2']
16
+ end
17
+
18
+ it "grep with a block should return an array of elements === pattern passed through block" do
19
+ EnumerableSpecs::Numerous.new("cat", "coat", "car", "cadr", "cost").grep(EnumerableSpecGrep2.new) { |i| i.upcase }.should == ["CAT", "CAR", "CADR"]
20
+ end
21
+ end
@@ -0,0 +1,40 @@
1
+ describe "Enumerable#take" do
2
+ before :each do
3
+ @values = [4,3,2,1,0,-1]
4
+ @enum = EnumerableSpecs::Numerous.new(*@values)
5
+ end
6
+
7
+ it "returns the take element" do
8
+ EnumerableSpecs::Numerous.new.take.should == 2
9
+ EnumerableSpecs::Empty.new.take.should == nil
10
+ end
11
+
12
+ it "returns nil if self is empty" do
13
+ EnumerableSpecs::Empty.new.take.should == nil
14
+ end
15
+
16
+ it "returns the take count elements if given a count" do
17
+ @enum.take(2).should == [4, 3]
18
+ @enum.take(4).should == [4, 3, 2, 1]
19
+ end
20
+
21
+ it "returns an empty array when passed a count on an empty array" do
22
+ empty = EnumerableSpecs::Empty.new
23
+ empty.take(0).should == []
24
+ empty.take(1).should == []
25
+ empty.take(2).should == []
26
+ end
27
+
28
+ it "returns an empty array when passed count == 0" do
29
+ @enum.take(0).should == []
30
+ end
31
+
32
+ it "returns an array containing the take element when passed count == 1" do
33
+ @enum.take(1).should == [4]
34
+ end
35
+
36
+ it "returns the entire array when count > length" do
37
+ @enum.take(100).should == @values
38
+ @enum.take(8).should == @values
39
+ end
40
+ end
@@ -0,0 +1,6 @@
1
+ describe "Enumerable#to_a" do
2
+ it "returns an array containing the elements" do
3
+ numerous = EnumerableSpecs::Numerous.new(1, nil, 'a', 2, false, true)
4
+ numerous.to_a.should == [1, nil, "a", 2, false, true]
5
+ end
6
+ end
@@ -0,0 +1,20 @@
1
+ describe "File.expand_path" do
2
+ before :each do
3
+ @base = ""
4
+ @tmpdir = "tmp"
5
+ @rootdir = ""
6
+ end
7
+
8
+ it "converts a pathname to an absolute pathname" do
9
+ File.expand_path('').should == @base
10
+ File.expand_path('a').should == File.join(@base, "a")
11
+ File.expand_path('a', nil).should == File.join(@base, 'a')
12
+ end
13
+
14
+ it "converts a pathname to an absolute pathname, using a complete path" do
15
+ File.expand_path("", "#{@tmpdir}").should == "#{@tmpdir}"
16
+ File.expand_path("a", "#{@tmpdir}").should == "#{@tmpdir}/a"
17
+ File.expand_path("../a", "#{@tmpdir}/xxx").should == "#{@tmpdir}/a"
18
+ File.expand_path(".", "#{@rootdir}").should == "#{@rootdir}"
19
+ end
20
+ end
@@ -0,0 +1,9 @@
1
+ describe "Hash#default" do
2
+ it "returns the default value" do
3
+ h = Hash.new 5
4
+ h.default.should == 5
5
+ h.default(4).should == 5
6
+ Hash.new.default.should == nil
7
+ Hash.new.default(4).should == nil
8
+ end
9
+ end
@@ -0,0 +1,15 @@
1
+ describe "Hash#each_key" do
2
+ it "calls block once for each key, passing key" do
3
+ r = {}
4
+ h = {1 => -1, 2 => -2, 3 => -3, 4 => -4}
5
+ h.each_key { |k| r[k] = k }.should equal(h)
6
+ r.should == {1 => 1, 2 => 2, 3 => 3, 4 => 4}
7
+ end
8
+
9
+ it "processes keys in the same order as keys()" do
10
+ keys = []
11
+ h = {1 => -1, 2 => -2, 3 => -3, 4 => -4}
12
+ h.each_key { |k| keys << k }
13
+ keys.should == h.keys
14
+ end
15
+ end