summaryrefslogtreecommitdiff
path: root/lib/stdlib/test/lists_SUITE.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/stdlib/test/lists_SUITE.erl')
-rw-r--r--lib/stdlib/test/lists_SUITE.erl476
1 files changed, 474 insertions, 2 deletions
diff --git a/lib/stdlib/test/lists_SUITE.erl b/lib/stdlib/test/lists_SUITE.erl
index b369b6918e..59f2e8bd03 100644
--- a/lib/stdlib/test/lists_SUITE.erl
+++ b/lib/stdlib/test/lists_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2023. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -55,6 +55,10 @@
ufunsort_error/1,
uniq_1/1, uniq_2/1,
zip_unzip/1, zip_unzip3/1, zipwith/1, zipwith3/1,
+ zip_fail/1, zip_trim/1, zip_pad/1,
+ zip3_fail/1, zip3_trim/1, zip3_pad/1,
+ zipwith_fail/1, zipwith_trim/1, zipwith_pad/1,
+ zipwith3_fail/1, zipwith3_trim/1, zipwith3_pad/1,
filter_partition/1,
join/1,
otp_5939/1, otp_6023/1, otp_6606/1, otp_7230/1,
@@ -121,7 +125,11 @@ groups() ->
{flatten, [parallel],
[flatten_1, flatten_2, flatten_1_e, flatten_2_e]},
{tickets, [parallel], [otp_5939, otp_6023, otp_6606, otp_7230]},
- {zip, [parallel], [zip_unzip, zip_unzip3, zipwith, zipwith3]},
+ {zip, [parallel], [zip_unzip, zip_unzip3, zipwith, zipwith3,
+ zip_fail, zip_trim, zip_pad,
+ zip3_fail, zip3_trim, zip3_pad,
+ zipwith_fail, zipwith_trim, zipwith_pad,
+ zipwith3_fail, zipwith3_trim, zipwith3_pad]},
{uniq, [parallel], [uniq_1, uniq_2]},
{misc, [parallel], [reverse, member, dropwhile, takewhile,
filter_partition, suffix, subtract, join,
@@ -433,6 +441,8 @@ keyreplace(Config) when is_list(Config) ->
merge(Config) when is_list(Config) ->
+ Singleton = id([a, b, c]),
+
%% merge list of lists
[] = lists:merge([]),
[] = lists:merge([[]]),
@@ -455,6 +465,33 @@ merge(Config) when is_list(Config) ->
Seq = lists:seq(1,100),
true = Seq == lists:merge(lists:map(fun(E) -> [E] end, Seq)),
+ true = erts_debug:same(Singleton, lists:merge([Singleton])),
+ true = erts_debug:same(Singleton, lists:merge([Singleton, []])),
+ true = erts_debug:same(Singleton, lists:merge([[], Singleton])),
+ true = erts_debug:same(Singleton, lists:merge([Singleton, [], []])),
+ true = erts_debug:same(Singleton, lists:merge([[], Singleton, []])),
+ true = erts_debug:same(Singleton, lists:merge([[], [], Singleton])),
+
+ {'EXIT', _} = (catch lists:merge([a])),
+ {'EXIT', _} = (catch lists:merge([a, b])),
+ {'EXIT', _} = (catch lists:merge([a, []])),
+ {'EXIT', _} = (catch lists:merge([[], b])),
+ {'EXIT', _} = (catch lists:merge([a, [1, 2, 3]])),
+ {'EXIT', _} = (catch lists:merge([[1, 2, 3], b])),
+ {'EXIT', _} = (catch lists:merge([a, b, c])),
+ {'EXIT', _} = (catch lists:merge([a, b, []])),
+ {'EXIT', _} = (catch lists:merge([a, [], c])),
+ {'EXIT', _} = (catch lists:merge([a, [], []])),
+ {'EXIT', _} = (catch lists:merge([[], b, c])),
+ {'EXIT', _} = (catch lists:merge([[], b, []])),
+ {'EXIT', _} = (catch lists:merge([[], [], c])),
+ {'EXIT', _} = (catch lists:merge([a, b, [1, 2, 3]])),
+ {'EXIT', _} = (catch lists:merge([a, [1, 2, 3], c])),
+ {'EXIT', _} = (catch lists:merge([a, [1, 2, 3], [4, 5, 6]])),
+ {'EXIT', _} = (catch lists:merge([[1, 2, 3], b, c])),
+ {'EXIT', _} = (catch lists:merge([[1, 2, 3], b, [4, 5, 6]])),
+ {'EXIT', _} = (catch lists:merge([[1, 2, 3], [4, 5, 6], c])),
+
Two = [1,2],
Six = [1,2,3,4,5,6],
@@ -474,6 +511,15 @@ merge(Config) when is_list(Config) ->
[1,2,3,4,5,7] = lists:merge([2,4], [1,3,5,7]),
[1,2,3,4,5,6,7] = lists:merge([2,4,6], [1,3,5,7]),
+ true = erts_debug:same(Singleton, lists:merge([], Singleton)),
+ true = erts_debug:same(Singleton, lists:merge(Singleton, [])),
+
+ {'EXIT', _} = (catch lists:merge(a, b)),
+ {'EXIT', _} = (catch lists:merge(a, [])),
+ {'EXIT', _} = (catch lists:merge([], b)),
+ {'EXIT', _} = (catch lists:merge(a, [1, 2, 3])),
+ {'EXIT', _} = (catch lists:merge([1, 2, 3], b)),
+
%% 3-way merge
[] = lists:merge3([], [], []),
Two = lists:merge3([], [], Two),
@@ -490,11 +536,28 @@ merge(Config) when is_list(Config) ->
Nine = lists:merge3([7,8,9],[4,5,6],[1,2,3]),
Nine = lists:merge3([4,5,6],[7,8,9],[1,2,3]),
+ true = erts_debug:same(Singleton, lists:merge3([], [], Singleton)),
+ true = erts_debug:same(Singleton, lists:merge3([], Singleton, [])),
+ true = erts_debug:same(Singleton, lists:merge3(Singleton, [], [])),
+
+ {'EXIT', _} = (catch lists:merge3(a, b, c)),
+ {'EXIT', _} = (catch lists:merge3(a, b, [])),
+ {'EXIT', _} = (catch lists:merge3(a, [], c)),
+ {'EXIT', _} = (catch lists:merge3(a, [], [])),
+ {'EXIT', _} = (catch lists:merge3([], b, [])),
+ {'EXIT', _} = (catch lists:merge3([], [], c)),
+ {'EXIT', _} = (catch lists:merge3(a, b, [1, 2, 3])),
+ {'EXIT', _} = (catch lists:merge3(a, [1, 2, 3], c)),
+ {'EXIT', _} = (catch lists:merge3(a, [1, 2, 3], [4, 5, 6])),
+ {'EXIT', _} = (catch lists:merge3([1, 2, 3], b, [4, 5, 6])),
+ {'EXIT', _} = (catch lists:merge3([1, 2, 3], [4, 5, 6], c)),
+
ok.
%% reverse merge functions
rmerge(Config) when is_list(Config) ->
+ Singleton = id([a, b, c]),
Two = [2,1],
Six = [6,5,4,3,2,1],
@@ -514,6 +577,15 @@ rmerge(Config) when is_list(Config) ->
[7,5,4,3,2,1] = lists:rmerge([4,2], [7,5,3,1]),
[7,6,5,4,3,2,1] = lists:rmerge([6,4,2], [7,5,3,1]),
+ true = erts_debug:same(Singleton, lists:rmerge([], Singleton)),
+ true = erts_debug:same(Singleton, lists:rmerge(Singleton, [])),
+
+ {'EXIT', _} = (catch lists:rmerge(a, b)),
+ {'EXIT', _} = (catch lists:rmerge(a, [])),
+ {'EXIT', _} = (catch lists:rmerge([], b)),
+ {'EXIT', _} = (catch lists:rmerge(a, [1, 2, 3])),
+ {'EXIT', _} = (catch lists:rmerge([1, 2, 3], b)),
+
Nine = [9,8,7,6,5,4,3,2,1],
%% 3-way reversed merge
@@ -532,6 +604,22 @@ rmerge(Config) when is_list(Config) ->
Nine = lists:rmerge3([9,8,7],[6,5,4],[3,2,1]),
Nine = lists:rmerge3([6,5,4],[9,8,7],[3,2,1]),
+ true = erts_debug:same(Singleton, lists:rmerge3([], [], Singleton)),
+ true = erts_debug:same(Singleton, lists:rmerge3([], Singleton, [])),
+ true = erts_debug:same(Singleton, lists:rmerge3(Singleton, [], [])),
+
+ {'EXIT', _} = (catch lists:rmerge3(a, b, c)),
+ {'EXIT', _} = (catch lists:rmerge3(a, b, [])),
+ {'EXIT', _} = (catch lists:rmerge3(a, [], c)),
+ {'EXIT', _} = (catch lists:rmerge3(a, [], [])),
+ {'EXIT', _} = (catch lists:rmerge3([], b, [])),
+ {'EXIT', _} = (catch lists:rmerge3([], [], c)),
+ {'EXIT', _} = (catch lists:rmerge3(a, b, [1, 2, 3])),
+ {'EXIT', _} = (catch lists:rmerge3(a, [1, 2, 3], c)),
+ {'EXIT', _} = (catch lists:rmerge3(a, [1, 2, 3], [4, 5, 6])),
+ {'EXIT', _} = (catch lists:rmerge3([1, 2, 3], b, [4, 5, 6])),
+ {'EXIT', _} = (catch lists:rmerge3([1, 2, 3], [4, 5, 6], c)),
+
ok.
sort_1(Config) when is_list(Config) ->
@@ -632,6 +720,8 @@ usort_1(Conf) when is_list(Conf) ->
ok.
umerge(Conf) when is_list(Conf) ->
+ Singleton = id([a, b, c]),
+
%% merge list of lists
[] = lists:umerge([]),
[] = lists:umerge([[]]),
@@ -655,6 +745,33 @@ umerge(Conf) when is_list(Conf) ->
Seq = lists:seq(1,100),
true = Seq == lists:umerge(lists:map(fun(E) -> [E] end, Seq)),
+ true = erts_debug:same(Singleton, lists:umerge([Singleton])),
+ true = erts_debug:same(Singleton, lists:umerge([Singleton, []])),
+ true = erts_debug:same(Singleton, lists:umerge([[], Singleton])),
+ true = erts_debug:same(Singleton, lists:umerge([Singleton, [], []])),
+ true = erts_debug:same(Singleton, lists:umerge([[], Singleton, []])),
+ true = erts_debug:same(Singleton, lists:umerge([[], [], Singleton])),
+
+ {'EXIT', _} = (catch lists:umerge([a])),
+ {'EXIT', _} = (catch lists:umerge([a, b])),
+ {'EXIT', _} = (catch lists:umerge([a, []])),
+ {'EXIT', _} = (catch lists:umerge([[], b])),
+ {'EXIT', _} = (catch lists:umerge([a, [1, 2, 3]])),
+ {'EXIT', _} = (catch lists:umerge([[1, 2, 3], b])),
+ {'EXIT', _} = (catch lists:umerge([a, b, c])),
+ {'EXIT', _} = (catch lists:umerge([a, b, []])),
+ {'EXIT', _} = (catch lists:umerge([a, [], c])),
+ {'EXIT', _} = (catch lists:umerge([a, [], []])),
+ {'EXIT', _} = (catch lists:umerge([[], b, c])),
+ {'EXIT', _} = (catch lists:umerge([[], b, []])),
+ {'EXIT', _} = (catch lists:umerge([[], [], c])),
+ {'EXIT', _} = (catch lists:umerge([a, b, [1, 2, 3]])),
+ {'EXIT', _} = (catch lists:umerge([a, [1, 2, 3], c])),
+ {'EXIT', _} = (catch lists:umerge([a, [1, 2, 3], [4, 5, 6]])),
+ {'EXIT', _} = (catch lists:umerge([[1, 2, 3], b, c])),
+ {'EXIT', _} = (catch lists:umerge([[1, 2, 3], b, [4, 5, 6]])),
+ {'EXIT', _} = (catch lists:umerge([[1, 2, 3], [4, 5, 6], c])),
+
Two = [1,2],
Six = [1,2,3,4,5,6],
@@ -681,6 +798,15 @@ umerge(Conf) when is_list(Conf) ->
[1,2,3,4,5,7] = lists:umerge([2,4], [1,2,3,4,5,7]),
[1,2,3,4,5,6,7] = lists:umerge([2,4,6], [1,2,3,4,5,6,7]),
+ true = erts_debug:same(Singleton, lists:umerge([], Singleton)),
+ true = erts_debug:same(Singleton, lists:umerge(Singleton, [])),
+
+ {'EXIT', _} = (catch lists:umerge(a, b)),
+ {'EXIT', _} = (catch lists:umerge(a, [])),
+ {'EXIT', _} = (catch lists:umerge([], b)),
+ {'EXIT', _} = (catch lists:umerge(a, [1, 2, 3])),
+ {'EXIT', _} = (catch lists:umerge([1, 2, 3], b)),
+
%% 3-way unique merge
[] = lists:umerge3([], [], []),
Two = lists:umerge3([], [], Two),
@@ -702,9 +828,27 @@ umerge(Conf) when is_list(Conf) ->
[1,2,3] = lists:umerge3([1,2,3],[2,3],[1,2,3]),
[1,2,3,4] = lists:umerge3([2,3,4],[3,4],[1,2,3]),
+ true = erts_debug:same(Singleton, lists:umerge3([], [], Singleton)),
+ true = erts_debug:same(Singleton, lists:umerge3([], Singleton, [])),
+ true = erts_debug:same(Singleton, lists:umerge3(Singleton, [], [])),
+
+ {'EXIT', _} = (catch lists:umerge3(a, b, c)),
+ {'EXIT', _} = (catch lists:umerge3(a, b, [])),
+ {'EXIT', _} = (catch lists:umerge3(a, [], c)),
+ {'EXIT', _} = (catch lists:umerge3(a, [], [])),
+ {'EXIT', _} = (catch lists:umerge3([], b, [])),
+ {'EXIT', _} = (catch lists:umerge3([], [], c)),
+ {'EXIT', _} = (catch lists:umerge3(a, b, [1, 2, 3])),
+ {'EXIT', _} = (catch lists:umerge3(a, [1, 2, 3], c)),
+ {'EXIT', _} = (catch lists:umerge3(a, [1, 2, 3], [4, 5, 6])),
+ {'EXIT', _} = (catch lists:umerge3([1, 2, 3], b, [4, 5, 6])),
+ {'EXIT', _} = (catch lists:umerge3([1, 2, 3], [4, 5, 6], c)),
+
ok.
rumerge(Conf) when is_list(Conf) ->
+ Singleton = id([a, b, c]),
+
Two = [2,1],
Six = [6,5,4,3,2,1],
@@ -731,6 +875,15 @@ rumerge(Conf) when is_list(Conf) ->
[7,5,4,3,2,1] = lists:rumerge([4,2], [7,5,4,3,2,1]),
[7,6,5,4,3,2,1] = lists:rumerge([6,4,2], [7,6,5,4,3,2,1]),
+ true = erts_debug:same(Singleton, lists:rumerge([], Singleton)),
+ true = erts_debug:same(Singleton, lists:rumerge(Singleton, [])),
+
+ {'EXIT', _} = (catch lists:rumerge(a, b)),
+ {'EXIT', _} = (catch lists:rumerge(a, [])),
+ {'EXIT', _} = (catch lists:rumerge([], b)),
+ {'EXIT', _} = (catch lists:rumerge(a, [1, 2, 3])),
+ {'EXIT', _} = (catch lists:rumerge([1, 2, 3], b)),
+
Nine = [9,8,7,6,5,4,3,2,1],
%% 3-way reversed unique merge
@@ -759,6 +912,23 @@ rumerge(Conf) when is_list(Conf) ->
true =
lists:umerge(L1, L2) ==
lists:reverse(lists:rumerge(lists:reverse(L1), lists:reverse(L2))),
+
+ true = erts_debug:same(Singleton, lists:rumerge3([], [], Singleton)),
+ true = erts_debug:same(Singleton, lists:rumerge3([], Singleton, [])),
+ true = erts_debug:same(Singleton, lists:rumerge3(Singleton, [], [])),
+
+ {'EXIT', _} = (catch lists:rumerge3(a, b, c)),
+ {'EXIT', _} = (catch lists:rumerge3(a, b, [])),
+ {'EXIT', _} = (catch lists:rumerge3(a, [], c)),
+ {'EXIT', _} = (catch lists:rumerge3(a, [], [])),
+ {'EXIT', _} = (catch lists:rumerge3([], b, [])),
+ {'EXIT', _} = (catch lists:rumerge3([], [], c)),
+ {'EXIT', _} = (catch lists:rumerge3(a, b, [1, 2, 3])),
+ {'EXIT', _} = (catch lists:rumerge3(a, [1, 2, 3], c)),
+ {'EXIT', _} = (catch lists:rumerge3(a, [1, 2, 3], [4, 5, 6])),
+ {'EXIT', _} = (catch lists:rumerge3([1, 2, 3], b, [4, 5, 6])),
+ {'EXIT', _} = (catch lists:rumerge3([1, 2, 3], [4, 5, 6], c)),
+
ok.
%% usort/1 on big randomized lists.
@@ -815,6 +985,7 @@ ucheck_stability(L) ->
%% Key merge two lists.
keymerge(Config) when is_list(Config) ->
+ Singleton = id([{1, a}, {2, b}, {3, c}]),
Two = [{1,a},{2,b}],
Six = [{1,a},{2,b},{3,c},{4,d},{5,e},{6,f}],
@@ -843,11 +1014,21 @@ keymerge(Config) when is_list(Config) ->
[{b,2},{c,11},{c,12},{c,21},{c,22},{e,5}] =
lists:keymerge(1,[{c,11},{c,12},{e,5}], [{b,2},{c,21},{c,22}]),
+ true = erts_debug:same(Singleton, lists:keymerge(1, Singleton, [])),
+ true = erts_debug:same(Singleton, lists:keymerge(1, [], Singleton)),
+
+ {'EXIT', _} = (catch lists:keymerge(1, a, b)),
+ {'EXIT', _} = (catch lists:keymerge(1, a, [])),
+ {'EXIT', _} = (catch lists:keymerge(1, [], b)),
+ {'EXIT', _} = (catch lists:keymerge(1, a, [{1, a}, {2, b}, {3, c}])),
+ {'EXIT', _} = (catch lists:keymerge(1, [{1, a}, {2, b}, {3, c}], b)),
+
ok.
%% Reverse key merge two lists.
rkeymerge(Config) when is_list(Config) ->
+ Singleton = id([{1, a}, {2, b}, {3, c}]),
Two = [{2,b},{1,a}],
Six = [{6,f},{5,e},{4,d},{3,c},{2,b},{1,a}],
@@ -880,6 +1061,15 @@ rkeymerge(Config) when is_list(Config) ->
lists:reverse(lists:rkeymerge(1,lists:reverse(L1),
lists:reverse(L2))),
+ true = erts_debug:same(Singleton, lists:rkeymerge(1, Singleton, [])),
+ true = erts_debug:same(Singleton, lists:rkeymerge(1, [], Singleton)),
+
+ {'EXIT', _} = (catch lists:rkeymerge(1, a, b)),
+ {'EXIT', _} = (catch lists:rkeymerge(1, a, [])),
+ {'EXIT', _} = (catch lists:rkeymerge(1, [], b)),
+ {'EXIT', _} = (catch lists:rkeymerge(1, a, [{1, a}, {2, b}, {3, c}])),
+ {'EXIT', _} = (catch lists:rkeymerge(1, [{1, a}, {2, b}, {3, c}], b)),
+
ok.
keysort_1(Config) when is_list(Config) ->
@@ -998,6 +1188,7 @@ keycompare(I, J, A, B) when element(I, A) == element(I, B),
%% Merge two lists while removing duplicates.
ukeymerge(Conf) when is_list(Conf) ->
+ Singleton = id([{1, a}, {2, b}, {3, c}]),
Two = [{1,a},{2,b}],
Six = [{1,a},{2,b},{3,c},{4,d},{5,e},{6,f}],
@@ -1047,11 +1238,21 @@ ukeymerge(Conf) when is_list(Conf) ->
L2 = [{b,1},{b,3},{b,5},{b,7}],
L1 = lists:ukeymerge(2, L1, L2),
+ true = erts_debug:same(Singleton, lists:ukeymerge(1, Singleton, [])),
+ true = erts_debug:same(Singleton, lists:ukeymerge(1, [], Singleton)),
+
+ {'EXIT', _} = (catch lists:ukeymerge(1, a, b)),
+ {'EXIT', _} = (catch lists:ukeymerge(1, a, [])),
+ {'EXIT', _} = (catch lists:ukeymerge(1, [], b)),
+ {'EXIT', _} = (catch lists:ukeymerge(1, a, [{1, a}, {2, b}, {3, c}])),
+ {'EXIT', _} = (catch lists:ukeymerge(1, [{1, a}, {2, b}, {3, c}], b)),
+
ok.
%% Reverse merge two lists while removing duplicates.
rukeymerge(Conf) when is_list(Conf) ->
+ Singleton = id([{1, a}, {2, b}, {3, c}]),
Two = [{2,b},{1,a}],
Six = [{6,f},{5,e},{4,d},{3,c},{2,b},{1,a}],
@@ -1101,6 +1302,15 @@ rukeymerge(Conf) when is_list(Conf) ->
lists:reverse(lists:rukeymerge(2, lists:reverse(L1),
lists:reverse(L2))),
+ true = erts_debug:same(Singleton, lists:rukeymerge(1, Singleton, [])),
+ true = erts_debug:same(Singleton, lists:rukeymerge(1, [], Singleton)),
+
+ {'EXIT', _} = (catch lists:rukeymerge(1, a, b)),
+ {'EXIT', _} = (catch lists:rukeymerge(1, a, [])),
+ {'EXIT', _} = (catch lists:rukeymerge(1, [], b)),
+ {'EXIT', _} = (catch lists:rukeymerge(1, a, [{1, a}, {2, b}, {3, c}])),
+ {'EXIT', _} = (catch lists:rukeymerge(1, [{1, a}, {2, b}, {3, c}], b)),
+
ok.
ukeysort_1(Config) when is_list(Config) ->
@@ -1278,6 +1488,7 @@ ukeycompare(I, J, A, B) when A =/= B,
%% Merge two lists using a fun.
funmerge(Config) when is_list(Config) ->
+ Singleton = id([a, b, c]),
Two = [1,2],
Six = [1,2,3,4,5,6],
F = fun(X, Y) -> X =< Y end,
@@ -1302,11 +1513,21 @@ funmerge(Config) when is_list(Config) ->
[{b,2},{c,11},{c,12},{c,21},{c,22},{e,5}] =
lists:merge(F2,[{c,11},{c,12},{e,5}], [{b,2},{c,21},{c,22}]),
+ true = erts_debug:same(Singleton, lists:merge(F, Singleton, [])),
+ true = erts_debug:same(Singleton, lists:merge(F, [], Singleton)),
+
+ {'EXIT', _} = (catch lists:merge(F, a, b)),
+ {'EXIT', _} = (catch lists:merge(F, a, [])),
+ {'EXIT', _} = (catch lists:merge(F, [], b)),
+ {'EXIT', _} = (catch lists:merge(F, a, [1, 2, 3])),
+ {'EXIT', _} = (catch lists:merge(F, [1, 2, 3], b)),
+
ok.
%% Reverse merge two lists using a fun.
rfunmerge(Config) when is_list(Config) ->
+ Singleton = id([a, b, c]),
Two = [2,1],
Six = [6,5,4,3,2,1],
F = fun(X, Y) -> X =< Y end,
@@ -1334,6 +1555,15 @@ rfunmerge(Config) when is_list(Config) ->
lists:merge(F2, L1, L2) ==
lists:reverse(lists:rmerge(F2,lists:reverse(L1), lists:reverse(L2))),
+ true = erts_debug:same(Singleton, lists:rmerge(F, Singleton, [])),
+ true = erts_debug:same(Singleton, lists:rmerge(F, [], Singleton)),
+
+ {'EXIT', _} = (catch lists:rmerge(F, a, b)),
+ {'EXIT', _} = (catch lists:rmerge(F, a, [])),
+ {'EXIT', _} = (catch lists:rmerge(F, [], b)),
+ {'EXIT', _} = (catch lists:rmerge(F, a, [1, 2, 3])),
+ {'EXIT', _} = (catch lists:rmerge(F, [1, 2, 3], b)),
+
ok.
@@ -1403,6 +1633,7 @@ funsort_check(I, Input, Expected) ->
%% Merge two lists while removing duplicates using a fun.
ufunmerge(Conf) when is_list(Conf) ->
+ Singleton = id([a, b, c]),
Two = [1,2],
Six = [1,2,3,4,5,6],
F = fun(X, Y) -> X =< Y end,
@@ -1437,10 +1668,20 @@ ufunmerge(Conf) when is_list(Conf) ->
[{b,2},{e,5},{c,11},{c,12},{c,21},{c,22}] =
lists:umerge(F2, [{e,5},{c,11},{c,12}], [{b,2},{c,21},{c,22}]),
+ true = erts_debug:same(Singleton, lists:umerge(F, Singleton, [])),
+ true = erts_debug:same(Singleton, lists:umerge(F, [], Singleton)),
+
+ {'EXIT', _} = (catch lists:umerge(F, a, b)),
+ {'EXIT', _} = (catch lists:umerge(F, a, [])),
+ {'EXIT', _} = (catch lists:umerge(F, [], b)),
+ {'EXIT', _} = (catch lists:umerge(F, a, [1, 2, 3])),
+ {'EXIT', _} = (catch lists:umerge(F, [1, 2, 3], b)),
+
ok.
%% Reverse merge two lists while removing duplicates using a fun.
rufunmerge(Conf) when is_list(Conf) ->
+ Singleton = id([a, b, c]),
Two = [2,1],
Six = [6,5,4,3,2,1],
F = fun(X, Y) -> X =< Y end,
@@ -1480,6 +1721,15 @@ rufunmerge(Conf) when is_list(Conf) ->
lists:umerge(F2, L3, L4) ==
lists:reverse(lists:rumerge(F2,lists:reverse(L3), lists:reverse(L4))),
+ true = erts_debug:same(Singleton, lists:rumerge(F, Singleton, [])),
+ true = erts_debug:same(Singleton, lists:rumerge(F, [], Singleton)),
+
+ {'EXIT', _} = (catch lists:rumerge(F, a, b)),
+ {'EXIT', _} = (catch lists:rumerge(F, a, [])),
+ {'EXIT', _} = (catch lists:rumerge(F, [], b)),
+ {'EXIT', _} = (catch lists:rumerge(F, a, [1, 2, 3])),
+ {'EXIT', _} = (catch lists:rumerge(F, [1, 2, 3], b)),
+
ok.
ufunsort_1(Config) when is_list(Config) ->
@@ -2362,6 +2612,41 @@ zip_unzip(Config) when is_list(Config) ->
{'EXIT',{function_clause,_}} = (catch lists:zip([a], [b,c])),
ok.
+zip_fail(Config) when is_list(Config) ->
+ [] = lists:zip([], [], fail),
+ {'EXIT', {function_clause, _}} = (catch lists:zip([a], [], fail)),
+ {'EXIT', {function_clause, _}} = (catch lists:zip([], [c], fail)),
+
+ [{a, c}] = lists:zip([a], [c], fail),
+ {'EXIT', {function_clause, _}} = (catch lists:zip([a, b], [c], fail)),
+ {'EXIT', {function_clause, _}} = (catch lists:zip([a], [c, d], fail)),
+
+ ok.
+
+zip_trim(Config) when is_list(Config) ->
+ [] = lists:zip([], [], trim),
+ [] = lists:zip([a], [], trim),
+ [] = lists:zip([], [c], trim),
+
+ [{a, c}] = lists:zip([a], [c], trim),
+ [{a, c}] = lists:zip([a, b], [c], trim),
+ [{a, c}] = lists:zip([a], [c, d], trim),
+
+ ok.
+
+zip_pad(Config) when is_list(Config) ->
+ How = {pad, {x, y}},
+
+ [] = lists:zip([], [], How),
+ [{a, y}] = lists:zip([a], [], How),
+ [{x, c}] = lists:zip([], [c], How),
+
+ [{a, c}] = lists:zip([a], [c], How),
+ [{a, c}, {b, y}] = lists:zip([a, b], [c], How),
+ [{a, c}, {x, d}] = lists:zip([a], [c, d], How),
+
+ ok.
+
%% Test lists:zip3/3, lists:unzip3/1.
zip_unzip3(Config) when is_list(Config) ->
[] = lists:zip3([], [], []),
@@ -2388,6 +2673,65 @@ zip_unzip3(Config) when is_list(Config) ->
ok.
+zip3_fail(Config) when is_list(Config) ->
+ [] = lists:zip3([], [], [], fail),
+ {'EXIT', {function_clause, _}} = (catch lists:zip3([a], [], [], fail)),
+ {'EXIT', {function_clause, _}} = (catch lists:zip3([], [c], [], fail)),
+ {'EXIT', {function_clause, _}} = (catch lists:zip3([a], [c], [], fail)),
+ {'EXIT', {function_clause, _}} = (catch lists:zip3([], [], [e], fail)),
+ {'EXIT', {function_clause, _}} = (catch lists:zip3([a], [], [e], fail)),
+ {'EXIT', {function_clause, _}} = (catch lists:zip3([], [c], [e], fail)),
+
+ [{a, c, e}] = lists:zip3([a], [c], [e], fail),
+ {'EXIT', {function_clause, _}} = (catch lists:zip3([a, b], [c], [e], fail)),
+ {'EXIT', {function_clause, _}} = (catch lists:zip3([a], [c, d], [e], fail)),
+ {'EXIT', {function_clause, _}} = (catch lists:zip3([a, b], [c, d], [e], fail)),
+ {'EXIT', {function_clause, _}} = (catch lists:zip3([a], [c], [e, f], fail)),
+ {'EXIT', {function_clause, _}} = (catch lists:zip3([a, b], [c], [e, f], fail)),
+ {'EXIT', {function_clause, _}} = (catch lists:zip3([a], [c, d], [e, f], fail)),
+
+ ok.
+
+zip3_trim(Config) when is_list(Config) ->
+ [] = lists:zip3([], [], [], trim),
+ [] = lists:zip3([a], [], [], trim),
+ [] = lists:zip3([], [c], [], trim),
+ [] = lists:zip3([a], [c], [], trim),
+ [] = lists:zip3([], [], [e], trim),
+ [] = lists:zip3([a], [], [e], trim),
+ [] = lists:zip3([], [c], [e], trim),
+
+ [{a, c, e}] = lists:zip3([a], [c], [e], trim),
+ [{a, c, e}] = lists:zip3([a, b], [c], [e], trim),
+ [{a, c, e}] = lists:zip3([a], [c, d], [e], trim),
+ [{a, c, e}] = lists:zip3([a, b], [c, d], [e], trim),
+ [{a, c, e}] = lists:zip3([a], [c], [e, f], trim),
+ [{a, c, e}] = lists:zip3([a, b], [c], [e, f], trim),
+ [{a, c, e}] = lists:zip3([a], [c, d], [e, f], trim),
+
+ ok.
+
+zip3_pad(Config) when is_list(Config) ->
+ How = {pad, {x, y, z}},
+
+ [] = lists:zip3([], [], [], How),
+ [{a, y, z}] = lists:zip3([a], [], [], How),
+ [{x, c, z}] = lists:zip3([], [c], [], How),
+ [{a, c, z}] = lists:zip3([a], [c], [], How),
+ [{x, y, e}] = lists:zip3([], [], [e], How),
+ [{a, y, e}] = lists:zip3([a], [], [e], How),
+ [{x, c, e}] = lists:zip3([], [c], [e], How),
+
+ [{a, c, e}] = lists:zip3([a], [c], [e], How),
+ [{a, c, e}, {b, y, z}] = lists:zip3([a, b], [c], [e], How),
+ [{a, c, e}, {x, d, z}] = lists:zip3([a], [c, d], [e], How),
+ [{a, c, e}, {b, d, z}] = lists:zip3([a, b], [c, d], [e], How),
+ [{a, c, e}, {x, y, f}] = lists:zip3([a], [c], [e, f], How),
+ [{a, c, e}, {b, y, f}] = lists:zip3([a, b], [c], [e, f], How),
+ [{a, c, e}, {x, d, f}] = lists:zip3([a], [c, d], [e, f], How),
+
+ ok.
+
%% Test lists:zipwith/3.
zipwith(Config) when is_list(Config) ->
Zip = fun(A, B) -> [A|B] end,
@@ -2410,6 +2754,47 @@ zipwith(Config) when is_list(Config) ->
{'EXIT',{function_clause,_}} = (catch lists:zipwith(Zip, [a], [b,c])),
ok.
+zipwith_fail(Config) when is_list(Config) ->
+ Zip = fun(A, B) -> A * B end,
+
+ [] = lists:zipwith(Zip, [], [], fail),
+ {'EXIT', {function_clause, _}} = (catch lists:zipwith(Zip, [2], [], fail)),
+ {'EXIT', {function_clause, _}} = (catch lists:zipwith(Zip, [], [5], fail)),
+
+ [2 * 5] = lists:zipwith(Zip, [2], [5], fail),
+ {'EXIT', {function_clause, _}} = (catch lists:zipwith(Zip, [2, 3], [5], fail)),
+ {'EXIT', {function_clause, _}} = (catch lists:zipwith(Zip, [2], [5, 7], fail)),
+
+ ok.
+
+zipwith_trim(Config) when is_list(Config) ->
+ Zip = fun(A, B) -> A * B end,
+
+ [] = lists:zipwith(Zip, [], [], trim),
+ [] = lists:zipwith(Zip, [2], [], trim),
+ [] = lists:zipwith(Zip, [], [5], trim),
+
+ [2 * 5] = lists:zipwith(Zip, [2], [5], trim),
+ [2 * 5] = lists:zipwith(Zip, [2, 3], [5], trim),
+ [2 * 5] = lists:zipwith(Zip, [2], [5, 7], trim),
+
+ ok.
+
+zipwith_pad(Config) when is_list(Config) ->
+ How = {pad, {17, 19}},
+
+ Zip = fun(A, B) -> A * B end,
+
+ [] = lists:zipwith(Zip, [], [], How),
+ [ 2 * 19] = lists:zipwith(Zip, [2], [], How),
+ [17 * 5] = lists:zipwith(Zip, [], [5], How),
+
+ [2 * 5] = lists:zipwith(Zip, [2], [5], How),
+ [2 * 5, 3 * 19] = lists:zipwith(Zip, [2, 3], [5], How),
+ [2 * 5, 17 * 7] = lists:zipwith(Zip, [2], [5, 7], How),
+
+ ok.
+
%% Test lists:zipwith3/4.
zipwith3(Config) when is_list(Config) ->
Zip = fun(A, B, C) -> [A,B,C] end,
@@ -2434,6 +2819,69 @@ zipwith3(Config) when is_list(Config) ->
ok.
+zipwith3_fail(Config) when is_list(Config) ->
+ Zip = fun(A, B, C) -> A * B * C end,
+
+ [] = lists:zipwith3(Zip, [], [], [], fail),
+ {'EXIT', {function_clause, _}} = (catch lists:zipwith3(Zip, [2], [], [], fail)),
+ {'EXIT', {function_clause, _}} = (catch lists:zipwith3(Zip, [], [5], [], fail)),
+ {'EXIT', {function_clause, _}} = (catch lists:zipwith3(Zip, [2], [5], [], fail)),
+ {'EXIT', {function_clause, _}} = (catch lists:zipwith3(Zip, [], [], [11], fail)),
+ {'EXIT', {function_clause, _}} = (catch lists:zipwith3(Zip, [2], [], [11], fail)),
+ {'EXIT', {function_clause, _}} = (catch lists:zipwith3(Zip, [], [5], [11], fail)),
+
+ [2 * 5 * 11] = lists:zipwith3(Zip, [2], [5], [11], fail),
+ {'EXIT', {function_clause, _}} = (catch lists:zipwith3(Zip, [2, 3], [5], [11], fail)),
+ {'EXIT', {function_clause, _}} = (catch lists:zipwith3(Zip, [2], [5, 7], [11], fail)),
+ {'EXIT', {function_clause, _}} = (catch lists:zipwith3(Zip, [2, 3], [5, 7], [11], fail)),
+ {'EXIT', {function_clause, _}} = (catch lists:zipwith3(Zip, [2], [5], [11, 13], fail)),
+ {'EXIT', {function_clause, _}} = (catch lists:zipwith3(Zip, [2, 3], [5], [11, 13], fail)),
+ {'EXIT', {function_clause, _}} = (catch lists:zipwith3(Zip, [2], [5, 7], [11, 13], fail)),
+
+ ok.
+
+zipwith3_trim(Config) when is_list(Config) ->
+ Zip = fun(A, B, C) -> A * B * C end,
+
+ [] = lists:zipwith3(Zip, [], [], [], trim),
+ [] = lists:zipwith3(Zip, [2], [], [], trim),
+ [] = lists:zipwith3(Zip, [], [5], [], trim),
+ [] = lists:zipwith3(Zip, [], [], [11], trim),
+ [] = lists:zipwith3(Zip, [2], [], [11], trim),
+ [] = lists:zipwith3(Zip, [], [5], [11], trim),
+
+ [2 * 5 * 11] = lists:zipwith3(Zip, [2], [5], [11], trim),
+ [2 * 5 * 11] = lists:zipwith3(Zip, [2, 3], [5], [11], trim),
+ [2 * 5 * 11] = lists:zipwith3(Zip, [2], [5, 7], [11], trim),
+ [2 * 5 * 11] = lists:zipwith3(Zip, [2], [5], [11, 13], trim),
+ [2 * 5 * 11] = lists:zipwith3(Zip, [2, 3], [5], [11, 13], trim),
+ [2 * 5 * 11] = lists:zipwith3(Zip, [2], [5, 7], [11, 13], trim),
+
+ ok.
+
+zipwith3_pad(Config) when is_list(Config) ->
+ How = {pad, {17, 19, 23}},
+
+ Zip = fun(A, B, C) -> A * B * C end,
+
+ [] = lists:zipwith3(Zip, [], [], [], How),
+ [ 2 * 19 * 23] = lists:zipwith3(Zip, [2], [], [], How),
+ [17 * 5 * 23] = lists:zipwith3(Zip, [], [5], [], How),
+ [ 2 * 5 * 23] = lists:zipwith3(Zip, [2], [5], [], How),
+ [17 * 19 * 11] = lists:zipwith3(Zip, [], [], [11], How),
+ [ 2 * 19 * 11] = lists:zipwith3(Zip, [2], [], [11], How),
+ [17 * 5 * 11] = lists:zipwith3(Zip, [], [5], [11], How),
+
+ [2 * 5 * 11] = lists:zipwith3(Zip, [2], [5], [11], How),
+ [2 * 5 * 11, 3 * 19 * 23] = lists:zipwith3(Zip, [2, 3], [5], [11], How),
+ [2 * 5 * 11, 17 * 7 * 23] = lists:zipwith3(Zip, [2], [5, 7], [11], How),
+ [2 * 5 * 11, 3 * 7 * 23] = lists:zipwith3(Zip, [2, 3], [5, 7], [11], How),
+ [2 * 5 * 11, 17 * 19 * 13] = lists:zipwith3(Zip, [2], [5], [11, 13], How),
+ [2 * 5 * 11, 3 * 19 * 13] = lists:zipwith3(Zip, [2, 3], [5], [11, 13], How),
+ [2 * 5 * 11, 17 * 7 * 13] = lists:zipwith3(Zip, [2], [5, 7], [11, 13], How),
+
+ ok.
+
%% Test lists:join/2
join(Config) when is_list(Config) ->
A = [a,b,c],
@@ -2750,15 +3198,39 @@ hof(Config) when is_list(Config) ->
enumerate(Config) when is_list(Config) ->
[] = lists:enumerate([]),
[] = lists:enumerate(10, []),
+ [] = lists:enumerate(-10, []),
+ [] = lists:enumerate(10, 2, []),
+ [] = lists:enumerate(10, -2, []),
+ [] = lists:enumerate(-10, 2, []),
+ [] = lists:enumerate(-10, -2, []),
[{1,a},{2,b},{3,c}] = lists:enumerate([a,b,c]),
[{10,a},{11,b},{12,c}] = lists:enumerate(10, [a,b,c]),
+ [{-10,a},{-9,b},{-8,c}] = lists:enumerate(-10, [a,b,c]),
+ [{10,a},{12,b},{14,c}] = lists:enumerate(10, 2, [a,b,c]),
+ [{10,a},{8,b},{6,c}] = lists:enumerate(10, -2, [a,b,c]),
+ [{-10,a},{-12,b},{-14,c}] = lists:enumerate(-10, -2, [a,b,c]),
{'EXIT', {function_clause, _}} = catch lists:enumerate(0),
{'EXIT', {function_clause, _}} = catch lists:enumerate(0, 10),
+ {'EXIT', {function_clause, _}} = catch lists:enumerate(0, 10, 20),
{'EXIT', {function_clause, _}} = catch lists:enumerate(1.0, []),
{'EXIT', {function_clause, _}} = catch lists:enumerate(1.0, [a,b,c]),
+ {'EXIT', {function_clause, _}} = catch lists:enumerate(1.0, 2, []),
+ {'EXIT', {function_clause, _}} = catch lists:enumerate(1.0, 2, [a,b,c]),
+ {'EXIT', {function_clause, _}} = catch lists:enumerate(1, 2.0, []),
+ {'EXIT', {function_clause, _}} = catch lists:enumerate(1, 2.0, [a,b,c]),
+ {'EXIT', {function_clause, _}} = catch lists:enumerate(1.0, 2.0, []),
+ {'EXIT', {function_clause, _}} = catch lists:enumerate(1.0, 2.0, [a,b,c]),
{'EXIT', {function_clause, _}} = catch lists:enumerate(<<1>>, []),
{'EXIT', {function_clause, _}} = catch lists:enumerate(<<1>>, [a,b,c]),
+ {'EXIT', {function_clause, _}} = catch lists:enumerate(<<1>>, 2, []),
+ {'EXIT', {function_clause, _}} = catch lists:enumerate(<<1>>, 2, [a,b,c]),
+ {'EXIT', {function_clause, _}} = catch lists:enumerate(1, <<2>>, []),
+ {'EXIT', {function_clause, _}} = catch lists:enumerate(1, <<2>>, [a,b,c]),
+ {'EXIT', {function_clause, _}} = catch lists:enumerate(<<1>>, <<2>>, []),
+ {'EXIT', {function_clause, _}} = catch lists:enumerate(<<1>>, <<2>>, [a,b,c]),
+ {'EXIT', {function_clause, _}} = catch lists:enumerate(<<1,2,3>>),
{'EXIT', {function_clause, _}} = catch lists:enumerate(1, <<1,2,3>>),
+ {'EXIT', {function_clause, _}} = catch lists:enumerate(1, 2, <<1,2,3>>),
ok.