Skip to content

Commit 7893852

Browse files
committed
Fix edge case for String.contains?
1 parent f1b625c commit 7893852

File tree

2 files changed

+27
-10
lines changed

2 files changed

+27
-10
lines changed

lib/elixir/lib/string.ex

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -886,11 +886,23 @@ defmodule String do
886886
"""
887887
@spec contains?(t, t | [t]) :: boolean
888888

889-
def contains?(_, "") do
889+
def contains?(string, matches) when is_list(matches) do
890+
Enum.any?(matches, do_contains(string, &1))
891+
end
892+
893+
def contains?(string, match) do
894+
do_contains(string, match)
895+
end
896+
897+
defp do_contains(_, "") do
890898
true
891899
end
892900

893-
def contains?(string, matches) do
894-
:nomatch != :binary.match(string, matches)
901+
defp do_contains(string, match) when is_binary(match) do
902+
:nomatch != :binary.match(string, match)
903+
end
904+
905+
defp do_contains(_, _) do
906+
raise ArgumentError
895907
end
896908
end

lib/elixir/test/elixir/string_test.exs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -332,20 +332,25 @@ defmodule StringTest do
332332
end
333333

334334
test :contains? do
335-
assert String.contains? "", ""
336-
assert String.contains? "abc", ""
337-
assert String.contains? "abc", ["", "x"]
338-
339-
refute String.contains? "", " "
340-
refute String.contains? "", "a"
341-
335+
## Normal cases ##
342336
assert String.contains? "elixir of life", "of"
343337
assert String.contains? "エリクシア", "シ"
344338
assert String.contains? "elixir of life", ["mercury", "life"]
345339
refute String.contains? "exlixir of life", "death"
346340
refute String.contains? "エリクシア", "仙"
347341
refute String.contains? "elixir of life", ["death", "mercury", "eternal life"]
348342

343+
## Edge cases ##
344+
assert String.contains? "", ""
345+
assert String.contains? "abc", ""
346+
assert String.contains? "abc", ["", "x"]
347+
348+
refute String.contains? "", " "
349+
refute String.contains? "", "a"
350+
351+
## Sanity checks ##
352+
assert String.contains? "", ["", ""]
353+
assert String.contains? "abc", ["", ""]
349354
assert_raise ArgumentError, fn ->
350355
String.contains? "abc", [["b"], "b"]
351356
end

0 commit comments

Comments
 (0)