/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* Copyright (C) 2009 Shaun McCance .
*
* Author: Shaun McCance
*/
#include
#include
#include
#include
#include
#include "yelp-uri.h"
GMainLoop *loop;
static void
print_uri (gchar *orig, YelpUri *uri, GOutputStream *stream)
{
GFile *file;
const gchar *type = NULL;
gchar *tmp, **tmpv, *out;
g_output_stream_write (stream, orig, strlen (orig), NULL, NULL);
g_output_stream_write (stream, "\n", 1, NULL, NULL);
switch (yelp_uri_get_document_type (uri)) {
case YELP_URI_DOCUMENT_TYPE_DOCBOOK:
type = "DOCBOOK";
break;
case YELP_URI_DOCUMENT_TYPE_MALLARD:
type = "MALLARD";
break;
case YELP_URI_DOCUMENT_TYPE_MAN:
type = "MAN";
break;
case YELP_URI_DOCUMENT_TYPE_INFO:
type = "INFO";
break;
case YELP_URI_DOCUMENT_TYPE_TEXT:
type = "TEXT";
break;
case YELP_URI_DOCUMENT_TYPE_HTML:
type = "HTML";
break;
case YELP_URI_DOCUMENT_TYPE_XHTML:
type = "XHTML";
break;
case YELP_URI_DOCUMENT_TYPE_HELP_LIST:
type = "TOC";
break;
case YELP_URI_DOCUMENT_TYPE_NOT_FOUND:
type = "NOT FOUND";
break;
case YELP_URI_DOCUMENT_TYPE_EXTERNAL:
type = "EXTERNAL";
break;
case YELP_URI_DOCUMENT_TYPE_ERROR:
type = "ERROR";
break;
case YELP_URI_DOCUMENT_TYPE_UNRESOLVED:
type = "UNRESOLVED";
break;
default:
g_assert_not_reached ();
break;
}
out = g_strdup_printf ("DOCUMENT TYPE: %s\n", type);
g_output_stream_write (stream, out, strlen (out), NULL, NULL);
g_free (out);
tmp = yelp_uri_get_document_uri (uri);
if (tmp) {
out = g_strdup_printf ("DOCUMENT URI: %s\n", tmp);
g_output_stream_write (stream, out, strlen (out), NULL, NULL);
g_free (out);
g_free (tmp);
}
tmp = yelp_uri_get_canonical_uri (uri);
if (tmp) {
out = g_strdup_printf ("CANONICAL URI: %s\n", tmp);
g_output_stream_write (stream, out, strlen (out), NULL, NULL);
g_free (out);
g_free (tmp);
}
file = yelp_uri_get_file (uri);
if (file) {
tmp = g_file_get_uri (file);
out = g_strdup_printf ("FILE URI: %s\n", tmp);
g_output_stream_write (stream, out, strlen (out), NULL, NULL);
g_free (out);
g_free (tmp);
g_object_unref (file);
}
tmpv = yelp_uri_get_search_path (uri);
if (tmpv) {
int i;
for (i = 0; tmpv[i]; i++) {
if (i == 0)
out = g_strdup_printf ("SEARCH PATH: %s\n", tmpv[i]);
else
out = g_strdup_printf (" %s\n", tmpv[i]);
g_output_stream_write (stream, out, strlen (out), NULL, NULL);
g_free (out);
}
g_strfreev (tmpv);
}
tmp = yelp_uri_get_page_id (uri);
if (tmp) {
out = g_strdup_printf ("PAGE ID: %s\n", tmp);
g_output_stream_write (stream, out, strlen (out), NULL, NULL);
g_free (out);
g_free (tmp);
}
tmp = yelp_uri_get_frag_id (uri);
if (tmp) {
out = g_strdup_printf ("FRAG ID: %s\n", tmp);
g_output_stream_write (stream, out, strlen (out), NULL, NULL);
g_free (out);
g_free (tmp);
}
g_output_stream_write (stream, "\0", 1, NULL, NULL);
}
static void run_test (gconstpointer data)
{
GFileInputStream *stream;
gchar contents[1024];
gsize bytes;
gchar *curi, *newline;
gchar **uriv;
GFile *file = G_FILE (data);
YelpUri *uri;
GOutputStream *outstream;
gchar *out;
stream = g_file_read (file, NULL, NULL);
g_assert (g_input_stream_read_all (G_INPUT_STREAM (stream),
contents, 1024, &bytes,
NULL, NULL));
newline = strchr (contents, '\n');
curi = g_strndup (contents, newline - contents);
uriv = g_strsplit (curi, " ", 2);
uri = yelp_uri_new (uriv[0]);
if (uriv[1] != NULL)
uri = yelp_uri_new_relative (uri, uriv[1]);
g_strfreev (uriv);
yelp_uri_resolve (uri);
while (!yelp_uri_is_resolved (uri))
while (g_main_context_pending (NULL))
g_main_context_iteration (NULL, FALSE);
outstream = g_memory_output_stream_new (NULL, 0, g_realloc, g_free);
print_uri (curi, uri, outstream);
out = (gchar *) g_memory_output_stream_get_data (G_MEMORY_OUTPUT_STREAM (outstream));
g_free (curi);
g_assert (!strncmp (out, contents, bytes));
}
static int
run_all_tests (int argc, char **argv)
{
GFile *dir, *file;
GFileInfo *info;
GFileEnumerator *children;
GList *list = NULL;
dir = g_file_new_for_path ("uri");
children = g_file_enumerate_children (dir,
G_FILE_ATTRIBUTE_STANDARD_NAME,
0, NULL, NULL);
while ((info = g_file_enumerator_next_file (children, NULL, NULL))) {
const gchar *name = g_file_info_get_attribute_byte_string (info,
G_FILE_ATTRIBUTE_STANDARD_NAME);
if (!g_str_has_suffix (name, ".test"))
continue;
list = g_list_insert_sorted (list, (gchar *) name, (GCompareFunc) strcmp);
}
while (list) {
gchar *test_id = g_strconcat ("/", list->data, NULL);
file = g_file_get_child (dir, list->data);
g_test_add_data_func (test_id, file, run_test);
g_free (test_id);
list = g_list_delete_link (list, list);
}
return g_test_run ();
}
static void
uri_resolved (YelpUri *uri, gchar *orig)
{
GOutputStream *stream = g_unix_output_stream_new (1, FALSE);
print_uri (orig, uri, stream);
g_object_unref (uri);
g_main_loop_quit (loop);
}
int
main (int argc, char **argv)
{
YelpUri *parent = NULL;
YelpUri *uri = NULL;
g_log_set_always_fatal (G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL);
if (argc < 2) {
g_test_init (&argc, &argv, NULL);
return run_all_tests (argc, argv);
}
else {
if (argc > 2) {
parent = yelp_uri_new (argv[1]);
uri = yelp_uri_new_relative (parent, argv[2]);
} else {
uri = yelp_uri_new (argv[1]);
}
if (uri) {
gchar *orig;
/* We leak orig if argc > 2. I don't care. */
if (argc > 2)
orig = g_strconcat (argv[1], " ", argv[2], NULL);
else
orig = argv[1];
g_signal_connect (uri, "resolved", G_CALLBACK (uri_resolved), orig);
yelp_uri_resolve (uri);
}
if (parent) {
g_object_unref (parent);
}
}
loop = g_main_loop_new (NULL, FALSE);
g_main_loop_run (loop);
return 0;
}