#include <stdio.h>
#include <unistd.h>

#include "elf.h"


gchar* tests[] = 
{
  /* Newlines */
#if 0
  "FILE name=\"val\n\0ue\"\n",
  NULL,
#endif
  "\0",
  "FILE",
  "FILE\n",
  "FILE\nFILE",
  "FILE\nFILE\n",
  "\n\n",
  "  FILE\nFI\n",
  "FILE\n= = = \n",
  "FILE\n= \"= = \n",
  "FILE\n\"= \"= = \n",
  "FILE\n\"=\" \"=\\\" = \n",

  /* Quotes and spacing */
  "FILE name=\"",
  "FILE name=\"\"",
  "FILE name=\" ",

  "FILE name=\"value\"",
  "FILE name=value\"",
  "FILE name=\"value",
  "FILE name=value",

  "FILE name =\"value\"",
  "FILE name =value\"",
  "FILE name =\"value",
  "FILE name =value",

  "FILE name= \"value\"",
  "FILE name= value\"",
  "FILE name= \"value",
  "FILE name= value",

  "FILE name = \"value\"",
  "FILE name = value\"",
  "FILE name = \"value",
  "FILE name = value",

  /* EOF's */
  "FILE name=\"va\0lue\"",
  "FILE name=va\0lue\"",
  "FILE name=\"va\0lue",
  "FILE name=val\0ue",

  /* Newlines */
  "FILE name=\"val\nue\"",
  "FILE name=v\nalue\"",
  "FILE name=\"val\nue",
  "FILE name=va\nlue",

  /* Quotes and multiple lines */
  "FILE name=\"\nFILE",
  "FILE name=\"\"\nFILE",
  "FILE name=\" \nFILE",
  "FILE name=\"\nFILE\n",
  "FILE name=\"\"\nFILE\n",
  "FILE name=\" \nFILE\n",

  /* ******************** */

  /* Two attributes */

  "FILE name2=\"value\" name=\"value\"",
  "FILE name2=\"value\" name=value\"",
  "FILE name2=\"value\" name=\"value",
  "FILE name2=\"value\" name=value",

  "FILE name2=\"value\" name =\"value\"",
  "FILE name2= \"value\" name =value\"",
  "FILE name2 = \"value\" name =\"value",
  "FILE name2 = \"value\" name =value",

  "FILE name2=value name= \"value\"",
  "FILE name2=\"value name= value\"",
  "FILE name2=value\" name= \"value",
  "FILE name2=\"value\" name= value",

  /* Two attributes and two nodes */

  "FILE name2=\"value\" name=\"value\""		"\n"	  "FILE name2=\"value\" name=\"value\"",
  "FILE name2=\"value\" name=value\""		"\n"	  "FILE name2=\"value\" name=\"value\"",
  "FILE name2=\"value\" name=\"value"		"\n"	  "FILE name2=\"value\" name=\"value\"",
  "FILE name2=\"value\" name=value"		"\n"	  "FILE name2=\"value\" name=\"value\"",

  "FILE name2=\"value\" name=\"value\""		"\n"	  "FILE name2=\"value\" name=value\"",
  "FILE name2=\"value\" name=value\""		"\n"	  "FILE name2=\"value\" name=value\"",
  "FILE name2=\"value\" name=\"value"		"\n"	  "FILE name2=\"value\" name=value\"",
  "FILE name2=\"value\" name=value"		"\n"	  "FILE name2=\"value\" name=value\"",

  "FILE name2=\"value\" name=\"value\""		"\n"	  "FILE name2=\"value\" name=\"value",
  "FILE name2=\"value\" name=value\""		"\n"	  "FILE name2=\"value\" name=\"value",
  "FILE name2=\"value\" name=\"value"		"\n"	  "FILE name2=\"value\" name=\"value",
  "FILE name2=\"value\" name=value"		"\n"	  "FILE name2=\"value\" name=\"value",

  "FILE name2=\"value\" name=\"value\""		"\n"	  "FILE name2=\"value\" name=value",
  "FILE name2=\"value\" name=value\""		"\n"	  "FILE name2=\"value\" name=value",
  "FILE name2=\"value\" name=\"value"		"\n"	  "FILE name2=\"value\" name=value",
  "FILE name2=\"value\" name=value"		"\n"	  "FILE name2=\"value\" name=value",


  /* Two attributes and two nodes with early EOF's */

  "FILE name2=\"value\" name=\"value\""		"\n"	  "FILE name2=\"val\0ue\" name=\"value\"",
  "FILE name2=\"value\" name=value\""		"\n"	  "FILE name2=\"val\0ue\" name=\"value\"",
  "FILE name2=\"value\" name=\"value"		"\n"	  "FILE name2=\"val\0ue\" name=\"value\"",
  "FILE name2=\"value\" name=value"		"\n"	  "FILE name2=\"val\0ue\" name=\"value\"",

  "FILE name2=\"value\" name=\"value\""		"\n"	  "FILE name2=\"val\0ue\" name=value\"",
  "FILE name2=\"value\" name=value\""		"\n"	  "FILE name2=\"val\0ue\" name=value\"",
  "FILE name2=\"value\" name=\"value"		"\n"	  "FILE name2=\"val\0ue\" name=value\"",
  "FILE name2=\"value\" name=value"		"\n"	  "FILE name2=\"val\0ue\" name=value\"",

  "FILE name2=\"value\" name=\"value\""		"\n"	  "FILE name2=\"val\0ue\" name=\"value",
  "FILE name2=\"value\" name=value\""		"\n"	  "FILE name2=\"val\0ue\" name=\"value",
  "FILE name2=\"value\" name=\"value"		"\n"	  "FILE name2=\"val\0ue\" name=\"value",
  "FILE name2=\"value\" name=value"		"\n"	  "FILE name2=\"val\0ue\" name=\"value",

  "FILE name2=\"value\" name=\"value\""		"\n"	  "FILE name2=\"val\0ue\" name=value",
  "FILE name2=\"value\" name=value\""		"\n"	  "FILE name2=\"val\0ue\" name=value",
  "FILE name2=\"value\" name=\"value"		"\n"	  "FILE name2=\"val\0ue\" name=value",
  "FILE name2=\"value\" name=value"		"\n"	  "FILE name2=\"val\0ue\" name=value",

  /* EOFs at various boundries */
  "FILE\0",
  "FILE \0",
  "FILE name2\0", 
  "FILE name2=\0",
  "FILE name2=\"\0",
  "FILE name2=\"value\0",
  "FILE name2=\"value\"\0",
  "FILE name2=\"value\" \0",
  "FILE name2=\"value\" nam\0",
  "FILE name2=\"value\" name\0",
  "FILE name2=\"value\" name \0",
  "FILE name2=\"value\" name =\0",
  "FILE name2=\"value\" name=\0",
  "FILE name2=\"value\" name=value\0",
  "FILE name2=\"value\" name=value \0",
  "FILE name2=\"value\" name=value \n\0",
  "FILE name2=\"value\" name=value name2\0",
  "FILE name2=\"value\" name=value name2 \0",
  "FILE name2=\"value\" name=value name2=\0",
  "FILE name2=\"value\" name=value name2 =\0",
  "FILE name2=\"value\" name=value name2 = \0",
  "FILE name2=\"value\" name=value name2=va\0",
  "FILE name2=\"value\" name=value name2=value \0",
  "FILE name2=\"value\" name=value name2=value\0",
  "FILE name2=\"value\" name=value"		"\n"	  "FI\0",
  "FILE name2=\"value\" name=value"		"\n"	  "FILE \0",
  "FILE name2=\"value\" name=value"		"\n"	  "FILE name2\0",
  "FILE name2=\"value\" name=value"		"\n"	  "FILE name2=\0",
  "FILE name2=\"value\" name=value"		"\n"	  "FILE name2 =\0",
  "FILE name2=\"value\" name=value"		"\n"	  "FILE name2 = \0",
  "FILE name2=\"value\" name=value"		"\n"	  "FILE name2 = \"\0",
  "FILE name2=\"value\" name=value"		"\n"	  "FILE name2=\"va\0",
  "FILE name2=\"value\" name=value"		"\n"	  "FILE name2=\"value\0",
  "FILE name2=\"value\" name=value"		"\n"	  "FILE name2=\"value\"\0",

  /* Quotes */
  "FILE name2=\"va\\\"lue\"",
  "FILE name2=\"\\\"value\"",
  "FILE name2=\"value\\\"\"",
  "FILE name2=\"value\\\"",
  "FILE name2=va\\\"lue\"",
  "FILE name2=\\\"value\"",
  "FILE name2=value\" \\\"",

  NULL

};


