aboutsummaryrefslogtreecommitdiff
path: root/test-stardict.c
diff options
context:
space:
mode:
Diffstat (limited to 'test-stardict.c')
-rw-r--r--test-stardict.c429
1 files changed, 0 insertions, 429 deletions
diff --git a/test-stardict.c b/test-stardict.c
deleted file mode 100644
index 8f7f798..0000000
--- a/test-stardict.c
+++ /dev/null
@@ -1,429 +0,0 @@
-/*
- * stardict.c: StarDict API test
- *
- * Copyright (c) 2013, Přemysl Janouch <p.janouch@gmail.com>
- * All rights reserved.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <glib.h>
-#include <gio/gio.h>
-
-#include "stardict.h"
-
-
-// --- Utilities ---------------------------------------------------------------
-
-// Adapted http://gezeiten.org/post/2009/04/Writing-Your-Own-GIO-Jobs
-static gboolean remove_recursive (GFile *file, GError **error);
-
-static gboolean
-remove_directory_contents (GFile *file, GError **error)
-{
- GFileEnumerator *enumerator =
- g_file_enumerate_children (file, "standard::*",
- G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, error);
-
- if (!enumerator)
- return FALSE;
-
- gboolean success = TRUE;
- do
- {
- GError *err = NULL;
- GFileInfo *child_info =
- g_file_enumerator_next_file (enumerator, NULL, &err);
-
- if (!child_info)
- {
- if (err)
- {
- g_propagate_error (error, err);
- success = FALSE;
- }
- break;
- }
-
- GFile *child = g_file_resolve_relative_path
- (file, g_file_info_get_name (child_info));
- success = remove_recursive (child, error);
- g_object_unref (child);
- g_object_unref (child_info);
- }
- while (success);
-
- g_object_unref (enumerator);
- return success;
-}
-
-static gboolean
-remove_recursive (GFile *file, GError **error)
-{
- g_return_val_if_fail (G_IS_FILE (file), FALSE);
-
- GFileInfo *info = g_file_query_info (file, "standard::*",
- G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, error);
-
- if (!info)
- return FALSE;
-
- GFileType type = g_file_info_get_file_type (info);
- g_object_unref (info);
-
- if (type == G_FILE_TYPE_DIRECTORY &&
- !remove_directory_contents (file, error))
- return FALSE;
-
- return g_file_delete (file, NULL, error);
-}
-
-static gchar *
-generate_random_string (gsize length, GRand *rand)
-{
- GString *s = g_string_sized_new (length);
- while (length--)
- g_string_append_c (s, g_rand_int_range (rand, 'a', 'z' + 1));
- return g_string_free (s, FALSE);
-}
-
-static gpointer
-generate_random_data (gsize length, GRand *rand)
-{
- gchar *blob = g_malloc (length), *i = blob;
- while (length--)
- *i++ = g_rand_int_range (rand, 0, 256);
- return blob;
-}
-
-// --- Dictionary generation ---------------------------------------------------
-
-typedef struct dictionary Dictionary;
-typedef struct test_entry TestEntry;
-
-struct dictionary
-{
- GFile *tmp_dir; //!< A temporary dictionary
- GFile *ifo_file; //!< The dictionary's .ifo file
- GArray *data; //!< Array of TestEntry's
-};
-
-struct test_entry
-{
- gchar *word;
- gchar *meaning;
- gpointer data;
- gsize data_size;
-};
-
-static void
-test_entry_free (TestEntry *te)
-{
- g_free (te->word);
- g_free (te->meaning);
- g_free (te->data);
-}
-
-static gint
-test_entry_word_compare (gconstpointer a, gconstpointer b)
-{
- return strcmp (((TestEntry *) a)->word, ((TestEntry *) b)->word);
-}
-
-static GArray *
-generate_dictionary_data (gsize length)
-{
- GRand *rand = g_rand_new_with_seed (0);
-
- GArray *a = g_array_sized_new (FALSE, FALSE, sizeof (TestEntry), length);
- g_array_set_clear_func (a, (GDestroyNotify) test_entry_free);
-
- while (length--)
- {
- TestEntry te;
-
- te.word = generate_random_string
- (g_rand_int_range (rand, 1, 10), rand);
- te.meaning = generate_random_string
- (g_rand_int_range (rand, 1, 1024), rand);
-
- te.data_size = g_rand_int_range (rand, 0, 1048576);
- te.data = generate_random_data (te.data_size, rand);
-
- g_array_append_val (a, te);
- }
-
- g_rand_free (rand);
- g_array_sort (a, test_entry_word_compare);
- return a;
-}
-
-static Dictionary *
-dictionary_create (void)
-{
- GError *error;
- gchar *tmp_dir_path = g_dir_make_tmp ("stardict-test-XXXXXX", &error);
- if (!tmp_dir_path)
- g_error ("Failed to create a directory for the test dictionary: %s",
- error->message);
-
- Dictionary *dict = g_malloc (sizeof *dict);
- dict->tmp_dir = g_file_new_for_path (tmp_dir_path);
-
- static const gint dictionary_size = 8;
- dict->data = generate_dictionary_data (dictionary_size);
- GFile *dict_file = g_file_get_child (dict->tmp_dir, "test.dict");
- GFile *idx_file = g_file_get_child (dict->tmp_dir, "test.idx");
-
- GFileOutputStream *dict_stream = g_file_replace (dict_file,
- NULL, FALSE, G_FILE_CREATE_NONE, NULL, &error);
- if (!dict_stream)
- g_error ("Failed to create the .dict file: %s", error->message);
-
- GFileOutputStream *idx_stream = g_file_replace (idx_file,
- NULL, FALSE, G_FILE_CREATE_NONE, NULL, &error);
- if (!idx_stream)
- g_error ("Failed to create the .idx file: %s", error->message);
-
- GDataOutputStream *dict_data
- = g_data_output_stream_new (G_OUTPUT_STREAM (dict_stream));
- g_data_output_stream_set_byte_order
- (dict_data, G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN);
-
- GDataOutputStream *idx_data
- = g_data_output_stream_new (G_OUTPUT_STREAM (idx_stream));
- g_data_output_stream_set_byte_order
- (idx_data, G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN);
-
- gint i;
- gsize written;
- for (i = 0; i < dictionary_size; i++)
- {
- TestEntry *te = &g_array_index (dict->data, TestEntry, i);
- goffset offset = g_seekable_tell (G_SEEKABLE (dict_stream));
-
- if (!g_data_output_stream_put_string (dict_data,
- te->meaning, NULL, &error)
- || !g_data_output_stream_put_byte (dict_data, '\0', NULL, &error)
- || !g_output_stream_write_all (G_OUTPUT_STREAM (dict_stream),
- te->data, te->data_size, &written, NULL, &error))
- g_error ("Write to dictionary failed: %s", error->message);
-
- if (!g_data_output_stream_put_string (idx_data,
- te->word, NULL, &error)
- || !g_data_output_stream_put_byte (idx_data, '\0', NULL, &error)
- || !g_data_output_stream_put_uint32 (idx_data, offset, NULL, &error)
- || !g_data_output_stream_put_uint32 (idx_data,
- g_seekable_tell (G_SEEKABLE (dict_stream)) - offset, NULL, &error))
- g_error ("Write to index failed: %s", error->message);
- }
-
- gint index_size = g_seekable_tell (G_SEEKABLE (idx_stream));
-
- if (!g_output_stream_close (G_OUTPUT_STREAM (dict_stream), NULL, &error))
- g_error ("Failed to close the .dict file: %s", error->message);
- if (!g_output_stream_close (G_OUTPUT_STREAM (idx_stream), NULL, &error))
- g_error ("Failed to close the .idx file: %s", error->message);
-
- g_object_unref (dict_data);
- g_object_unref (idx_data);
-
- g_object_unref (dict_stream);
- g_object_unref (idx_stream);
-
- gchar *ifo_contents = g_strdup_printf
- ("StarDict's dict ifo file\n"
- "version=3.0.0\n"
- "bookname=Test Book\n"
- "wordcount=%d\n"
- "idxfilesize=%d\n"
- "idxoffsetbits=32\n"
- "author=Lyra Heartstrings\n"
- "email=lyra@equestria.net\n"
- "website=http://equestria.net\n"
- "description=Test dictionary\n"
- "date=21.12.2012\n"
- "sametypesequence=mX\n",
- dictionary_size, index_size);
-
- g_object_unref (dict_file);
- g_object_unref (idx_file);
-
- dict->ifo_file = g_file_get_child (dict->tmp_dir, "test.ifo");
- if (!g_file_replace_contents (dict->ifo_file,
- ifo_contents, strlen (ifo_contents),
- NULL, FALSE, G_FILE_CREATE_NONE, NULL, NULL, &error))
- g_error ("Failed to create the .ifo file: %s", error->message);
- g_free (ifo_contents);
-
- g_message ("Successfully created a test dictionary in %s", tmp_dir_path);
- g_free (tmp_dir_path);
-
- return dict;
-}
-
-static void
-dictionary_destroy (Dictionary *dict)
-{
- GError *error;
- if (!remove_recursive (dict->tmp_dir, &error))
- g_error ("Failed to delete the temporary directory: %s",
- error->message);
-
- g_message ("The test dictionary has been deleted");
-
- g_object_unref (dict->tmp_dir);
- g_object_unref (dict->ifo_file);
- g_array_free (dict->data, TRUE);
- g_free (dict);
-}
-
-// --- Testing -----------------------------------------------------------------
-
-typedef struct dict_fixture DictFixture;
-
-struct dict_fixture
-{
- StardictDict *dict;
-};
-
-static void
-dict_setup (DictFixture *fixture, gconstpointer test_data)
-{
- Dictionary *dict = (Dictionary *) test_data;
-
- gchar *ifo_filename = g_file_get_path (dict->ifo_file);
- fixture->dict = stardict_dict_new (ifo_filename, NULL);
- g_free (ifo_filename);
-}
-
-static void
-dict_teardown (DictFixture *fixture, G_GNUC_UNUSED gconstpointer test_data)
-{
- g_object_unref (fixture->dict);
-}
-
-static void
-dict_test_list (gconstpointer user_data)
-{
- Dictionary *dict = (Dictionary *) user_data;
-
- gchar *tmp_path = g_file_get_path (dict->tmp_dir);
- GList *dictionaries = stardict_list_dictionaries (tmp_path);
- g_free (tmp_path);
-
- g_assert (dictionaries != NULL);
- g_assert (dictionaries->next == NULL);
-
- StardictInfo *info = dictionaries->data;
- GFile *ifo_file = g_file_new_for_path (stardict_info_get_path (info));
- g_assert (g_file_equal (ifo_file, dict->ifo_file) == TRUE);
- g_object_unref (ifo_file);
-
- g_list_free_full (dictionaries, (GDestroyNotify) stardict_info_free);
-}
-
-static void
-dict_test_new (gconstpointer user_data)
-{
- Dictionary *dict = (Dictionary *) user_data;
-
- gchar *ifo_filename = g_file_get_path (dict->ifo_file);
- StardictDict *sd = stardict_dict_new (ifo_filename, NULL);
- g_free (ifo_filename);
-
- g_assert (sd != NULL);
- g_object_unref (sd);
-}
-
-static void
-dict_test_data_entry (StardictDict *sd, TestEntry *entry)
-{
- gboolean success;
- StardictIterator *sdi =
- stardict_dict_search (sd, entry->word, &success);
-
- g_assert (success == TRUE);
- g_assert (sdi != NULL);
- g_assert (stardict_iterator_is_valid (sdi));
-
- const gchar *word = stardict_iterator_get_word (sdi);
- g_assert_cmpstr (word, ==, entry->word);
-
- StardictEntry *sde = stardict_iterator_get_entry (sdi);
- g_assert (sde != NULL);
-
- const GList *fields = stardict_entry_get_fields (sde);
- const StardictEntryField *sdef;
- g_assert (fields != NULL);
- g_assert (fields->data != NULL);
-
- sdef = fields->data;
- g_assert (sdef->type == 'm');
- g_assert_cmpstr (sdef->data, ==, entry->meaning);
-
- fields = fields->next;
- g_assert (fields != NULL);
- g_assert (fields->data != NULL);
-
- sdef = fields->data;
- g_assert (sdef->type == 'X');
- g_assert_cmpuint (sdef->data_size, ==, entry->data_size);
- g_assert (memcmp (sdef->data, entry->data, entry->data_size) == 0);
-
- fields = fields->next;
- g_assert (fields == NULL);
-
- g_object_unref (sde);
- g_object_unref (sdi);
-}
-
-static void
-dict_test_data (DictFixture *fixture, gconstpointer user_data)
-{
- Dictionary *dict = (Dictionary *) user_data;
- GArray *data = dict->data;
- StardictDict *sd = fixture->dict;
-
- guint i;
- for (i = 0; i < data->len; i++)
- {
- TestEntry *entry = &g_array_index (data, TestEntry, i);
- dict_test_data_entry (sd, entry);
- }
-}
-
-int
-main (int argc, char *argv[])
-{
- g_test_init (&argc, &argv, NULL);
- if (glib_check_version (2, 36, 0))
- g_type_init ();
-
- Dictionary *dict = dictionary_create ();
-
- g_test_add_data_func ("/dict/list", dict, dict_test_list);
- g_test_add_data_func ("/dict/new", dict, dict_test_new);
-
- g_test_add ("/dict/data", DictFixture, dict,
- dict_setup, dict_test_data, dict_teardown);
-
- int result = g_test_run ();
- dictionary_destroy (dict);
- return result;
-}