opal 0.3.11 → 0.3.15

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 (282) hide show
  1. data/.gitignore +13 -0
  2. data/Gemfile +10 -0
  3. data/LICENSE +20 -0
  4. data/README.md +11 -116
  5. data/Rakefile +126 -0
  6. data/bin/opal +1 -2
  7. data/docs/spec_runner.html +16 -0
  8. data/index.html +434 -0
  9. data/lib/opal.rb +14 -15
  10. data/lib/opal/builder.rb +46 -148
  11. data/lib/opal/command.rb +45 -115
  12. data/lib/opal/context.rb +139 -78
  13. data/lib/opal/dependency_builder.rb +34 -0
  14. data/lib/opal/environment.rb +92 -0
  15. data/lib/opal/parser/grammar.rb +4915 -0
  16. data/lib/opal/{parser.y → parser/grammar.y} +430 -284
  17. data/lib/opal/parser/lexer.rb +1329 -0
  18. data/lib/opal/parser/parser.rb +1460 -0
  19. data/lib/opal/parser/scope.rb +140 -0
  20. data/lib/opal/parser/sexp.rb +17 -0
  21. data/lib/opal/version.rb +2 -1
  22. data/opal.gemspec +23 -0
  23. data/opal.js +3149 -4162
  24. data/runtime/README.md +25 -0
  25. data/runtime/corelib/alpha.rb +10 -0
  26. data/runtime/corelib/array.rb +962 -0
  27. data/runtime/corelib/basic_object.rb +66 -0
  28. data/runtime/corelib/boolean.rb +44 -0
  29. data/runtime/corelib/class.rb +43 -0
  30. data/runtime/corelib/comparable.rb +25 -0
  31. data/runtime/corelib/complex.rb +2 -0
  32. data/runtime/corelib/dir.rb +29 -0
  33. data/runtime/corelib/enumerable.rb +316 -0
  34. data/runtime/corelib/enumerator.rb +80 -0
  35. data/runtime/corelib/error.rb +25 -0
  36. data/runtime/corelib/file.rb +80 -0
  37. data/runtime/corelib/hash.rb +503 -0
  38. data/runtime/corelib/io.rb +44 -0
  39. data/runtime/corelib/kernel.rb +237 -0
  40. data/runtime/corelib/load_order +29 -0
  41. data/runtime/corelib/match_data.rb +37 -0
  42. data/runtime/corelib/module.rb +171 -0
  43. data/runtime/corelib/native.rb +50 -0
  44. data/runtime/corelib/nil_class.rb +47 -0
  45. data/runtime/corelib/numeric.rb +219 -0
  46. data/runtime/corelib/object.rb +21 -0
  47. data/runtime/corelib/proc.rb +42 -0
  48. data/runtime/corelib/range.rb +38 -0
  49. data/runtime/corelib/rational.rb +16 -0
  50. data/runtime/corelib/regexp.rb +63 -0
  51. data/runtime/corelib/string.rb +185 -0
  52. data/runtime/corelib/struct.rb +97 -0
  53. data/runtime/corelib/time.rb +196 -0
  54. data/runtime/corelib/top_self.rb +7 -0
  55. data/runtime/gemlib/alpha.rb +5 -0
  56. data/runtime/gemlib/kernel.rb +17 -0
  57. data/runtime/gemlib/load_order +2 -0
  58. data/runtime/kernel/class.js +256 -0
  59. data/runtime/kernel/debug.js +42 -0
  60. data/runtime/kernel/init.js +114 -0
  61. data/runtime/kernel/load_order +5 -0
  62. data/runtime/kernel/loader.js +151 -0
  63. data/runtime/kernel/runtime.js +414 -0
  64. data/runtime/spec/README.md +34 -0
  65. data/runtime/spec/core/array/allocate_spec.rb +15 -0
  66. data/runtime/spec/core/array/append_spec.rb +31 -0
  67. data/runtime/spec/core/array/assoc_spec.rb +29 -0
  68. data/runtime/spec/core/array/at_spec.rb +38 -0
  69. data/runtime/spec/core/array/clear_spec.rb +22 -0
  70. data/runtime/spec/core/array/collect_spec.rb +3 -0
  71. data/runtime/spec/core/array/compact_spec.rb +42 -0
  72. data/runtime/spec/core/array/concat_spec.rb +21 -0
  73. data/runtime/spec/core/array/constructor_spec.rb +24 -0
  74. data/runtime/spec/core/array/count_spec.rb +11 -0
  75. data/runtime/spec/core/array/delete_at_spec.rb +31 -0
  76. data/runtime/spec/core/array/delete_if_spec.rb +24 -0
  77. data/runtime/spec/core/array/delete_spec.rb +26 -0
  78. data/runtime/spec/core/array/each_index_spec.rb +33 -0
  79. data/runtime/spec/core/array/each_spec.rb +11 -0
  80. data/runtime/spec/core/array/element_reference_spec.rb +136 -0
  81. data/runtime/spec/core/array/element_set_spec.rb +7 -0
  82. data/runtime/spec/core/array/empty_spec.rb +10 -0
  83. data/runtime/spec/core/array/eql_spec.rb +3 -0
  84. data/runtime/spec/core/array/equal_value_spec.rb +3 -0
  85. data/runtime/spec/core/array/fetch_spec.rb +26 -0
  86. data/runtime/spec/core/array/first_spec.rb +54 -0
  87. data/runtime/spec/core/array/fixtures/classes.rb +8 -0
  88. data/runtime/spec/core/array/flatten_spec.rb +41 -0
  89. data/runtime/spec/core/array/include_spec.rb +20 -0
  90. data/runtime/spec/core/array/insert_spec.rb +59 -0
  91. data/runtime/spec/core/array/last_spec.rb +57 -0
  92. data/runtime/spec/core/array/length_spec.rb +3 -0
  93. data/runtime/spec/core/array/map_spec.rb +3 -0
  94. data/runtime/spec/core/array/plus_spec.rb +16 -0
  95. data/runtime/spec/core/array/pop_spec.rb +79 -0
  96. data/runtime/spec/core/array/push_spec.rb +19 -0
  97. data/runtime/spec/core/array/rassoc_spec.rb +12 -0
  98. data/runtime/spec/core/array/reject_spec.rb +54 -0
  99. data/runtime/spec/core/array/replace_spec.rb +3 -0
  100. data/runtime/spec/core/array/reverse_each_spec.rb +18 -0
  101. data/runtime/spec/core/array/reverse_spec.rb +9 -0
  102. data/runtime/spec/core/array/shared/collect.rb +53 -0
  103. data/runtime/spec/core/array/shared/eql.rb +19 -0
  104. data/runtime/spec/core/array/shared/length.rb +6 -0
  105. data/runtime/spec/core/array/shared/replace.rb +31 -0
  106. data/runtime/spec/core/class/new_spec.rb +19 -0
  107. data/runtime/spec/core/enumerable/all_spec.rb +102 -0
  108. data/runtime/spec/core/enumerable/any_spec.rb +115 -0
  109. data/runtime/spec/core/enumerable/collect_spec.rb +3 -0
  110. data/runtime/spec/core/enumerable/count_spec.rb +29 -0
  111. data/runtime/spec/core/enumerable/detect_spec.rb +3 -0
  112. data/runtime/spec/core/enumerable/find_spec.rb +3 -0
  113. data/runtime/spec/core/enumerable/fixtures/classes.rb +26 -0
  114. data/runtime/spec/core/enumerable/shared/collect.rb +12 -0
  115. data/runtime/spec/core/enumerable/shared/entries.rb +7 -0
  116. data/runtime/spec/core/enumerable/shared/find.rb +49 -0
  117. data/runtime/spec/core/enumerable/to_a_spec.rb +7 -0
  118. data/runtime/spec/core/false/and_spec.rb +11 -0
  119. data/runtime/spec/core/false/inspect_spec.rb +7 -0
  120. data/runtime/spec/core/false/or_spec.rb +11 -0
  121. data/runtime/spec/core/false/to_s_spec.rb +7 -0
  122. data/runtime/spec/core/false/xor_spec.rb +11 -0
  123. data/runtime/spec/core/hash/allocate_spec.rb +15 -0
  124. data/runtime/spec/core/hash/assoc_spec.rb +29 -0
  125. data/runtime/spec/core/hash/clear_spec.rb +21 -0
  126. data/runtime/spec/core/hash/clone_spec.rb +12 -0
  127. data/runtime/spec/core/hash/default_spec.rb +6 -0
  128. data/runtime/spec/core/hash/delete_if_spec.rb +15 -0
  129. data/runtime/spec/core/hash/element_reference_spec.rb +16 -0
  130. data/runtime/spec/core/hash/element_set_spec.rb +8 -0
  131. data/runtime/spec/core/hash/new_spec.rb +13 -0
  132. data/runtime/spec/core/matchdata/to_a_spec.rb +7 -0
  133. data/runtime/spec/core/nil/and_spec.rb +12 -0
  134. data/runtime/spec/core/nil/inspect_spec.rb +8 -0
  135. data/runtime/spec/core/nil/nil_spec.rb +8 -0
  136. data/runtime/spec/core/nil/or_spec.rb +12 -0
  137. data/runtime/spec/core/nil/to_a_spec.rb +8 -0
  138. data/runtime/spec/core/nil/to_f_spec.rb +12 -0
  139. data/runtime/spec/core/nil/to_i_spec.rb +12 -0
  140. data/runtime/spec/core/nil/to_s_spec.rb +8 -0
  141. data/runtime/spec/core/nil/xor_spec.rb +12 -0
  142. data/runtime/spec/core/numeric/equal_value_spec.rb +11 -0
  143. data/runtime/spec/core/object/is_a_spec.rb +2 -0
  144. data/runtime/spec/core/object/shared/kind_of.rb +0 -0
  145. data/runtime/spec/core/regexp/match_spec.rb +23 -0
  146. data/runtime/spec/core/regexp/shared/match.rb +11 -0
  147. data/runtime/spec/core/symbol/to_proc_spec.rb +8 -0
  148. data/runtime/spec/core/true/and_spec.rb +11 -0
  149. data/runtime/spec/core/true/inspect_spec.rb +7 -0
  150. data/runtime/spec/core/true/or_spec.rb +11 -0
  151. data/runtime/spec/core/true/to_s_spec.rb +7 -0
  152. data/runtime/spec/core/true/xor_spec.rb +11 -0
  153. data/runtime/spec/language/alias_spec.rb +25 -0
  154. data/runtime/spec/language/and_spec.rb +62 -0
  155. data/runtime/spec/language/array_spec.rb +68 -0
  156. data/runtime/spec/language/block_spec.rb +105 -0
  157. data/runtime/spec/language/break_spec.rb +49 -0
  158. data/runtime/spec/language/case_spec.rb +165 -0
  159. data/runtime/spec/language/defined_spec.rb +80 -0
  160. data/runtime/spec/language/ensure_spec.rb +82 -0
  161. data/runtime/spec/language/fixtures/block.rb +19 -0
  162. data/runtime/spec/language/fixtures/break.rb +39 -0
  163. data/runtime/spec/language/fixtures/defined.rb +9 -0
  164. data/runtime/spec/language/fixtures/ensure.rb +37 -0
  165. data/runtime/spec/language/fixtures/next.rb +46 -0
  166. data/runtime/spec/language/fixtures/send.rb +36 -0
  167. data/runtime/spec/language/fixtures/super.rb +43 -0
  168. data/runtime/spec/language/hash_spec.rb +43 -0
  169. data/runtime/spec/language/if_spec.rb +278 -0
  170. data/runtime/spec/language/loop_spec.rb +32 -0
  171. data/runtime/spec/language/next_spec.rb +128 -0
  172. data/runtime/spec/language/or_spec.rb +65 -0
  173. data/runtime/spec/language/predefined_spec.rb +21 -0
  174. data/runtime/spec/language/regexp/interpolation_spec.rb +9 -0
  175. data/runtime/spec/language/regexp_spec.rb +7 -0
  176. data/runtime/spec/language/send_spec.rb +105 -0
  177. data/runtime/spec/language/string_spec.rb +4 -0
  178. data/runtime/spec/language/super_spec.rb +18 -0
  179. data/runtime/spec/language/symbol_spec.rb +41 -0
  180. data/runtime/spec/language/undef_spec.rb +16 -0
  181. data/runtime/spec/language/unless_spec.rb +44 -0
  182. data/runtime/spec/language/until_spec.rb +137 -0
  183. data/runtime/spec/language/variables_spec.rb +28 -0
  184. data/runtime/spec/language/versions/hash_1.9.rb +20 -0
  185. data/runtime/spec/language/while_spec.rb +175 -0
  186. data/runtime/spec/library/stringscanner/scan_spec.rb +36 -0
  187. data/runtime/spec/opal/forwardable/def_instance_delegator_spec.rb +49 -0
  188. data/runtime/spec/opal/opal/defined_spec.rb +15 -0
  189. data/runtime/spec/opal/opal/function_spec.rb +11 -0
  190. data/runtime/spec/opal/opal/native_spec.rb +16 -0
  191. data/runtime/spec/opal/opal/null_spec.rb +10 -0
  192. data/runtime/spec/opal/opal/number_spec.rb +11 -0
  193. data/runtime/spec/opal/opal/object_spec.rb +16 -0
  194. data/runtime/spec/opal/opal/string_spec.rb +11 -0
  195. data/runtime/spec/opal/opal/typeof_spec.rb +9 -0
  196. data/runtime/spec/opal/opal/undefined_spec.rb +10 -0
  197. data/runtime/spec/opal/true/case_compare_spec.rb +12 -0
  198. data/runtime/spec/opal/true/class_spec.rb +10 -0
  199. data/runtime/spec/spec_helper.rb +25 -0
  200. data/runtime/stdlib/base64.rb +91 -0
  201. data/runtime/stdlib/date.rb +4 -0
  202. data/{stdlib → runtime/stdlib}/dev.rb +0 -0
  203. data/runtime/stdlib/forwardable.rb +33 -0
  204. data/runtime/stdlib/optparse.rb +0 -0
  205. data/runtime/stdlib/pp.rb +6 -0
  206. data/{stdlib → runtime/stdlib}/racc/parser.rb +0 -0
  207. data/runtime/stdlib/rbconfig.rb +0 -0
  208. data/runtime/stdlib/si.rb +17 -0
  209. data/runtime/stdlib/strscan.rb +53 -0
  210. data/runtime/stdlib/uri.rb +111 -0
  211. data/runtime/stdlib/uri/common.rb +1014 -0
  212. data/runtime/stdlib/uri/ftp.rb +261 -0
  213. data/runtime/stdlib/uri/generic.rb +1599 -0
  214. data/runtime/stdlib/uri/http.rb +106 -0
  215. data/runtime/stdlib/uri/https.rb +22 -0
  216. data/runtime/stdlib/uri/ldap.rb +260 -0
  217. data/runtime/stdlib/uri/ldaps.rb +20 -0
  218. data/runtime/stdlib/uri/mailto.rb +280 -0
  219. data/spec/builder/build_source_spec.rb +52 -0
  220. data/spec/builder/fixtures/build_source/adam.rb +0 -0
  221. data/spec/builder/fixtures/build_source/bar/a.rb +0 -0
  222. data/spec/builder/fixtures/build_source/bar/wow/b.rb +0 -0
  223. data/spec/builder/fixtures/build_source/bar/wow/cow/c.rb +0 -0
  224. data/spec/builder/fixtures/build_source/beynon.rb +0 -0
  225. data/spec/builder/fixtures/build_source/charles.js +0 -0
  226. data/spec/builder/fixtures/build_source/foo/a.rb +0 -0
  227. data/spec/builder/fixtures/build_source/foo/b.rb +0 -0
  228. data/spec/builder/fixtures/build_source/foo/x.js +0 -0
  229. data/spec/builder/fixtures/build_source/foo/y.js +0 -0
  230. data/spec/builder/output_path_spec.rb +50 -0
  231. data/spec/grammar/alias_spec.rb +26 -0
  232. data/spec/grammar/and_spec.rb +13 -0
  233. data/spec/grammar/array_spec.rb +22 -0
  234. data/spec/grammar/attrasgn_spec.rb +28 -0
  235. data/spec/grammar/begin_spec.rb +38 -0
  236. data/spec/grammar/block_spec.rb +12 -0
  237. data/spec/grammar/break_spec.rb +17 -0
  238. data/spec/grammar/call_spec.rb +58 -0
  239. data/spec/grammar/class_spec.rb +35 -0
  240. data/spec/grammar/const_spec.rb +13 -0
  241. data/spec/grammar/cvar_spec.rb +11 -0
  242. data/spec/grammar/def_spec.rb +60 -0
  243. data/spec/grammar/false_spec.rb +17 -0
  244. data/spec/grammar/file_spec.rb +7 -0
  245. data/spec/grammar/gvar_spec.rb +13 -0
  246. data/spec/grammar/hash_spec.rb +17 -0
  247. data/spec/grammar/iasgn_spec.rb +9 -0
  248. data/spec/grammar/if_spec.rb +26 -0
  249. data/spec/grammar/iter_spec.rb +59 -0
  250. data/spec/grammar/ivar_spec.rb +9 -0
  251. data/spec/grammar/lasgn_spec.rb +8 -0
  252. data/spec/grammar/line_spec.rb +8 -0
  253. data/spec/grammar/lvar_spec.rb +38 -0
  254. data/spec/grammar/module_spec.rb +27 -0
  255. data/spec/grammar/nil_spec.rb +17 -0
  256. data/spec/grammar/not_spec.rb +27 -0
  257. data/spec/grammar/op_asgn1_spec.rb +23 -0
  258. data/spec/grammar/op_asgn2_spec.rb +23 -0
  259. data/spec/grammar/or_spec.rb +13 -0
  260. data/spec/grammar/return_spec.rb +17 -0
  261. data/spec/grammar/sclass_spec.rb +20 -0
  262. data/spec/grammar/self_spec.rb +17 -0
  263. data/spec/grammar/str_spec.rb +96 -0
  264. data/spec/grammar/super_spec.rb +20 -0
  265. data/spec/grammar/true_spec.rb +17 -0
  266. data/spec/grammar/undef_spec.rb +15 -0
  267. data/spec/grammar/unless_spec.rb +13 -0
  268. data/spec/grammar/while_spec.rb +15 -0
  269. data/spec/grammar/xstr_spec.rb +116 -0
  270. data/spec/grammar/yield_spec.rb +20 -0
  271. data/spec/spec_helper.rb +9 -0
  272. metadata +346 -21
  273. data/lib/opal/bundle.rb +0 -34
  274. data/lib/opal/lexer.rb +0 -902
  275. data/lib/opal/nodes.rb +0 -2150
  276. data/lib/opal/parser.rb +0 -4894
  277. data/lib/opal/rake/bundle_task.rb +0 -63
  278. data/opal-parser.js +0 -8343
  279. data/stdlib/strscan.rb +0 -52
  280. data/templates/init/Rakefile +0 -7
  281. data/templates/init/index.html +0 -17
  282. data/templates/init/lib/__NAME__.rb +0 -2
