//Tests Meters->Miles 
int firstmetersToMiles () {
  auto myConverter = std::make_shared<MetersToMilesConverter>();  
  double meterValue = 1000.0;
  double mileValue = myConverter->convert(meterValue);
  TINYTEST_EQUAL_EPSILON(0.621371192237334, mileValue);
  return 1;
}
//Tests Dollar->Pound  WERT: 0.64851 vom 2015-11-03 18:30 UTC
int firstDollarToPound () {
  auto myConverter = std::make_shared<DollarToPoundConverter>();  
  double dollarValue = 10000.0;
  double poundValue = myConverter->convert(dollarValue);
  TINYTEST_EQUAL_EPSILON(6485.10, poundValue);
  return 1;
}
int secondDollarToEuro () {
  auto myConverter = std::make_shared<DollarToEuroConverter>();  
  double dollarValue = 3000.0;
  double euroValue = myConverter->convert(dollarValue);
  TINYTEST_EQUAL_EPSILON(2640.0, euroValue);
  return 1;
}
int secondmetersToMiles () {
  auto myConverter = std::make_shared<MetersToMilesConverter>();  
  double meterValue = 1600.0;
  double mileValue = myConverter->convert(meterValue);
  TINYTEST_EQUAL_EPSILON(0.9941939075797344, mileValue);
  return 1;
}
int fourthDollarToEuro () {
  auto myConverter = std::make_shared<DollarToEuroConverter>();  
  double dollarValue = -50.0;
  double euroValue = myConverter->convert(dollarValue);
  TINYTEST_EQUAL_EPSILON(-44.0, euroValue);
  return 1;
}
int thirdCelsiusToKelvin () {
  auto myConverter = std::make_shared<CelsiusToKelvinConverter>();  
  double celsiusValue = -273.15;
  double kelvinValue = myConverter->convert(celsiusValue);
  TINYTEST_EQUAL_EPSILON(0.0, kelvinValue);
  return 1;
}
int fourthCelsiusToKelvin () {
  auto myConverter = std::make_shared<CelsiusToKelvinConverter>();  
  double celsiusValue = -520;
  double kelvinValue = myConverter->convert(celsiusValue);
  TINYTEST_EQUAL_EPSILON(-246.85, kelvinValue);
  return 1;
}
int thirdCelsiusToFahrenheit () {
  auto myConverter = std::make_shared<CelsiusToFahrenheitConverter>();  
  double celsiusValue = -530.0;
  double fahrenheitValue = myConverter->convert(celsiusValue);
  TINYTEST_EQUAL_EPSILON(-922.0, fahrenheitValue);
  return 1;
}
int inversioninversionDecoratorTest() {
  auto myConverter = new inversionDecorator(new inversionDecorator(new YardsToMetersConverter() ) );
  double yardsValue = 1;
  double yardsAusgabe = myConverter->convert(yardsValue);
  TINYTEST_EQUAL_EPSILON(0.9144, yardsAusgabe);
  return 1;
}
int chainedConverter() {
  auto myConverter = new MetersToFeetConverter(new YardsToMetersConverter() ) ;
  double yardsValue = 1.0;
  double feetAusgabe = myConverter->convert(yardsValue);
  TINYTEST_EQUAL_EPSILON(3.0, feetAusgabe);
  return 1;
}
int secondmetersToFeet () {
  auto myConverter = std::make_shared<MetersToFeetConverter>();  
  double meterValue = 1609344.0;
  double footValue = myConverter->convert(meterValue);
  TINYTEST_EQUAL_EPSILON(5280000.0, footValue);
  return 1;
}
int fourthmetersToFeet () {
  auto myConverter = std::make_shared<MetersToFeetConverter>();  
  double meterValue = -66.0;
  double footValue = myConverter->convert(meterValue);
  TINYTEST_EQUAL_EPSILON(-216.5354330708661, footValue);
  return 1;
}
int fourthmetersToMiles () {
  auto myConverter = std::make_shared<MetersToMilesConverter>();  
  double meterValue = -66.0;
  double mileValue = myConverter->convert(meterValue);
  TINYTEST_EQUAL_EPSILON(-0.041010498687664, mileValue);
  return 1;
}
//Tests Meters->Feet 
int firstmetersToFeet () {
  auto myConverter = std::make_shared<MetersToFeetConverter>();  
  double meterValue = 1000.0;
  double footValue = myConverter->convert(meterValue);
  TINYTEST_EQUAL_EPSILON(3280.839895013123, footValue);
  return 1;
}
int secondCelsiusToKelvin () {
  auto myConverter = std::make_shared<CelsiusToKelvinConverter>();  
  double celsiusValue = 1000.0;
  double kelvinValue = myConverter->convert(celsiusValue);
  TINYTEST_EQUAL_EPSILON(1273.15, kelvinValue);
  return 1;
}
int secondKelvinToCelsius () {
  auto myConverter = std::make_shared<KelvinToCelsiusConverter>();  
  double kelvinValue = 1273.15;
  double celsiusValue = myConverter->convert(kelvinValue);
  TINYTEST_EQUAL_EPSILON(1000.0, celsiusValue);
  return 1;
}
int fourthKelvinToCelsius () {
  auto myConverter = std::make_shared<KelvinToCelsiusConverter>();  
  double kelvinValue = -630.0;
  double celsiusValue = myConverter->convert(kelvinValue);
  TINYTEST_EQUAL_EPSILON(-273.15, celsiusValue);
  return 1;
}
int fourthDollarToPound () {
  auto myConverter = std::make_shared<DollarToPoundConverter>();  
  double dollarValue = -2.0;
  double poundValue = myConverter->convert(dollarValue);
  TINYTEST_EQUAL_EPSILON(0.0, poundValue);
  return 1;
}
int thirdDollarToPound () {
  auto myConverter = std::make_shared<DollarToPoundConverter>();  
  double dollarValue = 50.0;
  double poundValue = myConverter->convert(dollarValue);
  TINYTEST_EQUAL_EPSILON(32.4255, poundValue);
  return 1;
}
int secondDollarToPound () {
  auto myConverter = std::make_shared<DollarToPoundConverter>();  
  double dollarValue = 3000.0;
  double poundValue = myConverter->convert(dollarValue);
  TINYTEST_EQUAL_EPSILON(1945.53, poundValue);
  return 1;
}
int TestFactoryDollarToEuro(){
    std::string conversion="DollarToEuro";
    auto c = ConverterFactory::_instance()->create(conversion);
    if(c){
        TINYTEST_EQUAL_EPSILON(0.782, c->convert(1));
    }
  return 1;
}
int TestFactoryFahrenheitToCelsius(){
    std::string conversion="FahrenheitToCelsius";
    auto c = ConverterFactory::_instance()->create(conversion);
    if(c){
        TINYTEST_EQUAL_EPSILON(-17.22205, c->convert(1));
    }
  return 1;
}
int TestFactoryYardsToKilometer(){
    std::string conversion="YardsToKilometer";
    auto c = ConverterFactory::_instance()->create(conversion);
    if(c){
        TINYTEST_EQUAL_EPSILON(0.0009144, c->convert(1));
    }
  return 1;
}
int TestFactoryKilometerToYards(){
    std::string conversion="KilometerToYards";
    auto c = ConverterFactory::_instance()->create(conversion);
    if(c){
        TINYTEST_EQUAL_EPSILON(1093.6133, c->convert(1));
    }
  return 1;
}
int TestFactoryEuroToDollar(){
    std::string conversion="EuroToDollar";
    auto conv = ConverterFactory::_instance()->create("EuroToDollar");
    conv->print();
        TINYTEST_EQUAL_EPSILON(1.28, conv->convert(1));
  return 1;

}
int TestFactoryCelsiusToFahrenheit(){
    std::string conversion="CelsiusToFahrenheit";
    auto c = ConverterFactory::_instance()->create(conversion);
    if(c){
        TINYTEST_EQUAL_EPSILON(33.8, c->convert(1));
    }
  return 1;
}
int TestFahrenheitConverter(){
    FahrenheitToCelsiusConverter c;
    TINYTEST_EQUAL_EPSILON(-17.22205, c.convert(1));
    TINYTEST_EQUAL_EPSILON(-16.12061, c.convert(2.98));
  return 1;
}
int TestKilometersConverter(){
    KilometersToYardsConverter c;
    TINYTEST_EQUAL_EPSILON(1093.6133, c.convert(1));
    TINYTEST_EQUAL_EPSILON(377.296589, c.convert(0.345));
  return 1;
}
int TestCelsiusConverter(){
	CelsiusToFahrenheitConverter c;
	TINYTEST_EQUAL_EPSILON(33.8, c.convert(1));
	TINYTEST_EQUAL_EPSILON(35.006, c.convert(1.67));
  return 1;
}
int TestYardsConverter(){
	YardsToKilometersConverter c;
	TINYTEST_EQUAL_EPSILON(0.0009144, c.convert(1));
	TINYTEST_EQUAL_EPSILON(0.23389346, c.convert(255.789));
  return 1;
}