2006-05-13 James Livingston <doclivingston@gmail.com>
[rhythmbox.git] / tests / test-rhythmdb-simple.c
blob7a16a803d58a5ba16a4367c05fe689829b46dd1b
1 /*
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.
21 #include "config.h"
22 #include <glib.h>
23 #include <gtk/gtk.h>
24 #include <libgnome/gnome-i18n.h>
25 #include <stdlib.h>
26 #include <string.h>
27 #include "rhythmdb-tree.h"
28 #include "rb-debug.h"
29 #include "rb-thread-helpers.h"
31 int
32 main (int argc, char **argv)
34 RhythmDB *db;
35 RhythmDBEntry *entry, *entry1, *entry2, *entry3, *entry4;
36 GValue val = {0, };
37 GValue val2 = {0, };
38 char *orig_sort_key;
39 const char *new_sort_key;
41 gtk_init (&argc, &argv);
42 g_thread_init (NULL);
43 gdk_threads_init ();
44 rb_thread_helpers_init ();
45 rb_debug_init (TRUE);
47 GDK_THREADS_ENTER ();
49 db = rhythmdb_tree_new ("test");
51 /**
52 * TEST 1: Single entry creation
54 g_print ("Test 1\n");
55 rhythmdb_write_lock (db);
58 entry = rhythmdb_entry_new (db, RHYTHMDB_ENTRY_TYPE_SONG, "file:///moo.mp3");
59 g_assert (entry);
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");
66 /**
67 * TEST 2: Property setting
69 g_print ("Test 2\n");
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);
75 g_value_unset (&val);
77 rhythmdb_write_unlock (db);
78 g_print ("Test 2: PASS\n");
81 /**
82 * TEST 3: Single property reading
84 g_print ("Test 3\n");
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");
95 /**
96 * TEST 4: Resetting property
98 g_print ("Test 4\n");
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");
136 g_assert (entry);
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");
139 g_assert (entry1);
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");
142 g_assert (entry2);
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");
168 g_assert (entry);
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");
171 g_assert (entry1);
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");
174 g_assert (entry2);
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");
177 g_assert (entry3);
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");
180 g_assert (entry4);
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");
207 g_assert (entry);
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");
249 g_assert (entry);
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");
310 * THE END
312 rhythmdb_shutdown (db);
313 g_object_unref (G_OBJECT (db));
314 GDK_THREADS_LEAVE ();
316 exit (0);