2 * arch-tag: Some simple tests for the RhythmDB tree database
4 * Copyright (C) 2003 Colin Walters <walters@verbum.org>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program 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
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
24 #include <libgnome/gnome-i18n.h>
27 #include "rhythmdb-tree.h"
29 #include "rb-thread-helpers.h"
32 main (int argc
, char **argv
)
35 RhythmDBEntry
*entry
, *entry1
, *entry2
, *entry3
, *entry4
;
39 const char *new_sort_key
;
41 gtk_init (&argc
, &argv
);
44 rb_thread_helpers_init ();
49 db
= rhythmdb_tree_new ("test");
52 * TEST 1: Single entry creation
55 rhythmdb_write_lock (db
);
58 entry
= rhythmdb_entry_new (db
, RHYTHMDB_ENTRY_TYPE_SONG
, "file:///moo.mp3");
60 g_assert (rhythmdb_entry_lookup_by_location (db
, "file:///moo.mp3") == entry
);
62 rhythmdb_write_unlock (db
);
63 g_print ("Test 1: PASS\n");
67 * TEST 2: Property setting
70 rhythmdb_write_lock (db
);
72 g_value_init (&val
, G_TYPE_STRING
);
73 g_value_set_static_string (&val
, "foo22");
74 rhythmdb_entry_set (db
, entry
, RHYTHMDB_PROP_TITLE
, &val
);
77 rhythmdb_write_unlock (db
);
78 g_print ("Test 2: PASS\n");
82 * TEST 3: Single property reading
85 rhythmdb_read_lock (db
);
87 g_value_init (&val2
, G_TYPE_STRING
);
88 rhythmdb_entry_get (db
, entry
, RHYTHMDB_PROP_TITLE
, &val2
);
89 g_assert (!strcmp ("foo22", g_value_get_string (&val2
)));
90 g_value_unset (&val2
);
92 rhythmdb_read_unlock (db
);
93 g_print ("Test 3: PASS\n");
96 * TEST 4: Resetting property
99 rhythmdb_write_lock (db
);
101 g_value_init (&val
, G_TYPE_STRING
);
102 g_value_set_static_string (&val
, "baz9");
103 rhythmdb_entry_set (db
, entry
, RHYTHMDB_PROP_TITLE
, &val
);
104 g_value_unset (&val
);
106 rhythmdb_write_unlock (db
);
108 rhythmdb_read_lock (db
);
110 g_value_init (&val2
, G_TYPE_STRING
);
111 rhythmdb_entry_get (db
, entry
, RHYTHMDB_PROP_TITLE
, &val2
);
112 g_assert (!strcmp ("baz9", g_value_get_string (&val2
)));
113 g_value_unset (&val2
);
115 rhythmdb_read_unlock (db
);
116 g_print ("Test 4: PASS\n");
119 * TEST 5: Entry deletion
121 g_print ("Test 5\n");
122 rhythmdb_write_lock (db
);
124 rhythmdb_entry_delete (db
, entry
);
126 rhythmdb_write_unlock (db
);
127 g_print ("Test 5: PASS\n");
130 * TEST 6: Multiple entry creation
132 g_print ("Test 6\n");
133 rhythmdb_write_lock (db
);
135 entry
= rhythmdb_entry_new (db
, RHYTHMDB_ENTRY_TYPE_SONG
, "file:///bar.mp3");
137 g_assert (rhythmdb_entry_lookup_by_location (db
, "file:///bar.mp3") == entry
);
138 entry1
= rhythmdb_entry_new (db
, RHYTHMDB_ENTRY_TYPE_SONG
, "file:///baz.mp3");
140 g_assert (rhythmdb_entry_lookup_by_location (db
, "file:///baz.mp3") == entry1
);
141 entry2
= rhythmdb_entry_new (db
, RHYTHMDB_ENTRY_TYPE_SONG
, "file:///whee.mp3");
143 g_assert (rhythmdb_entry_lookup_by_location (db
, "file:///whee.mp3") == entry2
);
145 rhythmdb_write_unlock (db
);
146 g_print ("Test 6: PASS\n");
149 * TEST 7: Multiple entry deletion
151 g_print ("Test 7\n");
152 rhythmdb_write_lock (db
);
154 rhythmdb_entry_delete (db
, entry2
);
155 rhythmdb_entry_delete (db
, entry1
);
156 rhythmdb_entry_delete (db
, entry
);
158 rhythmdb_write_unlock (db
);
159 g_print ("Test 7: PASS\n");
162 * TEST 8: Different entry types
164 g_print ("Test 8\n");
165 rhythmdb_write_lock (db
);
167 entry
= rhythmdb_entry_new (db
, RHYTHMDB_ENTRY_TYPE_SONG
, "file:///crack.mp3");
169 g_assert (rhythmdb_entry_lookup_by_location (db
, "file:///crack.mp3") == entry
);
170 entry1
= rhythmdb_entry_new (db
, RHYTHMDB_ENTRY_TYPE_IRADIO_STATION
, "file:///whee.mp3");
172 g_assert (rhythmdb_entry_lookup_by_location (db
, "file:///whee.mp3") == entry1
);
173 entry2
= rhythmdb_entry_new (db
, RHYTHMDB_ENTRY_TYPE_SONG
, "file:///cow.mp3");
175 g_assert (rhythmdb_entry_lookup_by_location (db
, "file:///cow.mp3") == entry2
);
176 entry3
= rhythmdb_entry_new (db
, RHYTHMDB_ENTRY_TYPE_IRADIO_STATION
, "file:///bar.mp3");
178 g_assert (rhythmdb_entry_lookup_by_location (db
, "file:///bar.mp3") == entry3
);
179 entry4
= rhythmdb_entry_new (db
, RHYTHMDB_ENTRY_TYPE_IRADIO_STATION
, "file:///baz.mp3");
181 g_assert (rhythmdb_entry_lookup_by_location (db
, "file:///baz.mp3") == entry4
);
183 rhythmdb_write_unlock (db
);
184 g_print ("Test 8: PASS\n");
187 * TEST 9: Different entry types deletion
189 g_print ("Test 9\n");
190 rhythmdb_write_lock (db
);
192 rhythmdb_entry_delete (db
, entry1
);
193 rhythmdb_entry_delete (db
, entry3
);
194 rhythmdb_entry_delete (db
, entry2
);
195 rhythmdb_entry_delete (db
, entry
);
197 rhythmdb_write_unlock (db
);
198 g_print ("Test 9: PASS\n");
201 * TEST 10: More property setting
203 g_print ("Test 10\n");
204 rhythmdb_write_lock (db
);
206 entry
= rhythmdb_entry_new (db
, RHYTHMDB_ENTRY_TYPE_SONG
, "file:///bar.mp3");
209 g_value_init (&val
, G_TYPE_DOUBLE
);
210 g_value_set_double (&val
, 5.0);
211 rhythmdb_entry_set (db
, entry
, RHYTHMDB_PROP_RATING
, &val
);
212 g_value_unset (&val
);
214 g_value_init (&val
, G_TYPE_LONG
);
215 g_value_set_long (&val
, 32525424);
216 rhythmdb_entry_set (db
, entry
, RHYTHMDB_PROP_MTIME
, &val
);
217 g_value_unset (&val
);
219 rhythmdb_write_unlock (db
);
220 g_print ("Test 10: PASS\n");
223 * TEST 11: Last played property mirroring
225 g_print ("Test 11\n");
226 rhythmdb_write_lock (db
);
228 g_value_init (&val
, G_TYPE_LONG
);
229 g_value_set_long (&val
, 1354285);
230 rhythmdb_entry_set (db
, entry
, RHYTHMDB_PROP_LAST_PLAYED
, &val
);
231 g_value_unset (&val
);
233 g_value_init (&val2
, G_TYPE_STRING
);
234 rhythmdb_entry_get (db
, entry
, RHYTHMDB_PROP_LAST_PLAYED_STR
, &val2
);
235 g_assert (strlen (g_value_get_string (&val2
)) > 0);
236 g_value_unset (&val2
);
238 rhythmdb_write_unlock (db
);
240 g_print ("Test 11: PASS\n");
243 * TEST 12: Sort keys mirroring
245 g_print ("Test 12\n");
246 rhythmdb_write_lock (db
);
248 entry
= rhythmdb_entry_new (db
, RHYTHMDB_ENTRY_TYPE_SONG
, "file:///test-12.mp3");
251 g_value_init (&val
, G_TYPE_STRING
);
252 g_value_set_static_string (&val
, "foo");
253 rhythmdb_entry_set (db
, entry
, RHYTHMDB_PROP_TITLE
, &val
);
254 g_value_unset (&val
);
256 g_value_init (&val2
, G_TYPE_STRING
);
257 rhythmdb_entry_get (db
, entry
, RHYTHMDB_PROP_TITLE_SORT_KEY
, &val2
);
258 orig_sort_key
= g_strdup (g_value_get_string (&val2
));
259 g_assert (strlen (orig_sort_key
) > 0);
260 g_value_unset (&val2
);
262 g_value_init (&val
, G_TYPE_STRING
);
263 g_value_set_static_string (&val
, "Rock");
264 rhythmdb_entry_set (db
, entry
, RHYTHMDB_PROP_GENRE
, &val
);
265 g_value_unset (&val
);
267 g_value_init (&val2
, G_TYPE_STRING
);
268 rhythmdb_entry_get (db
, entry
, RHYTHMDB_PROP_GENRE_SORT_KEY
, &val2
);
269 g_assert (strlen (g_value_get_string (&val2
)) > 0);
270 g_value_unset (&val2
);
272 g_value_init (&val
, G_TYPE_STRING
);
273 g_value_set_static_string (&val
, "Nine Inch Nails");
274 rhythmdb_entry_set (db
, entry
, RHYTHMDB_PROP_ARTIST
, &val
);
275 g_value_unset (&val
);
277 g_value_init (&val2
, G_TYPE_STRING
);
278 rhythmdb_entry_get (db
, entry
, RHYTHMDB_PROP_ARTIST_SORT_KEY
, &val2
);
279 g_assert (strlen (g_value_get_string (&val2
)) > 0);
280 g_value_unset (&val2
);
282 g_value_init (&val
, G_TYPE_STRING
);
283 g_value_set_static_string (&val
, "Broken");
284 rhythmdb_entry_set (db
, entry
, RHYTHMDB_PROP_ALBUM
, &val
);
285 g_value_unset (&val
);
287 g_value_init (&val2
, G_TYPE_STRING
);
288 rhythmdb_entry_get (db
, entry
, RHYTHMDB_PROP_ALBUM_SORT_KEY
, &val2
);
289 g_assert (strlen (g_value_get_string (&val2
)) > 0);
290 g_value_unset (&val2
);
292 g_value_init (&val
, G_TYPE_STRING
);
293 g_value_set_static_string (&val
, "bar");
294 rhythmdb_entry_set (db
, entry
, RHYTHMDB_PROP_TITLE
, &val
);
295 g_value_unset (&val
);
297 g_value_init (&val2
, G_TYPE_STRING
);
298 rhythmdb_entry_get (db
, entry
, RHYTHMDB_PROP_TITLE_SORT_KEY
, &val2
);
299 new_sort_key
= g_value_get_string (&val2
);
300 g_assert (strlen (new_sort_key
) > 0);
301 g_assert (strcmp (new_sort_key
, orig_sort_key
) != 0);
302 g_free (orig_sort_key
);
303 g_value_unset (&val2
);
305 rhythmdb_write_unlock (db
);
307 g_print ("Test 12: PASS\n");
312 rhythmdb_shutdown (db
);
313 g_object_unref (G_OBJECT (db
));
314 GDK_THREADS_LEAVE ();