apicompatanamdw/bcdrivers/os/ossrv/glib/tests/option-test.c
author shrivatsa
Thu, 22 Apr 2010 17:15:08 +0530
changeset 2 0cb2248d0edc
child 8 d8ef7a232001
permissions -rw-r--r--
New BC drivers added are - Phonebook, Speed dial utility control, MMS Client MTM, Plugin Bio control, Organizer, Startup List Management, Flash viewer framework, Network Status, Profile engine wrapper, Drm helper, OMA Drm CAF Agent, SIP, Connection settings & UI, BLID, Landmarks, Send UI, Media Fetch, WebServices, Cellular services, Device services, Graphics, Kernel and OSSrv, XML Services, Multimedia.

/*
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/
#include <glib.h>
#include <string.h>

#ifdef SYMBIAN
#include <glib_global.h>
#include "mrt2_glib2_test.h"
#endif /*SYMBIAN*/
int error_test1_int;
char *error_test2_string;
gboolean error_test3_boolean;

int arg_test1_int;
gchar *arg_test2_string;
gchar *arg_test3_filename;

gchar *callback_test1_string;
gboolean callback_test2_int;

gchar *callback_test_optional_string;
gboolean callback_test_optional_boolean;

gchar **array_test1_array;

gboolean ignore_test1_boolean;
gboolean ignore_test2_boolean;
gchar *ignore_test3_string;

gchar **
split_string (const char *str, int *argc)
{
  gchar **argv;
  int len;
  
  argv = g_strsplit (str, " ", 0);

  for (len = 0; argv[len] != NULL; len++);

  if (argc)
    *argc = len;
    
  return argv;
}

gchar *
join_stringv (int argc, char **argv)
{
  int i;
  GString *str;

  str = g_string_new (NULL);

  for (i = 0; i < argc; i++)
    {
      g_string_append (str, argv[i]);

      if (i < argc - 1)
	g_string_append_c (str, ' ');
    }

  return g_string_free (str, FALSE);
}

/* Performs a shallow copy */
char **
copy_stringv (char **argv, int argc)
{
  return g_memdup (argv, sizeof (char *) * (argc + 1));
}


static gboolean
error_test1_pre_parse (GOptionContext *context,
		       GOptionGroup   *group,
		       gpointer	       data,
		       GError        **error)
{
  g_assert (error_test1_int == 0x12345678);

  return TRUE;
}

static gboolean
error_test1_post_parse (GOptionContext *context,
			GOptionGroup   *group,
			gpointer	  data,
			GError        **error)
{
  g_assert (error_test1_int == 20);

  /* Set an error in the post hook */
  g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, "");

  return FALSE;
}

void
error_test1 (void)
{
  GOptionContext *context;
  gboolean retval;
  GError *error = NULL;
  gchar **argv;
  int argc;
  GOptionGroup *main_group;
#ifndef SYMBIAN
  GOptionEntry entries [] =
    { { "test", 0, 0, G_OPTION_ARG_INT, &error_test1_int, NULL, NULL },
      { NULL } };
#else    

  GOptionEntry entries [2];
 
  entries[0].long_name = "test";
  entries[0].short_name = 0;
  entries[0].flags = 0;
  entries[0].arg = G_OPTION_ARG_INT;
  entries[0].arg_data = (gpointer)&error_test1_int;
  entries[0].description =  NULL;
  entries[0].arg_description = NULL;
      
  entries[1].long_name = NULL;
  entries[1].short_name = 0;
  entries[1].arg_data = NULL;
  entries[1].description =  NULL;
  entries[1].arg_description = NULL;
#endif
  
  context = g_option_context_new (NULL);
  g_option_context_add_main_entries (context, entries, NULL);

  /* Set pre and post parse hooks */
  main_group = g_option_context_get_main_group (context);
  g_option_group_set_parse_hooks (main_group,
				  error_test1_pre_parse, error_test1_post_parse);
  
  /* Now try parsing */
  argv = split_string ("program --test 20", &argc);

  retval = g_option_context_parse (context, &argc, &argv, &error);
  g_assert (retval == FALSE);

  /* On failure, values should be reset */
  g_assert (error_test1_int == 0x12345678);
  
  g_strfreev (argv);
  g_option_context_free (context);
  
}

static gboolean
error_test2_pre_parse (GOptionContext *context,
		       GOptionGroup   *group,
		       gpointer	  data,
		       GError        **error)
{
  g_assert (strcmp (error_test2_string, "foo") == 0);

  return TRUE;
}

static gboolean
error_test2_post_parse (GOptionContext *context,
			GOptionGroup   *group,
			gpointer	  data,
			GError        **error)
{
  g_assert (strcmp (error_test2_string, "bar") == 0);

  /* Set an error in the post hook */
  g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, "");

  return FALSE;
}

void
error_test2 (void)
{
  GOptionContext *context;
  gboolean retval;
  GError *error = NULL;
  gchar **argv;
  int argc;
  GOptionGroup *main_group;
#ifndef SYMBIAN
  GOptionEntry entries [] =
    { { "test", 0, 0, G_OPTION_ARG_STRING, &error_test2_string, NULL, NULL },
      { NULL } };
#else      
  GOptionEntry entries [2];
  
  entries[0].long_name = "test";
  entries[0].short_name = 0;
  entries[0].flags = 0;
  entries[0].arg = G_OPTION_ARG_STRING;
  entries[0].arg_data = (gpointer)&error_test2_string;
  entries[0].description =  NULL;
  entries[0].arg_description = NULL;
      
  entries[1].long_name = NULL;
  entries[1].short_name = 0;
  entries[1].arg_data = NULL;
  entries[1].description =  NULL;
  entries[1].arg_description = NULL;
#endif  


  context = g_option_context_new (NULL);
  g_option_context_add_main_entries (context, entries, NULL);

  /* Set pre and post parse hooks */
  main_group = g_option_context_get_main_group (context);
  g_option_group_set_parse_hooks (main_group,
				  error_test2_pre_parse, error_test2_post_parse);
  
  /* Now try parsing */
  argv = split_string ("program --test bar", &argc);
  retval = g_option_context_parse (context, &argc, &argv, &error);

  g_error_free (error);
  g_assert (retval == FALSE);

  g_assert (strcmp (error_test2_string, "foo") == 0);
  
  g_strfreev (argv);
  g_option_context_free (context);
}

static gboolean
error_test3_pre_parse (GOptionContext *context,
		       GOptionGroup   *group,
		       gpointer	  data,
		       GError        **error)
{
  g_assert (!error_test3_boolean);

  return TRUE;
}

static gboolean
error_test3_post_parse (GOptionContext *context,
			GOptionGroup   *group,
			gpointer	  data,
			GError        **error)
{
  g_assert (error_test3_boolean);

  /* Set an error in the post hook */
  g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, "");

  return FALSE;
}

