1/* testmultimap.vala
2 *
3 * Copyright (C) 2008  Jürg Billeter
4 * Copyright (C) 2009  Didier Villevalois, Julien Peeters
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 * Lesser General Public License for more details.
15
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
19 *
20 * Author:
21 * 	Jürg Billeter <j@bitron.ch>
22 * 	Didier 'Ptitjes' Villevalois <ptitjes@free.fr>
23 * 	Julien Peeters <contact@julienpeeters.fr>
24 */
25
26using GLib;
27using Gee;
28
29public abstract class MultiMapTests : Gee.TestCase {
30
31	protected MultiMapTests (string name) {
32		base (name);
33		add_test ("[MultiMap] type correctness", test_type_correctness);
34		add_test ("[MultiMap] size", test_size);
35		add_test ("[MultiMap] getting and setting", test_getting_setting);
36		add_test ("[MultiMap] keys, all keys and values", test_keys_all_keys_values);
37	}
38
39	protected MultiMap<string,string> test_multi_map;
40
41	public void test_type_correctness () {
42		// Check the multimap exists
43		assert (test_multi_map != null);
44
45		// Check the advertised key and value types
46		assert (test_multi_map.key_type == typeof (string));
47		assert (test_multi_map.value_type == typeof (string));
48	}
49
50	private void test_size () {
51		// Check the map exists
52		assert (test_multi_map != null);
53
54		assert (test_multi_map.size == 0);
55		test_multi_map.set ("0", "0");
56		assert (test_multi_map.size == 1);
57		test_multi_map.set ("0", "1");
58		assert (test_multi_map.size == 2);
59		test_multi_map.remove ("0", "1");
60		assert (test_multi_map.size == 1);
61		test_multi_map.set ("0", "1");
62		test_multi_map.remove_all ("0");
63		assert (test_multi_map.size == 0);
64		test_multi_map.set ("0", "0");
65		assert (test_multi_map.size == 1);
66		test_multi_map.set ("1", "1");
67		assert (test_multi_map.size == 2);
68	}
69
70	private void test_getting_setting () {
71		// Check the map exists
72		assert (test_multi_map != null);
73
74		test_multi_map.set ("0", "0");
75		assert (test_multi_map.contains ("0"));
76		assert (test_multi_map.get ("0").size == 1);
77		assert (test_multi_map.get ("0").contains ("0"));
78
79		assert (test_multi_map.get ("1").size == 0);
80
81		test_multi_map.set ("0", "1");
82		assert (test_multi_map.get ("0").size == 2);
83		assert (test_multi_map.get ("0").contains ("0"));
84		assert (test_multi_map.get ("0").contains ("1"));
85
86		test_multi_map.set ("1", "1");
87		assert (test_multi_map.contains ("1"));
88		assert (test_multi_map.get ("0").size == 2);
89		assert (test_multi_map.get ("0").contains ("0"));
90		assert (test_multi_map.get ("0").contains ("1"));
91		assert (test_multi_map.get ("1").size == 1);
92		assert (test_multi_map.get ("0").contains ("1"));
93
94		// Check remove if bindings exist
95		assert (test_multi_map.remove ("0", "0"));
96		assert (test_multi_map.contains ("0"));
97		assert (! test_multi_map.get ("0").contains ("0"));
98		assert (test_multi_map.get ("0").contains ("1"));
99		assert (test_multi_map.contains ("1"));
100		assert (test_multi_map.get ("1").contains ("1"));
101
102		// Check remove if only one binding exists
103		assert (test_multi_map.remove ("0", "1"));
104		assert (! test_multi_map.contains ("0"));
105		assert (! test_multi_map.get ("0").contains ("0"));
106		assert (! test_multi_map.get ("0").contains ("1"));
107		assert (test_multi_map.contains ("1"));
108		assert (test_multi_map.get ("1").contains ("1"));
109
110		// Check remove if no binding exists
111		assert (! test_multi_map.remove ("0", "1"));
112		assert (! test_multi_map.contains ("0"));
113		assert (! test_multi_map.get ("0").contains ("0"));
114		assert (! test_multi_map.get ("0").contains ("1"));
115		assert (test_multi_map.contains ("1"));
116		assert (test_multi_map.get ("1").contains ("1"));
117
118		test_multi_map.clear ();
119		assert (! test_multi_map.contains ("0"));
120		assert (! test_multi_map.contains ("1"));
121
122		// Check remove_all
123		test_multi_map.set ("0", "0");
124		test_multi_map.set ("0", "1");
125		test_multi_map.set ("1", "1");
126		assert (test_multi_map.size == 3);
127
128		assert (test_multi_map.contains ("0"));
129		assert (test_multi_map.contains ("1"));
130		assert (test_multi_map.get ("0").size == 2);
131		assert (test_multi_map.get ("0").contains ("0"));
132		assert (test_multi_map.get ("0").contains ("1"));
133		assert (test_multi_map.get ("1").size == 1);
134		assert (test_multi_map.get ("0").contains ("1"));
135
136		// Check remove_all if bindings exist
137		assert (test_multi_map.remove_all ("0"));
138		assert (! test_multi_map.contains ("0"));
139		assert (! test_multi_map.get ("0").contains ("0"));
140		assert (! test_multi_map.get ("0").contains ("1"));
141		assert (test_multi_map.contains ("1"));
142		assert (test_multi_map.get ("1").contains ("1"));
143
144		// Check remove_all if no binding exists
145		assert (! test_multi_map.remove_all ("0"));
146		assert (! test_multi_map.contains ("0"));
147		assert (! test_multi_map.get ("0").contains ("0"));
148		assert (! test_multi_map.get ("0").contains ("1"));
149		assert (test_multi_map.contains ("1"));
150		assert (test_multi_map.get ("1").contains ("1"));
151	}
152
153	private void test_keys_all_keys_values () {
154		// Check the map exists
155		assert (test_multi_map != null);
156
157		test_multi_map.set ("0", "0");
158		test_multi_map.set ("0", "1");
159		test_multi_map.set ("1", "1");
160
161		// Check for keys, all_keys and values
162		Set<string> keys = test_multi_map.get_keys ();
163		MultiSet<string> all_keys = test_multi_map.get_all_keys ();
164		Collection<string> values = test_multi_map.get_values ();
165
166		assert (keys.contains ("0"));
167		assert (keys.contains ("1"));
168		assert (all_keys.count ("0") == 2);
169		assert (all_keys.count ("1") == 1);
170		assert (values.contains ("0"));
171		assert (values.contains ("1"));
172
173		bool zero_found = false;
174		bool zero_found_once = true;
175		bool one_found = false;
176		bool one_found_twice = false;
177		bool nothing_more = true;
178		foreach (string value in values) {
179			if (value == "0") {
180				if (zero_found) {
181					zero_found_once = false;
182				}
183				zero_found = true;
184			} else if (value == "1") {
185				if (one_found) {
186					if (one_found_twice) {
187						one_found_twice = false;
188					} else {
189						one_found_twice = true;
190					}
191				}
192				one_found = true;
193			} else {
194				nothing_more = false;
195			}
196		}
197		assert (zero_found);
198		assert (zero_found_once);
199		assert (one_found);
200		assert (one_found_twice);
201		assert (nothing_more);
202	}
203}
204