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.
- data/.gitignore +13 -0
- data/Gemfile +10 -0
- data/LICENSE +20 -0
- data/README.md +11 -116
- data/Rakefile +126 -0
- data/bin/opal +1 -2
- data/docs/spec_runner.html +16 -0
- data/index.html +434 -0
- data/lib/opal.rb +14 -15
- data/lib/opal/builder.rb +46 -148
- data/lib/opal/command.rb +45 -115
- data/lib/opal/context.rb +139 -78
- data/lib/opal/dependency_builder.rb +34 -0
- data/lib/opal/environment.rb +92 -0
- data/lib/opal/parser/grammar.rb +4915 -0
- data/lib/opal/{parser.y → parser/grammar.y} +430 -284
- data/lib/opal/parser/lexer.rb +1329 -0
- data/lib/opal/parser/parser.rb +1460 -0
- data/lib/opal/parser/scope.rb +140 -0
- data/lib/opal/parser/sexp.rb +17 -0
- data/lib/opal/version.rb +2 -1
- data/opal.gemspec +23 -0
- data/opal.js +3149 -4162
- data/runtime/README.md +25 -0
- data/runtime/corelib/alpha.rb +10 -0
- data/runtime/corelib/array.rb +962 -0
- data/runtime/corelib/basic_object.rb +66 -0
- data/runtime/corelib/boolean.rb +44 -0
- data/runtime/corelib/class.rb +43 -0
- data/runtime/corelib/comparable.rb +25 -0
- data/runtime/corelib/complex.rb +2 -0
- data/runtime/corelib/dir.rb +29 -0
- data/runtime/corelib/enumerable.rb +316 -0
- data/runtime/corelib/enumerator.rb +80 -0
- data/runtime/corelib/error.rb +25 -0
- data/runtime/corelib/file.rb +80 -0
- data/runtime/corelib/hash.rb +503 -0
- data/runtime/corelib/io.rb +44 -0
- data/runtime/corelib/kernel.rb +237 -0
- data/runtime/corelib/load_order +29 -0
- data/runtime/corelib/match_data.rb +37 -0
- data/runtime/corelib/module.rb +171 -0
- data/runtime/corelib/native.rb +50 -0
- data/runtime/corelib/nil_class.rb +47 -0
- data/runtime/corelib/numeric.rb +219 -0
- data/runtime/corelib/object.rb +21 -0
- data/runtime/corelib/proc.rb +42 -0
- data/runtime/corelib/range.rb +38 -0
- data/runtime/corelib/rational.rb +16 -0
- data/runtime/corelib/regexp.rb +63 -0
- data/runtime/corelib/string.rb +185 -0
- data/runtime/corelib/struct.rb +97 -0
- data/runtime/corelib/time.rb +196 -0
- data/runtime/corelib/top_self.rb +7 -0
- data/runtime/gemlib/alpha.rb +5 -0
- data/runtime/gemlib/kernel.rb +17 -0
- data/runtime/gemlib/load_order +2 -0
- data/runtime/kernel/class.js +256 -0
- data/runtime/kernel/debug.js +42 -0
- data/runtime/kernel/init.js +114 -0
- data/runtime/kernel/load_order +5 -0
- data/runtime/kernel/loader.js +151 -0
- data/runtime/kernel/runtime.js +414 -0
- data/runtime/spec/README.md +34 -0
- data/runtime/spec/core/array/allocate_spec.rb +15 -0
- data/runtime/spec/core/array/append_spec.rb +31 -0
- data/runtime/spec/core/array/assoc_spec.rb +29 -0
- data/runtime/spec/core/array/at_spec.rb +38 -0
- data/runtime/spec/core/array/clear_spec.rb +22 -0
- data/runtime/spec/core/array/collect_spec.rb +3 -0
- data/runtime/spec/core/array/compact_spec.rb +42 -0
- data/runtime/spec/core/array/concat_spec.rb +21 -0
- data/runtime/spec/core/array/constructor_spec.rb +24 -0
- data/runtime/spec/core/array/count_spec.rb +11 -0
- data/runtime/spec/core/array/delete_at_spec.rb +31 -0
- data/runtime/spec/core/array/delete_if_spec.rb +24 -0
- data/runtime/spec/core/array/delete_spec.rb +26 -0
- data/runtime/spec/core/array/each_index_spec.rb +33 -0
- data/runtime/spec/core/array/each_spec.rb +11 -0
- data/runtime/spec/core/array/element_reference_spec.rb +136 -0
- data/runtime/spec/core/array/element_set_spec.rb +7 -0
- data/runtime/spec/core/array/empty_spec.rb +10 -0
- data/runtime/spec/core/array/eql_spec.rb +3 -0
- data/runtime/spec/core/array/equal_value_spec.rb +3 -0
- data/runtime/spec/core/array/fetch_spec.rb +26 -0
- data/runtime/spec/core/array/first_spec.rb +54 -0
- data/runtime/spec/core/array/fixtures/classes.rb +8 -0
- data/runtime/spec/core/array/flatten_spec.rb +41 -0
- data/runtime/spec/core/array/include_spec.rb +20 -0
- data/runtime/spec/core/array/insert_spec.rb +59 -0
- data/runtime/spec/core/array/last_spec.rb +57 -0
- data/runtime/spec/core/array/length_spec.rb +3 -0
- data/runtime/spec/core/array/map_spec.rb +3 -0
- data/runtime/spec/core/array/plus_spec.rb +16 -0
- data/runtime/spec/core/array/pop_spec.rb +79 -0
- data/runtime/spec/core/array/push_spec.rb +19 -0
- data/runtime/spec/core/array/rassoc_spec.rb +12 -0
- data/runtime/spec/core/array/reject_spec.rb +54 -0
- data/runtime/spec/core/array/replace_spec.rb +3 -0
- data/runtime/spec/core/array/reverse_each_spec.rb +18 -0
- data/runtime/spec/core/array/reverse_spec.rb +9 -0
- data/runtime/spec/core/array/shared/collect.rb +53 -0
- data/runtime/spec/core/array/shared/eql.rb +19 -0
- data/runtime/spec/core/array/shared/length.rb +6 -0
- data/runtime/spec/core/array/shared/replace.rb +31 -0
- data/runtime/spec/core/class/new_spec.rb +19 -0
- data/runtime/spec/core/enumerable/all_spec.rb +102 -0
- data/runtime/spec/core/enumerable/any_spec.rb +115 -0
- data/runtime/spec/core/enumerable/collect_spec.rb +3 -0
- data/runtime/spec/core/enumerable/count_spec.rb +29 -0
- data/runtime/spec/core/enumerable/detect_spec.rb +3 -0
- data/runtime/spec/core/enumerable/find_spec.rb +3 -0
- data/runtime/spec/core/enumerable/fixtures/classes.rb +26 -0
- data/runtime/spec/core/enumerable/shared/collect.rb +12 -0
- data/runtime/spec/core/enumerable/shared/entries.rb +7 -0
- data/runtime/spec/core/enumerable/shared/find.rb +49 -0
- data/runtime/spec/core/enumerable/to_a_spec.rb +7 -0
- data/runtime/spec/core/false/and_spec.rb +11 -0
- data/runtime/spec/core/false/inspect_spec.rb +7 -0
- data/runtime/spec/core/false/or_spec.rb +11 -0
- data/runtime/spec/core/false/to_s_spec.rb +7 -0
- data/runtime/spec/core/false/xor_spec.rb +11 -0
- data/runtime/spec/core/hash/allocate_spec.rb +15 -0
- data/runtime/spec/core/hash/assoc_spec.rb +29 -0
- data/runtime/spec/core/hash/clear_spec.rb +21 -0
- data/runtime/spec/core/hash/clone_spec.rb +12 -0
- data/runtime/spec/core/hash/default_spec.rb +6 -0
- data/runtime/spec/core/hash/delete_if_spec.rb +15 -0
- data/runtime/spec/core/hash/element_reference_spec.rb +16 -0
- data/runtime/spec/core/hash/element_set_spec.rb +8 -0
- data/runtime/spec/core/hash/new_spec.rb +13 -0
- data/runtime/spec/core/matchdata/to_a_spec.rb +7 -0
- data/runtime/spec/core/nil/and_spec.rb +12 -0
- data/runtime/spec/core/nil/inspect_spec.rb +8 -0
- data/runtime/spec/core/nil/nil_spec.rb +8 -0
- data/runtime/spec/core/nil/or_spec.rb +12 -0
- data/runtime/spec/core/nil/to_a_spec.rb +8 -0
- data/runtime/spec/core/nil/to_f_spec.rb +12 -0
- data/runtime/spec/core/nil/to_i_spec.rb +12 -0
- data/runtime/spec/core/nil/to_s_spec.rb +8 -0
- data/runtime/spec/core/nil/xor_spec.rb +12 -0
- data/runtime/spec/core/numeric/equal_value_spec.rb +11 -0
- data/runtime/spec/core/object/is_a_spec.rb +2 -0
- data/runtime/spec/core/object/shared/kind_of.rb +0 -0
- data/runtime/spec/core/regexp/match_spec.rb +23 -0
- data/runtime/spec/core/regexp/shared/match.rb +11 -0
- data/runtime/spec/core/symbol/to_proc_spec.rb +8 -0
- data/runtime/spec/core/true/and_spec.rb +11 -0
- data/runtime/spec/core/true/inspect_spec.rb +7 -0
- data/runtime/spec/core/true/or_spec.rb +11 -0
- data/runtime/spec/core/true/to_s_spec.rb +7 -0
- data/runtime/spec/core/true/xor_spec.rb +11 -0
- data/runtime/spec/language/alias_spec.rb +25 -0
- data/runtime/spec/language/and_spec.rb +62 -0
- data/runtime/spec/language/array_spec.rb +68 -0
- data/runtime/spec/language/block_spec.rb +105 -0
- data/runtime/spec/language/break_spec.rb +49 -0
- data/runtime/spec/language/case_spec.rb +165 -0
- data/runtime/spec/language/defined_spec.rb +80 -0
- data/runtime/spec/language/ensure_spec.rb +82 -0
- data/runtime/spec/language/fixtures/block.rb +19 -0
- data/runtime/spec/language/fixtures/break.rb +39 -0
- data/runtime/spec/language/fixtures/defined.rb +9 -0
- data/runtime/spec/language/fixtures/ensure.rb +37 -0
- data/runtime/spec/language/fixtures/next.rb +46 -0
- data/runtime/spec/language/fixtures/send.rb +36 -0
- data/runtime/spec/language/fixtures/super.rb +43 -0
- data/runtime/spec/language/hash_spec.rb +43 -0
- data/runtime/spec/language/if_spec.rb +278 -0
- data/runtime/spec/language/loop_spec.rb +32 -0
- data/runtime/spec/language/next_spec.rb +128 -0
- data/runtime/spec/language/or_spec.rb +65 -0
- data/runtime/spec/language/predefined_spec.rb +21 -0
- data/runtime/spec/language/regexp/interpolation_spec.rb +9 -0
- data/runtime/spec/language/regexp_spec.rb +7 -0
- data/runtime/spec/language/send_spec.rb +105 -0
- data/runtime/spec/language/string_spec.rb +4 -0
- data/runtime/spec/language/super_spec.rb +18 -0
- data/runtime/spec/language/symbol_spec.rb +41 -0
- data/runtime/spec/language/undef_spec.rb +16 -0
- data/runtime/spec/language/unless_spec.rb +44 -0
- data/runtime/spec/language/until_spec.rb +137 -0
- data/runtime/spec/language/variables_spec.rb +28 -0
- data/runtime/spec/language/versions/hash_1.9.rb +20 -0
- data/runtime/spec/language/while_spec.rb +175 -0
- data/runtime/spec/library/stringscanner/scan_spec.rb +36 -0
- data/runtime/spec/opal/forwardable/def_instance_delegator_spec.rb +49 -0
- data/runtime/spec/opal/opal/defined_spec.rb +15 -0
- data/runtime/spec/opal/opal/function_spec.rb +11 -0
- data/runtime/spec/opal/opal/native_spec.rb +16 -0
- data/runtime/spec/opal/opal/null_spec.rb +10 -0
- data/runtime/spec/opal/opal/number_spec.rb +11 -0
- data/runtime/spec/opal/opal/object_spec.rb +16 -0
- data/runtime/spec/opal/opal/string_spec.rb +11 -0
- data/runtime/spec/opal/opal/typeof_spec.rb +9 -0
- data/runtime/spec/opal/opal/undefined_spec.rb +10 -0
- data/runtime/spec/opal/true/case_compare_spec.rb +12 -0
- data/runtime/spec/opal/true/class_spec.rb +10 -0
- data/runtime/spec/spec_helper.rb +25 -0
- data/runtime/stdlib/base64.rb +91 -0
- data/runtime/stdlib/date.rb +4 -0
- data/{stdlib → runtime/stdlib}/dev.rb +0 -0
- data/runtime/stdlib/forwardable.rb +33 -0
- data/runtime/stdlib/optparse.rb +0 -0
- data/runtime/stdlib/pp.rb +6 -0
- data/{stdlib → runtime/stdlib}/racc/parser.rb +0 -0
- data/runtime/stdlib/rbconfig.rb +0 -0
- data/runtime/stdlib/si.rb +17 -0
- data/runtime/stdlib/strscan.rb +53 -0
- data/runtime/stdlib/uri.rb +111 -0
- data/runtime/stdlib/uri/common.rb +1014 -0
- data/runtime/stdlib/uri/ftp.rb +261 -0
- data/runtime/stdlib/uri/generic.rb +1599 -0
- data/runtime/stdlib/uri/http.rb +106 -0
- data/runtime/stdlib/uri/https.rb +22 -0
- data/runtime/stdlib/uri/ldap.rb +260 -0
- data/runtime/stdlib/uri/ldaps.rb +20 -0
- data/runtime/stdlib/uri/mailto.rb +280 -0
- data/spec/builder/build_source_spec.rb +52 -0
- data/spec/builder/fixtures/build_source/adam.rb +0 -0
- data/spec/builder/fixtures/build_source/bar/a.rb +0 -0
- data/spec/builder/fixtures/build_source/bar/wow/b.rb +0 -0
- data/spec/builder/fixtures/build_source/bar/wow/cow/c.rb +0 -0
- data/spec/builder/fixtures/build_source/beynon.rb +0 -0
- data/spec/builder/fixtures/build_source/charles.js +0 -0
- data/spec/builder/fixtures/build_source/foo/a.rb +0 -0
- data/spec/builder/fixtures/build_source/foo/b.rb +0 -0
- data/spec/builder/fixtures/build_source/foo/x.js +0 -0
- data/spec/builder/fixtures/build_source/foo/y.js +0 -0
- data/spec/builder/output_path_spec.rb +50 -0
- data/spec/grammar/alias_spec.rb +26 -0
- data/spec/grammar/and_spec.rb +13 -0
- data/spec/grammar/array_spec.rb +22 -0
- data/spec/grammar/attrasgn_spec.rb +28 -0
- data/spec/grammar/begin_spec.rb +38 -0
- data/spec/grammar/block_spec.rb +12 -0
- data/spec/grammar/break_spec.rb +17 -0
- data/spec/grammar/call_spec.rb +58 -0
- data/spec/grammar/class_spec.rb +35 -0
- data/spec/grammar/const_spec.rb +13 -0
- data/spec/grammar/cvar_spec.rb +11 -0
- data/spec/grammar/def_spec.rb +60 -0
- data/spec/grammar/false_spec.rb +17 -0
- data/spec/grammar/file_spec.rb +7 -0
- data/spec/grammar/gvar_spec.rb +13 -0
- data/spec/grammar/hash_spec.rb +17 -0
- data/spec/grammar/iasgn_spec.rb +9 -0
- data/spec/grammar/if_spec.rb +26 -0
- data/spec/grammar/iter_spec.rb +59 -0
- data/spec/grammar/ivar_spec.rb +9 -0
- data/spec/grammar/lasgn_spec.rb +8 -0
- data/spec/grammar/line_spec.rb +8 -0
- data/spec/grammar/lvar_spec.rb +38 -0
- data/spec/grammar/module_spec.rb +27 -0
- data/spec/grammar/nil_spec.rb +17 -0
- data/spec/grammar/not_spec.rb +27 -0
- data/spec/grammar/op_asgn1_spec.rb +23 -0
- data/spec/grammar/op_asgn2_spec.rb +23 -0
- data/spec/grammar/or_spec.rb +13 -0
- data/spec/grammar/return_spec.rb +17 -0
- data/spec/grammar/sclass_spec.rb +20 -0
- data/spec/grammar/self_spec.rb +17 -0
- data/spec/grammar/str_spec.rb +96 -0
- data/spec/grammar/super_spec.rb +20 -0
- data/spec/grammar/true_spec.rb +17 -0
- data/spec/grammar/undef_spec.rb +15 -0
- data/spec/grammar/unless_spec.rb +13 -0
- data/spec/grammar/while_spec.rb +15 -0
- data/spec/grammar/xstr_spec.rb +116 -0
- data/spec/grammar/yield_spec.rb +20 -0
- data/spec/spec_helper.rb +9 -0
- metadata +346 -21
- data/lib/opal/bundle.rb +0 -34
- data/lib/opal/lexer.rb +0 -902
- data/lib/opal/nodes.rb +0 -2150
- data/lib/opal/parser.rb +0 -4894
- data/lib/opal/rake/bundle_task.rb +0 -63
- data/opal-parser.js +0 -8343
- data/stdlib/strscan.rb +0 -52
- data/templates/init/Rakefile +0 -7
- data/templates/init/index.html +0 -17
- data/templates/init/lib/__NAME__.rb +0 -2
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
module LangSendSpecs
|
|
2
|
+
|
|
3
|
+
def self.fooM0; 100; end
|
|
4
|
+
def self.fooM1(a); [a]; end
|
|
5
|
+
def self.fooM2(a,b); [a,b]; end
|
|
6
|
+
def self.fooM3(a,b,c); [a,b,c]; end
|
|
7
|
+
def self.fooM4(a,b,c,d); [a,b,c,d]; end
|
|
8
|
+
def self.fooM5(a,b,c,d,e); [a,b,c,d,e]; end
|
|
9
|
+
def self.fooM0O1(a=1); [a]; end
|
|
10
|
+
def self.fooM1O1(a,b=1); [a,b]; end
|
|
11
|
+
def self.fooM2O1(a,b,c=1); [a,b,c]; end
|
|
12
|
+
def self.fooM3O1(a,b,c,d=1); [a,b,c,d]; end
|
|
13
|
+
def self.fooM4O1(a,b,c,d,e=1); [a,b,c,d,e]; end
|
|
14
|
+
def self.fooM0O2(a=1,b=2); [a,b]; end
|
|
15
|
+
def self.fooM0R(*r); r; end
|
|
16
|
+
def self.fooM1R(a, *r); [a, r]; end
|
|
17
|
+
def self.fooM0O1R(a=1, *r); [a, r]; end
|
|
18
|
+
def self.fooM1O1R(a, b=1, *r); [a, b, r]; end
|
|
19
|
+
|
|
20
|
+
def self.one(a); a; end
|
|
21
|
+
def self.oneb(a,&b); [a,yield(b)]; end
|
|
22
|
+
|
|
23
|
+
def self.makeproc(&b) b end
|
|
24
|
+
|
|
25
|
+
def self.yield_now; yield; end
|
|
26
|
+
|
|
27
|
+
class ToProc
|
|
28
|
+
def initialize(val)
|
|
29
|
+
@val = val
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def to_proc
|
|
33
|
+
Proc.new { @val }
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
module Super
|
|
2
|
+
module S1
|
|
3
|
+
class A
|
|
4
|
+
def foo(a)
|
|
5
|
+
a << "A#foo"
|
|
6
|
+
bar(a)
|
|
7
|
+
end
|
|
8
|
+
def bar(a)
|
|
9
|
+
a << "A#bar"
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
class B < A
|
|
13
|
+
def foo(a)
|
|
14
|
+
a << "B#foo"
|
|
15
|
+
super(a)
|
|
16
|
+
end
|
|
17
|
+
def bar(a)
|
|
18
|
+
a << "B#bar"
|
|
19
|
+
super(a)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
module S2
|
|
25
|
+
class A
|
|
26
|
+
def baz(a)
|
|
27
|
+
a << "A#baz"
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
class B < A
|
|
31
|
+
def foo(a)
|
|
32
|
+
a << "B#foo"
|
|
33
|
+
baz(a)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
class C < B
|
|
37
|
+
def baz(a)
|
|
38
|
+
a << "C#baz"
|
|
39
|
+
super(a)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
|
2
|
+
|
|
3
|
+
describe "Hash literal" do
|
|
4
|
+
it "{} should return an empty hash" do
|
|
5
|
+
{}.size.should == 0
|
|
6
|
+
{}.should == {}
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
it "{} should return a new hash populated with the given elements" do
|
|
10
|
+
h = {:a => 'a', 'b' => 3, 44 => 2.3}
|
|
11
|
+
h.size.should == 3
|
|
12
|
+
h.should == {:a => 'a', 'b' => 3, 44 => 2.3}
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "treats empty expressions an nils" do
|
|
16
|
+
h = {() => ()}
|
|
17
|
+
h.keys.should == [nil]
|
|
18
|
+
h.values.should == [nil]
|
|
19
|
+
h[nil].should == nil
|
|
20
|
+
|
|
21
|
+
h = {() => :value}
|
|
22
|
+
h.keys.should == [nil]
|
|
23
|
+
h.values.should == [:value]
|
|
24
|
+
h[nil].should == :value
|
|
25
|
+
|
|
26
|
+
h = {:keys => ()}
|
|
27
|
+
h.keys.should == [:keys]
|
|
28
|
+
h.values.should == [nil]
|
|
29
|
+
h[:key].should == nil
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it "checks duplicated keys on initialization" do
|
|
33
|
+
h = {:foo => :bar, :foo => :foo}
|
|
34
|
+
h.keys.size.should == 1
|
|
35
|
+
h.should == {:foo => :foo}
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "accepts a hanging comma" do
|
|
39
|
+
h = {:a => 1, :b => 2,}
|
|
40
|
+
h.size.should == 2
|
|
41
|
+
h.should == {:a => 1, :b => 2}
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
|
2
|
+
|
|
3
|
+
describe "The if expression" do
|
|
4
|
+
it "evaluates body if expression is true" do
|
|
5
|
+
a = []
|
|
6
|
+
if true
|
|
7
|
+
a << 123
|
|
8
|
+
end
|
|
9
|
+
a.should == [123]
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "does not evaluate body if expression if false" do
|
|
13
|
+
a = []
|
|
14
|
+
if false
|
|
15
|
+
a << 123
|
|
16
|
+
end
|
|
17
|
+
a.should == []
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "does not evaluate body if expression is empty" do
|
|
21
|
+
a = []
|
|
22
|
+
if ()
|
|
23
|
+
a << 123
|
|
24
|
+
end
|
|
25
|
+
a.should == []
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "does not evaluate else-body if expression is true" do
|
|
29
|
+
a = []
|
|
30
|
+
if true
|
|
31
|
+
a << 123
|
|
32
|
+
else
|
|
33
|
+
a << 456
|
|
34
|
+
end
|
|
35
|
+
a.should == [123]
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "evaluates only else-body if expression is false" do
|
|
39
|
+
a = []
|
|
40
|
+
if false
|
|
41
|
+
a << 123
|
|
42
|
+
else
|
|
43
|
+
a << 456
|
|
44
|
+
end
|
|
45
|
+
a.should == [456]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it "returns result of then-body evaluation if expression is true" do
|
|
49
|
+
if true
|
|
50
|
+
123
|
|
51
|
+
end.should == 123
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "returns result of last statement in then-body if expression is true" do
|
|
55
|
+
if true
|
|
56
|
+
'foo'
|
|
57
|
+
'bar'
|
|
58
|
+
'baz'
|
|
59
|
+
end.should == 'baz'
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it "returns result of then-body evaluation if expression is true and else part is present" do
|
|
63
|
+
if true
|
|
64
|
+
123
|
|
65
|
+
else
|
|
66
|
+
456
|
|
67
|
+
end.should == 123
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it "returns result of else-body evaluation if expression is false" do
|
|
71
|
+
if false
|
|
72
|
+
123
|
|
73
|
+
else
|
|
74
|
+
456
|
|
75
|
+
end.should == 456
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it "returns nil if then-body is empty and expression is true" do
|
|
79
|
+
if true
|
|
80
|
+
end.should == nil
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
it "returns nil if then-body is empty, expression is true and else part is present" do
|
|
84
|
+
if true
|
|
85
|
+
else
|
|
86
|
+
456
|
|
87
|
+
end.should == nil
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
it "returns nil if then-body is empty, expression is true and else part is empty" do
|
|
91
|
+
if true
|
|
92
|
+
else
|
|
93
|
+
end.should == nil
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
it "returns nil if else-body is empty and expression is false" do
|
|
97
|
+
if false
|
|
98
|
+
123
|
|
99
|
+
else
|
|
100
|
+
end.should == nil
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
it "returns nil if else-body is empty, expression is false and then-body is empty" do
|
|
104
|
+
if false
|
|
105
|
+
else
|
|
106
|
+
end.should == nil
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
it "considers an expression with nil result as false" do
|
|
110
|
+
if nil
|
|
111
|
+
123
|
|
112
|
+
else
|
|
113
|
+
456
|
|
114
|
+
end.should == 456
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
it "considers a non-nil and non-boolean object in expression result as true" do
|
|
118
|
+
if 'x'
|
|
119
|
+
123
|
|
120
|
+
else
|
|
121
|
+
456
|
|
122
|
+
end.should == 123
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
it "considers a zero integer in expression result as true" do
|
|
126
|
+
if 0
|
|
127
|
+
123
|
|
128
|
+
else
|
|
129
|
+
456
|
|
130
|
+
end.should == 123
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
it "allows starting else-body on the same line" do
|
|
134
|
+
if false
|
|
135
|
+
123
|
|
136
|
+
else 456
|
|
137
|
+
end.should == 456
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
it "evaluates subsequent elsif statements and executes body of first matching" do
|
|
141
|
+
if false
|
|
142
|
+
123
|
|
143
|
+
elsif false
|
|
144
|
+
234
|
|
145
|
+
elsif true
|
|
146
|
+
345
|
|
147
|
+
elsif true
|
|
148
|
+
456
|
|
149
|
+
end.should == 345
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
it "evaluates else-body if no if/elsif statements match" do
|
|
153
|
+
if false
|
|
154
|
+
123
|
|
155
|
+
elsif false
|
|
156
|
+
234
|
|
157
|
+
elsif false
|
|
158
|
+
345
|
|
159
|
+
else
|
|
160
|
+
456
|
|
161
|
+
end.should == 456
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
it "allows 'then' after expression when then-body is on the next line" do
|
|
165
|
+
if true then
|
|
166
|
+
123
|
|
167
|
+
end.should == 123
|
|
168
|
+
|
|
169
|
+
if true then ; 123; end.should == 123
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
it "allows then-body on the same line separated with 'then'" do
|
|
173
|
+
if true then 123
|
|
174
|
+
end.should == 123
|
|
175
|
+
|
|
176
|
+
if true then 123; end.should == 123
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
it "returns nil when then-body on the same line separated with 'then' and expression is false" do
|
|
180
|
+
if false then 123
|
|
181
|
+
end.should == nil
|
|
182
|
+
|
|
183
|
+
if false then 123; end.should == nil
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
it "returns nil when then-body separated by 'then' is empty and expression is true" do
|
|
187
|
+
if true then
|
|
188
|
+
end.should == nil
|
|
189
|
+
|
|
190
|
+
if true then ; end.should == nil
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
it "returns nil when then-body separated by 'then', expression is false and no else part" do
|
|
194
|
+
if false then
|
|
195
|
+
end.should == nil
|
|
196
|
+
|
|
197
|
+
if false then ; end.should == nil
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
it "evaluates then-body when then-body separated by 'then', expression is true and else part is present" do
|
|
201
|
+
if true then 123
|
|
202
|
+
else 456
|
|
203
|
+
end.should == 123
|
|
204
|
+
|
|
205
|
+
if true then 123; else 456; end.should == 123
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
it "evaluates else-body when then-body separated by 'then' and expression is false" do
|
|
209
|
+
if false then 123
|
|
210
|
+
else 456
|
|
211
|
+
end.should == 456
|
|
212
|
+
|
|
213
|
+
if false then 123; else 456; end.should == 456
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
describe "The postfix if form" do
|
|
218
|
+
it "evaluates statement if expression is true" do
|
|
219
|
+
a = []
|
|
220
|
+
a << 123 if true
|
|
221
|
+
a.should == [123]
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
it "does not evaluate statement if expression if false" do
|
|
225
|
+
a = []
|
|
226
|
+
a << 123 if false
|
|
227
|
+
a.should == []
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
it "returns result of expression if value is true" do
|
|
231
|
+
(123 if true).should == 123
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
it "returns nil if value is false" do
|
|
235
|
+
(123 if false).should == nil
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
it "considers a nil expression as false" do
|
|
239
|
+
(123 if nil).should == nil
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
it "considers a non-nil object as true" do
|
|
243
|
+
(123 if 'x').should == 123
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
it "evaluates then-body in containing scope" do
|
|
247
|
+
a = 123
|
|
248
|
+
if true
|
|
249
|
+
b = a+1
|
|
250
|
+
end
|
|
251
|
+
b.should == 124
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
it "evaluates else-body if containing scope" do
|
|
255
|
+
a = 123
|
|
256
|
+
if false
|
|
257
|
+
b = a+1
|
|
258
|
+
else
|
|
259
|
+
b= a+2
|
|
260
|
+
end
|
|
261
|
+
b.should == 125
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
it "evaluates elsif-body in containing scope" do
|
|
265
|
+
a = 123
|
|
266
|
+
if false
|
|
267
|
+
b = a+1
|
|
268
|
+
elsif false
|
|
269
|
+
b = a+2
|
|
270
|
+
elsif true
|
|
271
|
+
b = a+3
|
|
272
|
+
else
|
|
273
|
+
b = a+4
|
|
274
|
+
end
|
|
275
|
+
b.should == 126
|
|
276
|
+
end
|
|
277
|
+
end
|
|
278
|
+
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
|
2
|
+
|
|
3
|
+
describe "The loop expression" do
|
|
4
|
+
it "repeats the given block until a break is called" do
|
|
5
|
+
outer_loop = 0
|
|
6
|
+
loop do
|
|
7
|
+
outer_loop += 1
|
|
8
|
+
break if outer_loop == 10
|
|
9
|
+
end
|
|
10
|
+
outer_loop.should == 10
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "executes code in its own scope" do
|
|
14
|
+
loop do
|
|
15
|
+
inner_loop = 123
|
|
16
|
+
break
|
|
17
|
+
end
|
|
18
|
+
lambda { inner_loop }.should raise_error(NameError)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "returns the value passed to break if interrupted by break" do
|
|
22
|
+
loop do
|
|
23
|
+
break 123
|
|
24
|
+
end.should == 123
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "returns nil if interrupted by break with no arguments" do
|
|
28
|
+
loop do
|
|
29
|
+
break
|
|
30
|
+
end.should == nil
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
|
2
|
+
require File.expand_path('../fixtures/next', __FILE__)
|
|
3
|
+
|
|
4
|
+
describe "The next statement from within the block" do
|
|
5
|
+
before :each do
|
|
6
|
+
ScratchPad.record []
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
it "ends block execution" do
|
|
10
|
+
a = []
|
|
11
|
+
lambda {
|
|
12
|
+
a << 1
|
|
13
|
+
next
|
|
14
|
+
a << 2
|
|
15
|
+
}.call
|
|
16
|
+
a.should == [1]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "causes block to return nil if invoked without arguments" do
|
|
20
|
+
lambda { 123; next; 456 }.call.should == nil
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "causes block to return nil if invoked with an empty expression" do
|
|
24
|
+
lambda { next (); 456 }.call.should be_nil
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "returns the argument passed" do
|
|
28
|
+
lambda { 123; next 234; 345 }.call.should == 234
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it "returns to the invoking method" do
|
|
32
|
+
NextSpecs.yielding_method(nil) { next }.should == :method_return_value
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "returns to the invoking method, with the specified value" do
|
|
36
|
+
NextSpecs.yielding_method(nil) {
|
|
37
|
+
next nil;
|
|
38
|
+
fail("next didn't end the block execution")
|
|
39
|
+
}.should == :method_return_value
|
|
40
|
+
|
|
41
|
+
NextSpecs.yielding_method(1) {
|
|
42
|
+
next 1;
|
|
43
|
+
fail("next didn't end the block execution")
|
|
44
|
+
}.should == :method_return_value
|
|
45
|
+
|
|
46
|
+
NextSpecs.yielding_method([1, 2, 3]) {
|
|
47
|
+
next 1, 2, 3;
|
|
48
|
+
fail("next didn't end the block execution")
|
|
49
|
+
}.should == :method_return_value
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it "returns to the currently yielding method in case of chained calls" do
|
|
53
|
+
class ChainedNextTest
|
|
54
|
+
def self.meth_with_yield(&b)
|
|
55
|
+
yield.should == :next_return_value
|
|
56
|
+
:method_return_value
|
|
57
|
+
end
|
|
58
|
+
def self.invoking_method(&b)
|
|
59
|
+
meth_with_yield(&b)
|
|
60
|
+
end
|
|
61
|
+
def self.enclosing_method
|
|
62
|
+
invoking_method do
|
|
63
|
+
next :next_return_value
|
|
64
|
+
:wrong_return_value
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
ChainedNextTest.enclosing_method.should == :method_return_value
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it "causes ensure blocks to run" do
|
|
73
|
+
[1].each do |i|
|
|
74
|
+
begin
|
|
75
|
+
ScratchPad << :begin
|
|
76
|
+
next
|
|
77
|
+
ensure
|
|
78
|
+
ScratchPad << :ensure
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
ScratchPad.recorded.should == [:begin, :ensure]
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
describe "The next statement" do
|
|
87
|
+
before :each do
|
|
88
|
+
ScratchPad.record []
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
describe "in a while loop" do
|
|
92
|
+
describe "when not passed an argument" do
|
|
93
|
+
before :each do
|
|
94
|
+
ScratchPad.record []
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it "causes ensure blocks to run" do
|
|
98
|
+
NextSpecs.while_next(false)
|
|
99
|
+
|
|
100
|
+
ScratchPad.recorded.should == [:begin, :ensure]
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
it "causes ensure blocks to run when nested in an block" do
|
|
104
|
+
NextSpecs.while_within_iter(false)
|
|
105
|
+
|
|
106
|
+
ScratchPad.recorded.should == [:begin, :ensure]
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
describe "when passed an argument" do
|
|
111
|
+
before :each do
|
|
112
|
+
ScratchPad.record []
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
it "causes ensure blocks to run" do
|
|
116
|
+
NextSpecs.while_next(true)
|
|
117
|
+
|
|
118
|
+
ScratchPad.recorded.should == [:begin, :ensure]
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
it "causes ensure blocks to run when nested in an block" do
|
|
122
|
+
NextSpecs.while_within_iter(true)
|
|
123
|
+
|
|
124
|
+
ScratchPad.recorded.should == [:begin, :ensure]
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|