void
error_test3 (void)
{
  GOptionContext *context;
  gboolean retval;
  GError *error = NULL;
  gchar **argv;
  int argc;
  GOptionGroup *main_group;
 
#ifndef SYMBIAN 
  GOptionEntry entries [] =
    { { "test", 0, 0, G_OPTION_ARG_NONE, &error_test3_boolean, NULL, NULL },
      { NULL } };
#else      
  GOptionEntry entries [2];
  
  entries[0].long_name = "test";
  entries[0].short_name = 0;
  entries[0].flags = 0;
  entries[0].arg = G_OPTION_ARG_NONE;
  entries[0].arg_data = (gpointer)&error_test3_boolean;
  entries[0].description =  NULL;
  entries[0].arg_description = NULL;
      
  entries[1].long_name = NULL;
  entries[1].short_name = 0;
  entries[1].arg_data = NULL;
  entries[1].description =  NULL;
  entries[1].arg_description = NULL;
#endif
      

  context = g_option_context_new (NULL);
  g_option_context_add_main_entries (context, entries, NULL);

  /* Set pre and post parse hooks */
  main_group = g_option_context_get_main_group (context);
  g_option_group_set_parse_hooks (main_group,
				  error_test3_pre_parse, error_test3_post_parse);
  
  /* Now try parsing */
  argv = split_string ("program --test", &argc);
  retval = g_option_context_parse (context, &argc, &argv, &error);

  g_error_free (error);
  g_assert (retval == FALSE);

  g_assert (!error_test3_boolean);
  
  g_strfreev (argv);
  g_option_context_free (context);
}

void
arg_test1 (void)
{
  GOptionContext *context;
  gboolean retval;
  GError *error = NULL;
  gchar **argv;
  int argc;
#ifndef SYMBIAN 
  GOptionEntry entries [] =
    { { "test", 0, 0, G_OPTION_ARG_INT, &arg_test1_int, NULL, NULL },
      { NULL } };
#else      
  GOptionEntry entries [2];
  
  entries[0].long_name = "test";
  entries[0].short_name = 0;
  entries[0].flags = 0;
  entries[0].arg = G_OPTION_ARG_INT;
  entries[0].arg_data = (gpointer)&arg_test1_int;
  entries[0].description =  NULL;
  entries[0].arg_description = NULL;
      
  entries[1].long_name = NULL;
  entries[1].short_name = 0;
  entries[1].arg_data = NULL;
  entries[1].description =  NULL;
  entries[1].arg_description = NULL;
#endif      

  context = g_option_context_new (NULL);
  g_option_context_add_main_entries (context, entries, NULL);

  /* Now try parsing */
  argv = split_string ("program --test 20 --test 30", &argc);

  retval = g_option_context_parse (context, &argc, &argv, &error);
  g_assert (retval);

  /* Last arg specified is the one that should be stored */
  g_assert (arg_test1_int == 30);

  g_strfreev (argv);
  g_option_context_free (context);
}

void
arg_test2 (void)
{
  GOptionContext *context;
  gboolean retval;
  GError *error = NULL;
  gchar **argv;
  int argc;
#ifndef SYMBIAN  
  GOptionEntry entries [] =
    { { "test", 0, 0, G_OPTION_ARG_STRING, &arg_test2_string, NULL, NULL },
      { NULL } };
#else      
  GOptionEntry entries [2];
  
  entries[0].long_name = "test";
  entries[0].short_name = 0;
  entries[0].flags = 0;
  entries[0].arg = G_OPTION_ARG_STRING;
  entries[0].arg_data = (gpointer)&arg_test2_string;
  entries[0].description =  NULL;
  entries[0].arg_description = NULL;
      
  entries[1].long_name = NULL;
  entries[1].short_name = 0;
  entries[1].arg_data = NULL;
  entries[1].description =  NULL;
  entries[1].arg_description = NULL;
#endif      
  
  context = g_option_context_new (NULL);
  g_option_context_add_main_entries (context, entries, NULL);

  /* Now try parsing */
  argv = split_string ("program --test foo --test bar", &argc);
  
  retval = g_option_context_parse (context, &argc, &argv, &error);
  g_assert (retval);

  /* Last arg specified is the one that should be stored */
  g_assert (strcmp (arg_test2_string, "bar") == 0);

  g_free (arg_test2_string);
  
  g_strfreev (argv);
  g_option_context_free (context);
}

void
arg_test3 (void)
{
  GOptionContext *context;
  gboolean retval;
  GError *error = NULL;
  gchar **argv;
  int argc;
#ifndef SYMBIAN  
  GOptionEntry entries [] =
    { { "test", 0, 0, G_OPTION_ARG_FILENAME, &arg_test3_filename, NULL, NULL },
      { NULL } };
#else      
  GOptionEntry entries [2];
  
  entries[0].long_name = "test";
  entries[0].short_name = 0;
  entries[0].flags = 0;
  entries[0].arg = G_OPTION_ARG_FILENAME;
  entries[0].arg_data = (gpointer)&arg_test3_filename;
  entries[0].description =  NULL;
  entries[0].arg_description = NULL;
      
  entries[1].long_name = NULL;
  entries[1].short_name = 0;
  entries[1].arg_data = NULL;
  entries[1].description =  NULL;
  entries[1].arg_description = NULL;
#endif      
  
  context = g_option_context_new (NULL);
  g_option_context_add_main_entries (context, entries, NULL);

  /* Now try parsing */
  argv = split_string ("program --test foo.txt", &argc);
  
  retval = g_option_context_parse (context, &argc, &argv, &error);
  g_assert (retval);

  /* Last arg specified is the one that should be stored */
  g_assert (strcmp (arg_test3_filename, "foo.txt") == 0);

  g_free (arg_test3_filename);
  
  g_strfreev (argv);
  g_option_context_free (context);
}

static gboolean
callback_parse1 (const gchar *option_name, const gchar *value,
		 gpointer data, GError **error)
{
	callback_test1_string = g_strdup (value);
	return TRUE;
}

void
callback_test1 (void)
{
  GOptionContext *context;
  gboolean retval;
  GError *error = NULL;
  gchar **argv;
  int argc;
#ifndef SYMBIAN  
  GOptionEntry entries [] =
    { { "test", 0, 0, G_OPTION_ARG_CALLBACK, callback_parse1, NULL, NULL },
      { NULL } };
#else 
  GOptionEntry entries [2];
  
  entries[0].long_name = "test";
  entries[0].short_name = 0;
  entries[0].flags = 0;
  entries[0].arg = G_OPTION_ARG_CALLBACK;
  entries[0].arg_data = (gpointer)callback_parse1;
  entries[0].description =  NULL;
  entries[0].arg_description = NULL;
      
  entries[1].long_name = NULL;
  entries[1].short_name = 0;
  entries[1].arg_data = NULL;
  entries[1].description =  NULL;
  entries[1].arg_description = NULL;
#endif

  context = g_option_context_new (NULL);
  g_option_context_add_main_entries (context, entries, NULL);

  /* Now try parsing */
  argv = split_string ("program --test foo.txt", &argc);
  
  retval = g_option_context_parse (context, &argc, &argv, &error);
  g_assert (retval);

  g_assert (strcmp (callback_test1_string, "foo.txt") == 0);

  g_free (callback_test1_string);
  
  g_strfreev (argv);
  g_option_context_free (context);
}

static gboolean
callback_parse2 (const gchar *option_name, const gchar *value,
		 gpointer data, GError **error)
{
	callback_test2_int++;
	return TRUE;
}

void
callback_test2 (void)
{
  GOptionContext *context;
  gboolean retval;
  GError *error = NULL;
  gchar **argv;
  int argc;
 
#ifndef SYMBIAN 
  GOptionEntry entries [] =
    { { "test", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, callback_parse2, NULL, NULL },
      { NULL } };
#else      
  GOptionEntry entries [2];
  
  entries[0].long_name = "test";
  entries[0].short_name = 0;
  entries[0].flags = G_OPTION_FLAG_NO_ARG;
  entries[0].arg = G_OPTION_ARG_CALLBACK;
  entries[0].arg_data = (gpointer)callback_parse2;
  entries[0].description =  NULL;
  entries[0].arg_description = NULL;
      
  entries[1].long_name = NULL;
  entries[1].short_name = 0;
  entries[1].arg_data = NULL;
  entries[1].description =  NULL;
  entries[1].arg_description = NULL;
#endif      
  
  context = g_option_context_new (NULL);
  g_option_context_add_main_entries (context, entries, NULL);

  /* Now try parsing */
  argv = split_string ("program --test --test", &argc);
  
  retval = g_option_context_parse (context, &argc, &argv, &error);
  g_assert (retval);

  g_assert (callback_test2_int == 2);
  
  g_strfreev (argv);
  g_option_context_free (context);
}

static gboolean
callback_parse_optional (const gchar *option_name, const gchar *value,
		 gpointer data, GError **error)
{
	callback_test_optional_boolean = TRUE;
	if (value)
		callback_test_optional_string = g_strdup (value);
	else
		callback_test_optional_string = NULL;
	return TRUE;
}

void
callback_test_optional_1 (void)
{
  GOptionContext *context;
  gboolean retval;
  GError *error = NULL;
  gchar **argv;
  int argc;
#ifndef SYMBIAN
  GOptionEntry entries [] =
    { { "test", 0, G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK, 
	callback_parse_optional, NULL, NULL },
      { NULL } };
#else      
  GOptionEntry entries [2];
  
  entries[0].long_name = "test";
  entries[0].short_name = 0;
  entries[0].flags = G_OPTION_FLAG_OPTIONAL_ARG;
  entries[0].arg = G_OPTION_ARG_CALLBACK;
  entries[0].arg_data = (gpointer)callback_parse_optional;
  entries[0].description =  NULL;
  entries[0].arg_description = NULL;
      
  entries[1].long_name = NULL;
  entries[1].short_name = 0;
  entries[1].arg_data = NULL;
  entries[1].description =  NULL;
  entries[1].arg_description = NULL;
#endif      
  
  context = g_option_context_new (NULL);
  g_option_context_add_main_entries (context, entries, NULL);

  /* Now try parsing */
  argv = split_string ("program --test foo.txt", &argc);
  
  retval = g_option_context_parse (context, &argc, &argv, &error);
  g_assert (retval);

  g_assert (strcmp (callback_test_optional_string, "foo.txt") == 0);
  
  g_assert (callback_test_optional_boolean);

  g_free (callback_test_optional_string);
  
  g_strfreev (argv);
  g_option_context_free (context);
}

void
callback_test_optional_2 (void)
{
  GOptionContext *context;
  gboolean retval;
  GError *error = NULL;
  gchar **argv;
  int argc;
#ifndef SYMBIAN  
  GOptionEntry entries [] =
    { { "test", 0, G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK, 
	callback_parse_optional, NULL, NULL },
      { NULL } };
#else      
  GOptionEntry entries [2];
  
  entries[0].long_name = "test";
  entries[0].short_name = 0;
  entries[0].flags = G_OPTION_FLAG_OPTIONAL_ARG;
  entries[0].arg = G_OPTION_ARG_CALLBACK;
  entries[0].arg_data = (gpointer)callback_parse_optional;
  entries[0].description =  NULL;
  entries[0].arg_description = NULL;
      
  entries[1].long_name = NULL;
  entries[1].short_name = 0;
  entries[1].arg_data = NULL;
  entries[1].description =  NULL;
  entries[1].arg_description = NULL;
#endif      
  
  context = g_option_context_new (NULL);
  g_option_context_add_main_entries (context, entries, NULL);

  /* Now try parsing */
  argv = split_string ("program --test", &argc);
  
  retval = g_option_context_parse (context, &argc, &argv, &error);
  g_assert (retval);

  g_assert (callback_test_optional_string == NULL);
  
  g_assert (callback_test_optional_boolean);

  g_free (callback_test_optional_string);
  
  g_strfreev (argv);
  g_option_context_free (context);
}

void
callback_test_optional_3 (void)
{
  GOptionContext *context;
  gboolean retval;
  GError *error = NULL;
  gchar **argv;
  int argc;
#ifndef SYMBIAN  
  GOptionEntry entries [] =
    { { "test", 't', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK, 
	callback_parse_optional, NULL, NULL },
      { NULL } };
#else      
  GOptionEntry entries [2];
  
  entries[0].long_name = "test";
  entries[0].short_name = 't';
  entries[0].flags = G_OPTION_FLAG_OPTIONAL_ARG;
  entries[0].arg = G_OPTION_ARG_CALLBACK;
  entries[0].arg_data = (gpointer)callback_parse_optional;
  entries[0].description =  NULL;
  entries[0].arg_description = NULL;
      
  entries[1].long_name = NULL;
  entries[1].short_name = 0;
  entries[1].arg_data = NULL;
  entries[1].description =  NULL;
  entries[1].arg_description = NULL;
#endif      
  
  context = g_option_context_new (NULL);
  g_option_context_add_main_entries (context, entries, NULL);

  /* Now try parsing */
  argv = split_string ("program -t foo.txt", &argc);
  
  retval = g_option_context_parse (context, &argc, &argv, &error);
  g_assert (retval);

  g_assert (strcmp (callback_test_optional_string, "foo.txt") == 0);
  
  g_assert (callback_test_optional_boolean);

  g_free (callback_test_optional_string);
  
  g_strfreev (argv);
  g_option_context_free (context);
}


void
callback_test_optional_4 (void)
{
  GOptionContext *context;
  gboolean retval;
  GError *error = NULL;
  gchar **argv;
  int argc;
#ifndef SYMBIAN  
  GOptionEntry entries [] =
    { { "test", 't', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK, 
	callback_parse_optional, NULL, NULL },
      { NULL } };
#else      
  GOptionEntry entries [2];
  
  entries[0].long_name = "test";
  entries[0].short_name = 't';
  entries[0].flags = G_OPTION_FLAG_OPTIONAL_ARG;
  entries[0].arg = G_OPTION_ARG_CALLBACK;
  entries[0].arg_data = (gpointer)callback_parse_optional;
  entries[0].description =  NULL;
  entries[0].arg_description = NULL;
      
  entries[1].long_name = NULL;
  entries[1].short_name = 0;
  entries[1].arg_data = NULL;
  entries[1].description =  NULL;
  entries[1].arg_description = NULL;
#endif      
  
  context = g_option_context_new (NULL);
  g_option_context_add_main_entries (context, entries, NULL);

  /* Now try parsing */
  argv = split_string ("program -t", &argc);
  
  retval = g_option_context_parse (context, &argc, &argv, &error);
  g_assert (retval);

  g_assert (callback_test_optional_string == NULL);
  
  g_assert (callback_test_optional_boolean);

  g_free (callback_test_optional_string);
  
  g_strfreev (argv);
  g_option_context_free (context);
}

void
callback_test_optional_5 (void)
{
  GOptionContext *context;
  gboolean dummy;
  gboolean retval;
  GError *error = NULL;
  gchar **argv;
  int argc;
#ifndef SYMBIAN  
  GOptionEntry entries [] =
    { { "dummy", 'd', 0, G_OPTION_ARG_NONE, &dummy, NULL },
      { "test", 't', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK, 
	callback_parse_optional, NULL, NULL },
      { NULL } };
#else
  GOptionEntry entries [3];
  
  entries[0].long_name = "dummy";
  entries[0].short_name = 'd';
  entries[0].flags = 0;
  entries[0].arg = G_OPTION_ARG_NONE;
  entries[0].arg_data = (gpointer)&dummy;
  entries[0].description =  NULL;
    
  entries[1].long_name = "test";
  entries[1].short_name = 't';
  entries[1].flags = G_OPTION_FLAG_OPTIONAL_ARG;
  entries[1].arg = G_OPTION_ARG_CALLBACK;
  entries[1].arg_data = (gpointer)callback_parse_optional;
  entries[1].description =  NULL;
  entries[1].arg_description = NULL;
  
      
  entries[2].long_name = NULL;
  entries[2].short_name = 0;
  entries[2].arg_data = NULL;
  entries[2].description =  NULL;
  entries[2].arg_description = NULL;
#endif      
  
  context = g_option_context_new (NULL);
  g_option_context_add_main_entries (context, entries, NULL);

  /* Now try parsing */
  argv = split_string ("program --test --dummy", &argc);
  
  retval = g_option_context_parse (context, &argc, &argv, &error);
  g_assert (retval);

  g_assert (callback_test_optional_string == NULL);
  
  g_assert (callback_test_optional_boolean);

  g_free (callback_test_optional_string);
  
  g_strfreev (argv);
  g_option_context_free (context);
}

void
callback_test_optional_6 (void)
{
  GOptionContext *context;
  gboolean dummy;
  gboolean retval;
  GError *error = NULL;
  gchar **argv;
  int argc;
#ifndef SYMBIAN  
  GOptionEntry entries [] =
    { { "dummy", 'd', 0, G_OPTION_ARG_NONE, &dummy, NULL },
      { "test", 't', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK, 
	callback_parse_optional, NULL, NULL },
      { NULL } };
#else           
  GOptionEntry entries [3];
  
  entries[0].long_name = "dummy";
  entries[0].short_name = 'd';
  entries[0].flags = 0;
  entries[0].arg = G_OPTION_ARG_NONE;
  entries[0].arg_data = (gpointer)&dummy;
  entries[0].description =  NULL;
    
  entries[1].long_name = "test";
  entries[1].short_name = 't';
  entries[1].flags = G_OPTION_FLAG_OPTIONAL_ARG;
  entries[1].arg = G_OPTION_ARG_CALLBACK;
  entries[1].arg_data = (gpointer)callback_parse_optional;
  entries[1].description =  NULL;
  entries[1].arg_description = NULL;
  
      
  entries[2].long_name = NULL;
  entries[2].short_name = 0;
  entries[2].arg_data = NULL;
  entries[2].description =  NULL;
  entries[2].arg_description = NULL;
#endif      
      
  
  context = g_option_context_new (NULL);
  g_option_context_add_main_entries (context, entries, NULL);

  /* Now try parsing */
  argv = split_string ("program -t -d", &argc);
  
  retval = g_option_context_parse (context, &argc, &argv, &error);
  g_assert (retval);

  g_assert (callback_test_optional_string == NULL);
  
  g_assert (callback_test_optional_boolean);

  g_free (callback_test_optional_string);
  
  g_strfreev (argv);
  g_option_context_free (context);
}

void
callback_test_optional_7 (void)
{
  GOptionContext *context;
  gboolean dummy;
  gboolean retval;
  GError *error = NULL;
  gchar **argv;
  int argc;
#ifndef SYMBIAN  
  GOptionEntry entries [] =
    { { "dummy", 'd', 0, G_OPTION_ARG_NONE, &dummy, NULL },
      { "test", 't', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK, 
	callback_parse_optional, NULL, NULL },
      { NULL } };
#else      
   GOptionEntry entries [3];
  
  entries[0].long_name = "dummy";
  entries[0].short_name = 'd';
  entries[0].flags = 0;
  entries[0].arg = G_OPTION_ARG_NONE;
  entries[0].arg_data = (gpointer)&dummy;
  entries[0].description =  NULL;
    
  entries[1].long_name = "test";
  entries[1].short_name = 't';
  entries[1].flags = G_OPTION_FLAG_OPTIONAL_ARG;
  entries[1].arg = G_OPTION_ARG_CALLBACK;
  entries[1].arg_data = (gpointer)callback_parse_optional;
  entries[1].description =  NULL;
  entries[1].arg_description = NULL;
  
      
  entries[2].long_name = NULL;
  entries[2].short_name = 0;
  entries[2].arg_data = NULL;
  entries[2].description =  NULL;
  entries[2].arg_description = NULL;
#endif     
     
  
  context = g_option_context_new (NULL);
  g_option_context_add_main_entries (context, entries, NULL);

  /* Now try parsing */
  argv = split_string ("program -td", &argc);
  
  retval = g_option_context_parse (context, &argc, &argv, &error);
  g_assert (retval);

  g_assert (callback_test_optional_string == NULL);
  
  g_assert (callback_test_optional_boolean);

  g_free (callback_test_optional_string);
  
  g_strfreev (argv);
  g_option_context_free (context);
}

void
callback_test_optional_8 (void)
{
  GOptionContext *context;
  gboolean dummy;
  gboolean retval;
  GError *error = NULL;
  gchar **argv;
  int argc;
#ifndef SYMBIAN  
  GOptionEntry entries [] =
    { { "dummy", 'd', 0, G_OPTION_ARG_NONE, &dummy, NULL },
      { "test", 't', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK, 
	callback_parse_optional, NULL, NULL },
      { NULL } };
#else      
   GOptionEntry entries [3];
  
  entries[0].long_name = "dummy";
  entries[0].short_name = 'd';
  entries[0].flags = 0;
  entries[0].arg = G_OPTION_ARG_NONE;
  entries[0].arg_data = (gpointer)&dummy;
  entries[0].description =  NULL;
    
  entries[1].long_name = "test";
  entries[1].short_name = 't';
  entries[1].flags = G_OPTION_FLAG_OPTIONAL_ARG;
  entries[1].arg = G_OPTION_ARG_CALLBACK;
  entries[1].arg_data = (gpointer)callback_parse_optional;
  entries[1].description =  NULL;
  entries[1].arg_description = NULL;
  
      
  entries[2].long_name = NULL;
  entries[2].short_name = 0;
  entries[2].arg_data = NULL;
  entries[2].description =  NULL;
  entries[2].arg_description = NULL;
#endif      
  
  context = g_option_context_new (NULL);
  g_option_context_add_main_entries (context, entries, NULL);

  /* Now try parsing */
  argv = split_string ("program -dt foo.txt", &argc);
  
  retval = g_option_context_parse (context, &argc, &argv, &error);
  g_assert (retval);

  g_assert (callback_test_optional_string);
  
  g_assert (callback_test_optional_boolean);

  g_free (callback_test_optional_string);
  
  g_strfreev (argv);
  g_option_context_free (context);
}

void
ignore_test1 (void)
{
  GOptionContext *context;
  gboolean retval;
  GError *error = NULL;
  gchar **argv, **argv_copy;
  int argc;
  gchar *arg;
#ifndef SYMBIAN  
  GOptionEntry entries [] =
    { { "test", 0, 0, G_OPTION_ARG_NONE, &ignore_test1_boolean, NULL, NULL },
      { NULL } };
#else          
  GOptionEntry entries [2];
  
  entries[0].long_name = "test";
  entries[0].short_name = 0;
  entries[0].flags = 0;
  entries[0].arg = G_OPTION_ARG_NONE;
  entries[0].arg_data = (gpointer)&ignore_test1_boolean;
  entries[0].description =  NULL;
  entries[0].arg_description = NULL;
      
  entries[1].long_name = NULL;
  entries[1].short_name = 0;
  entries[1].arg_data = NULL;
  entries[1].description =  NULL;
  entries[1].arg_description = NULL;
#endif      

  context = g_option_context_new (NULL);
  g_option_context_set_ignore_unknown_options (context, TRUE);
  g_option_context_add_main_entries (context, entries, NULL);

  /* Now try parsing */
  argv = split_string ("program --test --hello", &argc);
  argv_copy = copy_stringv (argv, argc);
  
  retval = g_option_context_parse (context, &argc, &argv, &error);
  g_assert (retval);

  /* Check array */
  arg = join_stringv (argc, argv);
  g_assert (strcmp (arg, "program --hello") == 0);

  g_free (arg);
  g_strfreev (argv_copy);
  g_free (argv);
  g_option_context_free (context);
}

void
ignore_test2 (void)
{
  GOptionContext *context;
  gboolean retval;
  GError *error = NULL;
  gchar **argv;
  int argc;
  gchar *arg;
#ifndef SYMBIAN  
  GOptionEntry entries [] =
    { { "test", 't', 0, G_OPTION_ARG_NONE, &ignore_test2_boolean, NULL, NULL },
      { NULL } };
#else      
  GOptionEntry entries [2];
  
  entries[0].long_name = "test";
  entries[0].short_name = 't';
  entries[0].flags = 0;
  entries[0].arg = G_OPTION_ARG_NONE;
  entries[0].arg_data = (gpointer)&ignore_test2_boolean;
  entries[0].description =  NULL;
  entries[0].arg_description = NULL;
      
  entries[1].long_name = NULL;
  entries[1].short_name = 0;
  entries[1].arg_data = NULL;
  entries[1].description =  NULL;
  entries[1].arg_description = NULL;
#endif      

  context = g_option_context_new (NULL);
  g_option_context_set_ignore_unknown_options (context, TRUE);
  g_option_context_add_main_entries (context, entries, NULL);

  /* Now try parsing */
  argv = split_string ("program -test", &argc);
  
  retval = g_option_context_parse (context, &argc, &argv, &error);
  g_assert (retval);

  /* Check array */
  arg = join_stringv (argc, argv);
  g_assert (strcmp (arg, "program -es") == 0);

  g_free (arg);
  g_strfreev (argv);
  g_option_context_free (context);
}

void
ignore_test3 (void)
{
  GOptionContext *context;
  gboolean retval;
  GError *error = NULL;
  gchar **argv, **argv_copy;
  int argc;
  gchar *arg;
#ifndef SYMBAIN  
  GOptionEntry entries [] =
    { { "test", 0, 0, G_OPTION_ARG_STRING, &ignore_test3_string, NULL, NULL },
      { NULL } };
#else      
  GOptionEntry entries [2];
  
  entries[0].long_name = "test";
  entries[0].short_name = 0;
  entries[0].flags = 0;
  entries[0].arg = G_OPTION_ARG_STRING;
  entries[0].arg_data = (gpointer)&ignore_test3_string;
  entries[0].description =  NULL;
  entries[0].arg_description = NULL;
      
  entries[1].long_name = NULL;
  entries[1].short_name = 0;
  entries[1].arg_data = NULL;
  entries[1].description =  NULL;
  entries[1].arg_description = NULL;
#endif      

  context = g_option_context_new (NULL);
  g_option_context_set_ignore_unknown_options (context, TRUE);
  g_option_context_add_main_entries (context, entries, NULL);

  /* Now try parsing */
  argv = split_string ("program --test foo --hello", &argc);
  argv_copy = copy_stringv (argv, argc);
  
  retval = g_option_context_parse (context, &argc, &argv, &error);
  g_assert (retval);

  /* Check array */
  arg = join_stringv (argc, argv);
  g_assert (strcmp (arg, "program --hello") == 0);

  g_assert (strcmp (ignore_test3_string, "foo") == 0);
  g_free (ignore_test3_string);

  g_free (arg);
  g_strfreev (argv_copy);
  g_free (argv);
  g_option_context_free (context);
}

void
array_test1 (void)
{
  GOptionContext *context;
  gboolean retval;
  GError *error = NULL;
  gchar **argv;
  int argc;
#ifndef SYMBIAN  
  GOptionEntry entries [] =
    { { "test", 0, 0, G_OPTION_ARG_STRING_ARRAY, &array_test1_array, NULL, NULL },
      { NULL } };
#else     
  GOptionEntry entries [2];
  
  entries[0].long_name = "test";
  entries[0].short_name = 0;
  entries[0].flags = 0;
  entries[0].arg = G_OPTION_ARG_STRING_ARRAY;
  entries[0].arg_data = (gpointer)&array_test1_array;
  entries[0].description =  NULL;
  entries[0].arg_description = NULL;
      
  entries[1].long_name = NULL;
  entries[1].short_name = 0;
  entries[1].arg_data = NULL;
  entries[1].description =  NULL;
  entries[1].arg_description = NULL;
#endif      
        
  context = g_option_context_new (NULL);
  g_option_context_add_main_entries (context, entries, NULL);

  /* Now try parsing */
  argv = split_string ("program --test foo --test bar", &argc);
  
  retval = g_option_context_parse (context, &argc, &argv, &error);
  g_assert (retval);

  /* Check array */
  g_assert (strcmp (array_test1_array[0], "foo") == 0);
  g_assert (strcmp (array_test1_array[1], "bar") == 0);
  g_assert (array_test1_array[2] == NULL);

  g_strfreev (array_test1_array);
  
  g_strfreev (argv);
  g_option_context_free (context);
}

void
add_test1 (void)
{
  GOptionContext *context;

#ifndef SYMBIAN
  GOptionEntry entries1 [] =
    { { "test1", 0, 0, G_OPTION_ARG_STRING_ARRAY, NULL, NULL, NULL },
      { NULL } };
  GOptionEntry entries2 [] =
    { { "test2", 0, 0, G_OPTION_ARG_STRING_ARRAY, NULL, NULL, NULL },
      { NULL } };
#else      
  GOptionEntry entries1 [2];
  GOptionEntry entries2 [2];
  
  entries1[0].long_name = "test1";
  entries1[0].short_name = 0;
  entries1[0].flags = 0;
  entries1[0].arg = G_OPTION_ARG_STRING_ARRAY;
  entries1[0].arg_data = NULL;
  entries1[0].description =  NULL;
  entries1[0].arg_description = NULL;
      
  entries1[1].long_name = NULL;
  entries1[1].short_name = 0;
  entries1[1].arg_data = NULL;
  entries1[1].description =  NULL;
  entries1[1].arg_description = NULL;
      
  
  entries2[0].long_name = "test2";
  entries2[0].short_name = 0;
  entries2[0].flags = 0;
  entries2[0].arg = G_OPTION_ARG_STRING_ARRAY;
  entries2[0].arg_data = NULL;
  entries2[0].description =  NULL;
  entries2[0].arg_description = NULL;
      
  entries2[1].long_name = NULL;
  entries2[1].short_name = 0;
  entries2[1].arg_data = NULL;
  entries2[1].description =  NULL;
  entries2[1].arg_description = NULL;
#endif

  context = g_option_context_new (NULL);
  g_option_context_add_main_entries (context, entries1, NULL);
  g_option_context_add_main_entries (context, entries2, NULL);

  g_option_context_free (context);
}

