Revision 496c81a5c6e53a04073e11a4b96c85024abea7a3 authored by Thomas Poulet on 05 June 2019, 12:49:37 UTC, committed by GitHub on 05 June 2019, 12:49:37 UTC
2 parent s e57928f + df76c92
Raw File
EllipseTest.C
/****************************************************************/
/*               DO NOT MODIFY THIS HEADER                      */
/* MOOSE - Multiphysics Object Oriented Simulation Environment  */
/*                                                              */
/*           (c) 2010 Battelle Energy Alliance, LLC             */
/*                   ALL RIGHTS RESERVED                        */
/*                                                              */
/*          Prepared by Battelle Energy Alliance, LLC           */
/*            Under Contract No. DE-AC07-05ID14517              */
/*            With the U. S. Department of Energy               */
/*                                                              */
/*            See COPYRIGHT for full restrictions               */
/****************************************************************/

#include "EllipseTest.h"

CPPUNIT_TEST_SUITE_REGISTRATION(EllipseTest);

EllipseTest::EllipseTest() {}

EllipseTest::~EllipseTest() {}

/**
 * Testing Ellipse::isPointOutsideOfEllipse
 * Case: circle
 */
void
EllipseTest::isPointOutsideOfEllipseTestCircle()
{
  bool r;

  // Case: circle, p_c > 0
  // top right quadrant
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.0,
                                       /*p_c=*/3.0,
                                       /*x=*/2.0,
                                       /*y=*/1.0);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.0,
                                       /*p_c=*/3.0,
                                       /*x=*/2.0,
                                       /*y=*/2.0);
  CPPUNIT_ASSERT(r == true);
  // top left quadrant
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.0,
                                       /*p_c=*/3.0,
                                       /*x=*/-2.0,
                                       /*y=*/1.0);
  CPPUNIT_ASSERT(r == true);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.0,
                                       /*p_c=*/3.0,
                                       /*x=*/0.5,
                                       /*y=*/0.5);
  CPPUNIT_ASSERT(r == false);
  // bottom left quadrant
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.0,
                                       /*p_c=*/3.0,
                                       /*x=*/0.5,
                                       /*y=*/-1.0);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.0,
                                       /*p_c=*/3.0,
                                       /*x=*/0.5,
                                       /*y=*/-1.5);
  CPPUNIT_ASSERT(r == true);
  // bottom right quadrant
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.0,
                                       /*p_c=*/3.0,
                                       /*x=*/2.0,
                                       /*y=*/-1.0);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.0,
                                       /*p_c=*/3.0,
                                       /*x=*/2.0,
                                       /*y=*/-2.0);
  CPPUNIT_ASSERT(r == true);
  // on horizontal axis
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.0,
                                       /*p_c=*/3.0,
                                       /*x=*/-1.0,
                                       /*y=*/0.0);
  CPPUNIT_ASSERT(r == true);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.0,
                                       /*p_c=*/3.0,
                                       /*x=*/0.5,
                                       /*y=*/0.0);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.0,
                                       /*p_c=*/3.0,
                                       /*x=*/2.5,
                                       /*y=*/0.0);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.0,
                                       /*p_c=*/3.0,
                                       /*x=*/3.5,
                                       /*y=*/0.0);
  CPPUNIT_ASSERT(r == true);
  // on ellipse's vertical axis
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.0,
                                       /*p_c=*/3.0,
                                       /*x=*/1.5,
                                       /*y=*/-2.0);
  CPPUNIT_ASSERT(r == true);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.0,
                                       /*p_c=*/3.0,
                                       /*x=*/1.5,
                                       /*y=*/-1.0);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.0,
                                       /*p_c=*/3.0,
                                       /*x=*/1.5,
                                       /*y=*/1.0);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.0,
                                       /*p_c=*/3.0,
                                       /*x=*/1.5,
                                       /*y=*/2.0);
  CPPUNIT_ASSERT(r == true);

  // Case: circle, p_c < 0
  // top left quadrant
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.0,
                                       /*p_c=*/-3.0,
                                       /*x=*/-2.0,
                                       /*y=*/1.0);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.0,
                                       /*p_c=*/-3.0,
                                       /*x=*/-2.0,
                                       /*y=*/2.0);
  CPPUNIT_ASSERT(r == true);
  // top right quadrant
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.0,
                                       /*p_c=*/-3.0,
                                       /*x=*/2.0,
                                       /*y=*/1.0);
  CPPUNIT_ASSERT(r == true);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.0,
                                       /*p_c=*/-3.0,
                                       /*x=*/-0.5,
                                       /*y=*/0.5);
  CPPUNIT_ASSERT(r == false);
  // bottom right quadrant
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.0,
                                       /*p_c=*/-3.0,
                                       /*x=*/-0.5,
                                       /*y=*/-1.0);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.0,
                                       /*p_c=*/-3.0,
                                       /*x=*/-0.5,
                                       /*y=*/-1.5);
  CPPUNIT_ASSERT(r == true);
  // bottom left quadrant
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.0,
                                       /*p_c=*/-3.0,
                                       /*x=*/-2.0,
                                       /*y=*/-1.0);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.0,
                                       /*p_c=*/-3.0,
                                       /*x=*/-2.0,
                                       /*y=*/-2.0);
  CPPUNIT_ASSERT(r == true);
  // on horizontal axis
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.0,
                                       /*p_c=*/-3.0,
                                       /*x=*/1.0,
                                       /*y=*/0.0);
  CPPUNIT_ASSERT(r == true);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.0,
                                       /*p_c=*/-3.0,
                                       /*x=*/-0.5,
                                       /*y=*/0.0);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.0,
                                       /*p_c=*/-3.0,
                                       /*x=*/-2.5,
                                       /*y=*/0.0);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.0,
                                       /*p_c=*/-3.0,
                                       /*x=*/-3.5,
                                       /*y=*/0.0);
  CPPUNIT_ASSERT(r == true);
  // on ellipse's vertical axis
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.0,
                                       /*p_c=*/-3.0,
                                       /*x=*/-1.5,
                                       /*y=*/-2.0);
  CPPUNIT_ASSERT(r == true);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.0,
                                       /*p_c=*/-3.0,
                                       /*x=*/-1.5,
                                       /*y=*/-1.0);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.0,
                                       /*p_c=*/-3.0,
                                       /*x=*/-1.5,
                                       /*y=*/1.0);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.0,
                                       /*p_c=*/-3.0,
                                       /*x=*/-1.5,
                                       /*y=*/2.0);
  CPPUNIT_ASSERT(r == true);
}

