1defmodule Gettext.InterpolationTest do
2  use ExUnit.Case, async: true
3  doctest Gettext.Interpolation
4  alias Gettext.Interpolation
5
6  test "interpolate/2" do
7    interpolatable = Interpolation.to_interpolatable("%{a} %{b} %{c}")
8
9    assert Interpolation.interpolate(interpolatable, %{a: 1, b: :two, c: "thr ee"}) ==
10             {:ok, "1 two thr ee"}
11
12    assert Interpolation.interpolate(interpolatable, %{a: "a"}) ==
13             {:missing_bindings, "a %{b} %{c}", [:b, :c]}
14
15    interpolatable = Interpolation.to_interpolatable("%{a} %{a} %{a}")
16
17    assert Interpolation.interpolate(interpolatable, %{a: "foo"}) == {:ok, "foo foo foo"}
18
19    assert Interpolation.interpolate(interpolatable, %{b: "bar"}) ==
20             {:missing_bindings, "%{a} %{a} %{a}", [:a]}
21  end
22
23  test "to_interpolatable/1" do
24    assert Interpolation.to_interpolatable("Hello %{name}") == ["Hello ", :name]
25    assert Interpolation.to_interpolatable("%{solo}") == [:solo]
26    assert Interpolation.to_interpolatable("%{foo}%{bar} %{baz}") == [:foo, :bar, " ", :baz]
27    assert Interpolation.to_interpolatable("%{Your name} is cool!") == [:"Your name", " is cool!"]
28    assert Interpolation.to_interpolatable("foo %{} bar") == ["foo %{} bar"]
29    assert Interpolation.to_interpolatable("%{") == ["%{"]
30    assert Interpolation.to_interpolatable("abrupt ending %{") == ["abrupt ending %{"]
31
32    assert Interpolation.to_interpolatable("incomplete %{ and then some") ==
33             ["incomplete %{ and then some"]
34
35    assert Interpolation.to_interpolatable("first empty %{} then %{ incomplete") ==
36             ["first empty %{} then %{ incomplete"]
37
38    assert Interpolation.to_interpolatable("") == []
39  end
40
41  if :erlang.system_info(:otp_release) >= '20' do
42    test "to_interpolatable/1 with Unicode" do
43      assert Interpolation.to_interpolatable("%{Héllø} there") ==
44               [String.to_atom("Héllø"), " there"]
45    end
46  end
47
48  test "keys/1" do
49    # With a string as its argument
50    assert Interpolation.keys("Hello %{name}") == [:name]
51    assert Interpolation.keys("It's %{time} here in %{state}") == [:time, :state]
52    assert Interpolation.keys("Hi there %{your name}") == [:"your name"]
53    assert Interpolation.keys("Hello %{name} in %{state} goodbye %{name}") == [:name, :state]
54
55    # With a list of segments as its argument
56    assert Interpolation.keys(["Hello ", :name, " it's ", :time, " goodbye ", :name]) ==
57             [:name, :time]
58  end
59end
60