make our Color class serializable
[mussa.git] / alg / test / test_color.cpp
1 #include <boost/test/auto_unit_test.hpp>
2 #include <boost/test/floating_point_comparison.hpp>
3 #include <string>
4 #include <sstream>
5
6 #include <boost/archive/text_oarchive.hpp>
7 #include <boost/archive/text_iarchive.hpp>
8 #include <boost/archive/xml_oarchive.hpp>
9 #include <boost/archive/xml_iarchive.hpp>
10
11 #include "alg/color.hpp"
12
13 #include <iostream>
14
15 using namespace std;
16
17 BOOST_AUTO_TEST_CASE ( color )
18 {
19   const float tolerance = 1e-6;
20   const float zero = 0.0;
21   const float dotone = 0.1;
22   const float dottwo = 0.2;
23   const float dotthree = 0.3;
24   const float dotfour = 0.4;
25   Color c1;
26   BOOST_CHECK_CLOSE (c1.r(), zero, tolerance );
27   BOOST_CHECK_CLOSE (c1.g(), zero, tolerance );
28   BOOST_CHECK_CLOSE (c1.b(), zero, tolerance );
29   BOOST_CHECK_CLOSE (c1.a(), zero, tolerance );
30
31   Color c2(dotone, dottwo, dotthree, dotfour);
32   BOOST_CHECK_CLOSE (c2.r(), dotone, tolerance );
33   BOOST_CHECK_CLOSE (c2.g(), dottwo, tolerance );
34   BOOST_CHECK_CLOSE (c2.b(), dotthree, tolerance );
35   BOOST_CHECK_CLOSE (c2.a(), dotfour, tolerance );
36
37   Color c3(c2);
38   BOOST_CHECK_CLOSE (c3.r(), dotone, tolerance );
39   BOOST_CHECK_CLOSE (c3.g(), dottwo, tolerance );
40   BOOST_CHECK_CLOSE (c3.b(), dotthree, tolerance );
41   BOOST_CHECK_CLOSE (c3.a(), dotfour, tolerance );
42   BOOST_CHECK_EQUAL ( c2, c3 );
43
44   const float *colors = c3.get();
45   BOOST_CHECK_CLOSE (colors[Color::RedChannel   ], dotone, tolerance );
46   BOOST_CHECK_CLOSE (colors[Color::GreenChannel ], dottwo, tolerance );
47   BOOST_CHECK_CLOSE (colors[Color::BlueChannel  ], dotthree, tolerance );
48   BOOST_CHECK_CLOSE (colors[Color::AlphaChannel ], dotfour, tolerance );
49 }
50
51 BOOST_AUTO_TEST_CASE( serialize_color )
52 {
53   const Color color1(1.0, 1.0, 1.0, 1.0);
54
55   std::ostringstream oss;
56   // allocate/deallocate serialization components
57   {
58     boost::archive::text_oarchive oarchive(oss);
59     oarchive << color1;
60   }
61   Color color2;
62   {
63     std::istringstream iss(oss.str());
64     boost::archive::text_iarchive iarchive(iss);
65     iarchive >> color2;
66   }
67   BOOST_CHECK_EQUAL(color1, color2);
68 }  
69
70 BOOST_AUTO_TEST_CASE( serialize_xml_color )
71 {
72   const Color color1(0.0, 0.5, 0.0, 0.0);
73
74   std::ostringstream oss;
75   // allocate/deallocate serialization components
76   {
77     boost::archive::xml_oarchive oarchive(oss);
78     oarchive << boost::serialization::make_nvp("color", color1);
79   }
80   //std::cout << "XML Color: " << oss.str() << std::endl;
81   Color color2;
82   {
83     std::istringstream iss(oss.str());
84     boost::archive::xml_iarchive iarchive(iss);
85     iarchive >> boost::serialization::make_nvp("color", color2);
86   }
87   BOOST_CHECK_EQUAL(color1, color2);
88 }