Newer
Older
#ifndef PROPERTYMANAGERTEST_H_
#define PROPERTYMANAGERTEST_H_
#include <cxxtest/TestSuite.h>
#include "MantidKernel/PropertyManager.h"
#include "MantidKernel/BoundedValidator.h"
#include "MantidKernel/MandatoryValidator.h"
using namespace Mantid::Kernel;
class PropertyManagerHelper : public PropertyManager
{
public:
PropertyManagerHelper() : PropertyManager() {}
Russell Taylor
committed
using PropertyManager::declareProperty;
using PropertyManager::setProperty;
Steve Williams
committed
using PropertyManager::getPointerToProperty;
class PropertyManagerTest : public CxxTest::TestSuite
{
public:
Russell Taylor
committed
void setUp()
Russell Taylor
committed
manager = new PropertyManagerHelper;
Property *p = new PropertyWithValue<int>("aProp",1);
Russell Taylor
committed
manager->declareProperty(p);
manager->declareProperty("anotherProp",1.11);
manager->declareProperty("yetAnotherProp","itsValue");
}
void tearDown()
{
delete manager;
Russell Taylor
committed
Gigg, Martyn Anthony
committed
void testConstructor()
{
PropertyManagerHelper mgr;
std::vector<Property*> props = mgr.getProperties();
TS_ASSERT( props.empty() );
}
void testCopyConstructor()
{
PropertyManagerHelper mgr1;
mgr1.declareProperty("aProp",10);
PropertyManagerHelper mgr2 = mgr1;
const std::vector<Property*>& props1 = mgr1.getProperties();
const std::vector<Property*>& props2 = mgr2.getProperties();
Janik Zikovsky
committed
TS_ASSERT_EQUALS( props1.size(), props2.size() );
TS_ASSERT_DIFFERS( &props1[0], &props2[0] );
TS_ASSERT_EQUALS( props1[0]->name(), props2[0]->name() );
TS_ASSERT_EQUALS( props1[0]->value(), props2[0]->value() );
}
void testCopyAssignment()
{
PropertyManagerHelper mgr1;
mgr1.declareProperty("aProp",10);
PropertyManagerHelper mgr2;
mgr2 = mgr1;
const std::vector<Property*>& props1 = mgr1.getProperties();
const std::vector<Property*>& props2 = mgr2.getProperties();
Janik Zikovsky
committed
TS_ASSERT_EQUALS( props1.size(), props2.size() );
TS_ASSERT_DIFFERS( &props1[0], &props2[0] );
TS_ASSERT_EQUALS( props1[0]->name(), props2[0]->name() );
TS_ASSERT_EQUALS( props1[0]->value(), props2[0]->value() );
}
Gigg, Martyn Anthony
committed
void testdeclareProperty_pointer()
{
PropertyManagerHelper mgr;
Property *p = new PropertyWithValue<double>("myProp", 9.99);
TS_ASSERT_THROWS_NOTHING( mgr.declareProperty(p) );
TS_ASSERT( mgr.existsProperty(p->name()) );
// Confirm that the first 4 characters of the string are the same
// Note that some versions of boost::lexical_cast > 1.34 give a string such as
// 9.9900000000000002 rather than 9.99. Converting back to a double however does
// still give the correct 9.99.
TS_ASSERT_EQUALS( mgr.getPropertyValue("myProp").substr(0,4), std::string("9.99") );
TS_ASSERT_THROWS( mgr.declareProperty(p), Exception::ExistsError );
TS_ASSERT_THROWS( mgr.declareProperty(new PropertyWithValue<int>("",0)), std::invalid_argument );
mgr.declareProperty(new PropertyWithValue<int>("GoodIntProp",1), "Test doc");
TS_ASSERT_EQUALS( mgr.getPointerToProperty("GoodIntProp")->documentation(), "Test doc" );
}
Russell Taylor
committed
Gigg, Martyn Anthony
committed
void testdeclareProperty_int()
{
PropertyManagerHelper mgr;
Janik Zikovsky
committed
TS_ASSERT_THROWS_NOTHING( mgr.declareProperty("myProp", 1) );
TS_ASSERT( ! mgr.getPropertyValue("myProp").compare("1") );
TS_ASSERT_THROWS( mgr.declareProperty("MYPROP", 5), Exception::ExistsError );
TS_ASSERT_THROWS( mgr.declareProperty("", 5), std::invalid_argument );
Gigg, Martyn Anthony
committed
}
Gigg, Martyn Anthony
committed
void testdeclareProperty_double()
{
PropertyManagerHelper mgr;
BoundedValidator<double> *v = new BoundedValidator<double>(1,5);
Janik Zikovsky
committed
TS_ASSERT_THROWS_NOTHING( mgr.declareProperty("myProp", 9.99, v) );
Gigg, Martyn Anthony
committed
// Note that some versions of boost::lexical_cast > 1.34 give a string such as
// 9.9900000000000002 rather than 9.99. Converting back to a double however does
// still give the correct 9.99.
Janik Zikovsky
committed
TS_ASSERT_EQUALS( mgr.getPropertyValue("myProp").substr(0,4), std::string("9.99") );
TS_ASSERT_THROWS_NOTHING( mgr.declareProperty("withDoc", 4.4, v->clone(), "Test doc doub") );
TS_ASSERT_EQUALS( mgr.getPointerToProperty("withDoc")->documentation(), "Test doc doub" );
TS_ASSERT_THROWS( mgr.declareProperty("MYPROP", 5.5), Exception::ExistsError );
TS_ASSERT_THROWS( mgr.declareProperty("", 5.5), std::invalid_argument );
Gigg, Martyn Anthony
committed
}
Gigg, Martyn Anthony
committed
void testdeclareProperty_string()
{
PropertyManagerHelper mgr;
Janik Zikovsky
committed
TS_ASSERT_THROWS_NOTHING( mgr.declareProperty("myProp", "theValue", new MandatoryValidator<std::string>, "hello") );
TS_ASSERT_EQUALS( mgr.getPropertyValue("myProp"), "theValue" );
Gigg, Martyn Anthony
committed
Property *p = NULL;
Janik Zikovsky
committed
TS_ASSERT_THROWS_NOTHING( p = mgr.getProperty("myProp") );
Steve Williams
committed
TS_ASSERT_EQUALS(p->documentation(),"hello");
Russell Taylor
committed
Janik Zikovsky
committed
TS_ASSERT_THROWS( mgr.declareProperty("MYPROP", "aValue"), Exception::ExistsError );
TS_ASSERT_THROWS( mgr.declareProperty("", "aValue"), std::invalid_argument );
Gigg, Martyn Anthony
committed
}
void testSetProperties()
{
PropertyManagerHelper mgr;
mgr.declareProperty("APROP", 1);
mgr.declareProperty("anotherProp", 1.0);
Janik Zikovsky
committed
TS_ASSERT_THROWS_NOTHING( mgr.setProperties("APROP=15;anotherProp=1.3") );
TS_ASSERT( ! mgr.getPropertyValue("APROP").compare("15") );
TS_ASSERT( ! mgr.getPropertyValue("anotherProp").compare("1.3") );
Gigg, Martyn Anthony
committed
}
void testSetPropertyValue()
{
Russell Taylor
committed
manager->setPropertyValue("APROP","10");
TS_ASSERT( ! manager->getPropertyValue("aProp").compare("10") );
manager->setPropertyValue("aProp","1");
TS_ASSERT_THROWS( manager->setPropertyValue("fhfjsdf","0"), Exception::NotFoundError );
Gigg, Martyn Anthony
committed
}
void testSetProperty()
{
Russell Taylor
committed
TS_ASSERT_THROWS_NOTHING( manager->setProperty("AProp",5) );
TS_ASSERT_THROWS( manager->setProperty("wefhui",5), Exception::NotFoundError );
TS_ASSERT_THROWS( manager->setProperty("APROP",5.55), std::invalid_argument );
TS_ASSERT_THROWS( manager->setProperty("APROP","value"), std::invalid_argument );
TS_ASSERT_THROWS_NOTHING( manager->setProperty("AProp",1) );
Gigg, Martyn Anthony
committed
}
Russell Taylor
committed
Gigg, Martyn Anthony
committed
void testExistsProperty()
{
Property *p = new PropertyWithValue<int>("sjfudh",0);
Russell Taylor
committed
TS_ASSERT( ! manager->existsProperty(p->name()) );
Janik Zikovsky
committed
Property *pp = new PropertyWithValue<double>("APROP",9.99);
// Note that although the name of the property is the same, the type is different - yet it passes
Russell Taylor
committed
TS_ASSERT( manager->existsProperty(pp->name()) );
Janik Zikovsky
committed
delete p;
Gigg, Martyn Anthony
committed
delete pp;
}
void testValidateProperties()
{
Russell Taylor
committed
TS_ASSERT( manager->validateProperties() );
Janik Zikovsky
committed
PropertyManagerHelper mgr;
Gigg, Martyn Anthony
committed
mgr.declareProperty("someProp","", new MandatoryValidator<std::string>);
Janik Zikovsky
committed
TS_ASSERT( ! mgr.validateProperties() );
Gigg, Martyn Anthony
committed
}
Gigg, Martyn Anthony
committed
void testPropertyCount()
{
PropertyManagerHelper mgr;
TS_ASSERT_EQUALS(mgr.propertyCount(), 0);
const std::string name("TestProperty");
mgr.declareProperty(name, 10.0);
TS_ASSERT_EQUALS(mgr.propertyCount(), 1);
mgr.removeProperty(name);
TS_ASSERT_EQUALS(mgr.propertyCount(), 0);
}
Gigg, Martyn Anthony
committed
void testGetPropertyValue()
{
Russell Taylor
committed
TS_ASSERT( ! manager->getPropertyValue("APROP").compare("1") );
TS_ASSERT_THROWS( manager->getPropertyValue("sdfshdu"), Exception::NotFoundError );
Gigg, Martyn Anthony
committed
}
void testGetProperty()
{
Russell Taylor
committed
Property *p = manager->getProperty("APROP");
Janik Zikovsky
committed
TS_ASSERT( p );
TS_ASSERT( ! p->name().compare("aProp") );
TS_ASSERT( ! p->value().compare("1") );
TS_ASSERT( ! p->documentation().compare("") );
TS_ASSERT( typeid(int) == *p->type_info() );
Gigg, Martyn Anthony
committed
Russell Taylor
committed
TS_ASSERT_THROWS( p = manager->getProperty("werhui"), Exception::NotFoundError );
Gigg, Martyn Anthony
committed
Gigg, Martyn Anthony
committed
int i(0);
Russell Taylor
committed
TS_ASSERT_THROWS_NOTHING( i = manager->getProperty("aprop") );
Gigg, Martyn Anthony
committed
TS_ASSERT_EQUALS( i, 1 );
Gigg, Martyn Anthony
committed
double dd(0.0);
TS_ASSERT_THROWS( dd = manager->getProperty("aprop"), std::runtime_error );
TS_ASSERT_EQUALS(dd, 0.0); // If dd is bot used you get a compiler warning
Russell Taylor
committed
std::string s = manager->getProperty("aprop");
Janik Zikovsky
committed
TS_ASSERT( ! s.compare("1") );
Gigg, Martyn Anthony
committed
double d(0.0);
Russell Taylor
committed
TS_ASSERT_THROWS_NOTHING( d = manager->getProperty("anotherProp") );
TS_ASSERT_EQUALS( d, 1.11 );
Russell Taylor
committed
TS_ASSERT_THROWS( ii = manager->getProperty("anotherprop"), std::runtime_error );
TS_ASSERT_EQUALS(ii, 0); // Compiler warning if ii is not used
Russell Taylor
committed
std::string ss = manager->getProperty("anotherprop");
Gigg, Martyn Anthony
committed
// Note that some versions of boost::lexical_cast > 1.34 give a string such as
// 9.9900000000000002 rather than 9.99. Converting back to a double however does
// still give the correct 9.99.
Janik Zikovsky
committed
TS_ASSERT_EQUALS( ss.substr(0,4), std::string("1.11") );
Russell Taylor
committed
// This works, but CANNOT at present declare the string on a separate line and then assign
// (as I did for the int & double above)
Russell Taylor
committed
std::string sss = manager->getProperty("yetanotherprop");
Janik Zikovsky
committed
TS_ASSERT( ! sss.compare("itsValue") );
Gigg, Martyn Anthony
committed
}
Gigg, Martyn Anthony
committed
void testGetProperties()
{
Russell Taylor
committed
std::vector<Property*> props = manager->getProperties();
Janik Zikovsky
committed
TS_ASSERT( props.size() == 3 );
Gigg, Martyn Anthony
committed
Property *p = props[0];
Janik Zikovsky
committed
TS_ASSERT( ! p->name().compare("aProp") );
TS_ASSERT( ! p->value().compare("1") );
Gigg, Martyn Anthony
committed
}
void testLongLongProperty()
{
PropertyManagerHelper mgr;
TS_ASSERT_THROWS_NOTHING( mgr.declareProperty("llprop",static_cast<int64_t>(0)) );
TS_ASSERT_THROWS_NOTHING( mgr.setProperty("llprop",static_cast<int64_t>(52147900000)) );
TS_ASSERT_EQUALS( mgr.getPropertyValue("llprop"), "52147900000" );
TS_ASSERT_THROWS_NOTHING( mgr.setPropertyValue("llprop","1234567890123456789") );
Gigg, Martyn Anthony
committed
int64_t retrieved(0);
TS_ASSERT_THROWS_NOTHING( retrieved = mgr.getProperty("llprop") );
TS_ASSERT_EQUALS( retrieved, static_cast<int64_t>(1234567890123456789) );
}
Gigg, Martyn Anthony
committed
void testRemoveProperty()
{
PropertyManagerHelper mgr;
const std::string name("TestProperty");
TS_ASSERT_THROWS_NOTHING(mgr.declareProperty(name, 10.0));
TS_ASSERT_THROWS_NOTHING(mgr.removeProperty(name));
TS_ASSERT_EQUALS(mgr.getProperties().size(), 0 );
}
Gigg, Martyn Anthony
committed
void testClear()
{
PropertyManagerHelper mgr;
const std::string name("TestProperty");
TS_ASSERT_THROWS_NOTHING(mgr.declareProperty(name + "1", 10.0));
TS_ASSERT_THROWS_NOTHING(mgr.declareProperty(name + "2", 15.0));
TS_ASSERT_THROWS_NOTHING(mgr.declareProperty(name + "3", 14.0));
TS_ASSERT_EQUALS(mgr.propertyCount(), 3);
TS_ASSERT_THROWS_NOTHING(mgr.clear());
TS_ASSERT_EQUALS(mgr.propertyCount(), 0);
}
Janik Zikovsky
committed
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
//-----------------------------------------------------------------------------------------------------------
/** Test of adding managers together (this will be used when
* concatenating runs together).
*/
void testAdditionOperator()
{
PropertyManager mgr1;
Property *p;
p = new PropertyWithValue<double>("double", 12.0); mgr1.declareProperty(p, "docs");
p = new PropertyWithValue<int>("int", 23); mgr1.declareProperty(p, "docs");
p = new PropertyWithValue<double>("double_only_in_mgr1", 456.0); mgr1.declareProperty(p, "docs");
PropertyManager mgr2;
p = new PropertyWithValue<double>("double", 23.6); mgr2.declareProperty(p, "docs");
p = new PropertyWithValue<int>("int", 34); mgr2.declareProperty(p, "docs");
p = new PropertyWithValue<double>("new_double_in_mgr2", 321.0); mgr2.declareProperty(p, "docs");
p = new PropertyWithValue<int>("new_int", 655); mgr2.declareProperty(p, "docs");
//Add em together
mgr1 += mgr2;
double d;
d = mgr1.getProperty("double");
TS_ASSERT_DELTA( d, 35.6, 1e-4);
d = mgr1.getProperty("double_only_in_mgr1");
TS_ASSERT_DELTA( d, 456.0, 1e-4);
d = mgr1.getProperty("new_double_in_mgr2");
TS_ASSERT_DELTA( d, 321.0, 1e-4);
int i;
i = mgr1.getProperty("int");
TS_ASSERT_EQUALS( i, 57);
i = mgr1.getProperty("new_int");
TS_ASSERT_EQUALS( i, 655);
}
Russell Taylor
committed
PropertyManagerHelper * manager;
Russell Taylor
committed
};
#endif /*PROPERTYMANAGERTEST_H_*/