@@ -0,0 +1,12 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+
3
+ describe "NilClass#to_i" do
4
+ it "returns 0" do
5
+ nil.to_i.should == 0
6
+ end
7
+
8
+ it "does not cause NilClass to be coerced to Fixnum" do
9
+ (0 == nil).should == false
10
+ end
11
+ end
12
+
@@ -0,0 +1,8 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+
3
+ describe "NilClass#to_s" do
4
+ it "returns the string ''" do
5
+ nil.to_s.should == ""
6
+ end
7
+ end
8
+
@@ -0,0 +1,12 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+
3
+ describe "NilClass#^" do
4
+ it "returns false if other is nil or false, otherwise true" do
5
+ (nil ^ nil).should == false
6
+ (nil ^ true).should == true
7
+ (nil ^ false).should == false
8
+ (nil ^ "").should == true
9
+ (nil ^ 'x').should == true
10
+ end
11
+ end
12
+
@@ -0,0 +1,11 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+
3
+ describe "Numeric#==" do
4
+ it "returns true if self has the same value as other" do
5
+ (1 == 1).should == true
6
+ (9 == 5).should == false
7
+
8
+ (9 == 9.0).should == true
9
+ (9 == 9.01).should == false
10
+ end
11
+ end
@@ -0,0 +1,2 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+ require File.expand_path('../shared/kind_of', __FILE__)
File without changes
@@ -0,0 +1,23 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+ require File.expand_path('../shared/match', __FILE__)
3
+
4
+ describe "Regexp#=~ on a successful match" do
5
+ it "returns the index of the first character of the matching region" do
6
+ (/(.)(.)(.)/ =~ "abc").should == 0
7
+ end
8
+ end
9
+
10
+ describe "Regexp#match on a successful match" do
11
+ it "returns a MatchData object" do
12
+ /(.)(.)(.)/.match("abc").should be_kind_of(MatchData)
13
+ end
14
+
15
+ it "resets $~ if passed nil" do
16
+ # set $~
17
+ /./.match("a")
18
+ $~.should be_kind_of(MatchData)
19
+
20
+ /1/.match(nil)
21
+ $~.should be_nil
22
+ end
23
+ end
@@ -0,0 +1,11 @@
1
+ require File.expand_path('../../../../spec_helper', __FILE__)
2
+
3
+ describe :regexp_match do
4
+ it "returns nil if there is no match" do
5
+ /xyz/.match("abxyc").should be_nil
6
+ end
7
+
8
+ it "returns nil if the object is nil" do
9
+ /xyz/.match(nil).should be_nil
10
+ end
11
+ end
@@ -0,0 +1,8 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+
3
+ describe "Symbol#to_proc" do
4
+ it "returns a new Proc" do
5
+ proc = :to_s.to_proc
6
+ proc.should be_kind_of(Proc)
7
+ end
8
+ end
@@ -0,0 +1,11 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+
3
+ describe "TrueClass#&" do
4
+ it "returns false if other is nil or false, otherwise true" do
5
+ (true & true).should == true
6
+ (true & false).should == false
7
+ (true & nil).should == false
8
+ (true & "").should == true
9
+ (true & mock('x')).should == true
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+
3
+ describe "TrueClass#inspect" do
4
+ it "returns the string 'true'" do
5
+ true.inspect.should == "true"
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+
3
+ describe "TrueClass#|" do
4
+ it "returns true" do
5
+ (true | true).should == true
6
+ (true | false).should == true
7
+ (true | nil).should == true
8
+ (true | "").should == true
9
+ (true | mock('x')).should == true
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+
3
+ describe "TrueClass#to_s" do
4
+ it "returns the string 'true'" do
5
+ true.to_s.should == "true"
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+
3
+ describe "TrueClass#^" do
4
+ it "returns true if other is nil or false, otherwise false" do
5
+ (true ^ true).should == false
6
+ (true ^ false).should == true
7
+ (true ^ nil).should == true
8
+ (true ^ "").should == false
9
+ (true ^ mock('x')).should == false
10
+ end
11
+ end
@@ -0,0 +1,25 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ class AliasObject
4
+ attr :foo
5
+ attr_reader :baz
6
+ attr_accessor :baz
7
+
8
+ def prep; @foo = 3; @bar = 4; end
9
+ def value; 5; end
10
+ def false_value; 6; end
11
+ end
12
+
13
+ describe "The alias keyword" do
14
+ before(:each) do
15
+ @obj = AliasObject.new
16
+ @meta = class << @obj;self;end
17
+ end
18
+
19
+ it "creates a new name for an existing method" do
20
+ @meta.class_eval do
21
+ alias __value value
22
+ end
23
+ @obj.__value.should == 5
24
+ end
25
+ end
@@ -0,0 +1,62 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ describe "The '&&' statement" do
4
+ it "short-circuits evaluation at the first condition to be false" do
5
+ x = nil
6
+ true && false && x = 1
7
+ x.should be_nil
8
+ end
9
+
10
+ it "evaluates to the first condition not to be true" do
11
+ ("yes" && 1 && nil && true).should == nil
12
+ ("yes" && 1 && false && true).should == false
13
+ end
14
+
15
+ it "evaluates to the last condition if all are true" do
16
+ ("yes" && 1).should == 1
17
+ (1 && "yes").should == "yes"
18
+ end
19
+
20
+ it "evaluates the full set of chained conditions during assignment" do
21
+ x = y = nil
22
+ x = 1 && y = 2
23
+ x.should == 2
24
+ end
25
+
26
+ it "treats empty expressions as nil" do
27
+ (() && true).should be_nil
28
+ (true && ()).should be_nil
29
+ (() && ()).should be_nil
30
+ end
31
+ end
32
+
33
+ describe "The 'and' statement" do
34
+ it "short-circuits evaluation at the first condition to be false" do
35
+ x = nil
36
+ true and false and x = 1
37
+ x.should be_nil
38
+ end
39
+
40
+ it "evaluates to the first condition not to be true" do
41
+ ("yes" and 1 and nil and true).should == nil
42
+ ("yes" and 1 and false and true).should == false
43
+ end
44
+
45
+ it "evaluates to the last condition if all are true" do
46
+ ("yes" and 1).should == 1
47
+ (1 and "yes").should == "yes"
48
+ end
49
+
50
+ it "when used in assignment, evaluates and assigns expressions individually" do
51
+ x = y = nil
52
+ x = 1 and y = 2
53
+ x.should == 1
54
+ end
55
+
56
+ it "treats empty expressions as nil" do
57
+ (() and true).should be_nil
58
+ (true and ()).should be_nil
59
+ (() and ()).should be_nil
60
+ end
61
+ end
62
+
@@ -0,0 +1,68 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ describe "Array literals" do
4
+ it "[] should return a new array populated with the given elements" do
5
+ array = [1, 'a', nil]
6
+ array.should be_kind_of(Array)
7
+ array[0].should == 1
8
+ array[1].should == 'a'
9
+ array[2].should == nil
10
+ end
11
+
12
+ it "[] treats empty expressions as nil elements" do
13
+ array = [0, (), 2, (), 4]
14
+ array.should be_kind_of(Array)
15
+ array[0].should == 0
16
+ array[1].should == nil
17
+ array[2].should == 2
18
+ array[3].should == nil
19
+ array[4].should == 4
20
+ end
21
+
22
+ it "[] accepts a literal hash without curly braces as its only parameter" do
23
+ ["foo" => :bar, :baz => 42].should == [{"foo" => :bar, :baz => 42}]
24
+ end
25
+ end
26
+
27
+ describe "Barewood array literal" do
28
+ it "%w() transforms unquoted barewords into an array" do
29
+ a = 3
30
+ %w(a #{3+a} 3).should == ["a", '#{3+a}', "3"]
31
+ end
32
+
33
+ it "%W() transforms unquoted barewords into an array, supporting interpolation" do
34
+ a = 3
35
+ %W(a #{3+a} 3).should == ["a", '6', "3"]
36
+ end
37
+
38
+ it "%W() always treats interpolated expressions as a single word" do
39
+ a = "hello world"
40
+ %W(a b c #{a} d e).should == ["a", "b", "c", "hello world", "d", "e"]
41
+ end
42
+
43
+ it "treats consecutive whitespace characters the same as one" do
44
+ %w(a b c d).should == ["a", "b", "c", "d"]
45
+ %w(hello
46
+ world).should == ["hello", "world"]
47
+ end
48
+
49
+ it "treats whitespace as literals characters when escaped by a backslash" do
50
+ %w(a b\ c d e).should == ["a", "b c", "d", "e"]
51
+ %w(a b\
52
+ c d).should == ["a", "b\nc", "d"]
53
+ %W(a\ b\tc).should == ["a ", "b\tc"]
54
+ %W(white\ \ \ \ \ space).should == ["white ", " ", " ", " space"]
55
+ end
56
+ end
57
+
58
+ describe "The unpacking splat operator (*)" do
59
+ it "when applied to a literal nested array, unpacks its elements into then containing array" do
60
+ [1, 2, *[3, 4, 5]].should == [1, 2, 3, 4, 5]
61
+ end
62
+
63
+ it "when applied to a nested references array, unpacks its elements into the containing array" do
64
+ splatted_array = [3, 4, 5]
65
+ [1, 2, *splatted_array].should == [1, 2, 3, 4, 5]
66
+ end
67
+ end
68
+
@@ -0,0 +1,105 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+ require File.expand_path('../fixtures/block', __FILE__)
3
+
4
+ describe "A block" do
5
+ before :each do
6
+ @y = BlockSpecs::Yielder.new
7
+ end
8
+
9
+ it "captures locals from the surrounding scope" do
10
+ var = 1
11
+ @y.z { var }.should == 1
12
+ end
13
+
14
+ it "does not capture a local when an argument has the same name" do
15
+ var = 1
16
+ @y.s(2) { |var| var }.should == 2
17
+ var.should == 1
18
+ end
19
+
20
+ describe "taking zero arguments" do
21
+ before :each do
22
+ @y = BlockSpecs::Yielder.new
23
+ end
24
+
25
+ it "does not raise an exception when no values are yielded" do
26
+ @y.z { 1 }.should == 1
27
+ end
28
+
29
+ it "does not raise an exception when values are yielded" do
30
+ @y.s(0) { 1 }.should == 1
31
+ end
32
+ end
33
+
34
+ describe "taking || arguments" do
35
+ before :each do
36
+ @y = BlockSpecs::Yielder.new
37
+ end
38
+
39
+ it "does not raise an exception when no values are yielded" do
40
+ @y.z { || 1 }.should == 1
41
+ end
42
+
43
+ it "does not raise an exception when values are yielded" do
44
+ @y.s(0) { || 1 }.should == 1
45
+ end
46
+ end
47
+
48
+ describe "taking |a| arguments" do
49
+ before :each do
50
+ @y = BlockSpecs::Yielder.new
51
+ end
52
+
53
+ it "assigns nil to the argument when no values are yielded" do
54
+ @y.z { |a| a }.should be_nil
55
+ end
56
+
57
+ it "assigns the value yielded to the argument" do
58
+ @y.s(1) { |a| a }.should == 1
59
+ end
60
+
61
+ it "assigns the first value yielded to the argument" do
62
+ @y.m(1, 2) { |a| a }.should == 1
63
+ end
64
+
65
+ it "does not deconstruct a single Array value" do
66
+ @y.s([1, 2]) { |a| a }.should == [1, 2]
67
+ end
68
+ end
69
+
70
+ describe "taking |a, b| arguments" do
71
+ before :each do
72
+ @y = BlockSpecs::Yielder.new
73
+ end
74
+
75
+ it "assigns nil to the arguments when no values are yielded" do
76
+ @y.z { |a, b| [a, b] }.should == [nil, nil]
77
+ end
78
+
79
+ it "assigns one value yielded to the first argument" do
80
+ @y.s(1) { |a, b| [a, b] }.should == [1, nil]
81
+ end
82
+
83
+ it "assigns the first two values yielded to the arguments" do
84
+ @y.m(1, 2, 3) { |a, b| [a, b] }.should == [1, 2]
85
+ end
86
+
87
+ it "does not destructive an Array value as one of the several values yielded" do
88
+ @y.m([1, 2], 3, 4) { |a, b| [a, b] }.should == [[1, 2], 3]
89
+ end
90
+ end
91
+
92
+ describe "taking |a, *b| arguments" do
93
+ before :each do
94
+ @y = BlockSpecs::Yielder.new
95
+ end
96
+
97
+ it "assigns 'nil' and '[]' to the arguments when no values are yielded" do
98
+ @y.z { |a, *b| [a, b] }.should == [nil, []]
99
+ end
100
+
101
+ it "assigns all yielded values after the first to the rest arguments" do
102
+ @y.m(1, 2, 3) { |a, *b| [a, b] }.should == [1, [2, 3]]
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,49 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+ require File.expand_path('../fixtures/break', __FILE__)
3
+
4
+ describe "The break statement in a block" do
5
+ before :each do
6
+ ScratchPad.record []
7
+ @program = BreakSpecs::Block.new
8
+ end
9
+
10
+ it "returns nil to method invoking the method yielding to the block when not passed an argument" do
11
+ @program.break_nil
12
+ ScratchPad.recorded.should == [:a, :aa, :b, nil, :d]
13
+ end
14
+
15
+ it "returns a value to the method invoking the method yielding to the block" do
16
+ @program.break_value
17
+ ScratchPad.recorded.should == [:a, :aa, :b, :break, :d]
18
+ end
19
+ end
20
+
21
+ describe "Break inside a while loop" do
22
+ describe "with a value" do
23
+ it "exists the loop and returns the value" do
24
+ a = while true; break; end; a.should == nil
25
+ a = while true; break nil; end; a.should == nil
26
+ a = while true; break 1; end; a.should == 1
27
+ a = while true; break []; end; a.should == []
28
+ a = while true; break [1]; end; a.should == [1]
29
+ end
30
+ end
31
+
32
+ it "stops a while loop when run" do
33
+ i = 0
34
+ while true
35
+ break if i == 2
36
+ i+=1
37
+ end
38
+ i.should == 2
39
+ end
40
+
41
+ it "causes a call with a block to return when run" do
42
+ at = 0
43
+ 0.upto(5) do |i|
44
+ at = i
45
+ break i if i == 2
46
+ end.should == 2
47
+ at.should == 2
48
+ end
49
+ end