diff options
author | John Högberg <[email protected]> | 2018-11-02 09:38:40 +0100 |
---|---|---|
committer | John Högberg <[email protected]> | 2018-11-02 09:38:40 +0100 |
commit | f668717abf3a28692b7aa096ad7a776eb8738c7a (patch) | |
tree | 3ceb3a335f26361011de997e26740b37b1d5657e /lib/stdlib/test | |
parent | 69797ce56c590125a664b24e16e4e6691d948883 (diff) | |
parent | 7999ddad6121db7d1b7fe44b3c6a80a8d7ff70f3 (diff) | |
download | otp-f668717abf3a28692b7aa096ad7a776eb8738c7a.tar.gz otp-f668717abf3a28692b7aa096ad7a776eb8738c7a.tar.bz2 otp-f668717abf3a28692b7aa096ad7a776eb8738c7a.zip |
Merge branch 'maint'
* maint:
Optimize operator '--' and yield on large inputs
Inline erts_cmp
Clarify a magical allocation size
Fix trapping in lists:reverse/2
Diffstat (limited to 'lib/stdlib/test')
-rw-r--r-- | lib/stdlib/test/lists_SUITE.erl | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/lib/stdlib/test/lists_SUITE.erl b/lib/stdlib/test/lists_SUITE.erl index af94fc79bc..17bb12e548 100644 --- a/lib/stdlib/test/lists_SUITE.erl +++ b/lib/stdlib/test/lists_SUITE.erl @@ -2597,6 +2597,13 @@ subtract(Config) when is_list(Config) -> {'EXIT',_} = (catch sub([a|b], [])), {'EXIT',_} = (catch sub([a|b], [a])), + %% Trapping, both crashing and otherwise. + [sub_trapping(N) || N <- lists:seq(0, 18)], + + %% The current implementation chooses which algorithm to use based on + %% certain thresholds, and we need proper coverage for all corner cases. + [sub_thresholds(N) || N <- lists:seq(0, 32)], + ok. sub_non_matching(A, B) -> @@ -2606,6 +2613,41 @@ sub(A, B) -> Res = A -- B, Res = lists:subtract(A, B). +sub_trapping(N) -> + List = lists:duplicate(N + (1 bsl N), gurka), + ImproperList = List ++ crash, + + {'EXIT',_} = (catch sub_trapping_1(ImproperList, [])), + {'EXIT',_} = (catch sub_trapping_1(List, ImproperList)), + + List = List -- lists:duplicate(N + (1 bsl N), gaffel), + ok = sub_trapping_1(List, []). + +sub_trapping_1([], _) -> ok; +sub_trapping_1(L, R) -> sub_trapping_1(L -- R, [gurka | R]). + +sub_thresholds(N) -> + %% This needs to be long enough to cause trapping. + OtherLen = 1 bsl 18, + Other = lists:seq(0, OtherLen - 1), + + Disjoint = lists:seq(-N, -1), + Subset = lists:seq(1, N), + + %% LHS is disjoint from RHS, so all elements must be retained. + Disjoint = Disjoint -- Other, + + %% LHS is covered by RHS, so all elements must be removed. + [] = Subset -- Other, + + %% RHS is disjoint from LHS, so all elements must be retained. + Other = Other -- Disjoint, + + %% RHS is covered by LHS, so N elements must be removed. + N = OtherLen - length(Other -- Subset), + + ok. + %% Test lists:droplast/1 droplast(Config) when is_list(Config) -> [] = lists:droplast([x]), |