opal 0.3.43 → 0.3.44
Sign up to get free protection for your applications and to get access to all the features.
- 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
|