/**
 * Testing Ellipse::isPointOutsideOfEllipse
 * Case: ellipse, major axis horizontal
 */
void
EllipseTest::isPointOutsideOfEllipseTestMajorAxisHorizontal()
{
  bool r;

  // Case: ellipse, major axis horizontal, p_c > 0
  // top right quadrant
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/0.5,
                                       /*p_c=*/3.0,
                                       /*x=*/2.0,
                                       /*y=*/0.5);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/0.5,
                                       /*p_c=*/3.0,
                                       /*x=*/2.0,
                                       /*y=*/1.0);
  CPPUNIT_ASSERT(r == true);
  // top left quadrant
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/0.5,
                                       /*p_c=*/3.0,
                                       /*x=*/-2.0,
                                       /*y=*/1.0);
  CPPUNIT_ASSERT(r == true);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/0.5,
                                       /*p_c=*/3.0,
                                       /*x=*/0.5,
                                       /*y=*/0.5);
  CPPUNIT_ASSERT(r == false);
  // bottom left quadrant
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/0.5,
                                       /*p_c=*/3.0,
                                       /*x=*/0.5,
                                       /*y=*/-0.5);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/0.5,
                                       /*p_c=*/3.0,
                                       /*x=*/0.5,
                                       /*y=*/-1.0);
  CPPUNIT_ASSERT(r == true);
  // bottom right quadrant
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/0.5,
                                       /*p_c=*/3.0,
                                       /*x=*/2.0,
                                       /*y=*/-0.5);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/0.5,
                                       /*p_c=*/3.0,
                                       /*x=*/2.0,
                                       /*y=*/-1.0);
  CPPUNIT_ASSERT(r == true);
  // on horizontal axis
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/0.5,
                                       /*p_c=*/3.0,
                                       /*x=*/-1.0,
                                       /*y=*/0.0);
  CPPUNIT_ASSERT(r == true);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/0.5,
                                       /*p_c=*/3.0,
                                       /*x=*/0.5,
                                       /*y=*/0.0);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/0.5,
                                       /*p_c=*/3.0,
                                       /*x=*/2.5,
                                       /*y=*/0.0);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/0.5,
                                       /*p_c=*/3.0,
                                       /*x=*/3.5,
                                       /*y=*/0.0);
  CPPUNIT_ASSERT(r == true);
  // on ellipse's vertical axis
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/0.5,
                                       /*p_c=*/3.0,
                                       /*x=*/1.5,
                                       /*y=*/-2.0);
  CPPUNIT_ASSERT(r == true);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/0.5,
                                       /*p_c=*/3.0,
                                       /*x=*/1.5,
                                       /*y=*/-0.5);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/0.5,
                                       /*p_c=*/3.0,
                                       /*x=*/1.5,
                                       /*y=*/0.5);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/0.5,
                                       /*p_c=*/3.0,
                                       /*x=*/1.5,
                                       /*y=*/2.0);
  CPPUNIT_ASSERT(r == true);

  // Case: ellipse, major axis horizontal, p_c < 0
  // top left quadrant
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/0.5,
                                       /*p_c=*/-3.0,
                                       /*x=*/-2.0,
                                       /*y=*/0.5);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/0.5,
                                       /*p_c=*/-3.0,
                                       /*x=*/-2.0,
                                       /*y=*/1.0);
  CPPUNIT_ASSERT(r == true);
  // top left right
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/0.5,
                                       /*p_c=*/-3.0,
                                       /*x=*/2.0,
                                       /*y=*/1.0);
  CPPUNIT_ASSERT(r == true);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/0.5,
                                       /*p_c=*/-3.0,
                                       /*x=*/-0.5,
                                       /*y=*/0.5);
  CPPUNIT_ASSERT(r == false);
  // bottom right quadrant
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/0.5,
                                       /*p_c=*/-3.0,
                                       /*x=*/-0.5,
                                       /*y=*/-0.5);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/0.5,
                                       /*p_c=*/-3.0,
                                       /*x=*/-0.5,
                                       /*y=*/-1.0);
  CPPUNIT_ASSERT(r == true);
  // bottom left quadrant
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/0.5,
                                       /*p_c=*/-3.0,
                                       /*x=*/-2.0,
                                       /*y=*/-0.5);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/0.5,
                                       /*p_c=*/-3.0,
                                       /*x=*/-2.0,
                                       /*y=*/-1.0);
  CPPUNIT_ASSERT(r == true);
  // on horizontal axis
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/0.5,
                                       /*p_c=*/-3.0,
                                       /*x=*/1.0,
                                       /*y=*/0.0);
  CPPUNIT_ASSERT(r == true);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/0.5,
                                       /*p_c=*/-3.0,
                                       /*x=*/-0.5,
                                       /*y=*/0.0);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/0.5,
                                       /*p_c=*/-3.0,
                                       /*x=*/-2.5,
                                       /*y=*/0.0);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/0.5,
                                       /*p_c=*/-3.0,
                                       /*x=*/-3.5,
                                       /*y=*/0.0);
  CPPUNIT_ASSERT(r == true);
  // on ellipse's vertical axis
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/0.5,
                                       /*p_c=*/-3.0,
                                       /*x=*/-1.5,
                                       /*y=*/-2.0);
  CPPUNIT_ASSERT(r == true);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/0.5,
                                       /*p_c=*/-3.0,
                                       /*x=*/-1.5,
                                       /*y=*/-0.5);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/0.5,
                                       /*p_c=*/-3.0,
                                       /*x=*/-1.5,
                                       /*y=*/0.5);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/0.5,
                                       /*p_c=*/-3.0,
                                       /*x=*/-1.5,
                                       /*y=*/2.0);
  CPPUNIT_ASSERT(r == true);
}

/**
 * Testing Ellipse::isPointOutsideOfEllipse
 * Case: ellipse, major axis vertical
 */
void
EllipseTest::isPointOutsideOfEllipseTestMajorAxisVertical()
{
  bool r;

  // Case: ellipse, major axis vertical, p_c > 0
  // top right quadrant
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.5,
                                       /*p_c=*/3.0,
                                       /*x=*/2.0,
                                       /*y=*/2.0);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.5,
                                       /*p_c=*/3.0,
                                       /*x=*/2.0,
                                       /*y=*/3.0);
  CPPUNIT_ASSERT(r == true);
  // top left quadrant
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.5,
                                       /*p_c=*/3.0,
                                       /*x=*/1.3,
                                       /*y=*/3.0);
  CPPUNIT_ASSERT(r == true);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.5,
                                       /*p_c=*/3.0,
                                       /*x=*/1.3,
                                       /*y=*/2.0);
  CPPUNIT_ASSERT(r == false);
  // bottom left quadrant
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.5,
                                       /*p_c=*/3.0,
                                       /*x=*/1.3,
                                       /*y=*/-2.0);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.5,
                                       /*p_c=*/3.0,
                                       /*x=*/1.3,
                                       /*y=*/-3.0);
  CPPUNIT_ASSERT(r == true);
  // bottom right quadrant
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.5,
                                       /*p_c=*/3.0,
                                       /*x=*/2.0,
                                       /*y=*/-2.0);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.5,
                                       /*p_c=*/3.0,
                                       /*x=*/2.0,
                                       /*y=*/-3.0);
  CPPUNIT_ASSERT(r == true);
  // on horizontal axis
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.5,
                                       /*p_c=*/3.0,
                                       /*x=*/-1.0,
                                       /*y=*/0.0);
  CPPUNIT_ASSERT(r == true);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.5,
                                       /*p_c=*/3.0,
                                       /*x=*/0.5,
                                       /*y=*/0.0);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.5,
                                       /*p_c=*/3.0,
                                       /*x=*/2.5,
                                       /*y=*/0.0);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.5,
                                       /*p_c=*/3.0,
                                       /*x=*/3.5,
                                       /*y=*/0.0);
  CPPUNIT_ASSERT(r == true);
  // on ellipse's vertical axis
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.5,
                                       /*p_c=*/3.0,
                                       /*x=*/1.5,
                                       /*y=*/-2.5);
  CPPUNIT_ASSERT(r == true);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.5,
                                       /*p_c=*/3.0,
                                       /*x=*/1.5,
                                       /*y=*/-0.5);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.5,
                                       /*p_c=*/3.0,
                                       /*x=*/1.5,
                                       /*y=*/0.5);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.5,
                                       /*p_c=*/3.0,
                                       /*x=*/1.5,
                                       /*y=*/2.5);
  CPPUNIT_ASSERT(r == true);

  // Case: ellipse, major axis vertical, p_c < 0
  // top left quadrant
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.5,
                                       /*p_c=*/-3.0,
                                       /*x=*/-2.0,
                                       /*y=*/2.0);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.5,
                                       /*p_c=*/-3.0,
                                       /*x=*/-2.0,
                                       /*y=*/3.0);
  CPPUNIT_ASSERT(r == true);
  // top right quadrant
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.5,
                                       /*p_c=*/-3.0,
                                       /*x=*/-1.3,
                                       /*y=*/3.0);
  CPPUNIT_ASSERT(r == true);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.5,
                                       /*p_c=*/-3.0,
                                       /*x=*/-1.3,
                                       /*y=*/2.0);
  CPPUNIT_ASSERT(r == false);
  // bottom right quadrant
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.5,
                                       /*p_c=*/-3.0,
                                       /*x=*/-1.3,
                                       /*y=*/-2.0);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.5,
                                       /*p_c=*/-3.0,
                                       /*x=*/-1.3,
                                       /*y=*/-3.0);
  CPPUNIT_ASSERT(r == true);
  // bottom left quadrant
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.5,
                                       /*p_c=*/-3.0,
                                       /*x=*/-2.0,
                                       /*y=*/-2.0);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.5,
                                       /*p_c=*/-3.0,
                                       /*x=*/-2.0,
                                       /*y=*/-3.0);
  CPPUNIT_ASSERT(r == true);
  // on horizontal axis
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.5,
                                       /*p_c=*/-3.0,
                                       /*x=*/1.0,
                                       /*y=*/0.0);
  CPPUNIT_ASSERT(r == true);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.5,
                                       /*p_c=*/-3.0,
                                       /*x=*/-0.5,
                                       /*y=*/0.0);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.5,
                                       /*p_c=*/-3.0,
                                       /*x=*/-2.5,
                                       /*y=*/0.0);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.5,
                                       /*p_c=*/-3.0,
                                       /*x=*/-3.5,
                                       /*y=*/0.0);
  CPPUNIT_ASSERT(r == true);
  // on ellipse's vertical axis
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.5,
                                       /*p_c=*/-3.0,
                                       /*x=*/-1.5,
                                       /*y=*/-2.5);
  CPPUNIT_ASSERT(r == true);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.5,
                                       /*p_c=*/-3.0,
                                       /*x=*/-1.5,
                                       /*y=*/-0.5);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.5,
                                       /*p_c=*/-3.0,
                                       /*x=*/-1.5,
                                       /*y=*/0.5);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfEllipse(/*m=*/1.5,
                                       /*p_c=*/-3.0,
                                       /*x=*/-1.5,
                                       /*y=*/2.5);
  CPPUNIT_ASSERT(r == true);
}

/**
 * Testing Ellipse::distanceCC with shifted ellipse
 * Case: circle
 */
void
EllipseTest::distanceCCTestShift()
{
  Real d, x2, y2; //, x3, y3;
  Real shift = 0.5;

  // Case: circle, p_c < 0
  // top right quadrant
  d = Ellipse::distanceCC(/*m=*/1.0, /*p_c=*/-3.0, /*x1=*/2.0, /*y1=*/3.0, x2, y2, shift);
  // Ellipse::getYieldPointCC(/*m=*/1.0, /*p_c=*/-3.0, /*x1=*/2.0, /*y1=*/3.0, x3, y3);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(3 * std::sqrt(2) - 1.5, d, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.5 / std::sqrt(2) - 1.0, x2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.5 / std::sqrt(2), y2, 1e-5);
  // CPPUNIT_ASSERT_DOUBLES_EQUAL(1.5 / std::sqrt(2) - 1.5, x3, 1e-5);
  // CPPUNIT_ASSERT_DOUBLES_EQUAL(1.5 / std::sqrt(2), y3, 1e-5);
}

/**
 * Testing Ellipse::distanceCC
 * Case: circle
 */
void
EllipseTest::distanceCCTestCircle()
{
  Real d, x2, y2, x3, y3;

  // Case: circle, p_c < 0
  // top right quadrant
  d = Ellipse::distanceCC(/*m=*/1.0, /*p_c=*/-3.0, /*x1=*/1.5, /*y1=*/3.0, x2, y2, 0.);
  Ellipse::getYieldPointCC(/*m=*/1.0, /*p_c=*/-3.0, /*x1=*/1.5, /*y1=*/3.0, x3, y3);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(3 * std::sqrt(2) - 1.5, d, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.5 / std::sqrt(2) - 1.5, x2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.5 / std::sqrt(2), y2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.5 / std::sqrt(2) - 1.5, x3, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.5 / std::sqrt(2), y3, 1e-5);
  // top left quadrant
  d = Ellipse::distanceCC(/*m=*/1.0, /*p_c=*/-3.0, /*x1=*/-4.5, /*y1=*/3.0, x2, y2, 0.);
  Ellipse::getYieldPointCC(/*m=*/1.0, /*p_c=*/-3.0, /*x1=*/-4.5, /*y1=*/3.0, x3, y3);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(3 * std::sqrt(2) - 1.5, d, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.5 / std::sqrt(2) - 1.5, x2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.5 / std::sqrt(2), y2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.5 / std::sqrt(2) - 1.5, x3, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.5 / std::sqrt(2), y3, 1e-5);
  // bottom right quadrant
  d = Ellipse::distanceCC(/*m=*/1.0, /*p_c=*/-3.0, /*x1=*/1.5, /*y1=*/-3.0, x2, y2, 0.);
  Ellipse::getYieldPointCC(/*m=*/1.0, /*p_c=*/-3.0, /*x1=*/1.5, /*y1=*/-3.0, x3, y3);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(3 * std::sqrt(2) - 1.5, d, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.5 / std::sqrt(2) - 1.5, x2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.5 / std::sqrt(2), y2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.5 / std::sqrt(2) - 1.5, x3, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.5 / std::sqrt(2), y3, 1e-5);
  // bottom left quadrant
  d = Ellipse::distanceCC(/*m=*/1.0, /*p_c=*/-3.0, /*x1=*/-4.5, /*y1=*/-3.0, x2, y2, 0.);
  Ellipse::getYieldPointCC(/*m=*/1.0, /*p_c=*/-3.0, /*x1=*/-4.5, /*y1=*/-3.0, x3, y3);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(3 * std::sqrt(2) - 1.5, d, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.5 / std::sqrt(2) - 1.5, x2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.5 / std::sqrt(2), y2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.5 / std::sqrt(2) - 1.5, x3, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.5 / std::sqrt(2), y3, 1e-5);
  // on horizontal axis, left hand side of ellipse
  d = Ellipse::distanceCC(/*m=*/1.0, /*p_c=*/-3.0, /*x1=*/-4.0, /*y1=*/0.0, x2, y2, 0.);
  Ellipse::getYieldPointCC(/*m=*/1.0, /*p_c=*/-3.0, /*x1=*/-4.0, /*y1=*/0.0, x3, y3);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, d, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-3.0, x2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, y2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-3.0, x3, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, y3, 1e-5);
  // on horizontal axis, right hand side of ellipse
  d = Ellipse::distanceCC(/*m=*/1.0, /*p_c=*/-3.0, /*x1=*/1.0, /*y1=*/0.0, x2, y2, 0.);
  Ellipse::getYieldPointCC(/*m=*/1.0, /*p_c=*/-3.0, /*x1=*/1.0, /*y1=*/0.0, x3, y3);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, d, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, x2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, y2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, x3, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, y3, 1e-5);
  // on vertical axis, below ellipse
  d = Ellipse::distanceCC(/*m=*/1.0, /*p_c=*/-3.0, /*x1=*/-1.5, /*y1=*/-2.0, x2, y2, 0.);
  Ellipse::getYieldPointCC(/*m=*/1.0, /*p_c=*/-3.0, /*x1=*/-1.5, /*y1=*/-2.0, x3, y3);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.5, d, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.5, x2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.5, y2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.5, x3, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.5, y3, 1e-5);
  // on vertical axis, above ellipse
  d = Ellipse::distanceCC(/*m=*/1.0, /*p_c=*/-3.0, /*x1=*/-1.5, /*y1=*/2.0, x2, y2, 0.);
  Ellipse::getYieldPointCC(/*m=*/1.0, /*p_c=*/-3.0, /*x1=*/-1.5, /*y1=*/2.0, x3, y3);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.5, d, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.5, x2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.5, y2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.5, x3, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.5, y3, 1e-5);
}

/**
 * Testing Ellipse::distanceCC
 * Case: ellipse, major axis horizontal
 */
void
EllipseTest::distanceCCTestMajorAxisHorizontal()
{
  Real d, x2, y2, x3, y3;

  // Case: ellipse, major axis horizontal, p_c < 0
  // top right quadrant
  d = Ellipse::distanceCC(/*m=*/0.5, /*p_c=*/-3.0, /*x1=*/1.5, /*y1=*/3.0, x2, y2, 0.);
  Ellipse::getYieldPointCC(/*m=*/0.5, /*p_c=*/-3.0, /*x1=*/1.5, /*y1=*/3.0, x3, y3);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(3.1210069, d, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.282058, x2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.437784, y2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.0385555846931, x3, 1e-10);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.168952819574, y3, 1e-10);
  // top left quadrant
  d = Ellipse::distanceCC(/*m=*/0.5, /*p_c=*/-3.0, /*x1=*/-4.5, /*y1=*/3.0, x2, y2, 0.);
  Ellipse::getYieldPointCC(/*m=*/0.5, /*p_c=*/-3.0, /*x1=*/-4.5, /*y1=*/3.0, x3, y3);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(3.1210069, d, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-2.717941, x2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.437784, y2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-2.96144441531, x3, 1e-10);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.168952819574, y3, 1e-10);
  // bottom right quadrant
  d = Ellipse::distanceCC(/*m=*/0.5, /*p_c=*/-3.0, /*x1=*/1.5, /*y1=*/-3.0, x2, y2, 0.);
  Ellipse::getYieldPointCC(/*m=*/0.5, /*p_c=*/-3.0, /*x1=*/1.5, /*y1=*/-3.0, x3, y3);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(3.1210069, d, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.282058, x2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.437784, y2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.0385555846931, x3, 1e-10);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.168952819574, y3, 1e-10);
  // bottom left quadrant
  d = Ellipse::distanceCC(/*m=*/0.5, /*p_c=*/-3.0, /*x1=*/-4.5, /*y1=*/-3.0, x2, y2, 0.);
  Ellipse::getYieldPointCC(/*m=*/0.5, /*p_c=*/-3.0, /*x1=*/-4.5, /*y1=*/-3.0, x3, y3);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(3.1210069, d, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-2.717941, x2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.437784, y2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-2.96144441531, x3, 1e-10);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.168952819574, y3, 1e-10);
  // on horizontal axis, left hand side of ellipse
  d = Ellipse::distanceCC(/*m=*/0.5, /*p_c=*/-3.0, /*x1=*/-4.0, /*y1=*/0.0, x2, y2, 0.);
  Ellipse::getYieldPointCC(/*m=*/0.5, /*p_c=*/-3.0, /*x1=*/-4.0, /*y1=*/0.0, x3, y3);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, d, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-3.0, x2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, y2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-3.0, x3, 1e-10);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, y3, 1e-10);
  // on horizontal axis, right hand side of ellipse
  d = Ellipse::distanceCC(/*m=*/0.5, /*p_c=*/-3.0, /*x1=*/1.0, /*y1=*/0.0, x2, y2, 0.);
  Ellipse::getYieldPointCC(/*m=*/0.5, /*p_c=*/-3.0, /*x1=*/1.0, /*y1=*/0.0, x3, y3);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, d, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, x2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, y2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, x3, 1e-10);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, y3, 1e-10);
  // on vertical axis, below ellipse
  d = Ellipse::distanceCC(/*m=*/0.5, /*p_c=*/-3.0, /*x1=*/-1.5, /*y1=*/-1.0, x2, y2, 0.);
  Ellipse::getYieldPointCC(/*m=*/0.5, /*p_c=*/-3.0, /*x1=*/-1.5, /*y1=*/-1.0, x3, y3);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.25, d, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.5, x2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.75, y2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.5, x3, 1e-10);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.75, y3, 1e-10);
  // on vertical axis, above ellipse
  d = Ellipse::distanceCC(/*m=*/0.5, /*p_c=*/-3.0, /*x1=*/-1.5, /*y1=*/1.0, x2, y2, 0.);
  Ellipse::getYieldPointCC(/*m=*/0.5, /*p_c=*/-3.0, /*x1=*/-1.5, /*y1=*/1.0, x3, y3);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.25, d, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.5, x2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.75, y2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.5, x3, 1e-10);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.75, y3, 1e-10);
}

/**
 * Testing Ellipse::distanceCC
 * Case: ellipse, major axis vertical
 */
void
EllipseTest::distanceCCTestMajorAxisVertical()
{
  Real d, x2, y2, x3, y3;

  // Case: ellipse, major axis vertical, p_c < 0
  // top right quadrant
  d = Ellipse::distanceCC(/*m=*/1.5, /*p_c=*/-3.0, /*x1=*/-0.5, /*y1=*/2.0, x2, y2, 0.);
  Ellipse::getYieldPointCC(/*m=*/1.5, /*p_c=*/-3.0, /*x1=*/-0.5, /*y1=*/2.0, x3, y3);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.2094051, d, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.650317, x2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.854209, y2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.653371450454, x3, 1e-10);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.85734897716, y3, 1e-10);
  // top left quadrant
  d = Ellipse::distanceCC(/*m=*/1.5, /*p_c=*/-3.0, /*x1=*/-2.5, /*y1=*/2.0, x2, y2, 0.);
  Ellipse::getYieldPointCC(/*m=*/1.5, /*p_c=*/-3.0, /*x1=*/-2.5, /*y1=*/2.0, x3, y3);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.2094051, d, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-2.349682, x2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.854209, y2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-2.34662854955, x3, 1e-10);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.85734897716, y3, 1e-10);
  // bottom right quadrant
  d = Ellipse::distanceCC(/*m=*/1.5, /*p_c=*/-3.0, /*x1=*/-0.5, /*y1=*/-2.0, x2, y2, 0.);
  Ellipse::getYieldPointCC(/*m=*/1.5, /*p_c=*/-3.0, /*x1=*/-0.5, /*y1=*/-2.0, x3, y3);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.2094051, d, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.650317, x2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.854209, y2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.653371450454, x3, 1e-10);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.85734897716, y3, 1e-10);
  // bottom left quadrant
  d = Ellipse::distanceCC(/*m=*/1.5, /*p_c=*/-3.0, /*x1=*/-2.5, /*y1=*/-2.0, x2, y2, 0.);
  Ellipse::getYieldPointCC(/*m=*/1.5, /*p_c=*/-3.0, /*x1=*/-2.5, /*y1=*/-2.0, x3, y3);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.2094051, d, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-2.349682, x2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.854209, y2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-2.34662854955, x3, 1e-10);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.85734897716, y3, 1e-10);

  // on horizontal axis, left hand side of ellipse
  d = Ellipse::distanceCC(/*m=*/1.5, /*p_c=*/-3.0, /*x1=*/-4.0, /*y1=*/0.0, x2, y2, 0.);
  Ellipse::getYieldPointCC(/*m=*/1.5, /*p_c=*/-3.0, /*x1=*/-4.0, /*y1=*/0.0, x3, y3);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, d, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-3.0, x2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, y2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-3.0, x3, 1e-10);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, y3, 1e-10);
  // on horizontal axis, right hand side of ellipse
  d = Ellipse::distanceCC(/*m=*/1.5, /*p_c=*/-3.0, /*x1=*/1.0, /*y1=*/0.0, x2, y2, 0.);
  Ellipse::getYieldPointCC(/*m=*/1.5, /*p_c=*/-3.0, /*x1=*/1.0, /*y1=*/0.0, x3, y3);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, d, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, x2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, y2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, x3, 1e-10);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, y3, 1e-10);
  // on vertical axis, below ellipse
  d = Ellipse::distanceCC(/*m=*/1.5, /*p_c=*/-3.0, /*x1=*/-1.5, /*y1=*/-2.5, x2, y2, 0.);
  Ellipse::getYieldPointCC(/*m=*/1.5, /*p_c=*/-3.0, /*x1=*/-1.5, /*y1=*/-2.5, x3, y3);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.25, d, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.5, x2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-2.25, y2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.5, x3, 1e-10);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-2.25, y3, 1e-10);
  // on vertical axis, above ellipse
  d = Ellipse::distanceCC(/*m=*/1.5, /*p_c=*/-3.0, /*x1=*/-1.5, /*y1=*/2.5, x2, y2, 0.);
  Ellipse::getYieldPointCC(/*m=*/1.5, /*p_c=*/-3.0, /*x1=*/-1.5, /*y1=*/2.5, x3, y3);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.25, d, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.5, x2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(2.25, y2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.5, x3, 1e-10);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(2.25, y3, 1e-10);
}

/**
 * Testing Ellipse::distanceCCanisotropic
 * Case: rotated ellipse, major axis ~horizontal
 */
void
EllipseTest::distanceCCanisotropicTestMajorAxisHorizontal()
{
  Real d, x2, y2;

  d = Ellipse::distanceCCanisotropic(/*m=*/1.4,
                                     /*p_0=*/2.0,
                                     /*alpha=*/0.2,
                                     /*y0=*/2.0,
                                     /*y1*/ 1.5,
                                     x2,
                                     y2);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.340201, d, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.731422, x2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.291187, y2, 1e-5);
}

/**
 * Testing Ellipse::rotatePoint
 */
void
EllipseTest::rotatePointTest()
{
  Real z0, z1;
  Ellipse::rotatePoint(/*m=*/1.4,
                       /*p_0=*/2.0,
                       /*alpha=*/0.2,
                       /*forward=*/true,
                       /*y0=*/2.0,
                       /*y1*/ 1.5,
                       z0,
                       z1);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.47087, z0, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.72563, z1, 1e-5);
  Ellipse::rotatePoint(/*m=*/1.4,
                       /*p_0=*/2.0,
                       /*alpha=*/0.2,
                       /*forward=*/false,
                       /*y0=*/1.47087101353638,
                       /*y1*/ -0.725629700011281,
                       z0,
                       z1);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(2.0, z0, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.5, z1, 1e-5);
}

/**
 * Testing Ellipse::getDafaliasEllipseAxesAndCentre
 */
void
EllipseTest::getDafaliasEllipseAxesAndCentreTest()
{
  Real horizontal_axis, vertical_axis, center_p, center_q;
  Ellipse::getDafaliasEllipseAxesAndCentre(
      /*m=*/1.4, /*p_0=*/2.0, /*alpha=*/0.2, horizontal_axis, vertical_axis, center_p, center_q);

  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.4142135, horizontal_axis, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.979796, vertical_axis, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, center_p, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.2, center_q, 1e-5);
}

/**
 * Testing Ellipse::distanceCCanisotropic
 * Case: rotated ellipse, major axis ~vertical
 */
void
EllipseTest::distanceCCanisotropicTestMajorAxisVertical()
{
  Real d, x2, y2;

  d = Ellipse::distanceCCanisotropic(/*m=*/0.4,
                                     /*p_0=*/2.0,
                                     /*alpha=*/0.2,
                                     /*y0=*/2.0,
                                     /*y1*/ 1.5,
                                     x2,
                                     y2);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.952959979, d, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.7821427634, x2, 1e-5);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0.57227647, y2, 1e-5);
}

/**
 * Testing Ellipse::isPointOutsideOfRotatedEllipse
 * Case: ellipse, major axis ~horizontal
 */
void
EllipseTest::isPointOutsideOfRotatedEllipseTestMajorAxisHorizontal()
{
  bool r;
  r = Ellipse::isPointOutsideOfRotatedEllipse(
      /*m=*/1.4, /*p_0=*/2.0, /*alpha=*/0.2, /*y0=*/2.0, /*y1*/ 1.5);
  CPPUNIT_ASSERT(r == true);
  r = Ellipse::isPointOutsideOfRotatedEllipse(
      /*m=*/1.4, /*p_0=*/2.0, /*alpha=*/0.2, /*y0=*/1.5, /*y1*/ 1.51);
  CPPUNIT_ASSERT(r == true);
  r = Ellipse::isPointOutsideOfRotatedEllipse(
      /*m=*/1.4, /*p_0=*/2.0, /*alpha=*/0.2, /*y0=*/1.5, /*y1*/ 1.49);
  CPPUNIT_ASSERT(r == false);
}

/**
 * Testing Ellipse::isPointOutsideOfRotatedEllipse
 * Case: ellipse, major axis ~vertical
 */
void
EllipseTest::isPointOutsideOfRotatedEllipseTestMajorAxisVertical()
{
  bool r;
  r = Ellipse::isPointOutsideOfRotatedEllipse(
      /*m=*/0.4, /*p_0=*/2.0, /*alpha=*/0.2, /*y0=*/1.53, /*y1*/ 0.0);
  CPPUNIT_ASSERT(r == true);
  r = Ellipse::isPointOutsideOfRotatedEllipse(
      /*m=*/0.4, /*p_0=*/2.0, /*alpha=*/0.2, /*y0=*/1.49, /*y1*/ 0.0);
  CPPUNIT_ASSERT(r == false);
  r = Ellipse::isPointOutsideOfRotatedEllipse(
      /*m=*/0.4, /*p_0=*/2.0, /*alpha=*/0.2, /*y0=*/0.5, /*y1*/ 0.41);
  CPPUNIT_ASSERT(r == true);
  r = Ellipse::isPointOutsideOfRotatedEllipse(
      /*m=*/0.4, /*p_0=*/2.0, /*alpha=*/0.2, /*y0=*/0.5, /*y1*/ 0.39);
  CPPUNIT_ASSERT(r == false);
}
back to top