void
empty_test1 (void)
{
  GOptionContext *context;
  GOptionEntry entries [] =
    { { NULL } };

  g_set_prgname (NULL);

  context = g_option_context_new (NULL);

  g_option_context_add_main_entries (context, entries, NULL);
  
  g_option_context_parse (context, NULL, NULL, NULL);

  g_assert (strcmp (g_get_prgname (), "<unknown>") == 0);
  
  g_option_context_free (context);
}

void
empty_test2 (void)
{
  GOptionContext *context;

  context = g_option_context_new (NULL);
  g_option_context_parse (context, NULL, NULL, NULL);
  
  g_option_context_free (context);
}

void
empty_test3 (void)
{
  GOptionContext *context;
  gint argc;
  gchar **argv;

  argc = 0;
  argv = NULL;

  context = g_option_context_new (NULL);
  g_option_context_parse (context, &argc, &argv, NULL);
  
  g_option_context_free (context);
}

/* check that non-option arguments are left in argv by default */
void
rest_test1 (void)
{
  GOptionContext *context;
  gboolean retval;
  GError *error = NULL;
  gchar **argv;
  int argc;
#ifndef SYMBIAN  
  GOptionEntry entries [] = { 
      { "test", 0, 0, G_OPTION_ARG_NONE, &ignore_test1_boolean, NULL, NULL },
      { NULL } 
  };
#else  
  GOptionEntry entries [2];
  
  entries[0].long_name = "test";
  entries[0].short_name = 0;
  entries[0].flags = 0;
  entries[0].arg = G_OPTION_ARG_NONE;
  entries[0].arg_data = (gpointer)&ignore_test1_boolean;
  entries[0].description =  NULL;
  entries[0].arg_description = NULL;
      
  entries[1].long_name = NULL;
  entries[1].short_name = 0;
  entries[1].arg_data = NULL;
  entries[1].description =  NULL;
  entries[1].arg_description = NULL;
#endif
        
  context = g_option_context_new (NULL);
  g_option_context_add_main_entries (context, entries, NULL);

  /* Now try parsing */
  argv = split_string ("program foo --test bar", &argc);
  
  retval = g_option_context_parse (context, &argc, &argv, &error);
  g_assert (retval);

  /* Check array */
  g_assert (ignore_test1_boolean);
  g_assert (strcmp (argv[0], "program") == 0);
  g_assert (strcmp (argv[1], "foo") == 0);
  g_assert (strcmp (argv[2], "bar") == 0);
  g_assert (argv[3] == NULL);

  g_strfreev (argv);
  g_option_context_free (context);
}

/* check that -- works */
void
rest_test2 (void)
{
  GOptionContext *context;
  gboolean retval;
  GError *error = NULL;
  gchar **argv;
  int argc;
#ifndef SYMBIAN  
  GOptionEntry entries [] = { 
      { "test", 0, 0, G_OPTION_ARG_NONE, &ignore_test1_boolean, NULL, NULL },
      { NULL } 
  };
#else  
  GOptionEntry entries [2];
  
  entries[0].long_name = "test";
  entries[0].short_name = 0;
  entries[0].flags = 0;
  entries[0].arg = G_OPTION_ARG_NONE;
  entries[0].arg_data = (gpointer)&ignore_test1_boolean;
  entries[0].description =  NULL;
  entries[0].arg_description = NULL;
      
  entries[1].long_name = NULL;
  entries[1].short_name = 0;
  entries[1].arg_data = NULL;
  entries[1].description =  NULL;
  entries[1].arg_description = NULL;
#endif
        
  context = g_option_context_new (NULL);
  g_option_context_add_main_entries (context, entries, NULL);

  /* Now try parsing */
  argv = split_string ("program foo --test -- -bar", &argc);
  
  retval = g_option_context_parse (context, &argc, &argv, &error);
  g_assert (retval);

  /* Check array */
  g_assert (ignore_test1_boolean);
  g_assert (strcmp (argv[0], "program") == 0);
  g_assert (strcmp (argv[1], "foo") == 0);
  g_assert (strcmp (argv[2], "--") == 0);
  g_assert (strcmp (argv[3], "-bar") == 0);
  g_assert (argv[4] == NULL);

  g_strfreev (argv);
  g_option_context_free (context);
}

/* check that -- stripping works */
void
rest_test2a (void)
{
  GOptionContext *context;
  gboolean retval;
  GError *error = NULL;
  gchar **argv;
  int argc;
#ifndef SYMBIAN  
  GOptionEntry entries [] = { 
      { "test", 0, 0, G_OPTION_ARG_NONE, &ignore_test1_boolean, NULL, NULL },
      { NULL } 
  };
#else 
  GOptionEntry entries [2];
  
  entries[0].long_name = "test";
  entries[0].short_name = 0;
  entries[0].flags = 0;
  entries[0].arg = G_OPTION_ARG_NONE;
  entries[0].arg_data = (gpointer)&ignore_test1_boolean;
  entries[0].description =  NULL;
  entries[0].arg_description = NULL;
      
  entries[1].long_name = NULL;
  entries[1].short_name = 0;
  entries[1].arg_data = NULL;
  entries[1].description =  NULL;
  entries[1].arg_description = NULL;
#endif
        
  context = g_option_context_new (NULL);
  g_option_context_add_main_entries (context, entries, NULL);

  /* Now try parsing */
  argv = split_string ("program foo --test -- bar", &argc);
  
  retval = g_option_context_parse (context, &argc, &argv, &error);
  g_assert (retval);

  /* Check array */
  g_assert (ignore_test1_boolean);
  g_assert (strcmp (argv[0], "program") == 0);
  g_assert (strcmp (argv[1], "foo") == 0);
  g_assert (strcmp (argv[2], "bar") == 0);
  g_assert (argv[3] == NULL);

  g_strfreev (argv);
  g_option_context_free (context);
}

void
rest_test2b (void)
{
  GOptionContext *context;
  gboolean retval;
  GError *error = NULL;
  gchar **argv;
  int argc;
#ifndef SYMBIAN  
  GOptionEntry entries [] = { 
      { "test", 0, 0, G_OPTION_ARG_NONE, &ignore_test1_boolean, NULL, NULL },
      { NULL } 
  };
#else  
  GOptionEntry entries [2];
  
  entries[0].long_name = "test";
  entries[0].short_name = 0;
  entries[0].flags = 0;
  entries[0].arg = G_OPTION_ARG_NONE;
  entries[0].arg_data = (gpointer)&ignore_test1_boolean;
  entries[0].description =  NULL;
  entries[0].arg_description = NULL;
      
  entries[1].long_name = NULL;
  entries[1].short_name = 0;
  entries[1].arg_data = NULL;
  entries[1].description =  NULL;
  entries[1].arg_description = NULL;
#endif
        
  context = g_option_context_new (NULL);
  g_option_context_set_ignore_unknown_options (context, TRUE);
  g_option_context_add_main_entries (context, entries, NULL);

  /* Now try parsing */
  argv = split_string ("program foo --test -bar --", &argc);
  
  retval = g_option_context_parse (context, &argc, &argv, &error);
  g_assert (retval);

  /* Check array */
  g_assert (ignore_test1_boolean);
  g_assert (strcmp (argv[0], "program") == 0);
  g_assert (strcmp (argv[1], "foo") == 0);
  g_assert (strcmp (argv[2], "-bar") == 0);
  g_assert (argv[3] == NULL);

  g_strfreev (argv);
  g_option_context_free (context);
}

