opal 0.3.43 → 0.3.44
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/CHANGELOG.md +19 -0
- data/README.md +1 -0
- data/Rakefile +29 -19
- data/examples/native/Gemfile +3 -0
- data/examples/native/README.md +17 -0
- data/examples/native/app/app.rb +38 -0
- data/examples/native/config.ru +8 -0
- data/examples/native/index.html.erb +12 -0
- data/lib/opal/lexer.rb +5 -1
- data/lib/opal/parser.rb +36 -10
- data/lib/opal/processor.rb +10 -9
- data/lib/opal/server.rb +17 -7
- data/lib/opal/target_scope.rb +2 -2
- data/lib/opal/version.rb +1 -1
- data/opal/opal-browser/script_loader.rb +8 -13
- data/opal/opal.rb +23 -5
- data/opal/opal/array.rb +128 -14
- data/opal/opal/boolean.rb +1 -1
- data/opal/opal/class.rb +92 -18
- data/opal/opal/enumerable.rb +90 -0
- data/opal/opal/error.rb +1 -1
- data/opal/opal/hash.rb +2 -2
- data/opal/opal/kernel.rb +3 -3
- data/opal/opal/numeric.rb +1 -1
- data/opal/opal/proc.rb +1 -1
- data/opal/opal/regexp.rb +31 -31
- data/opal/opal/runtime.js +181 -69
- data/opal/opal/string.rb +561 -40
- data/opal/opal/time.rb +1 -1
- data/opal/rbconfig.rb +17 -3
- data/opal/strscan.rb +41 -5
- data/spec/opal/class/new_spec.rb +27 -0
- data/spec/opal/native_spec.rb +127 -0
- data/spec/ospec/runner.rb +0 -2
- data/spec/parser/strscan/get_byte_spec.rb +29 -0
- data/spec/parser/strscan/skip_spec.rb +40 -0
- data/spec/rubyspec/core/array/each_spec.rb +1 -1
- data/spec/rubyspec/core/array/intersection_spec.rb +5 -0
- data/spec/rubyspec/core/array/max_spec.rb +32 -0
- data/spec/rubyspec/core/array/min_spec.rb +32 -0
- data/spec/rubyspec/core/array/minus_spec.rb +7 -5
- data/spec/rubyspec/core/array/multiply_spec.rb +1 -1
- data/spec/rubyspec/core/array/plus_spec.rb +1 -1
- data/spec/rubyspec/core/array/pop_spec.rb +1 -1
- data/spec/rubyspec/core/array/push_spec.rb +1 -1
- data/spec/rubyspec/core/array/rassoc_spec.rb +1 -1
- data/spec/rubyspec/core/array/reject_spec.rb +2 -2
- data/spec/rubyspec/core/array/reverse_each_spec.rb +2 -2
- data/spec/rubyspec/core/array/rindex_spec.rb +2 -2
- data/spec/rubyspec/core/array/select_spec.rb +1 -1
- data/spec/rubyspec/core/array/shift_spec.rb +1 -1
- data/spec/rubyspec/core/array/slice_spec.rb +1 -1
- data/spec/rubyspec/core/array/sort_spec.rb +15 -15
- data/spec/rubyspec/core/array/to_a_spec.rb +1 -1
- data/spec/rubyspec/core/array/to_ary_spec.rb +1 -1
- data/spec/rubyspec/core/array/uniq_spec.rb +1 -1
- data/spec/rubyspec/core/array/unshift_spec.rb +1 -1
- data/spec/rubyspec/core/array/zip_spec.rb +1 -1
- data/spec/rubyspec/core/enumerable/select_spec.rb +4 -1
- data/spec/rubyspec/core/module/const_defined_spec.rb +86 -0
- data/spec/rubyspec/core/module/const_get_spec.rb +55 -3
- data/spec/rubyspec/core/module/const_set_spec.rb +2 -2
- data/spec/rubyspec/core/module/constants_spec.rb +49 -0
- data/spec/rubyspec/core/regexp/match_spec.rb +66 -1
- data/spec/rubyspec/core/string/center_spec.rb +71 -0
- data/spec/rubyspec/core/string/chomp_spec.rb +6 -1
- data/spec/rubyspec/core/string/clone_spec.rb +8 -0
- data/spec/rubyspec/core/string/dup_spec.rb +8 -0
- data/spec/rubyspec/core/string/end_with_spec.rb +5 -1
- data/spec/rubyspec/core/string/gsub_spec.rb +15 -1
- data/spec/rubyspec/core/string/lines_spec.rb +9 -0
- data/spec/rubyspec/core/string/ljust_spec.rb +17 -0
- data/spec/rubyspec/core/string/match_spec.rb +25 -3
- data/spec/rubyspec/core/string/rindex_spec.rb +50 -0
- data/spec/rubyspec/core/string/rjust_spec.rb +17 -0
- data/spec/rubyspec/core/string/scan_spec.rb +66 -0
- data/spec/rubyspec/core/string/sub_spec.rb +17 -1
- data/spec/rubyspec/core/string/tr_s_spec.rb +31 -0
- data/spec/rubyspec/core/string/tr_spec.rb +31 -0
- data/spec/rubyspec/fixtures/constants.rb +6 -0
- data/spec/rubyspec/language/class_spec.rb +4 -8
- data/spec/rubyspec/language/numbers_spec.rb +10 -4
- data/spec/rubyspec/language/predefined_spec.rb +69 -2
- data/spec/rubyspec/library/rbconfig/config_spec.rb +47 -0
- data/spec/rubyspec/spec_helper.rb +6 -0
- metadata +46 -25
- data/opal/opal-eventable.rb +0 -26
- data/opal/opal/native.rb +0 -115
- data/spec/opal/eventable_spec.rb +0 -75
- data/spec/opal/native/element_reference_spec.rb +0 -40
- data/spec/opal/native/equal_spec.rb +0 -17
- data/spec/opal/native/fixtures/classes.rb +0 -27
- data/spec/opal/native/global_spec.rb +0 -12
- data/spec/opal/native/initialize_spec.rb +0 -8
- data/spec/opal/native/method_missing_spec.rb +0 -53
- data/spec/opal/native/to_native_spec.rb +0 -8
- data/spec/rubyspec/core/string/demodulize_spec.rb +0 -10
- data/spec/rubyspec/core/string/underscore_spec.rb +0 -17
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
require File.expand_path('../../../spec_helper', __FILE__)
|
|
2
2
|
require File.expand_path('../../../fixtures/constants', __FILE__)
|
|
3
3
|
|
|
4
|
-
|
|
5
4
|
module ConstantSpecs
|
|
6
5
|
end
|
|
7
6
|
|
|
@@ -37,7 +36,8 @@ describe "Module#const_set" do
|
|
|
37
36
|
lambda { ConstantSpecs.const_set "::Name", 1 }.should raise_error(NameError)
|
|
38
37
|
end
|
|
39
38
|
|
|
40
|
-
it "raises a NameError if the name contains non-
|
|
39
|
+
it "raises a NameError if the name contains non-word characters" do
|
|
40
|
+
# underscore (i.e., _) is a valid word character
|
|
41
41
|
ConstantSpecs.const_set("CS_CONST404", :const404).should == :const404
|
|
42
42
|
lambda { ConstantSpecs.const_set "Name=", 1 }.should raise_error(NameError)
|
|
43
43
|
lambda { ConstantSpecs.const_set "Name?", 1 }.should raise_error(NameError)
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
module ConstantsSpecsModule
|
|
2
|
+
MOD_CONST1 = "1"
|
|
3
|
+
MOD_CONST2 = "2"
|
|
4
|
+
MOD_CONST3 = "3"
|
|
5
|
+
|
|
6
|
+
module Foo
|
|
7
|
+
FOO = "foo"
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
class ConstantsSpecsClass
|
|
12
|
+
CLASS_CONST1 = "1"
|
|
13
|
+
CLASS_CONST2 = "2"
|
|
14
|
+
CLASS_CONST3 = "3"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
class SubConstantsSpecsClass < ConstantsSpecsClass
|
|
18
|
+
CLASS_CONST4 = "4"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
describe "Module#constants" do
|
|
22
|
+
it "should return constants in global scope when called from Module or Class" do
|
|
23
|
+
result = Module.constants
|
|
24
|
+
result.should include("Module", "Object", "TrueClass", "FalseClass", "RUBY_ENGINE")
|
|
25
|
+
result2 = Class.constants
|
|
26
|
+
result.should == result2
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "should only return constants and child modules defined directly on module" do
|
|
30
|
+
result = ConstantsSpecsModule.constants
|
|
31
|
+
result.size.should == 4
|
|
32
|
+
result.should include("MOD_CONST1", "MOD_CONST2", "MOD_CONST3", "Foo")
|
|
33
|
+
result = ConstantsSpecsModule::Foo.constants
|
|
34
|
+
result.size.should == 1
|
|
35
|
+
result.should include("FOO")
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "should only return constants defined directly on class" do
|
|
39
|
+
result = ConstantsSpecsClass.constants
|
|
40
|
+
result.size.should == 3
|
|
41
|
+
result.should include("CLASS_CONST1", "CLASS_CONST2", "CLASS_CONST3")
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "should include constants inherited from superclass" do
|
|
45
|
+
result = SubConstantsSpecsClass.constants
|
|
46
|
+
result.size.should == 4
|
|
47
|
+
result.should include("ClASS_CONST4", "CLASS_CONST1", "CLASS_CONST2", "CLASS_CONST3")
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -17,6 +17,71 @@ describe "Regexp#match on a successful match" do
|
|
|
17
17
|
/1/.match(nil)
|
|
18
18
|
$~.should be_nil
|
|
19
19
|
end
|
|
20
|
+
|
|
21
|
+
it "returns a MatchData object that exposes pre_match and post_match strings for inline regexp" do
|
|
22
|
+
re = /note: /i
|
|
23
|
+
result = re.match('preamble NOTE: This is just a test.')
|
|
24
|
+
result.pre_match.should == 'preamble '
|
|
25
|
+
result.post_match.should == 'This is just a test.'
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "returns a MatchData object that exposes pre_match and post_match strings for constructed regexp" do
|
|
29
|
+
re = Regexp.new(/note: /i)
|
|
30
|
+
result = re.match('preamble NOTE: This is just a test.')
|
|
31
|
+
result.pre_match.should == 'preamble '
|
|
32
|
+
result.post_match.should == 'This is just a test.'
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "sets $` and $' variables on match" do
|
|
36
|
+
re = /note: /i
|
|
37
|
+
re.match('preamble NOTE: This is just a test.')
|
|
38
|
+
$`.should == 'preamble '
|
|
39
|
+
$'.should == 'This is just a test.'
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it "resets $` and $' when no match" do
|
|
43
|
+
re = /note: /i
|
|
44
|
+
re.match('preamble NOTE: This is just a test.')
|
|
45
|
+
$`.should_not be_nil
|
|
46
|
+
$'.should_not be_nil
|
|
47
|
+
re.match(nil)
|
|
48
|
+
$`.should be_nil
|
|
49
|
+
$'.should be_nil
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it "returns a MatchData object that exposes match array" do
|
|
53
|
+
re = /(note): (.*)/i
|
|
54
|
+
result = re.match('preamble NOTE: This is just a test.')
|
|
55
|
+
result.length.should == 3
|
|
56
|
+
result.size.should == 3
|
|
57
|
+
result.captures.should == ['NOTE', 'This is just a test.']
|
|
58
|
+
result.to_a.should == ['NOTE: This is just a test.', 'NOTE', 'This is just a test.']
|
|
59
|
+
result[1].should == ['NOTE']
|
|
60
|
+
result.values_at(1, -1).should == ['NOTE', 'This is just a test.']
|
|
61
|
+
result.values_at(-3, 0).should == [nil, 'NOTE: This is just a test.']
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it "replaces undefined with nil in match array" do
|
|
65
|
+
re = /(a(b)c)?(def)/
|
|
66
|
+
result = re.match("def")
|
|
67
|
+
result.to_a.size.should == 4
|
|
68
|
+
result.to_a.should == ["def", nil, nil, "def"]
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it "returns a MatchData object that exposes regexp and string" do
|
|
72
|
+
re = /(note): (.*)/i
|
|
73
|
+
result = re.match('preamble NOTE: This is just a test.')
|
|
74
|
+
result.string.should == 'preamble NOTE: This is just a test.'
|
|
75
|
+
result.regexp.to_s.should == re.to_s
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it "returns a MatchData object that provides access to offset of 0th element only" do
|
|
79
|
+
re = /(note): (.*)/i
|
|
80
|
+
result = re.match('preamble NOTE: This is just a test.')
|
|
81
|
+
result.begin(0).should == 9
|
|
82
|
+
result.begin(1).should == 9
|
|
83
|
+
lambda { result.begin(2) }.should raise_error(ArgumentError)
|
|
84
|
+
end
|
|
20
85
|
end
|
|
21
86
|
|
|
22
87
|
describe :regexp_match do
|
|
@@ -27,4 +92,4 @@ describe :regexp_match do
|
|
|
27
92
|
it "returns nil if the object is nil" do
|
|
28
93
|
/xyz/.match(nil).should be_nil
|
|
29
94
|
end
|
|
30
|
-
end
|
|
95
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
describe "String#center" do
|
|
2
|
+
|
|
3
|
+
it "does nothing if the specified width is lower than the string's size" do
|
|
4
|
+
"abc".center(2).should == "abc"
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
it "center a string with a strange pattern" do
|
|
8
|
+
"ab".center(17, '12345').should == "1234512ab12345123"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
describe "centers an odd string with a odd number of padding strings" do
|
|
12
|
+
it "uses default padding" do
|
|
13
|
+
"abc".center(5).should == " abc "
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "uses a custum padding" do
|
|
17
|
+
"abc".center(5, '-').should == "-abc-"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "works with bigger patterns" do
|
|
21
|
+
"abc".center(7, '~!{').should == "~!abc~!"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "repeats the pattern if needed" do
|
|
25
|
+
"abc".center(10, '~!{').should == "~!{abc~!{~"
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
describe "centers an even string with an odd number of padding strings" do
|
|
30
|
+
it "uses default padding" do
|
|
31
|
+
"abcd".center(7).should == " abcd "
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "works with bigger patterns" do
|
|
35
|
+
"abcd".center(7, '~!{').should == "~abcd~!"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "repeats the pattern if needed" do
|
|
39
|
+
"abcd".center(11, '~!{').should == "~!{abcd~!{~"
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
describe "centers an even string with an even number of padding strings" do
|
|
44
|
+
it "uses default padding" do
|
|
45
|
+
"abcd".center(8).should == " abcd "
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it "works with bigger patterns" do
|
|
49
|
+
"abcd".center(8, '~!{').should == "~!abcd~!"
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it "repeats the pattern if needed" do
|
|
53
|
+
"abcd".center(12, '~!{').should == "~!{~abcd~!{~"
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
describe "center an odd string with an even number" do
|
|
58
|
+
it "uses default padding" do
|
|
59
|
+
"abc".center(4).should == "abc "
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it "works with bigger patterns" do
|
|
63
|
+
"abc".center(4, '~!{').should == "abc~"
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it "repeats the pattern if needed" do
|
|
67
|
+
"abc".center(12, '~!{').should == "~!{~abc~!{~!"
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
end
|
|
@@ -30,6 +30,11 @@ describe "String#chomp with separator" do
|
|
|
30
30
|
"hello\n\r\n".chomp("\r\n").should == "hello\n"
|
|
31
31
|
end
|
|
32
32
|
|
|
33
|
+
it "removes separator character" do
|
|
34
|
+
"hello)".chomp(")").should == "hello"
|
|
35
|
+
"hello*)".chomp("*)").should == "hello"
|
|
36
|
+
end
|
|
37
|
+
|
|
33
38
|
it "returns self if the separator is nil" do
|
|
34
39
|
"hello\n\n".chomp(nil).should == "hello\n\n"
|
|
35
40
|
end
|
|
@@ -40,4 +45,4 @@ describe "String#chomp with separator" do
|
|
|
40
45
|
"".chomp("").should == ""
|
|
41
46
|
"".chomp(nil).should == ""
|
|
42
47
|
end
|
|
43
|
-
end
|
|
48
|
+
end
|
|
@@ -9,4 +9,8 @@ describe "String#end_with?" do
|
|
|
9
9
|
it "returns true only if any ending match" do
|
|
10
10
|
"hello".end_with?('x', 'y', 'llo', 'z').should be_true
|
|
11
11
|
end
|
|
12
|
-
|
|
12
|
+
|
|
13
|
+
it "should not return true if suffix length is 1 greater than string length" do
|
|
14
|
+
"-".end_with?(' +').should be_false
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -14,4 +14,18 @@ describe "String#gsub with pattern and block" do
|
|
|
14
14
|
"hello!".gsub(/(.)(.)/) { |*a| a.inspect }.should == '["he"]["ll"]["o!"]'
|
|
15
15
|
"hello".gsub('l') { 'x'}.should == 'hexxo'
|
|
16
16
|
end
|
|
17
|
-
|
|
17
|
+
|
|
18
|
+
it "should set the global match variable $~ inside block" do
|
|
19
|
+
match_data = nil
|
|
20
|
+
"hello".gsub(/(.)(.)(.)(.)(.)/) { match_data = $~; $~[1] }.should == "h"
|
|
21
|
+
match_data.length.should == 6
|
|
22
|
+
match_data.should == ["hello", "h", "e", "l", "l", "o"]
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "should replace match group with undefined value with nil in match array" do
|
|
26
|
+
match_data = nil
|
|
27
|
+
"def".gsub(/(a(b)c)?d(e)f/) { match_data = $~; $~[3] }.should == "e"
|
|
28
|
+
match_data.length.should == 4
|
|
29
|
+
match_data.should == ["def", nil, nil, "e"]
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
describe "String#lines" do
|
|
2
|
+
pending "should split on the default record separator and return enumerator if not block is given" do
|
|
3
|
+
"first\nsecond\nthird".lines.class.should == Enumerator
|
|
4
|
+
"first\nsecond\nthird".lines.entries.class.should == Array
|
|
5
|
+
"first\nsecond\nthird".lines.entries.size.should == 3
|
|
6
|
+
"first\nsecond\nthird".lines.entries.should == ["first\n", "second\n", "third"]
|
|
7
|
+
"first\nsecond\nthird\n".lines.entries.should == ["first\n", "second\n", "third\n"]
|
|
8
|
+
end
|
|
9
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
describe "String#ljust" do
|
|
2
|
+
it "does nothing if the specified width is lower than the string's size" do
|
|
3
|
+
"abc".ljust(2).should == "abc"
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
it "uses default padding" do
|
|
7
|
+
"abc".ljust(5).should == " abc"
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
it "uses a custum padding" do
|
|
11
|
+
"abc".ljust(5, '-').should == "--abc"
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "uses wisely a bigger pattern" do
|
|
15
|
+
"abc".ljust(10, "123").should == "1231231abc"
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
describe "String#=~" do
|
|
2
2
|
it "sets $~ to MatchData when there is a match and nil then there's none" do
|
|
3
|
-
'hello' =~
|
|
4
|
-
|
|
3
|
+
'hello' =~ /(l)(l)/
|
|
4
|
+
$~.should be_kind_of(MatchData)
|
|
5
|
+
$~[0].should == "ll"
|
|
6
|
+
$~.captures.should == ["l", "l"]
|
|
7
|
+
$~.pre_match.should == "he"
|
|
8
|
+
$`.should == "he"
|
|
9
|
+
$~.post_match.should == "o"
|
|
10
|
+
$'.should == "o"
|
|
5
11
|
|
|
6
12
|
'hello' =~ /not/
|
|
7
13
|
$~.should == nil
|
|
14
|
+
$`.should == nil
|
|
15
|
+
$'.should == nil
|
|
8
16
|
end
|
|
9
17
|
end
|
|
10
18
|
|
|
@@ -24,4 +32,18 @@ describe "String#match" do
|
|
|
24
32
|
'hello'.match(/X/)
|
|
25
33
|
$~.should == nil
|
|
26
34
|
end
|
|
27
|
-
|
|
35
|
+
|
|
36
|
+
it "sets $` to pre_match and $' to post_match or nil when there is no match" do
|
|
37
|
+
result = 'hello'.match(/ll/)
|
|
38
|
+
$`.should == 'he'
|
|
39
|
+
$'.should == 'o'
|
|
40
|
+
result.pre_match.should == 'he'
|
|
41
|
+
result.post_match.should == 'o'
|
|
42
|
+
|
|
43
|
+
'hello'.match(/X/)
|
|
44
|
+
$`.should == nil
|
|
45
|
+
$'.should == nil
|
|
46
|
+
result.pre_match.should == 'he'
|
|
47
|
+
result.post_match.should == 'o'
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
describe "String#rindex" do
|
|
2
|
+
it "should return index of last occurrence of search string" do
|
|
3
|
+
"camal".rindex("a").should == 3
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
it "should return index of last occurrence of RegExp match" do
|
|
7
|
+
"camal".rindex(/a/).should == 3
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
it "should return nil if non-empty search is not found" do
|
|
11
|
+
"camal".rindex("x").should be_nil
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "should return nil if RegExp is not matched" do
|
|
15
|
+
"camal".rindex(/x/).should be_nil
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "should return 0 if string and search string are both empty" do
|
|
19
|
+
"".rindex("").should == 0
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "should return index of last occurrence of search string from offset" do
|
|
23
|
+
"camal".rindex("a", 1).should == 1
|
|
24
|
+
"camal".rindex(/a/, 4).should == 3
|
|
25
|
+
"camal".rindex("a", -4).should == 1
|
|
26
|
+
"camal".rindex("a", -2).should == 3
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "should return index of last occurrence of RegExp match from offset" do
|
|
30
|
+
"camal".rindex(/a/, 1).should == 1
|
|
31
|
+
"camal".rindex(/a/, 4).should == 3
|
|
32
|
+
"camal".rindex(/a/, -4).should == 1
|
|
33
|
+
"camal".rindex(/a/, -2).should == 3
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it "should return nil of last occurrence is after offset" do
|
|
37
|
+
"camal".rindex("a", 0).should be_nil
|
|
38
|
+
"camal".rindex("a", -5).should be_nil
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it "should return nil of last occurrence of RegExp match is after offset" do
|
|
42
|
+
"camal".rindex(/a/, 0).should be_nil
|
|
43
|
+
"camal".rindex(/a/, -5).should be_nil
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "should raise TypeError if search is not String or RegExp" do
|
|
47
|
+
lambda { "camal".rindex(nil) }.should raise_error(TypeError)
|
|
48
|
+
lambda { "camal".rindex(1) }.should raise_error(TypeError)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
describe "String#rjust" do
|
|
2
|
+
it "does nothing if the specified width is lower than the string's size" do
|
|
3
|
+
"abc".rjust(2).should == "abc"
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
it "uses default padding" do
|
|
7
|
+
"abc".rjust(5).should == "abc "
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
it "uses a custum padding" do
|
|
11
|
+
"abc".rjust(5, '-').should == "abc--"
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "uses wisely a bigger pattern" do
|
|
15
|
+
"abc".rjust(10, "123").should == "abc1231231"
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
describe "String#scan" do
|
|
2
|
+
VOWELS_RE_NO_CAPTURE = /[aeiou]/
|
|
3
|
+
VOWELS_RE_CAPTURE = /([aeiou])/
|
|
4
|
+
it "should create one-dimensional array of matches if pattern has no capture groups" do
|
|
5
|
+
result = "string-a-long".scan(VOWELS_RE_NO_CAPTURE)
|
|
6
|
+
result.should be_kind_of(Array)
|
|
7
|
+
result.size.should == 3
|
|
8
|
+
result.should == ["i", "a", "o"]
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "should create two-dimensional array of matches if pattern has capture groups" do
|
|
12
|
+
result = "string-a-long".scan(VOWELS_RE_CAPTURE)
|
|
13
|
+
result.should be_kind_of(Array)
|
|
14
|
+
result.size.should == 3
|
|
15
|
+
result.should == [["i"], ["a"], ["o"]]
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "should set implicit match variables to final match when no block" do
|
|
19
|
+
result = "string-a-long".scan(VOWELS_RE_CAPTURE)
|
|
20
|
+
$~.should be_kind_of(MatchData)
|
|
21
|
+
$~.size.should == 2
|
|
22
|
+
$~[0].should == "o"
|
|
23
|
+
$~[1].should == "o"
|
|
24
|
+
$`.should == "string-a-l"
|
|
25
|
+
$~.pre_match.should == "string-a-l"
|
|
26
|
+
$'.should == "ng"
|
|
27
|
+
$~.post_match == "ng"
|
|
28
|
+
result.should == [["i"], ["a"], ["o"]]
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it "should set implicit match variables for each iteration of block" do
|
|
32
|
+
iterations = 0
|
|
33
|
+
vals = {
|
|
34
|
+
:match_data => [],
|
|
35
|
+
:capture1 => [],
|
|
36
|
+
:pre_match => [],
|
|
37
|
+
:post_match => []
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
result = "string-a-long".scan(VOWELS_RE_CAPTURE) do |capture1|
|
|
41
|
+
iterations += 1
|
|
42
|
+
vals[:match_data] << $~
|
|
43
|
+
vals[:capture1] << capture1
|
|
44
|
+
vals[:pre_match] << $`
|
|
45
|
+
vals[:post_match] << $'
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
iterations.should == 3
|
|
49
|
+
vals[:capture1].should == ["i", "a", "o"]
|
|
50
|
+
vals[:pre_match].should == ["str", "string-", "string-a-l"]
|
|
51
|
+
vals[:post_match].should == ["ng-a-long", "-long", "ng"]
|
|
52
|
+
vals[:match_data][0][0].should == "i"
|
|
53
|
+
vals[:match_data][1][0].should == "a"
|
|
54
|
+
vals[:match_data][2][0].should == "o"
|
|
55
|
+
result.should == "string-a-long"
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# this verifies that the lastIndex is reset before using the regexp
|
|
59
|
+
it "should get same matches on consecutive runs" do
|
|
60
|
+
re = Regexp.new('[aeiou]', 'g')
|
|
61
|
+
results1 = 'hello'.scan(re)
|
|
62
|
+
results2 = 'hello'.scan(re)
|
|
63
|
+
results1.should == ["e", "o"]
|
|
64
|
+
results2.should == results1
|
|
65
|
+
end
|
|
66
|
+
end
|