Skip to content

Commit 132b80a

Browse files
ideanlJosé Valim
authored andcommitted
Add bad digit clause to Base.decode32!/1,2 for case: :mixed (#7715)
* Add failing test for Base.decode32!/2 throwing a case error instead of an argument error (Issue #7703) * Fix Base.decode32!/2 throwing a case error instead of an argument error when using :mixed case (Issue #7703) Signed-off-by: José Valim <[email protected]>
1 parent f5e35da commit 132b80a

File tree

2 files changed

+18
-11
lines changed

2 files changed

+18
-11
lines changed

lib/elixir/lib/base.ex

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -184,16 +184,19 @@ defmodule Base do
184184
end
185185

186186
defp decode_char_clauses(alphabet, :mixed) when length(alphabet) == 32 do
187-
alphabet
188-
|> Stream.with_index()
189-
|> Enum.flat_map(fn {encoding, value} = pair ->
190-
if encoding in ?A..?Z do
191-
[pair, {encoding - ?A + ?a, value}]
192-
else
193-
[pair]
194-
end
195-
end)
196-
|> decode_clauses()
187+
clauses =
188+
alphabet
189+
|> Stream.with_index()
190+
|> Enum.flat_map(fn {encoding, value} = pair ->
191+
if encoding in ?A..?Z do
192+
[pair, {encoding - ?A + ?a, value}]
193+
else
194+
[pair]
195+
end
196+
end)
197+
|> decode_clauses()
198+
199+
clauses ++ bad_digit_clause()
197200
end
198201

199202
defp decode_mixed_clauses(first, second) do

lib/elixir/test/elixir/base_test.exs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,7 @@ defmodule BaseTest do
473473
assert :error == decode32("66FF", case: :lower)
474474
end
475475

476-
test "decode32!/1,2 error on non-alphabet digit" do
476+
test "decode32!/1,2 argument error on non-alphabet digit" do
477477
assert_raise ArgumentError, "non-alphabet digit found: \")\" (byte 41)", fn ->
478478
decode32!("MZX)6YTB")
479479
end
@@ -485,6 +485,10 @@ defmodule BaseTest do
485485
assert_raise ArgumentError, "non-alphabet digit found: \"M\" (byte 77)", fn ->
486486
decode32!("MZXW6YTBOI======", case: :lower)
487487
end
488+
489+
assert_raise ArgumentError, "non-alphabet digit found: \"0\" (byte 48)", fn ->
490+
decode32!("0ZXW6YTB0I======", case: :mixed)
491+
end
488492
end
489493

490494
test "decode32/1 errors on incorrect padding" do

0 commit comments

Comments
 (0)