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,65 @@
|
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
|
2
|
+
|
|
3
|
+
describe "The || operator" do
|
|
4
|
+
it "evaluates to true if any of its operands are true" do
|
|
5
|
+
if false || true || nil
|
|
6
|
+
x = true
|
|
7
|
+
end
|
|
8
|
+
x.should == true
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "evaluates to false if all of its operands are false" do
|
|
12
|
+
if false || nil
|
|
13
|
+
x = true
|
|
14
|
+
end
|
|
15
|
+
x.should == nil
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "is evaluated before assignment operators" do
|
|
19
|
+
x = nil || true
|
|
20
|
+
x.should == true
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "has a lower precedence than the && operator" do
|
|
24
|
+
x = 1 || false && x = 2
|
|
25
|
+
x.should == 1
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "treats empty expressions as nil" do
|
|
29
|
+
(() || true).should be_true
|
|
30
|
+
(() || false).should be_false
|
|
31
|
+
(true || ()).should be_true
|
|
32
|
+
(false || ()).should be_nil
|
|
33
|
+
(() || ()).should be_nil
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
describe "The or operator" do
|
|
38
|
+
it "evaluates to true if any of its operands are true" do
|
|
39
|
+
x = nil
|
|
40
|
+
if false or true
|
|
41
|
+
x = true
|
|
42
|
+
end
|
|
43
|
+
x.should == true
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "is evaluated after variables are assigned" do
|
|
47
|
+
x = nil or true
|
|
48
|
+
x.should == nil
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "has a lower precedence than the || operator" do
|
|
52
|
+
x = y= nil
|
|
53
|
+
x = true || false or y = 1
|
|
54
|
+
y.should == nil
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "treats empty expressions as nil" do
|
|
58
|
+
(() or true).should be_true
|
|
59
|
+
(() or false).should be_false
|
|
60
|
+
(true or ()).should be_true
|
|
61
|
+
(false or ()).should be_nil
|
|
62
|
+
(() or ()).should be_nil
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
|
2
|
+
|
|
3
|
+
describe "Predefined global $~" do
|
|
4
|
+
it "is set to contain the MatchData object of the last match if successful" do
|
|
5
|
+
md = /foo/.match 'foo'
|
|
6
|
+
$~.should be_kind_of(MatchData)
|
|
7
|
+
$~.object_id.should == md.object_id
|
|
8
|
+
|
|
9
|
+
/bar/ =~ 'bar'
|
|
10
|
+
$~.should be_kind_of(MatchData)
|
|
11
|
+
$~.object_id.should_not == md.object_id
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "is set to nil if the last match was unsuccessful" do
|
|
15
|
+
/foo/ =~ 'foo'
|
|
16
|
+
$~.nil?.should == false
|
|
17
|
+
|
|
18
|
+
/foo/ =~ 'bar'
|
|
19
|
+
$~.nil?.should == true
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
|
2
|
+
require File.expand_path('../fixtures/send', __FILE__)
|
|
3
|
+
|
|
4
|
+
specs = LangSendSpecs
|
|
5
|
+
|
|
6
|
+
describe "Invoking a method" do
|
|
7
|
+
describe "with zero arguments" do
|
|
8
|
+
it "requires no arguments passed" do
|
|
9
|
+
specs.fooM0.should == 100
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "raises ArgumentError if the method has a positive arity" do
|
|
13
|
+
lambda {
|
|
14
|
+
specs.fooM1
|
|
15
|
+
}.should raise_error(ArgumentError)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
describe "with only manditory arguments" do
|
|
20
|
+
it "requires exactly thr same number of passed values" do
|
|
21
|
+
specs.fooM1(1).should == [1]
|
|
22
|
+
specs.fooM2(1,2).should == [1,2]
|
|
23
|
+
specs.fooM3(1,2,3).should == [1,2,3]
|
|
24
|
+
specs.fooM4(1,2,3,4).should == [1,2,3,4]
|
|
25
|
+
specs.fooM5(1,2,3,4,5).should == [1,2,3,4,5]
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
describe "with optional arguments" do
|
|
30
|
+
it "uses the optional argument if none is is passed" do
|
|
31
|
+
specs.fooM0O1.should == [1]
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "uses the passed argument if available" do
|
|
35
|
+
specs.fooM0O1(2).should == [2]
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
describe "with manditory and optional arguments" do
|
|
40
|
+
it "uses the passed values in left to right order" do
|
|
41
|
+
specs.fooM1O1(2).should == [2, 1]
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
describe "with a rest argument" do
|
|
46
|
+
it "is an empty array if there are no additional arguments" do
|
|
47
|
+
specs.fooM0R().should == []
|
|
48
|
+
specs.fooM1R(1).should == [1, []]
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "gathers unused arguments" do
|
|
52
|
+
specs.fooM0R(1).should == [1]
|
|
53
|
+
specs.fooM1R(1,2).should == [1, [2]]
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "with a block makes it available to yield" do
|
|
58
|
+
specs.oneb(10) { 200 }.should == [10,200]
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "wwith a block converts the block to a Proc" do
|
|
62
|
+
prc = specs.makeproc { "hello" }
|
|
63
|
+
prc.should be_kind_of(Proc)
|
|
64
|
+
prc.call.should == "hello"
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it "with an object as a block used 'to_proc' for coercion" do
|
|
68
|
+
o = LangSendSpecs::ToProc.new(:from_to_proc)
|
|
69
|
+
|
|
70
|
+
specs.makeproc(&o).call.should == :from_to_proc
|
|
71
|
+
|
|
72
|
+
specs.yield_now(&o).should == :from_to_proc
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
it "with same names as existing variables is ok" do
|
|
76
|
+
foobar = 100
|
|
77
|
+
|
|
78
|
+
def foobar; 200; end
|
|
79
|
+
|
|
80
|
+
foobar.should == 100
|
|
81
|
+
foobar().should == 200
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it "with splat operator makes the object the direct arguments" do
|
|
85
|
+
a = [1,2,3]
|
|
86
|
+
specs.fooM3(*a).should == [1,2,3]
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it "without parantheses works" do
|
|
90
|
+
(specs.fooM3 1,2,3).should == [1,2,3]
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it "passes literal hashes without curly braces as the last parameter" do
|
|
94
|
+
specs.fooM3('abc', 456, 'rbx' => 'cool', 'specs' => 'fail sometimes', 'oh' => 'weh').should == ['abc', 456, {'rbx' => 'cool', 'specs' => 'fail sometimes', 'oh' => 'weh'}]
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it "passes a literal hash without curly braces or parens" do
|
|
98
|
+
(specs.fooM3 'abc', 456, 'rbx' => 'cool', 'specs' => 'fail sometimes', 'oh' => 'weh').should == ['abc', 456, {'rbx' => 'cool', 'specs' => 'fail sometimes', 'oh' => 'weh'}]
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
it "allows to literal hashes without curly braces as the only parameter" do
|
|
102
|
+
specs.fooM1(:rbx => :cool, :specs => :fail_sometimes).should == [{ :rbx => :cool, :specs => :fail_sometimes }]
|
|
103
|
+
(specs.fooM1 :rbx => :cool, :specs => :fail_sometimes).should == [{ :rbx => :cool, :specs => :fail_sometimes }]
|
|
104
|
+
end
|
|
105
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
|
2
|
+
require File.expand_path('../fixtures/super', __FILE__)
|
|
3
|
+
|
|
4
|
+
describe "The super keyword" do
|
|
5
|
+
it "calls the method on the calling class" do
|
|
6
|
+
Super::S1::A.new.foo([]).should == ["A#foo", "A#bar"]
|
|
7
|
+
Super::S1::A.new.bar([]).should == ["A#bar"]
|
|
8
|
+
Super::S1::B.new.foo([]).should == ["B#foo", "A#foo", "B#bar", "A#bar"]
|
|
9
|
+
Super::S1::B.new.bar([]).should == ["B#bar", "A#bar"]
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "searches the full inheritence chain" do
|
|
13
|
+
Super::S2::B.new.foo([]).should == ["B#foo", "A#baz"]
|
|
14
|
+
Super::S2::B.new.baz([]).should == ["A#baz"]
|
|
15
|
+
Super::S2::C.new.foo([]).should == ["B#foo", "C#baz", "A#baz"]
|
|
16
|
+
Super::S2::C.new.baz([]).should == ["C#baz", "A#baz"]
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
|
2
|
+
|
|
3
|
+
describe "A Symbol literal" do
|
|
4
|
+
it "is a ':' followed by any number of valid characters" do
|
|
5
|
+
a = :foo
|
|
6
|
+
a.should be_kind_of(Symbol)
|
|
7
|
+
# FIXME: this doesnt work as Symbols are Strings
|
|
8
|
+
#a.inspect.should == ':foo'
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "is a ':' followed by any valid variable, method, or constant name" do
|
|
12
|
+
# Add more of these?
|
|
13
|
+
[ :Foo,
|
|
14
|
+
:foo,
|
|
15
|
+
:@foo,
|
|
16
|
+
:@@foo,
|
|
17
|
+
:$foo,
|
|
18
|
+
:_,
|
|
19
|
+
:~,
|
|
20
|
+
:-,
|
|
21
|
+
:FOO,
|
|
22
|
+
:_Foo,
|
|
23
|
+
:&,
|
|
24
|
+
:_9
|
|
25
|
+
].each { |s| s.should be_kind_of(Symbol) }
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "is a ':' followed by a single- or double-quoted string that may contain otherwise invalid characters" do
|
|
29
|
+
[ [:'foo bar', ':"foo bar"'],
|
|
30
|
+
[:'++', ':"++"'],
|
|
31
|
+
[:'9', ':"9"'],
|
|
32
|
+
[:"foo #{1 + 1}", ':"foo 2"']
|
|
33
|
+
].each {
|
|
34
|
+
# FIXME: Symbols are Strings, so #inspect wont work
|
|
35
|
+
}
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "may contain '::' in the string" do
|
|
39
|
+
:'Some::Class'.should be_kind_of(Symbol)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
|
2
|
+
|
|
3
|
+
class UndefSpecClass
|
|
4
|
+
def meth(other);other;end
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
describe "The undef keyword" do
|
|
8
|
+
it "undefines 'meth='" do
|
|
9
|
+
obj = ::UndefSpecClass.new
|
|
10
|
+
(obj.meth 5).should == 5
|
|
11
|
+
class ::UndefSpecClass
|
|
12
|
+
undef meth
|
|
13
|
+
end
|
|
14
|
+
lambda { obj.meth 5 }.should raise_error(NoMethodError)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
|
2
|
+
|
|
3
|
+
describe "The unless expression" do
|
|
4
|
+
it "evaluates the unless body when the expression is false" do
|
|
5
|
+
unless false
|
|
6
|
+
a = true
|
|
7
|
+
else
|
|
8
|
+
a = false
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
a.should == true
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "returns the last statement in the body" do
|
|
15
|
+
unless false
|
|
16
|
+
'foo'
|
|
17
|
+
'bar'
|
|
18
|
+
'baz'
|
|
19
|
+
end.should == 'baz'
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "evaluates the else body when the expression is true" do
|
|
23
|
+
unless true
|
|
24
|
+
'foo'
|
|
25
|
+
else
|
|
26
|
+
'bar'
|
|
27
|
+
end.should == 'bar'
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "takes and optional then after the expression" do
|
|
31
|
+
unless false then
|
|
32
|
+
'baz'
|
|
33
|
+
end.should == 'baz'
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it "does not return a value when the expression is true" do
|
|
37
|
+
unless true; end.should == nil
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it "allows expression and body to be on one line (using 'then')" do
|
|
41
|
+
unless false then 'foo'; else 'bar'; end.should == 'foo'
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
|
2
|
+
|
|
3
|
+
describe "The until expression" do
|
|
4
|
+
it "runs while the expression is false" do
|
|
5
|
+
i = 0
|
|
6
|
+
until i > 9
|
|
7
|
+
i += 1
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
i.should == 10
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "optionally takes a 'do' after the expression" do
|
|
14
|
+
i = 0
|
|
15
|
+
until i > 9 do
|
|
16
|
+
i += 1
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
i.should == 10
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "allows body begin on the same line if do is used" do
|
|
23
|
+
i = 0
|
|
24
|
+
until i > 9 do i += 1
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
i.should == 10
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "executes code in containing variable scope" do
|
|
31
|
+
i = 0
|
|
32
|
+
until i == 1
|
|
33
|
+
a = 123
|
|
34
|
+
i = 1
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
a.should == 123
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it "executes code in containing variable scope with 'do'" do
|
|
41
|
+
i = 0
|
|
42
|
+
until i == 1 do
|
|
43
|
+
a = 123
|
|
44
|
+
i = 1
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
a.should == 123
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "returns nil if ended when condition became true" do
|
|
51
|
+
i = 0
|
|
52
|
+
until i > 9
|
|
53
|
+
i += 1
|
|
54
|
+
end.should == nil
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "evaluates the body if expression is empty" do
|
|
58
|
+
a = []
|
|
59
|
+
until ()
|
|
60
|
+
a << :body_evaluated
|
|
61
|
+
break
|
|
62
|
+
end
|
|
63
|
+
a.should == [:body_evaluated]
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it "stops running body if interrupted by break" do
|
|
67
|
+
i = 0
|
|
68
|
+
until i > 9
|
|
69
|
+
i += 1
|
|
70
|
+
break if i > 5
|
|
71
|
+
end
|
|
72
|
+
i.should == 6
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
it "returns value passed to break if interrupted by break" do
|
|
76
|
+
until false
|
|
77
|
+
break 123
|
|
78
|
+
end.should == 123
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
it "returns nil if interrupted by break with no arguments" do
|
|
82
|
+
until false
|
|
83
|
+
break
|
|
84
|
+
end.should == nil
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
it "skips to end of body with next" do
|
|
88
|
+
a = []
|
|
89
|
+
i = 0
|
|
90
|
+
until (i+=1)>=5
|
|
91
|
+
next if i==3
|
|
92
|
+
a << i
|
|
93
|
+
end
|
|
94
|
+
a.should == [1, 2, 4]
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
describe "The until modifier" do
|
|
99
|
+
it "runs preceding statement while the condition is false" do
|
|
100
|
+
i = 0
|
|
101
|
+
i += 1 until i > 9
|
|
102
|
+
i.should == 10
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
it "evaluates condition before statement execution" do
|
|
106
|
+
a = []
|
|
107
|
+
i = 0
|
|
108
|
+
a << i until (i+=1) >= 3
|
|
109
|
+
a.should == [1,2]
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
it "does not run the preceding statement if the condition is true" do
|
|
113
|
+
i = 0
|
|
114
|
+
i += 1 until true
|
|
115
|
+
i.should == 0
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
it "returns nil if ended when condition became true" do
|
|
119
|
+
i = 0
|
|
120
|
+
(i += 1 until i>9).should == nil
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
it "returns value passed to break if interrupted by break" do
|
|
124
|
+
(break 123 until false).should == 123
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
it "returns nil if interrupted by break with no arguments" do
|
|
128
|
+
(break until false).should == nil
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
it "skips to end of body with next" do
|
|
132
|
+
i = 0
|
|
133
|
+
j = 0
|
|
134
|
+
((i+=1) == 3 ? next : j+=i) until i > 10
|
|
135
|
+
j.should == 63
|
|
136
|
+
end
|
|
137
|
+
end
|