Skip to content
Snippets Groups Projects
CompositeImplicitFunctionTest.h 3.29 KiB
Newer Older
#ifndef COMPOSITE_IMPLICIT_FUNCTION_TEST_H_
#define COMPOSITE_IMPLICIT_FUNCTION_TEST_H_

#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <cxxtest/TestSuite.h>
#include <cmath>
#include <typeinfo>

#include "MantidGeometry/MDGeometry/CompositeImplicitFunction.h"

using namespace Mantid::Geometry;

class CompositeImplicitFunctionTest : public CxxTest::TestSuite
{
private:

  //Fake ImplicitFunction to verify abstract treatement of nested functions by composite.
  class MockImplicitFunction : public Mantid::Geometry::MDImplicitFunction
  {
  public:
    MOCK_CONST_METHOD0(toXMLString, std::string());
    MOCK_CONST_METHOD0(getName, std::string());
    MOCK_METHOD1(isPointContained, bool(const Mantid::coord_t * coords));
    bool isPointContained(const std::vector<Mantid::coord_t> &)
    // Unhide base class methods (avoids Intel compiler warning)
    using MDImplicitFunction::isPointContained;
    ~MockImplicitFunction(){}
  };

public:

  void testFunctionAddition()
  {
    CompositeImplicitFunction composite;
    composite.addFunction(Mantid::Geometry::MDImplicitFunction_sptr(new MockImplicitFunction()));
    composite.addFunction(Mantid::Geometry::MDImplicitFunction_sptr(new MockImplicitFunction()));
    TSM_ASSERT_EQUALS("Two functions should have been added to composite", 2, composite.getNFunctions());
  }


  void testEvaluateNestedFunctionsViaCoordinates()
  {
    using namespace testing;

    CompositeImplicitFunction composite;
    MockImplicitFunction* a = new MockImplicitFunction;
    MockImplicitFunction* b = new MockImplicitFunction;
    EXPECT_CALL(*a, isPointContained(_)).Times(1).WillOnce(testing::Return(true));
    EXPECT_CALL(*b, isPointContained(_)).Times(1);
    composite.addFunction(Mantid::Geometry::MDImplicitFunction_sptr(a));
    composite.addFunction(Mantid::Geometry::MDImplicitFunction_sptr(b));
    Mantid::coord_t coord[3] = {0, 0, 0};
    composite.isPointContained(coord);
    TSM_ASSERT("This nested function should have been executed", testing::Mock::VerifyAndClearExpectations(a));
    TSM_ASSERT("This nested function should have been executed", testing::Mock::VerifyAndClearExpectations(b));
  }


  void testRecursiveToXML()
  {
    MockImplicitFunction* mockFunctionA = new MockImplicitFunction;
    MockImplicitFunction* mockFunctionB = new MockImplicitFunction;

    EXPECT_CALL(*mockFunctionA, toXMLString()).Times(1).WillOnce(testing::Return("<Function></Function>"));
    EXPECT_CALL(*mockFunctionB, toXMLString()).Times(1).WillOnce(testing::Return("<Function></Function>"));

    CompositeImplicitFunction function;
    function.addFunction(Mantid::Geometry::MDImplicitFunction_sptr(mockFunctionA));	
    function.addFunction(Mantid::Geometry::MDImplicitFunction_sptr(mockFunctionB));	

    TSM_ASSERT_EQUALS("The xml generated by this function did not match the expected schema.", "<Function><Type>CompositeImplicitFunction</Type><ParameterList/><Function></Function><Function></Function></Function>", function.toXMLString());
  }

  void testCannotAddNullDimension()
  {
    CompositeImplicitFunction function;

    MockImplicitFunction* nullFunction = NULL;
    TSM_ASSERT("A null function cannot be added to a function of type CompositeFunction", !function.addFunction(Mantid::Geometry::MDImplicitFunction_sptr(nullFunction)));