Skip to content

Commit 140c2b7

Browse files
committed
Support incompatible encodings in inspection messages
1 parent ec6073b commit 140c2b7

File tree

2 files changed

+44
-2
lines changed

2 files changed

+44
-2
lines changed

lib/power_assert.rb

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,16 @@ def initialize(value)
6464
end
6565

6666
def inspect
67-
@value.inspect
67+
inspect = @value.inspect
68+
if Encoding.compatible?(Encoding.default_external, inspect)
69+
inspect
70+
else
71+
begin
72+
"#{inspect.encode(Encoding.default_external)}(#{inspect.encoding})"
73+
rescue Encoding::UndefinedConversionError, Encoding::InvalidByteSequenceError
74+
inspect.force_encoding(Encoding.default_external)
75+
end
76+
end
6877
rescue => e
6978
"InspectionFailure: #{e.class}: #{e.message.each_line.first}"
7079
end
@@ -156,7 +165,8 @@ def build_assertion_message(line, methods, return_values, refs, proc_binding)
156165
inspected_vals = vals.each_with_object({}) do |j, h|
157166
h[j.column.to_s.to_sym] = [SafeInspectable.new(i.value).inspect, '|', ' '][i.column <=> j.column]
158167
end
159-
ret << sprintf(fmt, inspected_vals).rstrip
168+
l = sprintf(fmt, inspected_vals)
169+
ret << (l.valid_encoding? ? l.rstrip : l)
160170
end
161171
ret.join("\n")
162172
end

test/test_power_assert.rb

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,38 @@ def test_inspection_failure
358358
end
359359
end
360360

361+
def test_assertion_message_with_incompatible_encodings
362+
if Encoding.default_external == Encoding::UTF_8
363+
a = "\u3042"
364+
def a.inspect
365+
super.encode('utf-16le')
366+
end
367+
assert_equal <<END.chomp, assertion_message {
368+
a + a
369+
| | |
370+
| | "\u3042"(UTF-16LE)
371+
| "\u3042\u3042"
372+
"\u3042"(UTF-16LE)
373+
END
374+
a + a
375+
}
376+
end
377+
378+
379+
a = "\xFF"
380+
def a.inspect
381+
"\xFF".force_encoding('ascii-8bit')
382+
end
383+
assert_equal <<END.chomp.b, assertion_message {
384+
a.length
385+
| |
386+
| 1
387+
\xFF
388+
END
389+
a.length
390+
}.b
391+
end
392+
361393
def test_assertion_message_with_string
362394
a, = 0, a # suppress "assigned but unused variable" warning
363395
@b = 1

0 commit comments

Comments
 (0)