1 #include <cxxtest/TestSuite.h>
3 #include "svg/svg-length.h"
4 #include <glib.h>
5 #include <utility>
7 // function internal to svg-length.cpp:
8 gchar const *sp_svg_length_get_css_units(SVGLength::Unit unit);
10 class SvgLengthTest : public CxxTest::TestSuite
11 {
12 private:
13 struct test_t {
14 char const* str; SVGLength::Unit unit; float value; float computed;
15 };
16 static test_t const absolute_tests[12];
17 static test_t const relative_tests[3];
18 static char const * fail_tests[8];
19 public:
20 SvgLengthTest() {
21 }
23 // createSuite and destroySuite get us per-suite setup and teardown
24 // without us having to worry about static initialization order, etc.
25 static SvgLengthTest *createSuite() { return new SvgLengthTest(); }
26 static void destroySuite( SvgLengthTest *suite ) { delete suite; }
28 void testRead()
29 {
30 for(size_t i=0; i<G_N_ELEMENTS(absolute_tests); i++) {
31 SVGLength l;
32 TSM_ASSERT(absolute_tests[i].str , l.read(absolute_tests[i].str));
33 TSM_ASSERT_EQUALS(absolute_tests[i].str , l.unit , absolute_tests[i].unit);
34 TSM_ASSERT_EQUALS(absolute_tests[i].str , l.value , absolute_tests[i].value);
35 TSM_ASSERT_EQUALS(absolute_tests[i].str , l.computed , absolute_tests[i].computed);
36 }
37 for(size_t i=0; i<G_N_ELEMENTS(relative_tests); i++) {
38 SVGLength l;
39 TSM_ASSERT(relative_tests[i].str , l.read(relative_tests[i].str));
40 l.update(7,13,19);
41 TSM_ASSERT_EQUALS(relative_tests[i].str , l.unit , relative_tests[i].unit);
42 TSM_ASSERT_EQUALS(relative_tests[i].str , l.value , relative_tests[i].value);
43 TSM_ASSERT_EQUALS(relative_tests[i].str , l.computed , relative_tests[i].computed);
44 }
45 for(size_t i=0; i<G_N_ELEMENTS(fail_tests); i++) {
46 SVGLength l;
47 TSM_ASSERT(fail_tests[i] , !l.read(fail_tests[i]));
48 }
49 }
51 void testReadOrUnset()
52 {
53 for(size_t i=0; i<G_N_ELEMENTS(absolute_tests); i++) {
54 SVGLength l;
55 l.readOrUnset(absolute_tests[i].str);
56 TSM_ASSERT_EQUALS(absolute_tests[i].str , l.unit , absolute_tests[i].unit);
57 TSM_ASSERT_EQUALS(absolute_tests[i].str , l.value , absolute_tests[i].value);
58 TSM_ASSERT_EQUALS(absolute_tests[i].str , l.computed , absolute_tests[i].computed);
59 }
60 for(size_t i=0; i<G_N_ELEMENTS(relative_tests); i++) {
61 SVGLength l;
62 l.readOrUnset(relative_tests[i].str);
63 l.update(7,13,19);
64 TSM_ASSERT_EQUALS(relative_tests[i].str , l.unit , relative_tests[i].unit);
65 TSM_ASSERT_EQUALS(relative_tests[i].str , l.value , relative_tests[i].value);
66 TSM_ASSERT_EQUALS(relative_tests[i].str , l.computed , relative_tests[i].computed);
67 }
68 for(size_t i=0; i<G_N_ELEMENTS(fail_tests); i++) {
69 SVGLength l;
70 l.readOrUnset(fail_tests[i], SVGLength::INCH, 123, 456);
71 TSM_ASSERT_EQUALS(fail_tests[i] , l.unit , SVGLength::INCH);
72 TSM_ASSERT_EQUALS(fail_tests[i] , l.value , 123);
73 TSM_ASSERT_EQUALS(fail_tests[i] , l.computed , 456);
74 }
75 }
77 void testReadAbsolute()
78 {
79 for(size_t i=0; i<G_N_ELEMENTS(absolute_tests); i++) {
80 SVGLength l;
81 TSM_ASSERT(absolute_tests[i].str , l.readAbsolute(absolute_tests[i].str));
82 TSM_ASSERT_EQUALS(absolute_tests[i].str , l.unit , absolute_tests[i].unit);
83 TSM_ASSERT_EQUALS(absolute_tests[i].str , l.value , absolute_tests[i].value);
84 TSM_ASSERT_EQUALS(absolute_tests[i].str , l.computed , absolute_tests[i].computed);
85 }
86 for(size_t i=0; i<G_N_ELEMENTS(relative_tests); i++) {
87 SVGLength l;
88 TSM_ASSERT(relative_tests[i].str , !l.readAbsolute(relative_tests[i].str));
89 }
90 for(size_t i=0; i<G_N_ELEMENTS(fail_tests); i++) {
91 SVGLength l;
92 TSM_ASSERT(fail_tests[i] , !l.readAbsolute(fail_tests[i]));
93 }
94 }
96 void testEnumMappedToString()
97 {
98 for ( int i = (static_cast<int>(SVGLength::NONE) + 1); i <= static_cast<int>(SVGLength::LAST_UNIT); i++ ) {
99 SVGLength::Unit target = static_cast<SVGLength::Unit>(i);
100 // PX is a special case where we don't have a unit string
101 if ( (target != SVGLength::PX) && (target != SVGLength::FOOT) ) {
102 gchar const* val = sp_svg_length_get_css_units(target);
103 TSM_ASSERT_DIFFERS(i, val, "");
104 }
105 }
106 }
108 // Ensure that all unit suffix strings used are allowed by SVG
109 void testStringsAreValidSVG()
110 {
111 gchar const* valid[] = {"", "em", "ex", "px", "pt", "pc", "cm", "mm", "in", "%"};
112 std::set<std::string> validStrings(valid, valid + G_N_ELEMENTS(valid));
113 for ( int i = (static_cast<int>(SVGLength::NONE) + 1); i <= static_cast<int>(SVGLength::LAST_UNIT); i++ ) {
114 SVGLength::Unit target = static_cast<SVGLength::Unit>(i);
115 gchar const* val = sp_svg_length_get_css_units(target);
116 TSM_ASSERT(i, validStrings.find(std::string(val)) != validStrings.end());
117 }
118 }
120 // Ensure that all unit suffix strings allowed by SVG are covered by enum
121 void testValidSVGStringsSupported()
122 {
123 // Note that "px" is ommitted from the list, as it will be assumed to be so if not explicitly set.
124 gchar const* valid[] = {"em", "ex", "pt", "pc", "cm", "mm", "in", "%"};
125 std::set<std::string> validStrings(valid, valid + G_N_ELEMENTS(valid));
126 for ( int i = (static_cast<int>(SVGLength::NONE) + 1); i <= static_cast<int>(SVGLength::LAST_UNIT); i++ ) {
127 SVGLength::Unit target = static_cast<SVGLength::Unit>(i);
128 gchar const* val = sp_svg_length_get_css_units(target);
129 std::set<std::string>::iterator iter = validStrings.find(std::string(val));
130 if (iter != validStrings.end()) {
131 validStrings.erase(iter);
132 }
133 }
134 TSM_ASSERT_EQUALS(validStrings, validStrings.size(), 0u);
135 }
137 // TODO: More tests
138 };
140 SvgLengthTest::test_t const SvgLengthTest::absolute_tests[12] = {
141 {"0", SVGLength::NONE, 0 , 0},
142 {"1", SVGLength::NONE, 1 , 1},
143 {"1.00001", SVGLength::NONE, 1.00001 , 1.00001},
144 {"1px", SVGLength::PX , 1 , 1},
145 {".1px", SVGLength::PX , 0.1 , 0.1},
146 {"100pt", SVGLength::PT , 100 , 125},
147 {"1e2pt", SVGLength::PT , 100 , 125},
148 {"3pc", SVGLength::PC , 3 , 45},
149 {"-3.5pc", SVGLength::PC , -3.5 , -3.5*15.},
150 {"1.2345678mm", SVGLength::MM , 1.2345678, 1.2345678*3.543307}, // TODO: More precise constants? (a 7 digit constant when the default precision is 8 digits?)
151 {"123.45678cm", SVGLength::CM , 123.45678 , 123.45678*35.43307},
152 {"73.162987in", SVGLength::INCH, 73.162987 , 73.162987*90}};
153 SvgLengthTest::test_t const SvgLengthTest::relative_tests[3] = {
154 {"123em", SVGLength::EM, 123, 123. * 7.},
155 {"123ex", SVGLength::EX, 123, 123. * 13.},
156 {"123%", SVGLength::PERCENT, 1.23, 1.23 * 19.}};
157 char const * SvgLengthTest::fail_tests[8] = {
158 "123 px",
159 "123e",
160 "123e+m",
161 "123ec",
162 "123pxt",
163 "--123",
164 "",
165 "px"};
167 /*
168 Local Variables:
169 mode:c++
170 c-file-style:"stroustrup"
171 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
172 indent-tabs-mode:nil
173 fill-column:99
174 End:
175 */
176 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :