1 //
2 // Filename    : TestRadialGradient.cpp
3 // Description : Tests for the RadialGradient class
4 // Organization: University of Heidelberg
5 // Created     : 2009-09-30
6 //
7 // Copyright 2008 University of Heidelberg
8 //
9 // This library is free software; you can redistribute it and/or modify it
10 // under the terms of the GNU Lesser General Public License as published
11 // by the Free Software Foundation; either version 2.1 of the License, or
12 // any later version.
13 //
14 // This library is distributed in the hope that it will be useful, but
15 // WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF
16 // MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  The software and
17 // documentation provided hereunder is on an "as is" basis, and the
18 // University of Heidelberg have no obligations to
19 // provide maintenance, support, updates, enhancements or modifications.
20 // In no event shall the University of Heidelberg be
21 // liable to any party for direct, indirect, special, incidental or
22 // consequential damages, including lost profits, arising out of the use of
23 // this software and its documentation, even if the University of
24 // Heidelberg have been advised of the possibility of such
25 // damage.  See the GNU Lesser General Public License for more details.
26 //
27 // You should have received a copy of the GNU Lesser General Public License
28 // along with this library; if not, write to the Free Software Foundation,
29 // Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
30 //
31 // The original code contained here was initially developed by:
32 //
33 //     Ralph Gauges
34 //     BIOQUANT/BQ0018
35 //     Im Neuenheimer Feld 267
36 //     69120 Heidelberg
37 //     Germany
38 //
39 //     mailto:ralph.gauges@bioquant.uni-heidelberg.de
40 //
41 // Contributor(s):
42 
43 
44 
45 #include <sbml/common/common.h>
46 #include <sbml/common/extern.h>
47 #include <sbml/xml/XMLNode.h>
48 #include <sbml/xml/XMLInputStream.h>
49 #include <sbml/packages/layout/sbml/test/utility.h>
50 #include <sbml/packages/render/extension/RenderExtension.h>
51 
52 #include <RadialGradient.h>
53 
54 #include <check.h>
55 #include <limits>
56 #include <string>
57 
58 
59 LIBSBML_CPP_NAMESPACE_USE
60 
61 BEGIN_C_DECLS
62 
63 static RadialGradient *G;
64 static RenderPkgNamespaces *renderns;
65 
66 void
RadialGradientTest_setup(void)67 RadialGradientTest_setup (void)
68 {
69   renderns = new (std::nothrow) RenderPkgNamespaces();
70     G = new (std::nothrow) RadialGradient(renderns);
71 
72     if (G == NULL)
73     {
74         fail("new(std::nothrow)RadialGradient(renderns) returned a NULL pointer.");
75     }
76 
77 }
78 
79 void
RadialGradientTest_teardown(void)80 RadialGradientTest_teardown (void)
81 {
82     delete G;
83     delete renderns;
84 }
85 
START_TEST(test_RadialGradient_setters)86 START_TEST (test_RadialGradient_setters )
87 {
88     fail_unless(G->getCenterX().getAbsoluteValue() < 1e-9);
89     fail_unless(fabs((G->getCenterX().getRelativeValue() - 50.0) / 50.0) < 1e-9);
90     fail_unless(G->getCenterY().getAbsoluteValue() < 1e-9);
91     fail_unless(fabs((G->getCenterY().getRelativeValue() - 50.0) / 50.0) < 1e-9);
92     fail_unless(G->getCenterZ().getAbsoluteValue() < 1e-9);
93     fail_unless(fabs((G->getCenterZ().getRelativeValue() - 50.0) / 50.0) < 1e-9);
94     fail_unless(G->getRadius().getAbsoluteValue() < 1e-9);
95     fail_unless(fabs((G->getRadius().getRelativeValue() - 50.0) / 50.0) < 1e-9);
96     fail_unless(G->getFocalPointX().getAbsoluteValue() < 1e-9);
97     fail_unless(fabs((G->getFocalPointX().getRelativeValue() - G->getCenterX().getRelativeValue()) / G->getCenterX().getRelativeValue()) < 1e-9);
98     fail_unless(G->getFocalPointY().getAbsoluteValue() < 1e-9);
99     fail_unless(fabs((G->getFocalPointY().getRelativeValue() - G->getCenterY().getRelativeValue()) / G->getCenterY().getRelativeValue()) < 1e-9);
100     fail_unless(G->getFocalPointZ().getAbsoluteValue() < 1e-9);
101     fail_unless(fabs((G->getFocalPointZ().getRelativeValue() - G->getCenterZ().getRelativeValue()) / G->getCenterZ().getRelativeValue()) < 1e-9);
102     G->setCoordinates(RelAbsVector(1.1,2.2),RelAbsVector(3.3,4.4),RelAbsVector(5.5,6.6)
103                      ,RelAbsVector(13.13,14.14)
104                      ,RelAbsVector(7.7,8.8),RelAbsVector(9.9,10.10),RelAbsVector(11.11,12.12)
105                      );
106     fail_unless(fabs((G->getCenterX().getAbsoluteValue() -1.1) / 1.1) < 1e-9);
107     fail_unless(fabs((G->getCenterX().getRelativeValue() -2.2) / 2.2) < 1e-9);
108     fail_unless(fabs((G->getCenterY().getAbsoluteValue() -3.3) / 3.3) < 1e-9);
109     fail_unless(fabs((G->getCenterY().getRelativeValue() -4.4) / 4.4) < 1e-9);
110     fail_unless(fabs((G->getCenterZ().getAbsoluteValue() -5.5) / 5.5) < 1e-9);
111     fail_unless(fabs((G->getCenterZ().getRelativeValue() -6.6) / 6.6) < 1e-9);
112     fail_unless(fabs((G->getRadius().getAbsoluteValue() -13.13) / 13.13) < 1e-9);
113     fail_unless(fabs((G->getRadius().getRelativeValue() -14.14) / 14.14) < 1e-9);
114     fail_unless(fabs((G->getFocalPointX().getAbsoluteValue() -7.7) / 7.7) < 1e-9);
115     fail_unless(fabs((G->getFocalPointX().getRelativeValue() -8.8) / 8.8) < 1e-9);
116     fail_unless(fabs((G->getFocalPointY().getAbsoluteValue() -9.9) / 9.9) < 1e-9);
117     fail_unless(fabs((G->getFocalPointY().getRelativeValue() -10.10) / 10.10) < 1e-9);
118     fail_unless(fabs((G->getFocalPointZ().getAbsoluteValue() -11.11) / 11.11) < 1e-9);
119     fail_unless(fabs((G->getFocalPointZ().getRelativeValue() -12.12) / 12.12) < 1e-9);
120     G->setCoordinates(RelAbsVector(3.3,4.4),RelAbsVector(5.5,6.6)
121                      ,RelAbsVector(17.17,18.18)
122                      ,RelAbsVector(9.9,10.10),RelAbsVector(11.11,12.12)
123                      );
124     fail_unless(fabs((G->getCenterX().getAbsoluteValue() - 3.3) / 3.3) < 1e-9);
125     fail_unless(fabs((G->getCenterX().getRelativeValue() - 4.4) / 4.4) < 1e-9);
126     fail_unless(fabs((G->getCenterY().getAbsoluteValue() - 5.5) / 5.5) < 1e-9);
127     fail_unless(fabs((G->getCenterY().getRelativeValue() - 6.6) / 6.6) < 1e-9);
128     fail_unless(G->getCenterZ().getAbsoluteValue() < 1e-9);
129     fail_unless(fabs((G->getCenterZ().getRelativeValue() - 50.0) / 50.0) < 1e-9);
130     fail_unless(fabs((G->getRadius().getAbsoluteValue() - 17.17) / 17.17) < 1e-9);
131     fail_unless(fabs((G->getRadius().getRelativeValue() - 18.18) / 18.18) < 1e-9);
132     fail_unless(fabs((G->getFocalPointX().getAbsoluteValue() - 9.9) / 9.9) < 1e-9);
133     fail_unless(fabs((G->getFocalPointX().getRelativeValue() - 10.10) / 10.10) < 1e-9);
134     fail_unless(fabs((G->getFocalPointY().getAbsoluteValue() - 11.11) / 11.11) < 1e-9);
135     fail_unless(fabs((G->getFocalPointY().getRelativeValue() - 12.12) / 12.12) < 1e-9);
136     fail_unless(G->getFocalPointZ().getAbsoluteValue() < 1e-9);
137     fail_unless(fabs((G->getFocalPointZ().getRelativeValue() - 50.0) / 50.0) < 1e-9);
138     G->setCenter(RelAbsVector(1.1,2.2),RelAbsVector(3.3,4.4),RelAbsVector(5.5,6.6));
139     fail_unless(fabs((G->getCenterX().getAbsoluteValue() - 1.1) / 1.1) < 1e-9);
140     fail_unless(fabs((G->getCenterX().getRelativeValue() - 2.2) / 2.2) < 1e-9);
141     fail_unless(fabs((G->getCenterY().getAbsoluteValue() - 3.3) / 3.3) < 1e-9);
142     fail_unless(fabs((G->getCenterY().getRelativeValue() - 4.4) / 4.4) < 1e-9);
143     fail_unless(fabs((G->getCenterZ().getAbsoluteValue() - 5.5) / 5.5) < 1e-9);
144     fail_unless(fabs((G->getCenterZ().getRelativeValue() - 6.6) / 6.6) < 1e-9);
145     fail_unless(fabs((G->getRadius().getAbsoluteValue() - 17.17) / 17.17) < 1e-9);
146     fail_unless(fabs((G->getRadius().getRelativeValue() - 18.18) / 18.18) < 1e-9);
147     fail_unless(fabs((G->getFocalPointX().getAbsoluteValue() - 9.9) / 9.9) < 1e-9);
148     fail_unless(fabs((G->getFocalPointX().getRelativeValue() - 10.10) / 10.10) < 1e-9);
149     fail_unless(fabs((G->getFocalPointY().getAbsoluteValue() - 11.11) / 11.11) < 1e-9);
150     fail_unless(fabs((G->getFocalPointY().getRelativeValue() -12.12) / 12.12) < 1e-9);
151     fail_unless(G->getFocalPointZ().getAbsoluteValue() < 1e-9);
152     fail_unless(fabs((G->getFocalPointZ().getRelativeValue() - 50.0) / 50.0) < 1e-9);
153     G->setCenter(RelAbsVector(3.3,4.4),RelAbsVector(5.5,6.6));
154     fail_unless(fabs((G->getCenterX().getAbsoluteValue() - 3.3) / 3.3) < 1e-9);
155     fail_unless(fabs((G->getCenterX().getRelativeValue() - 4.4) / 4.4) < 1e-9);
156     fail_unless(fabs((G->getCenterY().getAbsoluteValue() - 5.5) / 5.5) < 1e-9);
157     fail_unless(fabs((G->getCenterY().getRelativeValue() - 6.6) / 6.6) < 1e-9);
158     fail_unless(G->getCenterZ().getAbsoluteValue() < 1e-9);
159     fail_unless(G->getCenterZ().getRelativeValue() < 1e-9);
160     fail_unless(fabs((G->getRadius().getAbsoluteValue() - 17.17) / 17.17) < 1e-9);
161     fail_unless(fabs((G->getRadius().getRelativeValue() - 18.18) / 18.18) < 1e-9);
162     fail_unless(fabs((G->getFocalPointX().getAbsoluteValue() - 9.9) / 9.9) < 1e-9);
163     fail_unless(fabs((G->getFocalPointX().getRelativeValue() - 10.10) / 10.10) < 1e-9);
164     fail_unless(fabs((G->getFocalPointY().getAbsoluteValue() - 11.11) / 11.11) < 1e-9);
165     fail_unless(fabs((G->getFocalPointY().getRelativeValue() - 12.12) / 12.12) < 1e-9);
166     fail_unless(G->getFocalPointZ().getAbsoluteValue() < 1e-9);
167     fail_unless(fabs((G->getFocalPointZ().getRelativeValue() - 50.0) / 50.0) < 1e-9);
168     G->setFocalPoint(RelAbsVector(1.1,2.2),RelAbsVector(3.3,4.4),RelAbsVector(5.5,6.6));
169     fail_unless(fabs((G->getCenterX().getAbsoluteValue() - 3.3) / 3.3) < 1e-9);
170     fail_unless(fabs((G->getCenterX().getRelativeValue() - 4.4) / 4.4) < 1e-9);
171     fail_unless(fabs((G->getCenterY().getAbsoluteValue() - 5.5) / 5.5) < 1e-9);
172     fail_unless(fabs((G->getCenterY().getRelativeValue() - 6.6) / 6.6) < 1e-9);
173     fail_unless(G->getCenterZ().getAbsoluteValue() < 1e-9);
174     fail_unless(G->getCenterZ().getRelativeValue() < 1e-9);
175     fail_unless(fabs((G->getRadius().getAbsoluteValue() - 17.17) / 17.17) < 1e-9);
176     fail_unless(fabs((G->getRadius().getRelativeValue() - 18.18) / 18.18) < 1e-9);
177     fail_unless(fabs((G->getFocalPointX().getAbsoluteValue() - 1.1) / 1.1) < 1e-9);
178     fail_unless(fabs((G->getFocalPointX().getRelativeValue() - 2.2) / 2.2) < 1e-9);
179     fail_unless(fabs((G->getFocalPointY().getAbsoluteValue() - 3.3) / 3.3) < 1e-9);
180     fail_unless(fabs((G->getFocalPointY().getRelativeValue() - 4.4) / 4.4) < 1e-9);
181     fail_unless(fabs((G->getFocalPointZ().getAbsoluteValue() - 5.5) / 5.5) < 1e-9);
182     fail_unless(fabs((G->getFocalPointZ().getRelativeValue() - 6.6) / 6.6) < 1e-9);
183     G->setFocalPoint(RelAbsVector(9.9,10.10),RelAbsVector(11.11,12.12));
184     fail_unless(fabs((G->getCenterX().getAbsoluteValue() - 3.3) / 3.3) < 1e-9);
185     fail_unless(fabs((G->getCenterX().getRelativeValue() - 4.4) / 4.4) < 1e-9);
186     fail_unless(fabs((G->getCenterY().getAbsoluteValue() - 5.5) / 5.5) < 1e-9);
187     fail_unless(fabs((G->getCenterY().getRelativeValue() - 6.6) / 6.6) < 1e-9);
188     fail_unless(G->getCenterZ().getAbsoluteValue() < 1e-9);
189     fail_unless(G->getCenterZ().getRelativeValue() < 1e-9);
190     fail_unless(fabs((G->getRadius().getAbsoluteValue() - 17.17) / 17.17) < 1e-9);
191     fail_unless(fabs((G->getRadius().getRelativeValue() - 18.18) / 18.18) < 1e-9);
192     fail_unless(fabs((G->getFocalPointX().getAbsoluteValue() - 9.9) / 9.9) < 1e-9);
193     fail_unless(fabs((G->getFocalPointX().getRelativeValue() - 10.10) / 10.10) < 1e-9);
194     fail_unless(fabs((G->getFocalPointY().getAbsoluteValue() - 11.11) / 11.11) < 1e-9);
195     fail_unless(fabs((G->getFocalPointY().getRelativeValue() - 12.12) / 12.12) < 1e-9);
196     fail_unless(G->getFocalPointZ().getAbsoluteValue() < 1e-9);
197     fail_unless(G->getFocalPointZ().getRelativeValue() < 1e-9);
198     G->setRadius(RelAbsVector(20.20,21.21));
199     fail_unless(fabs((G->getCenterX().getAbsoluteValue() - 3.3) / 3.3) < 1e-9);
200     fail_unless(fabs((G->getCenterX().getRelativeValue() - 4.4) / 4.4) < 1e-9);
201     fail_unless(fabs((G->getCenterY().getAbsoluteValue() - 5.5) / 5.5) < 1e-9);
202     fail_unless(fabs((G->getCenterY().getRelativeValue() - 6.6) / 6.6) < 1e-9);
203     fail_unless(G->getCenterZ().getAbsoluteValue() < 1e-9);
204     fail_unless(G->getCenterZ().getRelativeValue() < 1e-9);
205     fail_unless(fabs((G->getRadius().getAbsoluteValue() - 20.20) / 20.20) < 1e-9);
206     fail_unless(fabs((G->getRadius().getRelativeValue() - 21.21) / 21.21) < 1e-9);
207     fail_unless(fabs((G->getFocalPointX().getAbsoluteValue() - 9.9) / 9.9) < 1e-9);
208     fail_unless(fabs((G->getFocalPointX().getRelativeValue() - 10.10) / 10.10) < 1e-9);
209     fail_unless(fabs((G->getFocalPointY().getAbsoluteValue() - 11.11) / 11.11) < 1e-9);
210     fail_unless(fabs((G->getFocalPointY().getRelativeValue() - 12.12) / 12.12) < 1e-9);
211     fail_unless(G->getFocalPointZ().getAbsoluteValue() < 1e-9);
212     fail_unless(G->getFocalPointZ().getRelativeValue() < 1e-9);
213 }
214 END_TEST
215 
216 
START_TEST(test_RadialGradient_read)217 START_TEST ( test_RadialGradient_read )
218 {
219   std::string s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
220                   "<radialGradient id=\"gradient\">\n"
221                   "  <stop offset=\"20%\" stop-color=\"#FF0000\"/>\n"
222                   "  <stop offset=\"80%\" stop-color=\"#0000FF\"/>\n"
223                   "</radialGradient>\n"
224                 ;
225 
226   XMLInputStream* pStream= new XMLInputStream(s.c_str(),false);
227   XMLNode* pNode = new XMLNode(*pStream);
228 
229   // required attributes
230   RadialGradient r(*pNode, 4);
231   fail_unless(r.isSetId());
232   fail_unless(r.getId() == "gradient");
233   fail_unless(r.getSpreadMethod() == GradientBase::PAD);
234   fail_unless(r.getNumGradientStops() == 2);
235   fail_unless(r.getGradientStop(0)->getOffset().getAbsoluteValue() < 1e-9);
236   fail_unless(fabs((r.getGradientStop(0)->getOffset().getRelativeValue() - 20.0) / 20.0) < 1e-9);
237   fail_unless(r.getGradientStop(0)->getStopColor() == "#FF0000");
238   fail_unless(r.getGradientStop(1)->getOffset().getAbsoluteValue() < 1e-9);
239   fail_unless(fabs((r.getGradientStop(1)->getOffset().getRelativeValue() - 80.0) / 80.0) < 1e-9);
240   fail_unless(r.getGradientStop(1)->getStopColor() == "#0000FF");
241   // radial gradient attributes
242   fail_unless(r.getCenterX().getAbsoluteValue() < 1e-9);
243   fail_unless(fabs((r.getCenterX().getRelativeValue() - 50.0) / 50.0) < 1e-9);
244   fail_unless(r.getCenterY().getAbsoluteValue() < 1e-9);
245   fail_unless(fabs((r.getCenterY().getRelativeValue() - 50.0) / 50.0) < 1e-9);
246   fail_unless(r.getCenterZ().getAbsoluteValue() < 1e-9);
247   fail_unless(fabs((r.getCenterZ().getRelativeValue() - 50.0) / 50.0) < 1e-9);
248   fail_unless(r.getFocalPointX().getAbsoluteValue() < 1e-9);
249   fail_unless(fabs((r.getFocalPointX().getRelativeValue() - r.getCenterX().getRelativeValue()) / r.getCenterX().getRelativeValue()) < 1e-9);
250   fail_unless(r.getFocalPointY().getAbsoluteValue() < 1e-9);
251   fail_unless(fabs((r.getFocalPointY().getRelativeValue() - r.getCenterY().getRelativeValue()) / r.getCenterY().getRelativeValue()) < 1e-9);
252   fail_unless(r.getFocalPointZ().getAbsoluteValue() < 1e-9);
253   fail_unless(fabs((r.getFocalPointZ().getRelativeValue() - r.getCenterZ().getRelativeValue()) / r.getCenterZ().getRelativeValue()) < 1e-9);
254   fail_unless(r.getRadius().getAbsoluteValue() < 1e-9);
255   fail_unless(fabs((r.getRadius().getRelativeValue() - 50.0) / 50.0) < 1e-9);
256 
257   delete pNode;
258   delete pStream;
259 
260   s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
261       "<radialGradient id=\"gradient\" spreadMethod=\"reflect\"\n"
262       "                cx=\"3.0\" cy=\"4.0\" cz=\"5.0\"\n"
263       "                fx=\"6.0\" fy=\"7.0\" fz=\"8.0\" r=\"9.0\">\n"
264       "  <stop offset=\"20%\" stop-color=\"#FF0000\"/>\n"
265       "  <stop offset=\"80%\" stop-color=\"#0000FF\"/>\n"
266       "</radialGradient>\n"
267     ;
268 
269   pStream= new XMLInputStream(s.c_str(),false);
270   pNode = new XMLNode(*pStream);
271 
272   // optional attributes
273   r = RadialGradient(*pNode, 4);
274   fail_unless(r.isSetId());
275   fail_unless(r.getId() == "gradient");
276   fail_unless(r.getSpreadMethod() == GradientBase::REFLECT);
277   fail_unless(r.getNumGradientStops() == 2);
278   fail_unless(r.getGradientStop(0)->getOffset().getAbsoluteValue() < 1e-9);
279   fail_unless(fabs((r.getGradientStop(0)->getOffset().getRelativeValue() - 20.0) / 20.0) < 1e-9);
280   fail_unless(r.getGradientStop(0)->getStopColor() == "#FF0000");
281   fail_unless(r.getGradientStop(1)->getOffset().getAbsoluteValue() < 1e-9);
282   fail_unless(fabs((r.getGradientStop(1)->getOffset().getRelativeValue() - 80.0) / 80.0) < 1e-9);
283   fail_unless(r.getGradientStop(1)->getStopColor() == "#0000FF");
284   // radial gradient attributes
285   fail_unless(fabs((r.getCenterX().getAbsoluteValue() - 3.0) / 3.0) < 1e-9);
286   fail_unless(r.getCenterX().getRelativeValue() < 1e-9);
287   fail_unless(fabs((r.getCenterY().getAbsoluteValue() - 4.0) / 4.0) < 1e-9);
288   fail_unless(r.getCenterY().getRelativeValue() < 1e-9);
289   fail_unless(fabs((r.getCenterZ().getAbsoluteValue() - 5.0) / 5.0) < 1e-9);
290   fail_unless(r.getCenterZ().getRelativeValue() < 1e-9);
291   fail_unless(fabs((r.getFocalPointX().getAbsoluteValue() - 6.0) / 6.0) < 1e-9);
292   fail_unless(r.getFocalPointX().getRelativeValue() < 1e-9);
293   fail_unless(fabs((r.getFocalPointY().getAbsoluteValue() - 7.0) / 7.0) < 1e-9);
294   fail_unless(r.getFocalPointY().getRelativeValue() < 1e-9);
295   fail_unless(fabs((r.getFocalPointZ().getAbsoluteValue() - 8.0) / 8.0) < 1e-9);
296   fail_unless(r.getFocalPointZ().getRelativeValue() < 1e-9);
297   fail_unless(fabs((r.getRadius().getAbsoluteValue() - 9.0) / 9.0) < 1e-9);
298   fail_unless(r.getRadius().getRelativeValue() < 1e-9);
299 
300   delete pNode;
301   delete pStream;
302 
303 
304   s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
305       "<radialGradient id=\"gradient\" spreadMethod=\"reflect\"\n"
306       "                cx=\"3.0\" cy=\"4.0\" cz=\"5.0\" r=\"9.0\">\n"
307       "  <stop offset=\"20%\" stop-color=\"#FF0000\"/>\n"
308       "  <stop offset=\"80%\" stop-color=\"#0000FF\"/>\n"
309       "</radialGradient>\n"
310     ;
311 
312   pStream= new XMLInputStream(s.c_str(),false);
313   pNode = new XMLNode(*pStream);
314 
315   // optional focal point attributes
316   r = RadialGradient(*pNode, 4);
317   fail_unless(r.isSetId());
318   fail_unless(r.getId() == "gradient");
319   fail_unless(r.getSpreadMethod() == GradientBase::REFLECT);
320   fail_unless(r.getNumGradientStops() == 2);
321   fail_unless(r.getGradientStop(0)->getOffset().getAbsoluteValue() < 1e-9);
322   fail_unless(fabs((r.getGradientStop(0)->getOffset().getRelativeValue() - 20.0) / 20.0) < 1e-9);
323   fail_unless(r.getGradientStop(0)->getStopColor() == "#FF0000");
324   fail_unless(r.getGradientStop(1)->getOffset().getAbsoluteValue() < 1e-9);
325   fail_unless(fabs((r.getGradientStop(1)->getOffset().getRelativeValue() - 80.0) / 80.0) < 1e-9);
326   fail_unless(r.getGradientStop(1)->getStopColor() == "#0000FF");
327   // radial gradient attributes
328   fail_unless(fabs((r.getCenterX().getAbsoluteValue() - 3.0) / 3.0) < 1e-9);
329   fail_unless(r.getCenterX().getRelativeValue() < 1e-9);
330   fail_unless(fabs((r.getCenterY().getAbsoluteValue() - 4.0) / 4.0) < 1e-9);
331   fail_unless(r.getCenterY().getRelativeValue() < 1e-9);
332   fail_unless(fabs((r.getCenterZ().getAbsoluteValue() - 5.0) / 5.0) < 1e-9);
333   fail_unless(r.getCenterZ().getRelativeValue() < 1e-9);
334   fail_unless(fabs((r.getFocalPointX().getAbsoluteValue() - r.getCenterX().getAbsoluteValue()) / r.getCenterX().getAbsoluteValue()) < 1e-9);
335   fail_unless(r.getFocalPointX().getRelativeValue() < 1e-9);
336   fail_unless(fabs((r.getFocalPointY().getAbsoluteValue() - r.getCenterY().getAbsoluteValue()) / r.getCenterY().getAbsoluteValue()) < 1e-9);
337   fail_unless(r.getFocalPointY().getRelativeValue() < 1e-9);
338   fail_unless(fabs((r.getFocalPointZ().getAbsoluteValue() - r.getCenterZ().getAbsoluteValue()) / r.getCenterZ().getAbsoluteValue()) < 1e-9);
339   fail_unless(r.getFocalPointZ().getRelativeValue() < 1e-9);
340   fail_unless(fabs((r.getRadius().getAbsoluteValue() - 9.0) / 9.0) < 1e-9);
341   fail_unless(r.getRadius().getRelativeValue() < 1e-9);
342 
343   delete pNode;
344   delete pStream;
345 }
346 END_TEST
347 
START_TEST(test_RadialGradient_write)348 START_TEST ( test_RadialGradient_write )
349 {
350   std::string s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
351                   "<radialGradient id=\"gradient\">\n"
352                   "  <stop offset=\"20%\" stop-color=\"#FF0000\"/>\n"
353                   "  <stop offset=\"80%\" stop-color=\"#0000FF\"/>\n"
354                   "</radialGradient>\n"
355                 ;
356 
357   XMLInputStream* pStream = new XMLInputStream(s.c_str(),false);
358   XMLNode* pNode1 = new XMLNode(*pStream);
359   fail_unless(pNode1 != NULL);
360   RadialGradient* pRG = new RadialGradient(*pNode1, 4);
361   fail_unless(pRG != NULL);
362   // create the XMLNode from the object
363   XMLNode* pNode2 = new XMLNode(pRG->toXML());
364   fail_unless(pNode1 != NULL);
365   // compare the two nodes
366   fail_unless(pNode1->equals(*pNode2, true));
367   delete pNode1;
368   delete pNode2;
369   delete pStream;
370   delete pRG;
371 
372   s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
373       "<radialGradient id=\"gradient\" spreadMethod=\"reflect\"\n"
374       "                cx=\"3\" cy=\"4\" cz=\"5\"\n"
375       "                fx=\"6\" fy=\"7\" fz=\"8\" r=\"9\">\n"
376       "  <stop offset=\"20%\" stop-color=\"#ff0000\"/>\n"
377       "  <stop offset=\"80%\" stop-color=\"#0000ff\"/>\n"
378       "</radialGradient>\n"
379     ;
380 
381   pStream = new XMLInputStream(s.c_str(),false);
382   pNode1 = new XMLNode(*pStream);
383   fail_unless(pNode1 != NULL);
384   pRG = new RadialGradient(*pNode1, 4);
385   fail_unless(pRG != NULL);
386   // create the XMLNode from the object
387   pNode2 = new XMLNode(pRG->toXML());
388   fail_unless(pNode1 != NULL);
389   // compare the two nodes
390   fail_unless(pNode1->equals(*pNode2, true));
391   delete pNode1;
392   delete pNode2;
393   delete pStream;
394   delete pRG;
395 
396   s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
397       "<radialGradient id=\"gradient\" spreadMethod=\"reflect\"\n"
398       "                cx=\"3\" cy=\"4\" cz=\"5\" r=\"9\">\n"
399       "  <stop offset=\"20%\" stop-color=\"#ff0000\"/>\n"
400       "  <stop offset=\"80%\" stop-color=\"#0000ff\"/>\n"
401       "</radialGradient>\n"
402     ;
403 
404   pStream = new XMLInputStream(s.c_str(),false);
405   pNode1 = new XMLNode(*pStream);
406   fail_unless(pNode1 != NULL);
407   pRG = new RadialGradient(*pNode1, 4);
408   fail_unless(pRG != NULL);
409   // create the XMLNode from the object
410   pNode2 = new XMLNode(pRG->toXML());
411   fail_unless(pNode1 != NULL);
412   // compare the two nodes
413   fail_unless(pNode1->equals(*pNode2, true));
414   delete pNode1;
415   delete pNode2;
416   delete pStream;
417   delete pRG;
418 
419 }
420 END_TEST
421 
422 Suite *
create_suite_RadialGradient(void)423 create_suite_RadialGradient (void)
424 {
425   Suite *suite = suite_create("RadialGradient");
426   TCase *tcase = tcase_create("RadialGradient");
427 
428 
429   tcase_add_checked_fixture( tcase,
430                              RadialGradientTest_setup,
431                              RadialGradientTest_teardown );
432 
433   tcase_add_test( tcase, test_RadialGradient_setters );
434   tcase_add_test( tcase, test_RadialGradient_read    );
435   tcase_add_test( tcase, test_RadialGradient_write   );
436 
437   suite_add_tcase(suite, tcase);
438 
439   return suite;
440 }
441 
442 END_C_DECLS
443