/**

   JMP tests

 */
int main()
{
  int i;

  ElfNode* node;
  gchar* buffer;
  gint length;

  for (i = 0; tests[i] != NULL; ++i)
    {
      node = elf_read (tests[i], strlen(tests[i]));
      if (node)
	{
	  elf_write (node, &buffer, &length);
	  elf_delete (node);
	  if (buffer)
	    {
/*  	      g_print ("%d: length (%d)\n", i, length); */
/*  	      fwrite (buffer, length, 1, stdout); */
	      node = elf_read (buffer, length);
	      g_free (buffer);
	      if (!node) 
		exit (1);
	      elf_delete (node);
	    }
	}
/*        else */
/*  	g_print ("%d: Could not read\n", i); */
    }

  for (i = 0; tests[i] != NULL; ++i)
    {
      node = elf_read (tests[i], strlen(tests[i]));
      if (node)
	{
	  elf_write (node, &buffer, &length);
	  elf_delete (node);
	  if (buffer)
	    {
/*  	      g_print ("%d: length (%d)\n", i, length); */
/*  	      fwrite(buffer, length, 1, stdout); */
	      node = elf_read (buffer, length);
	      g_free (buffer);
	      if (!node)
		exit (1);
	      elf_delete (node);
	    }
	}
/*        else */
/*  	g_print ("%d: Could not read\n", i); */
    }

  exit (0);
}



syntax highlighted by Code2HTML, v. 0.9.1