From feed5c13ffa466acd2ebbce9b050b39e5a3e654e Mon Sep 17 00:00:00 2001 From: meh Date: Tue, 14 May 2013 01:39:15 +0200 Subject: [PATCH 1/2] Fix String.valid_codepoint? tests --- lib/elixir/lib/string.ex | 2 +- lib/elixir/test/elixir/string_test.exs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/elixir/lib/string.ex b/lib/elixir/lib/string.ex index 14644bf2974..41693b658bc 100644 --- a/lib/elixir/lib/string.ex +++ b/lib/elixir/lib/string.ex @@ -470,7 +470,7 @@ defmodule String do true iex> String.valid_codepoint?("ø") true - iex> String.valid_codepoint?("\xffff") + iex> String.valid_codepoint?(<<0xffff :: 16>>) false iex> String.valid_codepoint?("asdf") false diff --git a/lib/elixir/test/elixir/string_test.exs b/lib/elixir/test/elixir/string_test.exs index 51d6e58491b..9196a54a175 100644 --- a/lib/elixir/test/elixir/string_test.exs +++ b/lib/elixir/test/elixir/string_test.exs @@ -233,7 +233,7 @@ defmodule StringTest do assert String.valid_codepoint?("ø") assert String.valid_codepoint?("あ") - refute String.valid_codepoint?("\xffff") + refute String.valid_codepoint?(<<0xffff :: 16>>) refute String.valid_codepoint?("ab") end From 1d6fd3c4c8a07dd1de00e97c954f0d8ebcf18a67 Mon Sep 17 00:00:00 2001 From: meh Date: Tue, 14 May 2013 01:39:30 +0200 Subject: [PATCH 2/2] Add String.valid? --- lib/elixir/lib/string.ex | 28 ++++++++++++++++++++++++++ lib/elixir/test/elixir/string_test.exs | 9 +++++++++ 2 files changed, 37 insertions(+) diff --git a/lib/elixir/lib/string.ex b/lib/elixir/lib/string.ex index 41693b658bc..546f06e9473 100644 --- a/lib/elixir/lib/string.ex +++ b/lib/elixir/lib/string.ex @@ -458,6 +458,34 @@ defmodule String do @spec next_codepoint(t) :: {codepoint, t} | :no_codepoint defdelegate next_codepoint(string), to: String.Unicode + @doc %B""" + Checks whether `str` is a valid UTF-8 string. + + ## Examples + + iex> String.valid?("a") + true + iex> String.valid?("ø") + true + iex> String.valid?(<<0xffff :: 16>>) + false + iex> String.valid?("asd" <> <<0xffff :: 16>>) + false + + """ + @spec valid?(t) :: boolean + def valid?(<<_ :: utf8, t :: binary>>) do + valid?(t) + end + + def valid?(<<>>) do + true + end + + def valid?(_) do + false + end + @doc %B""" Checks whether `str` is a valid codepoint. diff --git a/lib/elixir/test/elixir/string_test.exs b/lib/elixir/test/elixir/string_test.exs index 9196a54a175..b226cc18847 100644 --- a/lib/elixir/test/elixir/string_test.exs +++ b/lib/elixir/test/elixir/string_test.exs @@ -228,6 +228,15 @@ defmodule StringTest do assert String.slice("", 0, 1) == nil end + test :valid? do + assert String.valid?("afds") + assert String.valid?("øsdfh") + assert String.valid?("dskfjあska") + + refute String.valid?(<<0xffff :: 16>>) + refute String.valid?("asd" <> <<0xffff :: 16>>) + end + test :valid_codepoint? do assert String.valid_codepoint?("a") assert String.valid_codepoint?("ø")