/* fft/test.c
 * 
 * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or (at
 * your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 */

#include <config.h>
#include <string.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <float.h>

#include <gsl/gsl_complex.h>
#include <gsl/gsl_errno.h>
#include <gsl/gsl_dft_complex.h>
#include <gsl/gsl_fft_complex.h>
#include <gsl/gsl_fft_complex_float.h>
#include <gsl/gsl_fft_real.h>
#include <gsl/gsl_fft_real_float.h>
#include <gsl/gsl_fft_halfcomplex.h>
#include <gsl/gsl_fft_halfcomplex_float.h>
#include <gsl/gsl_ieee_utils.h>
#include <gsl/gsl_test.h>

void my_error_handler (const char *reason, const char *file,
                       int line, int err);

#include "complex_internal.h"

/* Usage: test [n]
   Exercise the fft routines for length n. By default n runs from 1 to 100.
   The exit status indicates success or failure. */

#define BASE_DOUBLE
#include "templates_on.h"
#include "compare_source.c"
#include "bitreverse.c"
#include "test_complex_source.c"
#include "test_real_source.c"
#include "test_trap_source.c"
#include "templates_off.h"
#undef  BASE_DOUBLE

#define BASE_FLOAT
#include "templates_on.h"
#include "compare_source.c"
#include "bitreverse.c"
#include "test_complex_source.c"
#include "test_real_source.c"
#include "test_trap_source.c"
#include "templates_off.h"
#undef  BASE_FLOAT

int
main (int argc, char *argv[])
{
  size_t i;
  size_t start = 1, end = 99;
  size_t stride ;
  size_t n = 0;

  gsl_ieee_env_setup ();

  if (argc == 2) 
    n = strtol (argv[1], NULL, 0);
 
  if (n)
    {
      start = n ;
      end = n ;
    }


  for (i = 1 ; i <= end ; i *= 2) 
    {
      if (i >= start) 
        {
          for (stride = 1 ; stride < 4 ; stride++)
            {
              test_complex_bitreverse_order (stride, i) ;
              test_complex_radix2 (stride, i) ;
              test_real_bitreverse_order (stride, i) ;
              test_real_radix2 (stride, i) ;
            }
        }
    }

  for (i = start ; i <= end ; i++) 
    {
      for (stride = 1 ; stride < 4 ; stride++)
        {
          test_complex_func (stride, i) ;
          test_complex_float_func (stride, i) ;
          test_real_func (stride, i) ;
          test_real_float_func (stride, i) ;
        }
    }

  gsl_set_error_handler (&my_error_handler);
  test_trap () ;
  test_float_trap () ;

  exit (gsl_test_summary ());
}


void
my_error_handler (const char *reason, const char *file, int line, int err)
{
  if (0) printf ("(caught [%s:%d: %s (%d)])\n", file, line, reason, err) ;
}
