int main( int argc, char* argv[] ) {
	Dictionary* dictionary;
	Stream* stream;
	
	MPI_Init( &argc, &argv );
	BaseFoundation_Init( &argc, &argv );
	BaseIO_Init( &argc, &argv );
	stream = Journal_Register (Info_Type, "myStream");
	Stream_RedirectFile( stream, "dictionaryOutput.dat" );

	dictionary = Dictionary_New();

	Dictionary_ReadAllParamFromCommandLine( dictionary, argc, argv );
	Print( dictionary, stream );
	
	Stg_Class_Delete( dictionary );
	
	BaseIO_Finalise();
	BaseFoundation_Finalise();
	MPI_Finalize();
	
	return EXIT_SUCCESS;
}
void DictionarySuite_TestReadAllParamFromCommandLine( DictionarySuiteData* data  ) {
   int                        argc;
   char**                     argv;
   char**                     expectedKeys;
   Dictionary_Entry_Value**   expectedVals;
   Index                      ii;
   Dictionary_Entry_Value*    tmpStruct=NULL;
   Dictionary_Entry_Value*    tmpStruct2=NULL;
   Dictionary_Entry_Value*    tmpList=NULL;
   Index                      numExp = 7;

   argc = 16;
   argv = Memory_Alloc_Array_Unnamed( char*, argc );
   expectedVals = Memory_Alloc_Array_Unnamed( Dictionary_Entry_Value*, numExp );
   expectedKeys = Memory_Alloc_Array_Unnamed( char*, numExp );

   /* Now fill in our mock command line, and create the expected values to test
    *  against along the way */   
   Stg_asprintf( &argv[0], "./testStGermain");
   Stg_asprintf( &argv[1], "-param=hey");
   Stg_asprintf( &argv[2], "--option");
   Stg_asprintf( &argv[3], "--output-dir=");
   Stg_asprintf( &expectedKeys[0], "output-dir" );

   expectedVals[0] = Dictionary_Entry_Value_FromString( "" );
   Stg_asprintf( &argv[4], "--Ra=1.0e4");
   Stg_asprintf( &expectedKeys[1], "Ra" );

   expectedVals[1] = Dictionary_Entry_Value_FromDouble( 1.0e4 );
   Stg_asprintf( &argv[5], "--foo.bar=5");
   Stg_asprintf( &expectedKeys[2], "foo" );

   expectedVals[2] = Dictionary_Entry_Value_NewStruct();
   Dictionary_Entry_Value_AddMember( expectedVals[2], (Dictionary_Entry_Key)"bar", Dictionary_Entry_Value_FromDouble( 5 )  );
   Stg_asprintf( &expectedKeys[3], "vpac" );

   expectedVals[3] = Dictionary_Entry_Value_NewStruct();
   Dictionary_Entry_Value_AddMember( expectedVals[3], (Dictionary_Entry_Key)"csd", tmpStruct = Dictionary_Entry_Value_NewStruct()  );
     Stg_asprintf( &argv[7], "--foo.bot=7");
   Dictionary_Entry_Value_AddMember( expectedVals[2], (Dictionary_Entry_Key)"bot", Dictionary_Entry_Value_FromDouble( 7 )  );
   Stg_asprintf( &argv[8], "--sports[]=hockey");
   Stg_asprintf( &expectedKeys[4], "sports" );

   expectedVals[4] = Dictionary_Entry_Value_NewList();
   Dictionary_Entry_Value_AddElement( expectedVals[4], Dictionary_Entry_Value_FromString( "hockey" ) );
   Stg_asprintf( &argv[9], "--sports[]=chess");
   /* This should be overwritten by next entry, so ignore */
   Stg_asprintf( &argv[10], "--sports[1]=tennis");
   Dictionary_Entry_Value_AddElement( expectedVals[4], Dictionary_Entry_Value_FromString( "tennis" ) );
   Stg_asprintf( &argv[11], "--sles[].name=pressure");
   Stg_asprintf( &expectedKeys[5], "sles" );

   expectedVals[5] = Dictionary_Entry_Value_NewList();
   Dictionary_Entry_Value_AddElement( expectedVals[5], tmpStruct = Dictionary_Entry_Value_NewStruct() );
   Dictionary_Entry_Value_AddMember( tmpStruct, (Dictionary_Entry_Key)"name", Dictionary_Entry_Value_FromString( "pressure" )  );
   Stg_asprintf( &argv[12], "--sles[].name=temperature");
   Dictionary_Entry_Value_AddElement( expectedVals[5], tmpStruct2 = Dictionary_Entry_Value_NewStruct() );
   Dictionary_Entry_Value_AddMember( tmpStruct2, (Dictionary_Entry_Key)"name", Dictionary_Entry_Value_FromString( "temperature" )  );
   Stg_asprintf( &argv[13], "--sles[0].solver=mg");
   Dictionary_Entry_Value_AddMember( tmpStruct, (Dictionary_Entry_Key)"solver", Dictionary_Entry_Value_FromString( "mg" )  );
   Stg_asprintf( &argv[14], "--sles[1].solver=direct");
   Dictionary_Entry_Value_AddMember( tmpStruct2, (Dictionary_Entry_Key)"solver", Dictionary_Entry_Value_FromString( "direct" )  );
   Stg_asprintf( &argv[15], "--some.crazy[].shit=here");
   Stg_asprintf( &expectedKeys[6], "some" );

   expectedVals[6] = Dictionary_Entry_Value_NewStruct();
   Dictionary_Entry_Value_AddMember( expectedVals[6], (Dictionary_Entry_Key)"crazy", tmpList = Dictionary_Entry_Value_NewList()  );
   Dictionary_Entry_Value_AddElement( tmpList, tmpStruct = Dictionary_Entry_Value_NewStruct() );
   Dictionary_Entry_Value_AddMember( tmpStruct, (Dictionary_Entry_Key)"shit", Dictionary_Entry_Value_FromString( "here" )  );

   Dictionary_ReadAllParamFromCommandLine( data->dict, argc, argv );

   for (ii=0; ii < numExp; ii++) {
      pcu_check_true( Dictionary_Entry_Compare( data->dict->entryPtr[ii], expectedKeys[ii]));
      pcu_check_true( Dictionary_Entry_Value_Compare( expectedVals[ii], data->dict->entryPtr[ii]->value ));
   }

   for (ii=0; ii < argc; ii++) {
      Memory_Free( argv[ii] );
   }
   Memory_Free( argv );

   for (ii=0; ii < numExp; ii++) {
      Memory_Free( expectedKeys[ii] );
      Memory_Free( expectedVals[ii] );
   }
   Memory_Free( expectedKeys );
   Memory_Free( expectedVals );
}