void
rest_test2c (void)
{
  GOptionContext *context;
  gboolean retval;
  GError *error = NULL;
  gchar **argv;
  int argc;
#ifndef SYMBIAN  
  GOptionEntry entries [] = { 
      { "test", 0, 0, G_OPTION_ARG_NONE, &ignore_test1_boolean, NULL, NULL },
      { NULL } 
  };
#else  
  GOptionEntry entries [2];
  
  entries[0].long_name = "test";
  entries[0].short_name = 0;
  entries[0].flags = 0;
  entries[0].arg = G_OPTION_ARG_NONE;
  entries[0].arg_data = (gpointer)&ignore_test1_boolean;
  entries[0].description =  NULL;
  entries[0].arg_description = NULL;
      
  entries[1].long_name = NULL;
  entries[1].short_name = 0;
  entries[1].arg_data = NULL;
  entries[1].description =  NULL;
  entries[1].arg_description = NULL;
#endif
        
  context = g_option_context_new (NULL);
  g_option_context_add_main_entries (context, entries, NULL);

  /* Now try parsing */
  argv = split_string ("program --test foo -- bar", &argc);
  
  retval = g_option_context_parse (context, &argc, &argv, &error);
  g_assert (retval);

  /* Check array */
  g_assert (ignore_test1_boolean);
  g_assert (strcmp (argv[0], "program") == 0);
  g_assert (strcmp (argv[1], "foo") == 0);
  g_assert (strcmp (argv[2], "bar") == 0);
  g_assert (argv[3] == NULL);

  g_strfreev (argv);
  g_option_context_free (context);
}

void
rest_test2d (void)
{
  GOptionContext *context;
  gboolean retval;
  GError *error = NULL;
  gchar **argv;
  int argc;
#ifndef SYMBIAN  
  GOptionEntry entries [] = { 
      { "test", 0, 0, G_OPTION_ARG_NONE, &ignore_test1_boolean, NULL, NULL },
      { NULL } 
  };
#else  
  GOptionEntry entries [2];
  
  entries[0].long_name = "test";
  entries[0].short_name = 0;
  entries[0].flags = 0;
  entries[0].arg = G_OPTION_ARG_NONE;
  entries[0].arg_data = (gpointer)&ignore_test1_boolean;
  entries[0].description =  NULL;
  entries[0].arg_description = NULL;
      
  entries[1].long_name = NULL;
  entries[1].short_name = 0;
  entries[1].arg_data = NULL;
  entries[1].description =  NULL;
  entries[1].arg_description = NULL;
#endif
        
  context = g_option_context_new (NULL);
  g_option_context_add_main_entries (context, entries, NULL);

  /* Now try parsing */
  argv = split_string ("program --test -- -bar", &argc);
  
  retval = g_option_context_parse (context, &argc, &argv, &error);
  g_assert (retval);

  /* Check array */
  g_assert (ignore_test1_boolean);
  g_assert (strcmp (argv[0], "program") == 0);
  g_assert (strcmp (argv[1], "--") == 0);
  g_assert (strcmp (argv[2], "-bar") == 0);
  g_assert (argv[3] == NULL);

  g_strfreev (argv);
  g_option_context_free (context);
}


/* check that G_OPTION_REMAINING collects non-option arguments */
void
rest_test3 (void)
{
  GOptionContext *context;
  gboolean retval;
  GError *error = NULL;
  gchar **argv;
  int argc;
#ifndef SYMBIAN  
  GOptionEntry entries [] = { 
      { "test", 0, 0, G_OPTION_ARG_NONE, &ignore_test1_boolean, NULL, NULL },
      { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &array_test1_array, NULL, NULL },
      { NULL } 
  };
#else  
  GOptionEntry entries [3];
  
  entries[0].long_name = "test";
  entries[0].short_name = 0;
  entries[0].flags = 0;
  entries[0].arg = G_OPTION_ARG_NONE;
  entries[0].arg_data = (gpointer)&ignore_test1_boolean;
  entries[0].description =  NULL;
  entries[0].arg_description = NULL;
      
      
  entries[1].long_name = G_OPTION_REMAINING;
  entries[1].short_name = 0;
  entries[1].flags = 0;
  entries[1].arg = G_OPTION_ARG_STRING_ARRAY;
  entries[1].arg_data = (gpointer)&array_test1_array;
  entries[1].description =  NULL;
  entries[1].arg_description = NULL;

  entries[2].long_name = NULL;
  entries[2].short_name = 0;
  entries[2].arg_data = NULL;
  entries[2].description =  NULL;
  entries[2].arg_description = NULL;
#endif
        
  context = g_option_context_new (NULL);
  g_option_context_add_main_entries (context, entries, NULL);

  /* Now try parsing */
  argv = split_string ("program foo --test bar", &argc);
  
  retval = g_option_context_parse (context, &argc, &argv, &error);
  g_assert (retval);

  /* Check array */
  g_assert (ignore_test1_boolean);
  g_assert (strcmp (array_test1_array[0], "foo") == 0);
  g_assert (strcmp (array_test1_array[1], "bar") == 0);
  g_assert (array_test1_array[2] == NULL);

  g_strfreev (array_test1_array);
  
  g_strfreev (argv);
  g_option_context_free (context);
}


/* check that G_OPTION_REMAINING and -- work together */
void
rest_test4 (void)
{
  GOptionContext *context;
  gboolean retval;
  GError *error = NULL;
  gchar **argv;
  int argc;
#ifndef SYMBIAN  
  GOptionEntry entries [] = { 
      { "test", 0, 0, G_OPTION_ARG_NONE, &ignore_test1_boolean, NULL, NULL },
      { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &array_test1_array, NULL, NULL },
      { NULL } 
  };
#else  
  GOptionEntry entries [3];
  
  entries[0].long_name = "test";
  entries[0].short_name = 0;
  entries[0].flags = 0;
  entries[0].arg = G_OPTION_ARG_NONE;
  entries[0].arg_data = (gpointer)&ignore_test1_boolean;
  entries[0].description =  NULL;
  entries[0].arg_description = NULL;
      
      
  entries[1].long_name = G_OPTION_REMAINING;
  entries[1].short_name = 0;
  entries[1].flags = 0;
  entries[1].arg = G_OPTION_ARG_STRING_ARRAY;
  entries[1].arg_data = (gpointer)&array_test1_array;
  entries[1].description =  NULL;
  entries[1].arg_description = NULL;

  entries[2].long_name = NULL;
  entries[2].short_name = 0;
  entries[2].arg_data = NULL;
  entries[2].description =  NULL;
  entries[2].arg_description = NULL;
#endif
        
  context = g_option_context_new (NULL);
  g_option_context_add_main_entries (context, entries, NULL);

  /* Now try parsing */
  argv = split_string ("program foo --test -- -bar", &argc);
  
  retval = g_option_context_parse (context, &argc, &argv, &error);
  g_assert (retval);

  /* Check array */
  g_assert (ignore_test1_boolean);
  g_assert (strcmp (array_test1_array[0], "foo") == 0);
  g_assert (strcmp (array_test1_array[1], "-bar") == 0);
  g_assert (array_test1_array[2] == NULL);

  g_strfreev (array_test1_array);
  
  g_strfreev (argv);
  g_option_context_free (context);
}

