132 lines
3.2 KiB
Ruby
132 lines
3.2 KiB
Ruby
![]() |
# frozen_string_literal: true
|
||
|
|
||
|
require 'fast_spec_helper'
|
||
|
|
||
|
require_relative '../../../../rubocop/cop/style/regexp_literal_mixed_preserve'
|
||
|
|
||
|
# This spec contains only relevant examples.
|
||
|
#
|
||
|
# See also https://github.com/rubocop/rubocop/pull/9688
|
||
|
RSpec.describe RuboCop::Cop::Style::RegexpLiteralMixedPreserve, :config do
|
||
|
let(:config) do
|
||
|
supported_styles = { 'SupportedStyles' => %w[slashes percent_r mixed mixed_preserve] }
|
||
|
RuboCop::Config.new('Style/PercentLiteralDelimiters' =>
|
||
|
percent_literal_delimiters_config,
|
||
|
'Style/RegexpLiteralMixedPreserve' =>
|
||
|
cop_config.merge(supported_styles))
|
||
|
end
|
||
|
|
||
|
let(:percent_literal_delimiters_config) { { 'PreferredDelimiters' => { '%r' => '{}' } } }
|
||
|
|
||
|
context 'when EnforcedStyle is set to mixed_preserve' do
|
||
|
let(:cop_config) { { 'EnforcedStyle' => 'mixed_preserve' } }
|
||
|
|
||
|
describe 'a single-line `//` regex without slashes' do
|
||
|
it 'is accepted' do
|
||
|
expect_no_offenses('foo = /a/')
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe 'a single-line `//` regex with slashes' do
|
||
|
it 'registers an offense and corrects' do
|
||
|
expect_offense(<<~'RUBY')
|
||
|
foo = /home\//
|
||
|
^^^^^^^^ Use `%r` around regular expression.
|
||
|
RUBY
|
||
|
|
||
|
expect_correction(<<~'RUBY')
|
||
|
foo = %r{home/}
|
||
|
RUBY
|
||
|
end
|
||
|
|
||
|
describe 'when configured to allow inner slashes' do
|
||
|
before do
|
||
|
cop_config['AllowInnerSlashes'] = true
|
||
|
end
|
||
|
|
||
|
it 'is accepted' do
|
||
|
expect_no_offenses('foo = /home\\//')
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe 'a multi-line `//` regex without slashes' do
|
||
|
it 'is accepted' do
|
||
|
expect_no_offenses(<<~'RUBY')
|
||
|
foo = /
|
||
|
foo
|
||
|
bar
|
||
|
/x
|
||
|
RUBY
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe 'a multi-line `//` regex with slashes' do
|
||
|
it 'registers an offense and corrects' do
|
||
|
expect_offense(<<~'RUBY')
|
||
|
foo = /
|
||
|
^ Use `%r` around regular expression.
|
||
|
https?:\/\/
|
||
|
example\.com
|
||
|
/x
|
||
|
RUBY
|
||
|
|
||
|
expect_correction(<<~'RUBY')
|
||
|
foo = %r{
|
||
|
https?://
|
||
|
example\.com
|
||
|
}x
|
||
|
RUBY
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe 'a single-line %r regex without slashes' do
|
||
|
it 'is accepted' do
|
||
|
expect_no_offenses(<<~RUBY)
|
||
|
foo = %r{a}
|
||
|
RUBY
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe 'a single-line %r regex with slashes' do
|
||
|
it 'is accepted' do
|
||
|
expect_no_offenses('foo = %r{home/}')
|
||
|
end
|
||
|
|
||
|
describe 'when configured to allow inner slashes' do
|
||
|
before do
|
||
|
cop_config['AllowInnerSlashes'] = true
|
||
|
end
|
||
|
|
||
|
it 'is accepted' do
|
||
|
expect_no_offenses(<<~RUBY)
|
||
|
foo = %r{home/}
|
||
|
RUBY
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe 'a multi-line %r regex without slashes' do
|
||
|
it 'is accepted' do
|
||
|
expect_no_offenses(<<~RUBY)
|
||
|
foo = %r{
|
||
|
foo
|
||
|
bar
|
||
|
}x
|
||
|
RUBY
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe 'a multi-line %r regex with slashes' do
|
||
|
it 'is accepted' do
|
||
|
expect_no_offenses(<<~RUBY)
|
||
|
foo = %r{
|
||
|
https?://
|
||
|
example\.com
|
||
|
}x
|
||
|
RUBY
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|