1use strict;
2use warnings;
3
4use t::std;
5
6{
7	check_test(
8		sub {
9			cmp_deeply([], set());
10		},
11		{
12			actual_ok => 1,
13			diag => "",
14		},
15		"empty eq"
16	);
17
18	check_test(
19		sub {
20			cmp_deeply(["a"], set("a", "a"));
21		},
22		{
23			actual_ok => 1,
24			diag => "",
25		},
26		"empty eq"
27	);
28
29	check_test(
30		sub {
31			cmp_deeply(['a', 'b', 'b', ['c', 'd']], set('b', 'a', ['c', 'd'], 'b'));
32		},
33		{
34			actual_ok => 1,
35			diag => "",
36		},
37		"3 elem eq"
38	);
39
40	check_test(
41		sub {
42			cmp_deeply(['a', [], 'b', 'b'], set());
43		},
44		{
45			actual_ok => 0,
46			diag => <<EOM,
47Comparing \$data as a Set
48Extra: 'a', 'b', 1 reference
49EOM
50		},
51		"empty extra"
52	);
53
54	check_test(
55		sub {
56			cmp_deeply([], set('a', [], 'a', 'b'));
57		},
58		{
59			actual_ok => 0,
60			diag => <<EOM,
61Comparing \$data as a Set
62Missing: 'a', 'b', 1 reference
63EOM
64		},
65		"empty missing"
66	);
67
68	check_test(
69		sub {
70			cmp_deeply(['a', 'a', 'b', [\"c"], "d", []], set({}, 'a', [\"c"], 'd', 'd', "e"));
71		},
72		{
73			actual_ok => 0,
74			diag => <<EOM,
75Comparing \$data as a Set
76Missing: 'e', 1 reference
77Extra: 'b', 1 reference
78EOM
79		},
80		"extra and missing"
81	);
82
83	check_test(
84		sub {
85			cmp_deeply("a", set());
86		},
87		{
88			actual_ok => 0,
89			diag => <<EOM,
90Comparing \$data as a Set
91got    : 'a'
92expect : An array to use as a Set
93EOM
94		},
95		"no array"
96	);
97
98	check_test(
99		sub {
100			cmp_deeply(['a',['a', 'b', 'b'], ['c', 'd', 'c','d'], ['a', 'b', 'a']],
101				set(set('c', 'd', 'd'), set('a', 'b', 'a'), set('c', 'c', 'd'), 'a')
102			);
103		},
104		{
105			actual_ok => 1,
106			diag => '',
107		},
108		"set of sets eq"
109	);
110	check_test(
111		sub {
112			cmp_deeply([['a', 'b', 'c'], ['c', 'd', 'c'], ['a', 'b', 'a']],
113				set(set('c', 'd', 'c'), set('a', 'b', 'a'), set('b', 'b', 'a'))
114			);
115		},
116		{
117			actual_ok => 0,
118			diag => <<EOM,
119Comparing \$data as a Set
120Extra: 1 reference
121EOM
122		},
123		"set of sets not eq"
124	);
125
126	my $b1 = set('a');
127	my $b2 = [set('b')];
128	$b1->add($b1, $b2, $b1);
129	$b2->[0]->add($b2, $b1, $b2);
130
131	my $v1 = ['a'];
132	my $v2 = [['b']];
133	push(@$v1, $v2, $v1, $v2);
134	push(@{$v2->[0]}, $v1, $v2, $v1);
135
136	check_test(
137		sub {
138			cmp_deeply($v1, $b1);
139		},
140		{
141			actual_ok => 1,
142			diag => '',
143		},
144		"circular double set eq"
145	);
146
147	$b1->add('b', 'b');
148	push(@$v1, 'c', 'c');
149	check_test(
150		sub {
151			cmp_deeply($v1, $b1);
152		},
153		{
154			actual_ok => 0,
155			diag => <<EOM,
156Comparing \$data as a Set
157Missing: 'b'
158Extra: 'c'
159EOM
160		},
161		"circular double set not eq"
162	);
163
164	check_test(
165		sub {
166			cmp_set([1, 2, 2], [1, 1, 2]);
167		},
168		{
169			actual_ok => 1,
170		},
171		"cmp_set eq"
172	);
173		
174	check_test(
175		sub {
176			cmp_set([1, 2, 2, 3], [1, 1, 2]);
177		},
178		{
179			actual_ok => 0,
180		},
181		"cmp_set not eq"
182	);
183}
184
185{
186	my $a1 = \"a";
187	my $b1 = \"b";
188	my $a2 = \"a";
189	my $b2 = \"b";
190
191	TODO:
192	{
193	todo_skip(
194		"Because I want to get it out the door see notes on bags and sets",
195		5
196	);
197	check_test(
198		sub {
199			cmp_deeply([[\'a', \'b']], set(set($a2, $b1), set($b2, $a1)))
200		},
201		{
202			actual_ok => 1,
203			diag => "",
204		},
205		"set compare()"
206	);
207	}
208
209	check_test(
210		sub {
211			cmp_deeply(['a', 'b', 'c', 'a'], supersetof('b', 'a', 'b'));
212		},
213		{
214			actual_ok => 1,
215			diag => "",
216		},
217		"supersetof yes"
218	);
219
220	check_test(
221		sub {
222			cmp_deeply(['a', 'b', 'c', 'a'], supersetof('d', 'b', 'd'));
223		},
224		{
225			actual_ok => 0,
226			diag => <<'EOM',
227Comparing $data as a SuperSet
228Missing: 'd'
229EOM
230		},
231		"supersetof no"
232	);
233
234	check_test(
235		sub {
236			cmp_deeply(['b', 'a', 'b'], subsetof('a', 'b', 'c', 'a'));
237		},
238		{
239			actual_ok => 1,
240			diag => "",
241		},
242		"subsetof yes"
243	);
244
245	check_test(
246		sub {
247			cmp_deeply(['d', 'b', 'd'], subsetof('a', 'b', 'c', 'a'));
248		},
249		{
250			actual_ok => 0,
251			diag => <<'EOM',
252Comparing $data as a SubSet
253Extra: 'd'
254EOM
255		},
256		"subsetof no"
257	);
258}
259
260{
261	check_test(
262		sub {
263			cmp_deeply([1, undef, undef], set(undef, 1, undef));
264		},
265		{
266			actual_ok => 1,
267			diag => "",
268		},
269		"undef warnings"
270	);
271
272	check_test(
273		sub {
274			cmp_deeply([1, undef], set(1));
275		},
276		{
277			actual_ok => 0,
278			diag => <<EOM,
279Comparing \$data as a Set
280Extra: undef
281EOM
282		},
283		"warnings extra"
284	);
285}
286