145 lines
3.0 KiB
Elixir
145 lines
3.0 KiB
Elixir
Code.require_file "../../test_helper", __FILE__
|
|
|
|
defmodule Kernel.Overridable do
|
|
def sample do
|
|
1
|
|
end
|
|
|
|
def with_super do
|
|
1
|
|
end
|
|
|
|
def without_super do
|
|
1
|
|
end
|
|
|
|
def explicit_nested_super do
|
|
{ super?, 2 }
|
|
end
|
|
|
|
defoverridable [sample: 0, with_super: 0, without_super: 0, explicit_nested_super: 0]
|
|
|
|
def explicit_nested_super do
|
|
{ super, super?, 1 }
|
|
end
|
|
|
|
defoverridable [explicit_nested_super: 0]
|
|
|
|
def implicit_nested_super do
|
|
{ super?, 1 }
|
|
end
|
|
|
|
defoverridable [implicit_nested_super: 0]
|
|
|
|
def implicit_nested_super do
|
|
{ super, super?, 0 }
|
|
end
|
|
|
|
def super_with_explicit_args(x, y) do
|
|
x + y
|
|
end
|
|
|
|
def super_with_implicit_args(x, y) do
|
|
x + y
|
|
end
|
|
|
|
def many_clauses(0) do
|
|
11
|
|
end
|
|
|
|
def many_clauses(1) do
|
|
13
|
|
end
|
|
|
|
defoverridable [implicit_nested_super: 0, super_with_implicit_args: 2,
|
|
super_with_explicit_args: 2, many_clauses: 1]
|
|
|
|
def without_super do
|
|
:without_super
|
|
end
|
|
|
|
def with_super do
|
|
super() + 2
|
|
end
|
|
|
|
def no_overridable do
|
|
{ :no_overridable, super? }
|
|
end
|
|
|
|
def explicit_nested_super do
|
|
{ super, super?, 0 }
|
|
end
|
|
|
|
def super_with_explicit_args(x, y) do
|
|
super x, y * 2
|
|
end
|
|
|
|
def super_with_implicit_args(x, y) do
|
|
x + y + super
|
|
end
|
|
|
|
def many_clauses(2) do
|
|
17
|
|
end
|
|
|
|
def many_clauses(_) do
|
|
super
|
|
end
|
|
end
|
|
|
|
defmodule Kernel.OverridableTest do
|
|
require Kernel.Overridable, as: Overridable
|
|
use ExUnit.Case
|
|
|
|
test "overridable is made concrete if no other is defined" do
|
|
assert Overridable.sample == 1
|
|
end
|
|
|
|
test "overridable overridden with super" do
|
|
assert Overridable.with_super == 3
|
|
end
|
|
|
|
test "overridable overridden without super" do
|
|
assert Overridable.without_super == :without_super
|
|
end
|
|
|
|
test "overridable overriden with nested super" do
|
|
assert Overridable.explicit_nested_super == { { { false, 2 }, true, 1 }, true, 0 }
|
|
end
|
|
|
|
test "overridable node overriden with nested super" do
|
|
assert Overridable.implicit_nested_super == { { false, 1 }, true, 0 }
|
|
end
|
|
|
|
test "calling super with explicit args" do
|
|
assert Overridable.super_with_explicit_args(1, 2) == 5
|
|
end
|
|
|
|
test "calling super with implicit args" do
|
|
assert Overridable.super_with_implicit_args(1, 2) == 6
|
|
end
|
|
|
|
test "function without overridable returns false for super?" do
|
|
assert Overridable.no_overridable == { :no_overridable, false }
|
|
end
|
|
|
|
test "overridable with many clauses" do
|
|
assert Overridable.many_clauses(0) == 11
|
|
assert Overridable.many_clauses(1) == 13
|
|
assert Overridable.many_clauses(2) == 17
|
|
end
|
|
|
|
test "overridable definitions are private" do
|
|
refute_member {:"OVERRIDABLE-0-with_super",0}, Overridable.__info__(:exports)
|
|
end
|
|
|
|
test "invalid super call" do
|
|
try do
|
|
Erlang.elixir.eval 'defmodule Foo.Forwarding do\ndef bar, do: 1\ndefoverridable [bar: 0]\ndef foo, do: super\nend', []
|
|
flunk "expected eval to fail"
|
|
rescue: error
|
|
assert error.message == ("nofile:4: no super defined for foo/0 in module 'Foo.Forwarding'. " <>
|
|
"Overridable functions available are: bar/0")
|
|
end
|
|
end
|
|
end |