Skip to content
This repository was archived by the owner on Nov 30, 2024. It is now read-only.

Commit b70f78e

Browse files
committed
Simplify EncodedString conversions; fix ArgumentError raised from #split
Also, make Rubocop happy
1 parent 7f44214 commit b70f78e

File tree

2 files changed

+12
-17
lines changed

2 files changed

+12
-17
lines changed

lib/rspec/support/encoded_string.rb

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ module RSpec
22
module Support
33
# @private
44
class EncodedString
5-
MRI_UNICODE_UNKOWN_CHARACTER = "\xEF\xBF\xBD"
6-
75
def initialize(string, encoding=nil)
86
@encoding = encoding
97
@source_encoding = detect_source_encoding(string)
@@ -34,19 +32,18 @@ def to_s
3432
private
3533

3634
def matching_encoding(string)
37-
string.encode(@encoding)
38-
rescue Encoding::UndefinedConversionError, Encoding::InvalidByteSequenceError
39-
normalize_missing(string.encode(@encoding, :invalid => :replace, :undef => :replace))
35+
# Converting it to a higher higher character set (UTF-16) and then
36+
# back (to UTF-8) ensures that you will strip away invalid or undefined byte sequences.
37+
string.
38+
encode(::Encoding::UTF_16LE,
39+
:invalid => :replace, :undef => :replace, :replace => '?').
40+
encode(@encoding)
41+
rescue Encoding::UndefinedConversionError, Encoding::InvalidByteSequenceError, Encoding::CompatibilityError
42+
string.encode(@encoding,
43+
:invalid => :replace, :undef => :replace, :replace => '?')
4044
rescue Encoding::ConverterNotFoundError
41-
normalize_missing(string.force_encoding(@encoding).encode(:invalid => :replace))
42-
end
43-
44-
def normalize_missing(string)
45-
if @encoding.to_s == "UTF-8"
46-
string.gsub(MRI_UNICODE_UNKOWN_CHARACTER.force_encoding(@encoding), "?")
47-
else
48-
string
49-
end
45+
string.force_encoding(@encoding).encode(
46+
:invalid => :replace, :replace => '?')
5047
end
5148

5249
def detect_source_encoding(string)

spec/rspec/support/encoded_string_spec.rb

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,7 @@ module RSpec::Support
105105
it 'fails to split a string with an invalid byte sequence' do
106106
message_with_invalid_byte_sequence = "\xEF \255 \xAD I have bad bytes".force_encoding(target_encoding)
107107
resulting_string = build_encoded_string(message_with_invalid_byte_sequence, target_encoding)
108-
expect {
109-
resulting_string.split("\n")
110-
}.to raise_error(ArgumentError)
108+
expect(resulting_string.split("\n")).to eq(["? ? ? I have bad bytes"])
111109
end
112110

113111
it 'splits the string based on the delimiter accounting for encoding' do

0 commit comments

Comments
 (0)