/* test that G_OPTION_REMAINING works with G_OPTION_ARG_FILENAME_ARRAY */
void
rest_test5 (void)
{
  GOptionContext *context;
  gboolean retval;
  GError *error = NULL;
  gchar **argv;
  int argc;
  
#ifndef SYMBIAN  
  GOptionEntry entries [] = { 
      { "test", 0, 0, G_OPTION_ARG_NONE, &ignore_test1_boolean, NULL, NULL },
      { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &array_test1_array, NULL, NULL },
      { NULL } 
  };
#else  
  GOptionEntry entries [3];
  
  entries[0].long_name = "test";
  entries[0].short_name = 0;
  entries[0].flags = 0;
  entries[0].arg = G_OPTION_ARG_NONE;
  entries[0].arg_data = (gpointer)&ignore_test1_boolean;
  entries[0].description =  NULL;
  entries[0].arg_description = NULL;
      
      
  entries[1].long_name = G_OPTION_REMAINING;
  entries[1].short_name = 0;
  entries[1].flags = 0;
  entries[1].arg = G_OPTION_ARG_FILENAME_ARRAY;
  entries[1].arg_data = (gpointer)&array_test1_array;
  entries[1].description =  NULL;
  entries[1].arg_description = NULL;

  entries[2].long_name = NULL;
  entries[2].short_name = 0;
  entries[2].arg_data = NULL;
  entries[2].description =  NULL;
  entries[2].arg_description = NULL;
#endif
        
  context = g_option_context_new (NULL);
  g_option_context_add_main_entries (context, entries, NULL);

  /* Now try parsing */
  argv = split_string ("program foo --test bar", &argc);
  
  retval = g_option_context_parse (context, &argc, &argv, &error);
  g_assert (retval);

  /* Check array */
  g_assert (ignore_test1_boolean);
  g_assert (strcmp (array_test1_array[0], "foo") == 0);
  g_assert (strcmp (array_test1_array[1], "bar") == 0);
  g_assert (array_test1_array[2] == NULL);

  g_strfreev (array_test1_array);
  
  g_strfreev (argv);
  g_option_context_free (context);
}

void
unknown_short_test (void)
{
  GOptionContext *context;
  gboolean retval;
  GError *error = NULL;
  gchar **argv;
  int argc;
#ifndef SYMBIAN  
  GOptionEntry entries [] = { { NULL } };
#else
  GOptionEntry entries [1];

  entries[0].long_name = NULL;
  entries[0].short_name = 0;
  entries[0].arg_data = NULL;
  entries[0].description =  NULL;
  entries[0].arg_description = NULL;
#endif

  context = g_option_context_new (NULL);
  g_option_context_add_main_entries (context, entries, NULL);

  /* Now try parsing */
  argv = split_string ("program -0", &argc);

  retval = g_option_context_parse (context, &argc, &argv, &error);
  g_assert (!retval);

  g_strfreev (argv);
  g_option_context_free (context);
}

/* test that lone dashes are treated as non-options */
void lonely_dash_test (void)
{
  GOptionContext *context;
  gboolean retval;
  GError *error = NULL;
  gchar **argv;
  int argc;

  context = g_option_context_new (NULL);

  /* Now try parsing */
  argv = split_string ("program -", &argc);

  retval = g_option_context_parse (context, &argc, &argv, &error);

  g_assert (retval);

  g_assert (argv[1] && strcmp (argv[1], "-") == 0);

  g_strfreev (argv);
  g_option_context_free (context);
}

void
missing_arg_test (void)
{
  GOptionContext *context;
  gboolean retval;
  GError *error = NULL;
  gchar **argv;
  int argc;
  gchar *arg = NULL;
#ifndef SYMBIAN  
  GOptionEntry entries [] =
    { { "test", 't', 0, G_OPTION_ARG_STRING, &arg, NULL, NULL },
      { NULL } };
#else      
  GOptionEntry entries [2];
  
  entries[0].long_name = "test";
  entries[0].short_name = 't';
  entries[0].flags = 0;
  entries[0].arg = G_OPTION_ARG_STRING;
  entries[0].arg_data = (gpointer)&arg;
  entries[0].description =  NULL;
  entries[0].arg_description = NULL;
      
  entries[1].long_name = NULL;
  entries[1].short_name = 0;
  entries[1].arg_data = NULL;
  entries[1].description =  NULL;
  entries[1].arg_description = NULL;
#endif

  context = g_option_context_new (NULL);
  g_option_context_add_main_entries (context, entries, NULL);

  /* Now try parsing */
  argv = split_string ("program --test", &argc);

  retval = g_option_context_parse (context, &argc, &argv, &error);
  g_assert (retval == FALSE);
  g_clear_error (&error);

  g_strfreev (argv);

  /* Try parsing again */
  argv = split_string ("program --t", &argc);

  retval = g_option_context_parse (context, &argc, &argv, &error);
  g_assert (retval == FALSE);

  g_strfreev (argv);
  g_option_context_free (context);
}

int
main (int argc, char **argv)
{
  #ifdef SYMBIAN
  g_log_set_handler (NULL,  G_LOG_FLAG_FATAL| G_LOG_FLAG_RECURSION | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG, &mrtLogHandler, NULL);
  g_set_print_handler(mrtPrintHandler);
  #endif /*SYMBIAN*/
  /* Test that restoration on failure works */
  error_test1_int = 0x12345678;
  error_test1 ();
  error_test2_string = "foo";
  error_test2 ();
  error_test3_boolean = FALSE;
  error_test3 ();
  
  /* Test that special argument parsing works */
  arg_test1 ();
  arg_test2 ();
  arg_test3 ();

  /* Test string arrays */
  array_test1 ();

  /* Test callback args */
  callback_test1 ();
  callback_test2 ();

  /* Test optional arg flag for callback */
  callback_test_optional_1 ();
  callback_test_optional_2 ();
  callback_test_optional_3 ();
  callback_test_optional_4 ();
  callback_test_optional_5 ();
  callback_test_optional_6 ();
  callback_test_optional_7 ();
  callback_test_optional_8 ();
  
  /* Test ignoring options */
  ignore_test1 ();
  ignore_test2 ();
  ignore_test3 ();

  add_test1 ();

  /* Test parsing empty args */
  empty_test1 ();
  empty_test2 ();
  empty_test3 ();

  /* Test handling of rest args */
  rest_test1 ();
  rest_test2 ();
  rest_test2a ();
  rest_test2b ();
  rest_test2c ();
  rest_test2d ();
  rest_test3 ();
  rest_test4 ();
  rest_test5 ();

  /* test for bug 166609 */
  unknown_short_test ();

  /* test for bug 168008 */
  lonely_dash_test ();

  /* test for bug 305576 */
  missing_arg_test ();

#ifdef SYMBIAN
  testResultXml("option-test");
#endif /* EMULATOR */
  return 0;
}