mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
128 lines
3.5 KiB
Ruby
128 lines
3.5 KiB
Ruby
require_relative 'spec_helper'
|
|
|
|
load_extension("regexp")
|
|
|
|
describe "C-API Regexp function" do
|
|
before :each do
|
|
@p = CApiRegexpSpecs.new
|
|
end
|
|
|
|
describe "rb_reg_new" do
|
|
it "returns a new valid Regexp" do
|
|
my_re = @p.a_re("a", 0)
|
|
my_re.kind_of?(Regexp).should == true
|
|
('1a' =~ my_re).should == 1
|
|
('1b' =~ my_re).should == nil
|
|
my_re.source.should == 'a'
|
|
end
|
|
|
|
it "returns a Regexp with the given options" do
|
|
@p.a_re("a", 0).options == 0
|
|
@p.a_re("a", Regexp::IGNORECASE).options.should == Regexp::IGNORECASE
|
|
@p.a_re("a", Regexp::EXTENDED).options.should == Regexp::EXTENDED
|
|
@p.a_re("a", Regexp::EXTENDED | Regexp::IGNORECASE).options.should == Regexp::EXTENDED | Regexp::IGNORECASE
|
|
@p.a_re("a", Regexp::MULTILINE).options.should == Regexp::MULTILINE
|
|
end
|
|
end
|
|
|
|
describe "rb_reg_nth_match" do
|
|
it "returns a the appropriate match data entry" do
|
|
@p.a_re_1st_match(/([ab])/.match("a")).should == 'a'
|
|
@p.a_re_1st_match(/([ab])/.match("b")).should == 'b'
|
|
@p.a_re_1st_match(/[ab]/.match("a")).should == nil
|
|
@p.a_re_1st_match(/[ab]/.match("c")).should == nil
|
|
end
|
|
end
|
|
|
|
describe "rb_reg_options" do
|
|
it "returns the options used to create the regexp" do
|
|
@p.rb_reg_options(/42/im).should == //im.options
|
|
@p.rb_reg_options(/42/i).should == //i.options
|
|
@p.rb_reg_options(/42/m).should == //m.options
|
|
end
|
|
end
|
|
|
|
describe "rb_reg_regcomp" do
|
|
it "creates a valid regexp from a string" do
|
|
regexp = /\b([A-Z0-9._%+-]+)\.{2,4}/
|
|
@p.rb_reg_regcomp(regexp.source).should == regexp
|
|
end
|
|
end
|
|
|
|
it "allows matching in C, properly setting the back references" do
|
|
mail_regexp = /\b([A-Z0-9._%+-]+)@([A-Z0-9.-]+\.[A-Z]{2,4})\b/i
|
|
name = "john.doe"
|
|
domain = "example.com"
|
|
@p.match(mail_regexp, "#{name}@#{domain}")
|
|
$1.should == name
|
|
$2.should == domain
|
|
end
|
|
|
|
describe "rb_reg_match" do
|
|
it "returns the matched position or nil" do
|
|
@p.rb_reg_match(/a/, 'ab').should == 0
|
|
@p.rb_reg_match(/b/, 'ab').should == 1
|
|
@p.rb_reg_match(/c/, 'ab').should == nil
|
|
end
|
|
end
|
|
|
|
describe "rb_backref_get" do
|
|
it "returns the last MatchData" do
|
|
md = /a/.match('ab')
|
|
@p.rb_backref_get.should == md
|
|
md = /b/.match('ab')
|
|
@p.rb_backref_get.should == md
|
|
md = /c/.match('ab')
|
|
@p.rb_backref_get.should == md
|
|
end
|
|
|
|
it "returns MatchData when used with rb_reg_match" do
|
|
@p.rb_reg_match_backref_get(/a/, 'ab')[0].should == 'a'
|
|
end
|
|
end
|
|
|
|
describe "rb_backref_set" do
|
|
before :each do
|
|
@md = "foo".match(/foo/)
|
|
$~ = nil
|
|
end
|
|
|
|
it "sets the value of $~" do
|
|
@p.rb_backref_set(@md)
|
|
@p.rb_backref_get.should == @md
|
|
$~.should == @md
|
|
end
|
|
|
|
it "sets a Thread-local value" do
|
|
running = false
|
|
|
|
thr = Thread.new do
|
|
@p.rb_backref_set(@md)
|
|
@p.rb_backref_get.should == @md
|
|
$~.should == @md
|
|
running = true
|
|
end
|
|
|
|
Thread.pass while thr.status and !running
|
|
$~.should be_nil
|
|
|
|
thr.join
|
|
end
|
|
end
|
|
|
|
describe "rb_memicmp" do
|
|
it "returns 0 for identical strings" do
|
|
@p.rb_memcicmp('Hello', 'Hello').should == 0
|
|
end
|
|
|
|
it "returns 0 for strings which only differ in case" do
|
|
@p.rb_memcicmp('Hello', 'HELLO').should == 0
|
|
@p.rb_memcicmp('HELLO', 'Hello').should == 0
|
|
end
|
|
|
|
it "returns the difference between the first non matching characters" do
|
|
@p.rb_memcicmp('Hello', 'HELLP').should == -1
|
|
@p.rb_memcicmp('HELLp', 'Hello').should == 1
|
|
end
|
|
end
|
|
end
|