svg-affine-test.h revision 39a897cf2c4e5c0208d081fe7d51dc893b5c33d1
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz char const * str;
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen bool operator()(Geom::Affine const &ref, Geom::Affine const &cm) const
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk maxabsdiff = std::max(std::abs(ref[i]-cm[i]), maxabsdiff);
9eb886f0efdd076022ef171278e8475a580a1e91jaspervdg// createSuite and destroySuite get us per-suite setup and teardown
9eb886f0efdd076022ef171278e8475a580a1e91jaspervdg// without us having to worry about static initialization order, etc.
9eb886f0efdd076022ef171278e8475a580a1e91jaspervdg static SvgAffineTest *createSuite() { return new SvgAffineTest(); }
9eb886f0efdd076022ef171278e8475a580a1e91jaspervdg static void destroySuite( SvgAffineTest *suite ) { delete suite; }
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz char const* strs[] = {
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz "matrix(1,0,0,1,0,0)",
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz "translate(0,0)",
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz "scale(1,1)",
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz "rotate(0,0,0)",
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz "skewX(0)",
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz "skewY(0)"};
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz for(size_t i=0; i<n; i++) {
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz TSM_ASSERT(strs[i] , sp_svg_transform_read(strs[i], &cm));
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz TS_ASSERT_EQUALS(sp_svg_transform_write(Geom::identity()) , (void*)0)
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz for(size_t i=0; i<G_N_ELEMENTS(read_matrix_tests); i++) {
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz TSM_ASSERT(read_matrix_tests[i].str , sp_svg_transform_read(read_matrix_tests[i].str, &cm));
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk TSM_ASSERT_RELATION(read_matrix_tests[i].str , approx_equal_pred , read_matrix_tests[i].matrix , cm);
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz for(size_t i=0; i<G_N_ELEMENTS(read_translate_tests); i++) {
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz TSM_ASSERT(read_translate_tests[i].str , sp_svg_transform_read(read_translate_tests[i].str, &cm));
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk TSM_ASSERT_RELATION(read_translate_tests[i].str , approx_equal_pred , read_translate_tests[i].matrix , cm);
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz for(size_t i=0; i<G_N_ELEMENTS(read_scale_tests); i++) {
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz TSM_ASSERT(read_scale_tests[i].str , sp_svg_transform_read(read_scale_tests[i].str, &cm));
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk TSM_ASSERT_RELATION(read_scale_tests[i].str , approx_equal_pred , read_scale_tests[i].matrix , cm);
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz for(size_t i=0; i<G_N_ELEMENTS(read_rotate_tests); i++) {
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz TSM_ASSERT(read_rotate_tests[i].str , sp_svg_transform_read(read_rotate_tests[i].str, &cm));
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk TSM_ASSERT_RELATION(read_rotate_tests[i].str , approx_equal_pred , read_rotate_tests[i].matrix , cm);
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz for(size_t i=0; i<G_N_ELEMENTS(read_skew_tests); i++) {
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz TSM_ASSERT(read_skew_tests[i].str , sp_svg_transform_read(read_skew_tests[i].str, &cm));
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk TSM_ASSERT_RELATION(read_skew_tests[i].str , approx_equal_pred , read_skew_tests[i].matrix , cm);
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz for(size_t i=0; i<G_N_ELEMENTS(write_matrix_tests); i++) {
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg char * str = sp_svg_transform_write(write_matrix_tests[i].matrix);
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg TS_ASSERT_RELATION(streq_rel , str , write_matrix_tests[i].str);
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz for(size_t i=0; i<G_N_ELEMENTS(write_translate_tests); i++) {
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg char * str = sp_svg_transform_write(write_translate_tests[i].matrix);
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg TS_ASSERT_RELATION(streq_rel , str , write_translate_tests[i].str);
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz for(size_t i=0; i<G_N_ELEMENTS(write_scale_tests); i++) {
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg char * str = sp_svg_transform_write(write_scale_tests[i].matrix);
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg TS_ASSERT_RELATION(streq_rel , str , write_scale_tests[i].str);
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz for(size_t i=0; i<G_N_ELEMENTS(write_rotate_tests); i++) {
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg char * str = sp_svg_transform_write(write_rotate_tests[i].matrix);
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg TS_ASSERT_RELATION(streq_rel , str , write_rotate_tests[i].str);
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz for(size_t i=0; i<G_N_ELEMENTS(write_skew_tests); i++) {
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg char * str = sp_svg_transform_write(write_skew_tests[i].matrix);
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg TS_ASSERT_RELATION(streq_rel , str , write_skew_tests[i].str);
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg // NOTE: According to the SVG specification (see the syntax at http://www.w3.org/TR/SVG/coords.html#TransformAttribute
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg // there should be 1 or more comma-wsp sequences between transforms... This doesn't make sense and it seems
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg // likely that instead of a + they meant a ? (zero or one comma-wsp sequences).
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz char const * str = "skewY(17)skewX(9)translate(7,13)scale(2)rotate(13)translate(3,5)";
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen Geom::Affine ref(2.0199976232558053, 1.0674773585906016, -0.14125199392774669, 1.9055550612095459, 14.412730624347654, 28.499820929377454); // Precomputed using Mathematica
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg for(size_t i=0; i<G_N_ELEMENTS(read_fail_tests); i++) {
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg TSM_ASSERT(read_fail_tests[i] , !sp_svg_transform_read(read_fail_tests[i], &cm));
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruzSvgAffineTest::test_t const SvgAffineTest::read_matrix_tests[3] = {
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen {"matrix(0,0,0,0,0,0)",Geom::Affine(0,0,0,0,0,0)},
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen {" matrix(1,2,3,4,5,6)",Geom::Affine(1,2,3,4,5,6)},
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen {"matrix (1 2 -3,-4,5e6,-6e-7)",Geom::Affine(1,2,-3,-4,5e6,-6e-7)}};
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruzSvgAffineTest::test_t const SvgAffineTest::read_translate_tests[3] = {
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen {"translate(-1e3 .123e2)",Geom::Affine(1,0,0,1,-1e3,.123e2)}};
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruzSvgAffineTest::test_t const SvgAffineTest::read_scale_tests[3] = {
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen {"scale(0.1e-2 -.475e0)",Geom::Affine(0.1e-2,0,0,-.475e0,0,0)}};
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruzSvgAffineTest::test_t const SvgAffineTest::read_rotate_tests[4] = {
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen {"rotate(13 )",Geom::Affine(cos(13.*DEGREE),sin(13.*DEGREE),-sin(13.*DEGREE),cos(13.*DEGREE),0,0)},
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen {"rotate(-13)",Geom::Affine(cos(-13.*DEGREE),sin(-13.*DEGREE),-sin(-13.*DEGREE),cos(-13.*DEGREE),0,0)},
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen {"rotate(373)",Geom::Affine(cos(13.*DEGREE),sin(13.*DEGREE),-sin(13.*DEGREE),cos(13.*DEGREE),0,0)},
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen {"rotate(13,7,11)",Geom::Affine(cos(13.*DEGREE),sin(13.*DEGREE),-sin(13.*DEGREE),cos(13.*DEGREE),(1-cos(13.*DEGREE))*7+sin(13.*DEGREE)*11,(1-cos(13.*DEGREE))*11-sin(13.*DEGREE)*7)}};
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruzSvgAffineTest::test_t const SvgAffineTest::read_skew_tests[3] = {
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen {"skewX( 30)",Geom::Affine(1,0,tan(30.*DEGREE),1,0,0)},
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen {"skewX(-30)",Geom::Affine(1,0,tan(-30.*DEGREE),1,0,0)},
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen {"skewY(390)",Geom::Affine(1,tan(30.*DEGREE),0,1,0,0)}};
9eb886f0efdd076022ef171278e8475a580a1e91jaspervdgchar const * const SvgAffineTest::read_fail_tests[25] = {
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg "matrix((1,2,3,4,5,6)",
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg "matrix((1,2,3,4,5,6))",
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg "matrix(1,2,3,4,5,6))",
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg "matrix(,1,2,3,4,5,6)",
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg "matrix(1,2,3,4,5,6,)",
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg "matrix(1,2,3,4,5,)",
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg "matrix(1,2,3,4,5)",
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg "matrix(1,2,3,4,5e6-3)", // Here numbers HAVE to be separated by a comma-wsp sequence
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg "matrix(1,2,3,4,5e6.3)", // Here numbers HAVE to be separated by a comma-wsp sequence
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg "translate()",
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg "translate(,)",
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg "translate(1,)",
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg "translate(1,6,)",
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg "translate(1,6,0)",
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg "scale(1,6,2)",
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg "rotate(1,6)",
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg "rotate(1,6,)",
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg "rotate(1,6,3,4)",
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg "skewY(1,2)"};
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruzSvgAffineTest::test_t const SvgAffineTest::write_matrix_tests[2] = {
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen {"matrix(1,2,3,4,5,6)",Geom::Affine(1,2,3,4,5,6)},
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen {"matrix(-1,2123,3,0.4,1e-8,1e20)",Geom::Affine(-1,2.123e3,3+1e-14,0.4,1e-8,1e20)}};
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruzSvgAffineTest::test_t const SvgAffineTest::write_translate_tests[3] = {
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen {"translate(-1345,0.123)",Geom::Affine(1,0,0,1,-1.345e3,.123)}};
39a897cf2c4e5c0208d081fe7d51dc893b5c33d1Liam P. WhiteSvgAffineTest::test_t const SvgAffineTest::write_scale_tests[3] = {
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruzSvgAffineTest::test_t const SvgAffineTest::write_rotate_tests[2] = {
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen {"rotate(13)",Geom::Affine(cos(13.*DEGREE),sin(13.*DEGREE),-sin(13.*DEGREE),cos(13.*DEGREE),0,0)},
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen {"rotate(-13,7,11)",Geom::Affine(cos(-13.*DEGREE),sin(-13.*DEGREE),-sin(-13.*DEGREE),cos(-13.*DEGREE),(1-cos(-13.*DEGREE))*7+sin(-13.*DEGREE)*11,(1-cos(-13.*DEGREE))*11-sin(-13.*DEGREE)*7)}};
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruzSvgAffineTest::test_t const SvgAffineTest::write_skew_tests[3] = {
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen {"skewX(30)",Geom::Affine(1,0,tan(30.*DEGREE),1,0,0)},
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen {"skewX(-30)",Geom::Affine(1,0,tan(-30.*DEGREE),1,0,0)},
7171e57dfc6ef06705f2df1bb917ce7de8fc5f5bLiam P. White {"skewY(30)",Geom::Affine(1,tan(30.*DEGREE),0,1,0,0)}};
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz Local Variables:
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz c-file-style:"stroustrup"
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz indent-tabs-mode:nil
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz fill-column:99
a4030d5ca449e7e384bc699cd249ee704faaeab0Chris Morgan// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :