Newsgroup: it.comp.lang.c++
Titolo: Domanda  su cpp e unit test [CppUnit]

Ciao , ho una domanda da farvi. Mi scuso già anticipatamente se fosse
OT . Riguarda cmq l'uso di CppUnit e di un esempio che non mi torna
chiaro :
ho creato la seguente classe SOMMA:
#ifndef SOMMA_H
#define SOMMA_H
template <class T> class SOMMA {
public:
SOMMA() {};
T somma(T a,T b)
{
return a + b;
}
};
#endif
e la seguente classe SOMMATEST per eseguire gli unit test :
#ifndef SOMMATEST_H
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/TestFixture.h>
#include <cppunit/TestCaller.h>
#include <cppunit/TestSuite.h>
#include <cppunit/TestResult.h>
#include <cppunit/TestRunner.h>
#include <cppunit/ui/text/TestRunner.h>
#include <cmath>
#include <iostream>
#include <string>
#include "somma.h"
#define SOMMATEST_H
using namespace std;
class SOMMATEST:public
  CppUnit::TestFixture
{
private:
  SOMMA<int> * a;
  SOMMA<float> * b;
  SOMMA<double> * c;
  SOMMA<string> * d;
public:void
  setUp ()
  {
    a = new SOMMA<int> ();
    b = new SOMMA<float> ();
    c = new SOMMA<double> ();
    d = new SOMMA<string> ();
  }
  void
  tearDown ()
  {
    delete a;
    delete b;
    delete c;
    delete d;
  }
  void
  testSOMMA ()
  {
    CPPUNIT_ASSERT (5 == 5);
    CPPUNIT_ASSERT (a->somma (2, 3) == 5);
    CPPUNIT_ASSERT (b->somma (1.0,1.0) == 2);
    CPPUNIT_ASSERT (c->somma (0.3,0.5)==(double)0.8);
    CPPUNIT_ASSERT (d->somma ("abc", "de") == "abcde");
  }
static CppUnit::Test *suite() {
CppUnit::TestSuite *suite=new CppUnit::TestSuite("SOMMA");
suite->addTest(new CppUnit::TestCaller<SOMMATEST>("SOMMATEST",&SOMMATEST::testSOMMA));
return suite;
}
};
#endif
(so che sono orrende ma sono solo dei tests per esaminare un pò cppunit
Lancio il test con un main fatto cosi : 
int main(int argc,char *argv[])
{
CppUnit::TextUi::TestRunner runner;
  runner.addTest(SOMMATEST::suite());
  runner.run();
return 0;
}
ma quando lancio l'eseguibile il test case sull'oggetto c mi va sempre in errore :
1) test: SOMMATEST (F) line: 47 sommatest.h
assertion failed
- Expression: c->somma (0.3,0.5)==(double)0.8 
.... qualcuno ha idea di cosa sto sbagliando ? 
sto usando g++ 4.1.3 
Grazie per gli eventuali aiuti e comunque un saluto a tutto il newsgroup
ciao
Pier Paolo

 - Expression: c->somma (0.3,0.5)==(double)0.8 
Per via degli errori di rappresentazione probabilmente risulta
	0.3+0.5!=0.8
E' raro che si utilizzi l'operatore == con i float, bisogna invece 
testare che la differenza sia "piuttosto" piccola in valore assoluto.
E.


si alla fine ho fatto una verifica con la differenza e funziona sia per
double che per float.... però ..... è proprio brutto :) 
ciao e grazie
PP

 double che per float.... però ..... è proprio brutto :) 
E' la vita... in base 2 il numero 0.3 è periodico, quindi non puo' 
essere memorizzato esattamente.
E.

 double che per float.... perň ..... č proprio brutto :) 
Non č brutto. E' standard. Si č sempre fatto cosě perchč non si puň fare
diversamente. 
Cioč, puoi creare funzioni che 'mascherino' la cosa (che so, near()), ma
sotto sotto non puoi fare altrimenti. Nota che alcuni framework di
unit-testing forniscono un'asserzione precisamente per dire che due
reali siano *molto* vicini (ovvero per cercare di capire se sono
uguali).
-- 
blog:  
http://www.akropolix.net/rik0/blogs
 | Uccidete i filosofi,
site:  
http://www.akropolix.net/rik0/
      | tenetevi riso e
forum: 
http://www.akropolix.net/forum/
     | bacchette per voi.