/*
 * File: test.c
 * Author: Andrew Salo
 * Date: 16.03.03
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
     
#define TESTS 50
#define TESTPATH "tests/"
#define DP_ALG "./dp"
#define DP_EPS "3"
#define SIMP_ALG "./simple"


/* Прототипы функций */
int test_dp (const char *);
int test_simp (const char *);
int write_table (const char *);


/*
 * int main (int, char**) ---
 * главная процедура
 */
int main (int argc, char **argv)
{
  int i, ln;
  char test[30];

  strcpy (test, TESTPATH "test\0");
  ln = strlen (test);

  for (i = 0; i < TESTS; i++)
    {
      /* Номер теста */
      sprintf (&test[ln], "%d\0", i);

      /* Тестировать алгоритм Дугласа-Пекера */
      if (test_dp (test) == -1)
	{
	  perror ("test_dp");
	  exit (1);
	}

      /* Тестировать усовершенствованный алгоритм */
      if (test_simp (test) == -1)
	{
	  perror ("test_simp");
	  exit (1);
	}

      /* Рисовать таблицу */
      if (write_table (test) == -1)
	exit (1);

      /* Ждать нажатия клавиши */
      getchar ();
    }

  exit (0);
}


/*
 * int test_dp (const char*) ---
 * тестирование алгоритма Дугласа-Пекера
 */
int test_dp (const char* test)
{
  int status;
  pid_t pid;

  char test_out[30];

  /* Имя выходного файла */
  strcpy (test_out, test);
  strcat (test_out, ".dp\0");

  switch (pid = fork ())
    {
    case -1:
      /* Неудача */
      return -1;
      break;

    case 0:
      /* Потомок */
      execlp (DP_ALG, DP_ALG, test, test_out, DP_EPS, NULL);
      _exit (1);
      break;

    default:
      /* Родитель */
      if (waitpid (pid, &status, 0) != pid)
	return -1;

      break;
    }

  return 0;
}


/*
 * int test_simp (const char*) ---
 * тестирование усовершенствованного алгоритма
 */
int test_simp (const char* test)
{
  int status;
  pid_t pid;

  char test_out[30];

  /* Имя выходного файла */
  strcpy (test_out, test);
  strcat (test_out, ".simp\0");

  switch (pid = fork ())
    {
    case -1:
      /* Неудача */
      return -1;
      break;

    case 0:
      /* Потомок */
      execlp (SIMP_ALG, SIMP_ALG, test, test_out, NULL);
      _exit (1);
      break;

    default:
      /* Родитель */
      if (waitpid (pid, &status, 0) != pid)
	return -1;

      break;
    }

  return 0;
}


/*
 * write_table (const char *) ---
 * вывод таблицы на экран
 */
int write_table (const char* test)
{
  FILE *in_pts, *dp_pts, *simp_pts;
  char test_in[30], test_dp[30], test_simp[30];
  int in_flag = 0, dp_flag = 0, simp_flag = 0;
  float x, y;

  /* Имена файлов */
  strcpy (test_in, test);
  strcat (test_in, ".in\0");

  strcpy (test_dp, test);
  strcat (test_dp, ".dp\0");

  strcpy (test_simp, test);
  strcat (test_simp, ".simp\0");

  /* Открыть файлы */
  if ((in_pts = fopen (test_in, "r")) == NULL)
    {
      perror (test_in);
      return -1;
    }

  if ((dp_pts = fopen (test_dp, "r")) == NULL)
    {
      perror (test_dp);
      fclose (in_pts);
      return -1;
    }

  if ((simp_pts = fopen (test_simp, "r")) == NULL)
    {
      perror (test_simp);
      fclose (in_pts);
      fclose (dp_pts);
      return -1;
    }

  /* Заголовок */
  fprintf (stdout, "\nTest: %s\n", test);

  fprintf (stdout, "--------------------------+-------------"
	   "-------------+--------------------------\n"
	   "      Initial points      |"
	   "      Douglas-Peucker     |"
	   "         Modified         \n"
	   "--------------------------+-------------"
	   "-------------+--------------------------\n");
  /* Вывод на экран точек */
  while ((in_flag * dp_flag * simp_flag) != 1)
    {
      /* Файл с исходными точками */
      if (!in_flag)
	{
	  fscanf (in_pts, "%f %f", &x, &y);

	  if (feof (in_pts))
	    {
	      in_flag = 1;
	      fprintf (stdout, "\t\t\t  |");
	    }
	  else
	    fprintf (stdout, "  %10.3f  %10.3f  |", x, y);
	}
      else
	fprintf (stdout, "\t\t\t  |");

      /* Файл с точками, полученными по алгоритму
	 Дугласа - Пекера */
      if (!dp_flag)
	{
	  fscanf (dp_pts, "%f %f", &x, &y);

	  if (feof (dp_pts))
	    {
	      dp_flag = 1;
	      fprintf (stdout, "\t\t\t     |");
	    }
	  else
	    fprintf (stdout, "  %10.3f  %10.3f  |", x, y);
	}
      else
	fprintf (stdout, "\t\t\t     |");

      /* Файл с точками, полученными по
	 усовершенствованному алгоритму */
      if (!simp_flag)
	{
	  fscanf (simp_pts, "%f %f", &x, &y);

	  if (feof (simp_pts))
	    {
	      simp_flag = 1;
	      fprintf (stdout, "\t\t\t  \n");
	    }
	  else
	    fprintf (stdout, "  %10.3f  %10.3f  \n", x, y);
	}
      else
	fprintf (stdout, "\t\t\t  \n");
    }

  fprintf (stdout, "--------------------------+-------------"
	   "-------------+--------------------------\n");

  /* Закрыть файлы */
  fclose (in_pts);
  fclose (dp_pts);
  fclose (simp_pts);

  return 0;
}
