// ============================================================================
//
// Copyright (c) 1997-2001 The CGAL Consortium
//
// This software and related documentation is part of an INTERNAL release
// of the Computational Geometry Algorithms Library (CGAL). It is not
// intended for general use.
//
// ----------------------------------------------------------------------------
//
// release       : $CGAL_Revision: CGAL-I $
// release_date  : $CGAL_Date$
//
// file          : test/Min_annulus_d/test_Min_annulus_d_d.cpp
// package       : $CGAL_Package: Min_annulus_d $
// chapter       : Geometric Optimization
//
// revision      : $Id$
// revision_date : $Date$
//
// author(s)     : Sven Schönherr <sven@inf.ethz.ch>
// coordinator   : ETH Zürich (Bernd Gärtner <gaertner@inf.ethz.ch>)
//
// implementation: test program for Min_annulus (dD traits class)
// ============================================================================

#include <CGAL/Min_annulus_d.h>
#include <CGAL/Min_sphere_annulus_d_traits_d.h>
#include <CGAL/Cartesian_d.h>
#include <CGAL/Homogeneous_d.h>
#ifdef CGAL_USE_GMP
#include <CGAL/Gmpzf.h>
#include <CGAL/Gmpq.h>
typedef CGAL::Gmpzf RT;
typedef CGAL::Gmpq FT;
#else
#include <CGAL/MP_Float.h>
#include <CGAL/Quotient.h>
typedef CGAL::MP_Float RT;
typedef CGAL::Quotient<CGAL::MP_Float> FT;
#endif
#include <vector>
#include <string>
#include <iostream>
#include <sstream>
#include <fstream>

// exact kernels
typedef  CGAL::Cartesian_d<FT>                     CK1;
typedef  CGAL::Min_sphere_annulus_d_traits_d<CK1>        CTraits1;
typedef  CGAL::Homogeneous_d<RT>                   HK1;
typedef  CGAL::Min_sphere_annulus_d_traits_d<HK1>        HTraits1;

// inexact kernels
typedef  CGAL::Cartesian_d<double>                      CK2;
typedef  CGAL::Min_sphere_annulus_d_traits_d<CK2, RT, double> CTraits2;
typedef  CGAL::Homogeneous_d<double>                    HK2;
typedef  CGAL::Min_sphere_annulus_d_traits_d<HK2, RT, double> HTraits2;

#include <CGAL/Random.h>
#include <vector>

#include "test_Min_annulus_d.h"

template <class K, class Traits>
void process ()
{
  // generate point set
  std::vector<typename K::Point_d>  points;
  points.reserve( 100);
  {
    int d = 10;
    std::vector<double>  coords( d+1);
    int  i, j;
    double hom = 2.0;
    for ( i = 0; i < 100; ++i) {
      for (j=0; j<d; ++j)
        coords[ j] = CGAL::get_default_random()( 0x100000);
      coords[d] = hom;
      points.push_back
        (typename K::Point_d(d, coords.begin(), coords.end()));
    }

  // call test function
  CGAL::test_Min_annulus_d(points.begin(), points.end(), Traits(), 0);
  }
}

// main
// ----
int main()
{
  // the following takes forever under Quotient<MP_Float>
#ifdef CGAL_USE_GMP
    process<CK1, CTraits1>();
#endif
    process<HK1, HTraits1>();
    process<CK2, CTraits2>();
    process<HK2, HTraits2>();
}

// ===== EOF ==================================================================
