* Bug 15967 fixed: setdiff(a,[],..) had troubles
[scilab.git] / scilab / modules / elementary_functions / tests / unit_tests / setdiff.tst
1 // =============================================================================
2 // Scilab ( http://wwwscilaborg/ ) - This file is part of Scilab
3 // Copyright (C) 2009 - DIGITEO - Allan CORNET
4 // Copyright (C) 2018 - 2019 - Samuel GOUGEON
5 //
6 //  This file is distributed under the same license as the Scilab package
7 // =============================================================================
8 // <-- CLI SHELL MODE -->
9 // <-- NO CHECK REF -->
10 // <-- ENGLISH IMPOSED -->
11 // =============================================================================
12
13 a = [223;111;2;4;2;2];
14 b = [2;3;21;223;123;22];
15 REF_K = [4 ; 2];
16 for f = list(double, int8, uint8, int16, uint16, int32, uint32, int64, uint64)
17     REF_V = f([4 ; 111]);
18     [v,k]= setdiff(f(a), f(b));
19     assert_checkequal(v, REF_V);
20     assert_checkequal(k, REF_K);
21 end
22
23 // =============================================================================
24
25 REF_V = ['111' ; '4'];
26 REF_K = [2; 4];
27 [v,k] = setdiff(string(a),string(b));
28 if and(v == REF_V) <> %t then pause,end
29 if and(k == REF_K) <> %t then pause,end
30
31 // =============================================================================
32 s  = 7;
33 s2 = 5;
34 r  = [14   0  4  7   8  15   7  17  15  12];
35 r2 = [ 2  11  1  0  15   7  10   5];
36 c  = r';
37 c2 = r2';
38 m  = [
39    1  3  2  0  0  0  1  2  1  3
40    1  3  2  1  3  1  2  3  1  0
41 ];
42 m2  = [
43    0  3  1  1  3  2  0  2  0
44    2  0  0  2  2  1  2  2  3
45  ];
46 h = cat(3, m(:,1:6), m2(:,1:6));
47 h2 = cat(3, m([2 1],1:6), m2([2 1],1:6));
48 L  = list(s,  r,  c,  m,  h);
49 L2 = list(s2, r2, c2, m2, h2);
50
51 // With a=[] , orien = none|"r"|"c"
52 // --------------------------------
53 for i = 1:length(L)
54     o = L(i);
55     [va, ka] = setdiff([], o);
56     assert_checkequal(va, []);
57     assert_checkequal(ka, []);
58     [va, ka] = setdiff([], o, "r");
59     assert_checkequal(va, []);
60     assert_checkequal(ka, []);
61     [va, ka] = setdiff([], o, "c");
62     assert_checkequal(va, []);
63     assert_checkequal(ka, []);
64 end
65
66 // With b=[] , orien = none|"r"|"c"
67 // --------------------------------
68 for i = 1:length(L)
69     o = L(i);
70     [va, ka] = setdiff(o,[]);
71     [var,kar]= unique(o);
72     assert_checkequal(va, var);
73     assert_checkequal(ka, kar);
74     if ndims(o)>2
75         [var,kar] = unique(matrix(permute(o,[2 1 3]),6,-1)', "r");
76     else
77         [var,kar] = unique(o, "r")
78     end
79     [va, ka] = setdiff(o, [], "r");
80     assert_checkequal(va, var);
81     assert_checkequal(ka, kar);
82     [va, ka] = setdiff(o, [], "c");
83     if ndims(o)>2
84         [var,kar] = unique(matrix(o,2,-1), "c");
85     else
86         [var,kar] = unique(o, "c")
87     end
88     assert_checkequal(va, var);
89     assert_checkequal(ka, kar);
90 end
91
92 // "r" and "c" options
93 // -------------------
94 for f = list(double, int8, uint8, int16, uint16, int32, uint32, int64, uint64)
95     // With row vectors
96     [rr,k] = setdiff(f(r), f([r2 0 2]), "r");
97     assert_checkequal(rr, f(r));
98     assert_checkequal(k, 1);
99     [rc,k] = setdiff(f(r), f(r2), "c");
100     assert_checkequal(rc, f([4  8  12  14  17]));
101     assert_checkequal(k,    [3  5  10   1   8]);
102
103     // With column vectors
104     [rc,k] = setdiff(f(r'), f([r2 0 2]'), "c");
105     assert_checkequal(rc, f(r'));
106     assert_checkequal(k, 1);
107     [rr,k] = setdiff(f(r'), f(r2'), "r");
108     assert_checkequal(rr, f([4  8  12  14  17]'));
109     assert_checkequal(k,    [3  5  10   1  8]');
110
111     // With matrices
112     [mc,k] = setdiff(f(m), f(m2), "c");
113     assert_checkequal(mc, f([0  1  2  3
114                              1  1  3  3]));
115     assert_checkequal(k,    [4  1  8  2]);
116     [mr,k] = setdiff(f(m'), f(m2'), "r");
117     assert_checkequal(mr, f([0  1  2  3
118                             1  1  3  3]'));
119     assert_checkequal(k,   [4  1  8  2]');
120
121     // With hypermatrices
122     [hc,k] = setdiff(f(h), f(h2), "c");
123     assert_checkequal(hc, f([0  3
124                              2  2]));
125     assert_checkequal(k,    [7 11]);
126
127     hr  = permute(h, [2 1 3]);
128     h2r = permute(h2,[2 1 3]);
129     [hr,k] = setdiff(f(hr), f(h2r), "r");
130     assert_checkequal(hr, f([0  2
131                              3  2]));
132     assert_checkequal(k,    [7 11]');
133 end
134
135 // =============================================================================
136 // Error messages
137 msg = "%s: Wrong number of input argument(s): %d or %d expected.\n";
138 assert_checkerror("setdiff()", msg , [], "setdiff", 2, 3);