%% -*- erlang-indent-level: 4 -*-
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
%% You may obtain a copy of the License at
%%
%% http://www.apache.org/licenses/LICENSE-2.0
%%
%% Unless required by applicable law or agreed to in writing, software
%% distributed under the License is distributed on an "AS IS" BASIS,
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
%% See the License for the specific language governing permissions and
%% limitations under the License.
%%
-module(erl_types_SUITE).
-export([all/0,
consistency_and_to_string/1]).
%% Simplify calls into erl_types and avoid importing the entire module.
-define(M, erl_types).
-include_lib("common_test/include/ct.hrl").
all() ->
[consistency_and_to_string].
consistency_and_to_string(_Config) ->
%% Check consistency of types
Atom1 = ?M:t_atom(),
Atom2 = ?M:t_atom(foo),
Atom3 = ?M:t_atom(bar),
true = ?M:t_is_atom(Atom2),
True = ?M:t_atom(true),
False = ?M:t_atom(false),
Bool = ?M:t_boolean(),
true = ?M:t_is_boolean(True),
true = ?M:t_is_boolean(Bool),
false = ?M:t_is_boolean(Atom1),
Binary = ?M:t_binary(),
true = ?M:t_is_binary(Binary),
Bitstr = ?M:t_bitstr(),
true = ?M:t_is_bitstr(Bitstr),
Bitstr1 = ?M:t_bitstr(7, 3),
true = ?M:t_is_bitstr(Bitstr1),
false = ?M:t_is_binary(Bitstr1),
Bitstr2 = ?M:t_bitstr(16, 8),
true = ?M:t_is_bitstr(Bitstr2),
true = ?M:t_is_binary(Bitstr2),
BitStr816 = ?M:t_bitstr(8,16),
BitStr816 = ?M:t_subtract(?M:t_bitstr(4, 12), ?M:t_bitstr(8, 12)),
Int1 = ?M:t_integer(),
Int2 = ?M:t_integer(1),
Int3 = ?M:t_integer(16#ffffffff),
true = ?M:t_is_integer(Int2),
true = ?M:t_is_byte(Int2),
false = ?M:t_is_byte(Int3),
false = ?M:t_is_byte(?M:t_from_range(-1, 1)),
true = ?M:t_is_byte(?M:t_from_range(1, 255)),
Tuple1 = ?M:t_tuple(),
Tuple2 = ?M:t_tuple(3),
Tuple3 = ?M:t_tuple([Atom1, Int1]),
Tuple4 = ?M:t_tuple([Tuple1, Tuple2]),
Tuple5 = ?M:t_tuple([Tuple3, Tuple4]),
Tuple6 = ?M:t_limit(Tuple5, 2),
Tuple7 = ?M:t_limit(Tuple5, 3),
true = ?M:t_is_tuple(Tuple1),
Port = ?M:t_port(),
Pid = ?M:t_pid(),
Ref = ?M:t_reference(),
Identifier = ?M:t_identifier(),
false = ?M:t_is_reference(Port),
true = ?M:t_is_identifier(Port),
Function1 = ?M:t_fun(),
Function2 = ?M:t_fun(Pid),
Function3 = ?M:t_fun([], Pid),
Function4 = ?M:t_fun([Port, Pid], Pid),
Function5 = ?M:t_fun([Pid, Atom1], Int2),
true = ?M:t_is_fun(Function3),
List1 = ?M:t_list(),
List2 = ?M:t_list(?M:t_boolean()),
List3 = ?M:t_cons(?M:t_boolean(), List2),
List4 = ?M:t_cons(?M:t_boolean(), ?M:t_atom()),
List5 = ?M:t_cons(?M:t_boolean(), ?M:t_nil()),
List6 = ?M:t_cons_tl(List5),
List7 = ?M:t_sup(List4, List5),
List8 = ?M:t_inf(List7, ?M:t_list()),
List9 = ?M:t_cons(),
List10 = ?M:t_cons_tl(List9),
true = ?M:t_is_boolean(?M:t_cons_hd(List5)),
true = ?M:t_is_list(List5),
false = ?M:t_is_list(List4),
Product1 = ?M:t_product([Atom1, Atom2]),
Product2 = ?M:t_product([Atom3, Atom1]),
Product3 = ?M:t_product([Atom3, Atom2]),
Union1 = ?M:t_sup(Atom2, Atom3),
Union2 = ?M:t_sup(Tuple2, Tuple3),
Union3 = ?M:t_sup(Int2, Atom3),
Union4 = ?M:t_sup(Port, Pid),
Union5 = ?M:t_sup(Union4, Int1),
Union6 = ?M:t_sup(Function1, Function2),
Union7 = ?M:t_sup(Function4, Function5),
Union8 = ?M:t_sup(True, False),
true = ?M:t_is_boolean(Union8),
Union9 = ?M:t_sup(Int2, ?M:t_integer(2)),
true = ?M:t_is_byte(Union9),
Union10 = ?M:t_sup(?M:t_tuple([?M:t_atom(true), ?M:t_any()]),
?M:t_tuple([?M:t_atom(false), ?M:t_any()])),
Any = ?M:t_any(),
Any = ?M:t_sup(Product3, Function5),
Atom3 = ?M:t_inf(Union3, Atom1),
Union2 = ?M:t_inf(Union2, Tuple1),
Int2 = ?M:t_inf(Int1, Union3),
Union4 = ?M:t_inf(Union4, Identifier),
Port = ?M:t_inf(Union5, Port),
Function4 = ?M:t_inf(Union7, Function4),
None = ?M:t_none(),
None = ?M:t_inf(Product2, Atom1),
Product3 = ?M:t_inf(Product1, Product2),
Function5 = ?M:t_inf(Union7, Function5),
true = ?M:t_is_byte(?M:t_inf(Union9, ?M:t_number())),
true = ?M:t_is_char(?M:t_inf(Union9, ?M:t_number())),
RecDict = #{{record, foo} => {{?FILE, ?LINE}, [{2, [{bar, [], ?M:t_any()},
{baz, [], ?M:t_any()}]}]}},
Record1 = ?M:t_from_term({foo, [1,2], {1,2,3}}),
%% Check string representations
"atom()" = ?M:t_to_string(Atom1),
"'foo'" = ?M:t_to_string(Atom2),
"'bar'" = ?M:t_to_string(Atom3),
"binary()" = ?M:t_to_string(Binary),
"integer()" = ?M:t_to_string(Int1),
"1" = ?M:t_to_string(Int2),
"tuple()" = ?M:t_to_string(Tuple1),
"{_,_,_}" = ?M:t_to_string(Tuple2),
"{atom(),integer()}" = ?M:t_to_string(Tuple3),
"{tuple(),{_,_,_}}" = ?M:t_to_string(Tuple4),
"{{atom(),integer()},{tuple(),{_,_,_}}}" = ?M:t_to_string(Tuple5),
"{{_,_},{_,_}}" = ?M:t_to_string(Tuple6),
"{{atom(),integer()},{tuple(),{_,_,_}}}" = ?M:t_to_string(Tuple7),
"reference()" = ?M:t_to_string(Ref),
"port()" = ?M:t_to_string(Port),
"pid()" = ?M:t_to_string(Pid),
"identifier()" = ?M:t_to_string(Identifier),
"[any()]" = ?M:t_to_string(List1),
"[boolean()]" = ?M:t_to_string(List2),
"[boolean(),...]" = ?M:t_to_string(List3),
"nonempty_improper_list(boolean(),atom())" = ?M:t_to_string(List4),
"[boolean(),...]" = ?M:t_to_string(List5),
"[boolean()]" = ?M:t_to_string(List6),
"nonempty_maybe_improper_list(boolean(),atom() | [])" = ?M:t_to_string(List7),
"[boolean(),...]" = ?M:t_to_string(List8),
"nonempty_maybe_improper_list()" = ?M:t_to_string(List9),
"any()" = ?M:t_to_string(List10),
"fun()" = ?M:t_to_string(Function1),
"fun((...) -> pid())" = ?M:t_to_string(Function2),
"fun(() -> pid())" = ?M:t_to_string(Function3),
"fun((port(),pid()) -> pid())" = ?M:t_to_string(Function4),
"fun((pid(),atom()) -> 1)" = ?M:t_to_string(Function5),
"<atom(),'foo'>" = ?M:t_to_string(Product1),
"<'bar',atom()>" = ?M:t_to_string(Product2),
"#foo{bar::[1 | 2,...],baz::{1,2,3}}" = ?M:t_to_string(Record1, RecDict),
"'bar' | 'foo'" = ?M:t_to_string(Union1),
"{atom(),integer()} | {_,_,_}" = ?M:t_to_string(Union2),
"'bar' | 1" = ?M:t_to_string(Union3),
"pid() | port()" = ?M:t_to_string(Union4),
"pid() | port() | integer()" = ?M:t_to_string(Union5),
"fun()" = ?M:t_to_string(Union6),
"fun((pid() | port(),atom() | pid()) -> pid() | 1)" = ?M:t_to_string(Union7),
"boolean()" = ?M:t_to_string(Union8),
"{'false',_} | {'true',_}" = ?M:t_to_string(Union10),
"{'true',integer()}" = ?M:t_to_string(?M:t_inf(Union10, ?M:t_tuple([?M:t_atom(true), ?M:t_integer()]))).