summaryrefslogtreecommitdiffstats
path: root/testfiles
diff options
context:
space:
mode:
authorJabier Arraiza <jabier.arraiza@marker.es>2017-11-03 00:10:02 +0000
committerJabier Arraiza <jabier.arraiza@marker.es>2017-11-03 00:10:02 +0000
commitd2df0412f728dd5bb54537dfdfe7c35b34d40e0e (patch)
treee2703384779e83312c456399999997fcc289c5cf /testfiles
parentMerge branch 'master' into powerpencil (diff)
parentchange assignment to equality (diff)
downloadinkscape-d2df0412f728dd5bb54537dfdfe7c35b34d40e0e.tar.gz
inkscape-d2df0412f728dd5bb54537dfdfe7c35b34d40e0e.zip
Merge branch 'master' into powerpencil
Diffstat (limited to 'testfiles')
-rw-r--r--testfiles/CMakeLists.txt17
-rw-r--r--testfiles/fuzzer.cpp15
-rw-r--r--testfiles/fuzzer.dict525
-rw-r--r--testfiles/rendering_tests/CMakeLists.txt4
-rw-r--r--testfiles/rendering_tests/expected_rendering/selector-important-002-large.pngbin0 -> 11306 bytes
-rw-r--r--testfiles/rendering_tests/expected_rendering/selector-important-002.pngbin0 -> 921 bytes
-rw-r--r--testfiles/rendering_tests/expected_rendering/selector-important-003-large.pngbin0 -> 11308 bytes
-rw-r--r--testfiles/rendering_tests/expected_rendering/selector-important-003.pngbin0 -> 925 bytes
-rw-r--r--testfiles/rendering_tests/expected_rendering/test-glyph-y-pos-large.pngbin0 -> 72842 bytes
-rw-r--r--testfiles/rendering_tests/expected_rendering/test-glyph-y-pos.pngbin0 -> 13506 bytes
-rw-r--r--testfiles/rendering_tests/expected_rendering/test-rtl-vertical-large.pngbin0 -> 54382 bytes
-rw-r--r--testfiles/rendering_tests/expected_rendering/test-rtl-vertical.pngbin0 -> 9856 bytes
-rw-r--r--testfiles/rendering_tests/selector-important-002.svg58
-rw-r--r--testfiles/rendering_tests/selector-important-003.svg57
-rw-r--r--testfiles/rendering_tests/test-glyph-y-pos.svg26
-rw-r--r--testfiles/rendering_tests/test-rtl-vertical.svg26
-rw-r--r--testfiles/src/attributes-test.cpp5
-rw-r--r--testfiles/src/cxxtests-to-migrate/style-test.h537
-rw-r--r--testfiles/src/style-test.cpp575
19 files changed, 1305 insertions, 540 deletions
diff --git a/testfiles/CMakeLists.txt b/testfiles/CMakeLists.txt
index e7198a39f..2f721d820 100644
--- a/testfiles/CMakeLists.txt
+++ b/testfiles/CMakeLists.txt
@@ -14,7 +14,8 @@ set(TEST_SOURCES
color-profile-test
dir-util-test
sp-object-test
- object-set-test)
+ object-set-test
+ style-test)
set(TEST_LIBS
gmock_main
@@ -30,3 +31,17 @@ foreach(source ${TEST_SOURCES})
add_dependencies(tests ${source})
endforeach()
add_subdirectory(rendering_tests)
+
+
+if(WITH_FUZZ)
+ # to use the fuzzer, make sure you use the right compiler (clang)
+ # with the right flags -fsanitize=address -fsanitize-coverage=edge,trace-pc-guard,indirect-calls,trace-cmp,trace-div,trace-gep -fno-omit-frame-pointer
+ # (see libfuzzer doc for info in flags)
+ # first line is for integration into oss-fuzz https://github.com/google/oss-fuzz
+ add_executable(fuzz fuzzer.cpp)
+ if(LIB_FUZZING_ENGINE)
+ target_link_libraries(fuzz inkscape_base -lFuzzingEngine)
+ else()
+ target_link_libraries(fuzz inkscape_base -lFuzzer)
+ endif()
+endif()
diff --git a/testfiles/fuzzer.cpp b/testfiles/fuzzer.cpp
new file mode 100644
index 000000000..6dd09e753
--- /dev/null
+++ b/testfiles/fuzzer.cpp
@@ -0,0 +1,15 @@
+#include "xml/repr.h"
+#include "inkscape.h"
+#include "document.h"
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+ g_type_init();
+ Inkscape::GC::init();
+ if ( !Inkscape::Application::exists() )
+ Inkscape::Application::create("", false);
+ //void* a= sp_repr_read_mem((const char*)data, size, 0);
+ SPDocument *doc = SPDocument::createNewDocFromMem( (const char*)data, size, 0);
+ if(doc)
+ doc->doUnref();
+ return 0;
+}
diff --git a/testfiles/fuzzer.dict b/testfiles/fuzzer.dict
new file mode 100644
index 000000000..8fae9bd4e
--- /dev/null
+++ b/testfiles/fuzzer.dict
@@ -0,0 +1,525 @@
+# Dictionary for the fuzzer to "guess" faster important words.
+# Contains xml keywords and svg element names and attributes.
+# It might be useful to remove some of them, maybe.
+
+"100"
+"200"
+"300"
+"400"
+"500"
+"600"
+"700"
+"800"
+"900"
+"a"
+"accent-height"
+"accumulate"
+"additive"
+"after-edge"
+"alignment-baseline"
+"all"
+"alphabetic"
+"altGlyph"
+"altGlyphDef"
+"altGlyphItem"
+"amplitude"
+"animate"
+"animateColor"
+"animateMotion"
+"animateTransform"
+"arabic-form"
+"ascent"
+attr_encoding=" encoding=\"1\""
+attr_generic=" a=\"1\""
+attr_href=" href=\"1\""
+"attributeName"
+"attributeType"
+attr_standalone=" standalone=\"no\""
+attr_version=" version=\"1\""
+attr_xml_base=" xml:base=\"1\""
+attr_xml_id=" xml:id=\"1\""
+attr_xml_lang=" xml:lang=\"1\""
+attr_xmlns=" xmlns=\"1\""
+attr_xml_space=" xml:space=\"1\""
+"auto"
+"azimuth"
+"baseFrequency"
+"baseline"
+"baseline-shift"
+"baseProfile"
+"bbox"
+"before-edge"
+"begin"
+"bevel"
+"bias"
+"bidi-override"
+"blink"
+"block"
+"bold"
+"bolder"
+"butt"
+"by"
+"calcMode"
+"cap-height"
+"caption"
+"central"
+"circle"
+"class"
+"clip"
+"clip-path"
+"clipPath"
+"clipPathUnits"
+"clip-rule"
+"collapse"
+"color"
+"color-interpolation"
+"color-interpolation-filters"
+"color-profile"
+"color-rendering"
+"compact"
+"condensed"
+"contentScriptType"
+"contentStyleType"
+"crispEdges"
+"crosshair"
+"currentColor"
+"cursor"
+"cx"
+"cy"
+"d"
+"default"
+"defs"
+"desc"
+"descent"
+"diffuseConstant"
+"direction"
+"display"
+"divisor"
+"dominant-baseline"
+"dur"
+"dx"
+"dy"
+"edgeMode"
+"elevation"
+"ellipse"
+"embed"
+"enable-background"
+"end"
+entity_builtin="&lt;"
+entity_decimal="&#1;"
+entity_external="&a;"
+entity_hex="&#x1;"
+"e-resize"
+"evenodd"
+"expanded"
+"exponent"
+"externalResourcesRequired"
+"extra-condensed"
+"extra-expanded"
+"feBlend"
+"feColorMatrix"
+"feComponentTransfer"
+"feComposite"
+"feConvolveMatrix"
+"feDiffuseLighting"
+"feDisplacementMap"
+"feDistantLight"
+"feFlood"
+"feFuncA"
+"feFuncB"
+"feFuncG"
+"feFuncR"
+"feGaussianBlur"
+"feImage"
+"feMerge"
+"feMergeNode"
+"feMorphology"
+"feOffset"
+"fePointLight"
+"feSpecularLighting"
+"feSpotLight"
+"feTile"
+"feTurbulence"
+"fill"
+"fill-opacity"
+"fill-rule"
+"filter"
+"filterRes"
+"filterUnits"
+"flood-color"
+"flood-opacity"
+"font"
+"font-face"
+"font-face-format"
+"font-face-name"
+"font-face-src"
+"font-face-uri"
+"font-family"
+"font-size"
+"font-size-adjust"
+"font-stretch"
+"font-style"
+"font-variant"
+"font-weight"
+"foreignObject"
+"format"
+"from"
+"fx"
+"fy"
+"g"
+"g1"
+"g2"
+"geometricPrecision"
+"glyph"
+"glyph-name"
+"glyph-orientation-horizontal"
+"glyph-orientation-vertical"
+"glyphRef"
+"gradientTransform"
+"gradientUnits"
+"hanging"
+"height"
+"help"
+"hidden"
+"hkern"
+"horiz-adv-x"
+"horiz-origin-x"
+"horiz-origin-y"
+"icon"
+"id"
+"ideographic"
+"image"
+"image-rendering"
+"in"
+"in2"
+"individual"
+"inherit"
+"inline"
+"inline-table"
+"intercept"
+"italic"
+"k"
+"k1"
+"k2"
+"k3"
+"k4"
+"kernelMatrix"
+"kernelUnitLength"
+"kerning"
+"keyPoints"
+"keySplines"
+"keyTimes"
+"lang"
+"lengthAdjust"
+"letter-spacing"
+"lighter"
+"lighting-color"
+"limitingConeAngle"
+"line"
+"linearGradient"
+"linearRGB"
+"'line-height'"
+"line-through"
+"list-item"
+"local"
+"lr"
+"lr-tb"
+"ltr"
+"marker"
+"marker-end"
+"markerHeight"
+"marker-mid"
+"marker-start"
+"markerUnits"
+"markerWidth"
+"mask"
+"maskContentUnits"
+"maskUnits"
+"mathematical"
+"max"
+"media"
+"menu"
+"message-box"
+"metadata"
+"method"
+"middle"
+"min"
+"missing-glyph"
+"miter"
+"mode"
+"move"
+"mpath"
+"name"
+"narrower"
+"ne-resize"
+"new"
+"no-change"
+"none"
+"nonzero"
+"normal"
+"n-resize"
+"numOctaves"
+"nw-resize"
+"oblique"
+"offset"
+"onabort"
+"onactivate"
+"onbegin"
+"onclick"
+"onend"
+"onerror"
+"onfocusin"
+"onfocusout"
+"onload"
+"onmousedown"
+"onmousemove"
+"onmouseout"
+"onmouseover"
+"onmouseup"
+"onrepeat"
+"onresize"
+"onscroll"
+"onunload"
+"onzoom"
+"opacity"
+"operator"
+"optimizeLegibility"
+"optimizeQuality"
+"optimizeSpeed"
+"order"
+"orient"
+"orientation"
+"origin"
+"overflow"
+"overline"
+"overline-position"
+"overline-thickness"
+"paint"
+"painted"
+"panose-1"
+"path"
+"pathLength"
+"pattern"
+"patternContentUnits"
+"patternTransform"
+"patternUnits"
+"pointer"
+"pointer-events"
+"points"
+"pointsAtX"
+"pointsAtY"
+"pointsAtZ"
+"polygon"
+"polyline"
+"preserveAlpha"
+"preserveAspectRatio"
+"primitiveUnits"
+"properties"
+"r"
+"radialGradient"
+"radius"
+"rect"
+"refX"
+"refY"
+"rendering-intent"
+"repeatCount"
+"repeatDur"
+"requiredExtensions"
+"requiredFeatures"
+"reset-size"
+"restart"
+"result"
+"rl"
+"rl-tb"
+"rotate"
+"round"
+"rtl"
+"run-in"
+"rx"
+"ry"
+"scale"
+"script"
+"scroll"
+"see"
+"seed"
+"semi-condensed"
+"semi-expanded"
+"se-resize"
+"set"
+"shape-rendering"
+"slope"
+"small-caps"
+"small-caption"
+"spacing"
+"Specifying"
+"specularConstant"
+"specularExponent"
+"spreadMethod"
+"square"
+"s-resize"
+"sRGB"
+"start"
+"startOffset"
+"status-bar"
+"stdDeviation"
+"stemh"
+"stemv"
+"stitchTiles"
+"stop"
+"stop-color"
+"stop-opacity"
+"strikethrough-position"
+"strikethrough-thickness"
+"string"
+string_any="ANY"
+string_brackets="[]"
+string_cdata="CDATA"
+string_col_fallback=":fallback"
+string_col_generic=":a"
+string_col_include=":include"
+string_dashes="--"
+string_empty_dblquotes="\"\""
+string_empty="EMPTY"
+string_empty_quotes="''"
+string_entities="ENTITIES"
+string_entity="ENTITY"
+string_fixed="#FIXED"
+string_id="ID"
+string_idref="IDREF"
+string_idrefs="IDREFS"
+string_implied="#IMPLIED"
+string_nmtoken="NMTOKEN"
+string_nmtokens="NMTOKENS"
+string_notation="NOTATION"
+string_parentheses="()"
+string_pcdata="#PCDATA"
+string_percent="%a"
+string_public="PUBLIC"
+string_required="#REQUIRED"
+string_schema=":schema"
+string_system="SYSTEM"
+string_ucs4="UCS-4"
+string_utf16="UTF-16"
+string_utf8="UTF-8"
+string_xmlns="xmlns:"
+"stroke"
+"stroke-dasharray"
+"stroke-dashoffset"
+"stroke-linecap"
+"stroke-linejoin"
+"stroke-miterlimit"
+"stroke-opacity"
+"stroke-width"
+"style"
+"sub"
+"super"
+"surfaceScale"
+"svg"
+"switch"
+"sw-resize"
+"symbol"
+"systemLanguage"
+"table"
+"table-caption"
+"table-cell"
+"table-column"
+"table-column-group"
+"table-footer-group"
+"table-header-group"
+"table-row"
+"table-row-group"
+"tableValues"
+tag_attlist="<!ATTLIST"
+tag_cdata="<![CDATA["
+tag_close="</a>"
+tag_doctype="<!DOCTYPE"
+tag_element="<!ELEMENT"
+tag_entity="<!ENTITY"
+tag_ignore="<![IGNORE["
+tag_include="<![INCLUDE["
+tag_notation="<!NOTATION"
+tag_open="<a>"
+tag_open_close="<a />"
+tag_open_exclamation="<!"
+tag_open_q="<?"
+tag_sq2_close="]]>"
+tag_xml_q="<?xml?>"
+"target"
+"targetX"
+"targetY"
+"tb"
+"tb-rl"
+"text"
+"text-after-edge"
+"text-anchor"
+"text-before-edge"
+"text-decoration"
+"textLength"
+"textPath"
+"text-rendering"
+"title"
+"to"
+"transform"
+"tref"
+"tspan"
+"type"
+"u1"
+"u2"
+"ultra-condensed"
+"ultra-expanded"
+"underline"
+"underline-position"
+"underline-thickness"
+"unicode"
+"unicode-bidi"
+"unicode-range"
+"units-per-em"
+"use"
+"use-script"
+"v-alphabetic"
+"values"
+"version"
+"vert-adv-y"
+"vert-origin-x"
+"vert-origin-y"
+"v-hanging"
+"v-ideographic"
+"view"
+"viewBox"
+"viewTarget"
+"visibility"
+"visible"
+"visibleFill"
+"visiblePainted"
+"visibleStroke"
+"vkern"
+"v-mathematical"
+"wait"
+"wider"
+"width"
+"widths"
+"word-spacing"
+"w-resize"
+"writing-mode"
+"x"
+"x1"
+"x2"
+"xChannelSelector"
+"x-height"
+"xlink:actuate"
+"xlink:arcrole"
+"xlink:href"
+"xlink:role"
+"xlink:show"
+"xlink:title"
+"xlink:type"
+#XML
+"xml:base"
+"xml:lang"
+"xml:space"
+"y"
+"y1"
+"y2"
+"yChannelSelector"
+"z"
+"zoomAndPan"
diff --git a/testfiles/rendering_tests/CMakeLists.txt b/testfiles/rendering_tests/CMakeLists.txt
index 3f838628a..8db01d97a 100644
--- a/testfiles/rendering_tests/CMakeLists.txt
+++ b/testfiles/rendering_tests/CMakeLists.txt
@@ -2,6 +2,10 @@
#add your test here (do not put the .svg extension)
set(RENDERING_TESTS
test-empty
+ test-glyph-y-pos
+ test-rtl-vertical
+ selector-important-002
+ selector-important-003
)
diff --git a/testfiles/rendering_tests/expected_rendering/selector-important-002-large.png b/testfiles/rendering_tests/expected_rendering/selector-important-002-large.png
new file mode 100644
index 000000000..e92eef0a4
--- /dev/null
+++ b/testfiles/rendering_tests/expected_rendering/selector-important-002-large.png
Binary files differ
diff --git a/testfiles/rendering_tests/expected_rendering/selector-important-002.png b/testfiles/rendering_tests/expected_rendering/selector-important-002.png
new file mode 100644
index 000000000..b0af9bd12
--- /dev/null
+++ b/testfiles/rendering_tests/expected_rendering/selector-important-002.png
Binary files differ
diff --git a/testfiles/rendering_tests/expected_rendering/selector-important-003-large.png b/testfiles/rendering_tests/expected_rendering/selector-important-003-large.png
new file mode 100644
index 000000000..91cb3afa9
--- /dev/null
+++ b/testfiles/rendering_tests/expected_rendering/selector-important-003-large.png
Binary files differ
diff --git a/testfiles/rendering_tests/expected_rendering/selector-important-003.png b/testfiles/rendering_tests/expected_rendering/selector-important-003.png
new file mode 100644
index 000000000..dfe3dbc5a
--- /dev/null
+++ b/testfiles/rendering_tests/expected_rendering/selector-important-003.png
Binary files differ
diff --git a/testfiles/rendering_tests/expected_rendering/test-glyph-y-pos-large.png b/testfiles/rendering_tests/expected_rendering/test-glyph-y-pos-large.png
new file mode 100644
index 000000000..e60f4772d
--- /dev/null
+++ b/testfiles/rendering_tests/expected_rendering/test-glyph-y-pos-large.png
Binary files differ
diff --git a/testfiles/rendering_tests/expected_rendering/test-glyph-y-pos.png b/testfiles/rendering_tests/expected_rendering/test-glyph-y-pos.png
new file mode 100644
index 000000000..85a3050a8
--- /dev/null
+++ b/testfiles/rendering_tests/expected_rendering/test-glyph-y-pos.png
Binary files differ
diff --git a/testfiles/rendering_tests/expected_rendering/test-rtl-vertical-large.png b/testfiles/rendering_tests/expected_rendering/test-rtl-vertical-large.png
new file mode 100644
index 000000000..84abe78ff
--- /dev/null
+++ b/testfiles/rendering_tests/expected_rendering/test-rtl-vertical-large.png
Binary files differ
diff --git a/testfiles/rendering_tests/expected_rendering/test-rtl-vertical.png b/testfiles/rendering_tests/expected_rendering/test-rtl-vertical.png
new file mode 100644
index 000000000..ea8836f51
--- /dev/null
+++ b/testfiles/rendering_tests/expected_rendering/test-rtl-vertical.png
Binary files differ
diff --git a/testfiles/rendering_tests/selector-important-002.svg b/testfiles/rendering_tests/selector-important-002.svg
new file mode 100644
index 000000000..e5a66b68e
--- /dev/null
+++ b/testfiles/rendering_tests/selector-important-002.svg
@@ -0,0 +1,58 @@
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="480" height="360"
+ style="fill:orange !important">
+
+ <title>Style "!important" — 002</title>
+
+ <style type="text/css">
+
+ <!-- Later rule overrides same specificity previous rule. -->
+ #groupA use { fill: red !important; }
+ #groupA use { fill: blue !important; }
+
+ #groupB .classB { fill: red !important; }
+ #groupB .classB { fill: blue !important; }
+
+ #groupC #MyRectC { fill: red !important; }
+ #groupC #MyRectC { fill: blue !important; }
+
+ #groupD { fill: blue !important; }
+ #classD { fill: red !important; }
+
+ #groupE use { fill: blue !important; }
+ #groupE { fill: red !important; }
+ </style>
+
+ <defs>
+ <rect id="MyRect" width="40" height="40"/>
+ </defs>
+
+ <!--
+ <text id="title" x="240" y="50" style="fill:black; font-size:24px; text-anchor:middle;">Style "!important" — 002</text>
+ <a href="https://svgwg.org/svg2-draft/stylling.html">
+ <text id="source" x="240" y="70" style="fill:black; font-size:12px; text-anchor:middle;">https://svgwg.org/svg2-draft/styling.html</text>
+ </a>
+ -->
+
+ <g id="groupA">
+ <use id="MyRectA" class="classA" x="20" y="100" xlink:href="#MyRect" />
+ </g>
+
+ <g id="groupB">
+ <use id="MyRectB" class="classB" x="120" y="100" xlink:href="#MyRect" />
+ </g>
+
+ <g id="groupC">
+ <use id="MyRectC" class="classC" x="220" y="100" xlink:href="#MyRect" />
+ </g>
+
+ <g id="groupD">
+ <use id="MyRectD" class="classD" x="320" y="100" xlink:href="#MyRect" />
+ </g>
+
+ <g id="groupE">
+ <use id="MyRectE" class="classE" x="420" y="100" xlink:href="#MyRect" />
+ </g>
+
+</svg>
diff --git a/testfiles/rendering_tests/selector-important-003.svg b/testfiles/rendering_tests/selector-important-003.svg
new file mode 100644
index 000000000..831319f5c
--- /dev/null
+++ b/testfiles/rendering_tests/selector-important-003.svg
@@ -0,0 +1,57 @@
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="480" height="360">
+
+ <title>Style "!important" — 003</title>
+
+ <style type="text/css">
+
+ /* !important is not inherited. */
+ g #groupA { fill: red !important; }
+ use { fill: blue; }
+
+ /* Attributes cannot have !important. */
+ #MyRectB { fill: blue; }
+
+ /* Inline can have !important. */
+ #MyRectC { fill: red !important; }
+
+ /* Bad property shouldn't set !important. */
+ #MyRectD { fill: XXX !important; }
+
+ /* Bad inline property shouldn't set !important. */
+ #MyRectE { fill: blue; }
+ </style>
+
+ <defs>
+ <rect id="MyRect" width="40" height="40"/>
+ </defs>
+
+ <!--
+ <text id="title" x="240" y="50" style="fill:black; font-size:24px; text-anchor:middle;">Style "!important" — 003</text>
+ <a href="https://svgwg.org/svg2-draft/stylling.html">
+ <text id="source" x="240" y="70" style="fill:black; font-size:12px; text-anchor:middle;">https://svgwg.org/svg2-draft/styling.html</text>
+ </a>
+ -->
+
+ <g id="groupA">
+ <use id="MyRectA" class="classA" x="20" y="100" xlink:href="#MyRect" />
+ </g>
+
+ <g id="groupB">
+ <use id="MyRectB" class="classB" x="120" y="100" xlink:href="#MyRect" fill="red !important"/>
+ </g>
+
+ <g id="groupC">
+ <use id="MyRectC" class="classC" x="220" y="100" xlink:href="#MyRect" style="fill: blue !important"/>
+ </g>
+
+ <g id="groupD">
+ <use id="MyRectD" class="classD" x="320" y="100" xlink:href="#MyRect" style="fill: blue"/>
+ </g>
+
+ <g id="groupE">
+ <use id="MyRectE" class="classE" x="420" y="100" xlink:href="#MyRect" style="fill: XXX !important"/>
+ </g>
+
+</svg>
diff --git a/testfiles/rendering_tests/test-glyph-y-pos.svg b/testfiles/rendering_tests/test-glyph-y-pos.svg
new file mode 100644
index 000000000..28200c79b
--- /dev/null
+++ b/testfiles/rendering_tests/test-glyph-y-pos.svg
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+
+<svg width="600" height="600"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.1"
+ viewBox="0 0 600 600">
+ <style type="text/css">
+ text {
+ font-family: DejaVu Sans;
+ font-size: 36px;
+ }
+ .title {
+ text-anchor: middle;
+ }
+ </style>
+
+ <g>
+ <text x="50" y="200">G̃g̃X̃x̃</text>
+ <text x="300" y="200" style="writing-mode:vertical-lr;">G̃g̃X̃x̃</text>
+ <text x="500" y="200" style="writing-mode:vertical-lr;text-orientation:upright">G̃g̃X̃x̃</text>
+ </g>
+
+ <text class="title" x="50%" y="120">Composed Glyphs</text>
+
+</svg>
diff --git a/testfiles/rendering_tests/test-rtl-vertical.svg b/testfiles/rendering_tests/test-rtl-vertical.svg
new file mode 100644
index 000000000..a959c1880
--- /dev/null
+++ b/testfiles/rendering_tests/test-rtl-vertical.svg
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+
+<svg width="600" height="600"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.1"
+ viewBox="0 0 600 600">
+ <style type="text/css">
+ text {
+ font-family: DejaVu Sans;
+ font-size: 36px;
+ }
+ .title {
+ text-anchor: middle;
+ }
+ </style>
+
+ <g>
+ <text x="50" y="200">أبجد</text>
+ <text x="300" y="200" style="writing-mode:vertical-lr;">بجد</text>
+ <text x="500" y="200" style="writing-mode:vertical-lr;text-orientation:upright">أبجد</text>
+ </g>
+
+ <text class="title" x="50%" y="120">RTL text in vertical mode</text>
+
+</svg>
diff --git a/testfiles/src/attributes-test.cpp b/testfiles/src/attributes-test.cpp
index f6881fc09..da9a8d592 100644
--- a/testfiles/src/attributes-test.cpp
+++ b/testfiles/src/attributes-test.cpp
@@ -51,7 +51,7 @@ std::vector<AttributeInfo> getKnownAttrs()
attindex.html lacks attributeName, begin, additive, font, marker;
I've added these manually.
- SVG 2: white-space, shape-inside, shape-outside, shape-padding, shape-margin
+ SVG 2: white-space, shape-inside, shape-subtrace, shape-padding, shape-margin
*/
AttributeInfo all_attrs[] = {
AttributeInfo("attributeName", true),
@@ -174,6 +174,7 @@ std::vector<AttributeInfo> getKnownAttrs()
AttributeInfo("image-rendering", true),
AttributeInfo("in", true),
AttributeInfo("in2", true),
+ AttributeInfo("inline-size", true),
AttributeInfo("intercept", true),
AttributeInfo("isolation", true),
AttributeInfo("k", true),
@@ -274,7 +275,7 @@ std::vector<AttributeInfo> getKnownAttrs()
AttributeInfo("seed", true),
AttributeInfo("shape-inside", true),
AttributeInfo("shape-margin", true),
- AttributeInfo("shape-outside", true),
+ AttributeInfo("shape-subtract", true),
AttributeInfo("shape-padding", true),
AttributeInfo("shape-rendering", true),
AttributeInfo("slope", true),
diff --git a/testfiles/src/cxxtests-to-migrate/style-test.h b/testfiles/src/cxxtests-to-migrate/style-test.h
deleted file mode 100644
index c6bb665e0..000000000
--- a/testfiles/src/cxxtests-to-migrate/style-test.h
+++ /dev/null
@@ -1,537 +0,0 @@
-#ifndef SEEN_STYLE_TEST_H
-#define SEEN_STYLE_TEST_H
-
-#include <cxxtest/TestSuite.h>
-
-#include "test-helpers.h"
-
-#include "style.h"
-
-class StyleTest : public CxxTest::TestSuite
-{
-public:
- SPDocument* _doc;
-
- StyleTest() :
- _doc(0)
- {
- }
-
- virtual ~StyleTest()
- {
- if ( _doc )
- {
- _doc->doUnref();
- _doc = 0;
- }
- }
-
- static void createSuiteSubclass( StyleTest*& dst )
- {
- dst = new StyleTest();
- }
-
-// createSuite and destroySuite get us per-suite setup and teardown
-// without us having to worry about static initialization order, etc.
- static StyleTest *createSuite()
- {
- StyleTest* suite = Inkscape::createSuiteAndDocument<StyleTest>( createSuiteSubclass );
- return suite;
- }
-
- static void destroySuite( StyleTest *suite )
- {
- delete suite;
- }
-
- // ---------------------------------------------------------------
- // ---------------------------------------------------------------
- // ---------------------------------------------------------------
-
- // Reading and writing style string
- void testOne()
- {
- struct TestCase {
- TestCase(gchar const* src, gchar const* dst = 0, gchar const* uri = 0) : src(src), dst(dst), uri(uri) {}
- gchar const* src;
- gchar const* dst;
- gchar const* uri;
- };
-
- TestCase cases[] = {
- TestCase("fill:none"),
- TestCase("fill:currentColor"),
- TestCase("fill:#ff00ff"),
-
- TestCase("fill:rgb(100%, 0%, 100%)", "fill:#ff00ff"),
- // TODO - fix this to preserve the string
- TestCase("fill:url(#painter) rgb(100%, 0%, 100%)",
- "fill:url(#painter) #ff00ff", "#painter"),
-
- TestCase("fill:rgb(255, 0, 255)", "fill:#ff00ff"),
- // TODO - fix this to preserve the string
- TestCase("fill:url(#painter) rgb(255, 0, 255)",
- "fill:url(#painter) #ff00ff", "#painter"),
-
-
-// TestCase("fill:#ff00ff icc-color(colorChange, 0.1, 0.5, 0.1)"),
-
- TestCase("fill:url(#painter)", 0, "#painter"),
- TestCase("fill:url(#painter) none", 0, "#painter"),
- TestCase("fill:url(#painter) currentColor", 0, "#painter"),
- TestCase("fill:url(#painter) #ff00ff", 0, "#painter"),
-// TestCase("fill:url(#painter) rgb(100%, 0%, 100%)", 0, "#painter"),
-// TestCase("fill:url(#painter) rgb(255, 0, 255)", 0, "#painter"),
-
- TestCase("fill:url(#painter) #ff00ff icc-color(colorChange, 0.1, 0.5, 0.1)", 0, "#painter"),
-
-// TestCase("fill:url(#painter) inherit", 0, "#painter"),
- TestCase("fill:inherit"),
-
-// General tests (in general order of appearance in sp_style_read), SPIPaint tested above
- TestCase("visibility:hidden"), // SPIEnum
- TestCase("visibility:collapse"),
- TestCase("visibility:visible"),
- TestCase("display:none"), // SPIEnum
- TestCase("overflow:visible"), // SPIEnum
- TestCase("overflow:auto"), // SPIEnum
-
- TestCase("color:#ff0000"),
- TestCase("color:blue", "color:#0000ff"),
- // TestCase("color:currentColor"), SVG 1.1 does not allow color value 'currentColor'
-
- // Font shorthand
- TestCase("font:bold 12px Arial",
- "font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12px;line-height:normal;font-family:Arial"),
- TestCase("font:bold 12px/24px 'Times New Roman'",
- "font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12px;line-height:24px;font-family:\'Times New Roman\'"),
- // From CSS 3 Fonts (examples):
- TestCase("font: 12pt/15pt sans-serif",
- "font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:15pt;font-family:sans-serif"),
- TestCase("font: 80% sans-serif",
- "font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:80%;line-height:normal;font-family:sans-serif"),
- TestCase("font: x-large/110% 'new century schoolbook', serif",
- "font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:x-large;line-height:110%;font-family:\'new century schoolbook\', serif"),
- TestCase("font: bold italic large Palatino, serif",
- "font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:large;line-height:normal;font-family:Palatino, serif"),
- TestCase("font: normal small-caps 120%/120% fantasy",
- "font-style:normal;font-variant:small-caps;font-weight:normal;font-stretch:normal;font-size:120%;line-height:120%;font-family:fantasy"),
- TestCase("font: condensed oblique 12pt 'Helvetica Neue', serif;",
- "font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:16px;line-height:normal;font-family:\'Helvetica Neue\', serif"),
-
- TestCase("font-family:sans-serif"), // SPIString, text_private
- TestCase("font-family:Arial"),
- // TestCase("font-variant:normal;font-stretch:normal;-inkscape-font-specification:Nimbus Roman No9 L Bold Italic"),
-
- // Needs to be fixed (quotes should be around each font-family):
- TestCase("font-family:Georgia, 'Minion Web'","font-family:Georgia, \'Minion Web\'"),
- TestCase("font-size:12", "font-size:12px"), // SPIFontSize
- TestCase("font-size:12px"),
- TestCase("font-size:12pt", "font-size:16px"),
- TestCase("font-size:medium"),
- TestCase("font-size:smaller"),
- TestCase("font-style:italic"), // SPIEnum
- TestCase("font-variant:small-caps"), // SPIEnum
- TestCase("font-weight:100"), // SPIEnum
- TestCase("font-weight:normal"),
- TestCase("font-weight:bolder"),
- TestCase("font-stretch:condensed"), // SPIEnum
-
- TestCase("font-variant-ligatures:none"), // SPILigatures
- TestCase("font-variant-ligatures:normal"),
- TestCase("font-variant-ligatures:no-common-ligatures"),
- TestCase("font-variant-ligatures:discretionary-ligatures"),
- TestCase("font-variant-ligatures:historical-ligatures"),
- TestCase("font-variant-ligatures:no-contextual"),
- TestCase("font-variant-ligatures:common-ligatures", "font-variant-ligatures:normal"),
- TestCase("font-variant-ligatures:contextual", "font-variant-ligatures:normal"),
- TestCase("font-variant-ligatures:no-common-ligatures historical-ligatures"),
- TestCase("font-variant-ligatures:historical-ligatures no-contextual"),
- TestCase("font-variant-position:normal"),
- TestCase("font-variant-position:sub"),
- TestCase("font-variant-position:super"),
- TestCase("font-variant-caps:normal"),
- TestCase("font-variant-caps:small-caps"),
- TestCase("font-variant-caps:all-small-caps"),
- TestCase("font-variant-numeric:normal"),
- TestCase("font-variant-numeric:lining-nums"),
- TestCase("font-variant-numeric:oldstyle-nums"),
- TestCase("font-variant-numeric:proportional-nums"),
- TestCase("font-variant-numeric:tabular-nums"),
- TestCase("font-variant-numeric:diagonal-fractions"),
- TestCase("font-variant-numeric:stacked-fractions"),
- TestCase("font-variant-numeric:ordinal"),
- TestCase("font-variant-numeric:slashed-zero"),
- TestCase("font-variant-numeric:tabular-nums slashed-zero"),
- TestCase("font-variant-numeric:tabular-nums proportional-nums", "font-variant-numeric:proportional-nums"),
-
- // Should be moved down
- TestCase("text-indent:12em"), // SPILength?
- TestCase("text-align:center"), // SPIEnum
-
- // SPITextDecoration
- // The default value for 'text-decoration-color' is 'currentColor', but
- // we cannot set the default to that value yet. (We need to switch
- // SPIPaint to SPIColor and then add the ability to set default.)
- // TestCase("text-decoration: underline",
- // "text-decoration: underline;text-decoration-line: underline;text-decoration-color:currentColor"),
- // TestCase("text-decoration: overline underline",
- // "text-decoration: underline overline;text-decoration-line: underline overline;text-decoration-color:currentColor"),
-
- TestCase("text-decoration: underline wavy #0000ff",
- "text-decoration: underline;text-decoration-line: underline;text-decoration-style:wavy;text-decoration-color:#0000ff"),
- TestCase("text-decoration: double overline underline #ff0000",
- "text-decoration: underline overline;text-decoration-line: underline overline;text-decoration-style:double;text-decoration-color:#ff0000"),
-
- // SPITextDecorationLine
- TestCase("text-decoration-line: underline",
- "text-decoration: underline;text-decoration-line: underline"),
-
- // SPITextDecorationStyle
- TestCase("text-decoration-style:solid"),
- TestCase("text-decoration-style:dotted"),
-
- // SPITextDecorationColor
- TestCase("text-decoration-color:#ff00ff"),
-
- // Should be moved up
- TestCase("line-height:24px"), // SPILengthOrNormal
- TestCase("line-height:1.5"),
- TestCase("letter-spacing:2px"), // SPILengthOrNormal
- TestCase("word-spacing:2px"), // SPILengthOrNormal
- TestCase("word-spacing:normal"),
- TestCase("text-transform:lowercase"), // SPIEnum
- // ...
- TestCase("baseline-shift:baseline"), // SPIBaselineShift
- TestCase("baseline-shift:sub"),
- TestCase("baseline-shift:12.5%"),
- TestCase("baseline-shift:2px"),
-
- TestCase("opacity:0.1"), // SPIScale24
- // ...
- TestCase("stroke-width:2px"), // SPILength
- TestCase("stroke-linecap:round"), // SPIEnum
- TestCase("stroke-linejoin:round"), // SPIEnum
- TestCase("stroke-miterlimit:4"), // SPIFloat
- TestCase("marker:url(#Arrow)"), // SPIString
- TestCase("marker-start:url(#Arrow)"),
- TestCase("marker-mid:url(#Arrow)"),
- TestCase("marker-end:url(#Arrow)"),
- TestCase("stroke-opacity:0.5"), // SPIScale24
- TestCase("stroke-dasharray:0, 1, 0, 1"), // SPIDashArray
- TestCase("stroke-dasharray:0 1 0 1","stroke-dasharray:0, 1, 0, 1"),
- TestCase("stroke-dasharray:0 1 2 3","stroke-dasharray:0, 1, 2, 3"),
- TestCase("stroke-dashoffset:13"), // SPILength
- TestCase("stroke-dashoffset:10px"),
- // ...
- //TestCase("filter:url(#myfilter)"), // SPIFilter segfault in read
- TestCase("filter:inherit"),
-
- TestCase("opacity:0.1;fill:#ff0000;stroke:#0000ff;stroke-width:2px"),
- TestCase("opacity:0.1;fill:#ff0000;stroke:#0000ff;stroke-width:2px;stroke-dasharray:1, 2, 3, 4;stroke-dashoffset:15"),
-
-
-#ifdef WITH_SVG2
- TestCase("paint-order:stroke"), // SPIPaintOrder
- TestCase("paint-order:normal"),
- TestCase("paint-order: markers stroke fill", "paint-order:markers stroke fill"),
-
-#endif
- TestCase(0)
- };
-
- for ( gint i = 0; cases[i].src; i++ ) {
- // std::cout << "Test one: " << i << std::endl;
- SPStyle style(_doc);
- style.mergeString( cases[i].src );
- if ( cases[i].uri ) {
- TSM_ASSERT( cases[i].src, style.fill.value.href );
- if ( style.fill.value.href ) {
- TS_ASSERT_EQUALS( style.fill.value.href->getURI()->toString(), std::string(cases[i].uri) );
- }
- } else {
- TS_ASSERT( !style.fill.value.href || !style.fill.value.href->getObject() );
- }
-
- std::string str0_set = style.write(SP_STYLE_FLAG_IFSET );
-
- if ( cases[i].dst ) {
- // std::cout << " " << str0_set << " " << std::string(cases[i].dst) << std::endl;
- TS_ASSERT_EQUALS( str0_set, std::string(cases[i].dst) );
- } else {
- // std::cout << " " << str0_set << " " << std::string(cases[i].src) << std::endl;
- TS_ASSERT_EQUALS( str0_set, std::string(cases[i].src) );
- }
- }
- }
-
- // Testing operator==
- void testTwo()
- {
- struct TestCase {
- TestCase(gchar const* src, gchar const* dst, bool match) :
- src(src), dst(dst), match(match) {}
- gchar const* src;
- gchar const* dst;
- bool match;
- };
-
- TestCase cases[] = {
-
- // SPIFloat
- TestCase("stroke-miterlimit:4", "stroke-miterlimit:4", true ),
- TestCase("stroke-miterlimit:4", "stroke-miterlimit:2", false),
- TestCase("stroke-miterlimit:4", "", true ), // Default
-
- // SPIScale24
- TestCase("opacity:0.3", "opacity:0.3", true ),
- TestCase("opacity:0.3", "opacity:0.6", false),
- TestCase("opacity:1.0", "", true ), // Default
-
- // SPILength
- TestCase("text-indent:3", "text-indent:3", true ),
- TestCase("text-indent:6", "text-indent:3", false),
- TestCase("text-indent:6px", "text-indent:3", false),
- TestCase("text-indent:1px", "text-indent:12pc", false),
- TestCase("text-indent:2ex", "text-indent:2ex", false),
-
- // SPILengthOrNormal
- TestCase("letter-spacing:normal", "letter-spacing:normal", true ),
- TestCase("letter-spacing:2", "letter-spacing:normal", false),
- TestCase("letter-spacing:normal", "letter-spacing:2", false),
- TestCase("letter-spacing:5px", "letter-spacing:5px", true ),
- TestCase("letter-spacing:10px", "letter-spacing:5px", false),
- TestCase("letter-spacing:10em", "letter-spacing:10em", false),
-
- // SPIEnum
- TestCase("text-anchor:start", "text-anchor:start", true ),
- TestCase("text-anchor:start", "text-anchor:middle", false),
- TestCase("text-anchor:start", "", true ), // Default
- TestCase("text-anchor:start", "text-anchor:junk", true ), // Bad value
-
- TestCase("font-weight:normal", "font-weight:400", true ),
- TestCase("font-weight:bold", "font-weight:700", true ),
-
-
- // SPIString and SPIFontString
- TestCase("font-family:Arial", "font-family:Arial", true ),
- TestCase("font-family:A B", "font-family:A B", true ),
- TestCase("font-family:A B", "font-family:A C", false),
- // Default is not set by class... value is NULL which cannot be compared
- // TestCase("font-family:sans-serif", "", true ), // Default
-
- // SPIColor
- TestCase("color:blue", "color:blue", true ),
- TestCase("color:blue", "color:red", false),
- TestCase("color:red", "color:#ff0000", true ),
-
- // SPIPaint
- TestCase("fill:blue", "fill:blue", true ),
- TestCase("fill:blue", "fill:red", false),
- TestCase("fill:currentColor", "fill:currentColor", true ),
- TestCase("fill:url(#xxx)", "fill:url(#xxx)", true ),
- // Needs URL defined as in test 1
- //TestCase("fill:url(#xxx)", "fill:url(#yyy)", false),
-
- // SPIPaintOrder
- TestCase("paint-order:markers", "paint-order:markers", true ),
- TestCase("paint-order:markers", "paint-order:stroke", false),
- //TestCase("paint-order:fill stroke markers", "", true ), // Default
- TestCase("paint-order:normal", "paint-order:normal", true ),
- //TestCase("paint-order:fill stroke markers", "paint-order:normal", true ),
-
- // SPIDashArray
- TestCase("stroke-dasharray:0 1 2 3","stroke-dasharray:0 1 2 3",true ),
- TestCase("stroke-dasharray:0 1", "stroke-dasharray:0 2", false),
-
- // SPIFilter
-
- // SPIFontSize
- TestCase("font-size:12px", "font-size:12px", true ),
- TestCase("font-size:12px", "font-size:24px", false),
- TestCase("font-size:12ex", "font-size:24ex", false),
- TestCase("font-size:medium", "font-size:medium", true ),
- TestCase("font-size:medium", "font-size:large", false),
-
- // SPIBaselineShift
- TestCase("baseline-shift:baseline", "baseline-shift:baseline", true ),
- TestCase("baseline-shift:sub", "baseline-shift:sub", true ),
- TestCase("baseline-shift:sub", "baseline-shift:super", false),
- TestCase("baseline-shift:baseline", "baseline-shift:sub", false),
- TestCase("baseline-shift:10px", "baseline-shift:10px", true ),
- TestCase("baseline-shift:10px", "baseline-shift:12px", false),
-
-
- // SPITextDecorationLine
- TestCase("text-decoration-line:underline", "text-decoration-line:underline", true ),
- TestCase("text-decoration-line:underline", "text-decoration-line:overline", false),
- TestCase("text-decoration-line:underline overline", "text-decoration-line:underline overline", true ),
- TestCase("text-decoration-line:none", "", true ), // Default
-
-
- // SPITextDecorationStyle
- TestCase("text-decoration-style:solid", "text-decoration-style:solid", true ),
- TestCase("text-decoration-style:dotted", "text-decoration-style:solid", false),
- TestCase("text-decoration-style:solid", "", true ), // Default
-
- // SPITextDecoration
- TestCase("text-decoration:underline", "text-decoration:underline", true ),
- TestCase("text-decoration:underline", "text-decoration:overline", false),
- TestCase("text-decoration:underline overline","text-decoration:underline overline",true ),
- TestCase("text-decoration:overline underline","text-decoration:underline overline",true ),
- // TestCase("text-decoration:none", "text-decoration-color:currentColor", true ), // Default
-
-
- // Terminate
- TestCase(0,0,0)
- };
- for ( gint i = 0; cases[i].src; i++ ) {
- // std::cout << "Test two: " << i << std::endl;
- SPStyle style_src(_doc);
- SPStyle style_dst(_doc);
-
- style_src.mergeString( cases[i].src );
- style_dst.mergeString( cases[i].dst );
-
- // std::cout << "Test:" << std::endl;
- // std::cout << " C: |" << cases[i].src << "| |" << cases[i].dst << "|" << std::endl;
- // std::cout << " S: |" << style_src.write( SP_STYLE_FLAG_IFSET, NULL ) << "| |"
- // << style_dst.write( SP_STYLE_FLAG_IFSET, NULL ) << "|" <<std::endl;
- TS_ASSERT( (style_src == style_dst) == cases[i].match );
- // std::cout << "End Test\n" << std::endl;
- }
- }
-
-
- // Test of cascade
- void testThree()
- {
- struct TestCase {
- TestCase(gchar const* parent, gchar const* child, gchar const* result) :
- parent(parent), child(child), result(result) {}
- gchar const* parent;
- gchar const* child;
- gchar const* result;
- };
-
- TestCase cases[] = {
-
- // SPIFloat
- TestCase("stroke-miterlimit:6", "stroke-miterlimit:2", "stroke-miterlimit:2" ),
- TestCase("stroke-miterlimit:6", "", "stroke-miterlimit:6" ),
- TestCase("", "stroke-miterlimit:2", "stroke-miterlimit:2" ),
-
- // SPIScale24
- TestCase("opacity:0.3", "opacity:0.3", "opacity:0.3" ),
- TestCase("opacity:0.3", "opacity:0.6", "opacity:0.6" ),
- // 'opacity' does not inherit
- TestCase("opacity:0.3", "", "opacity:1.0" ),
- TestCase("", "opacity:0.3", "opacity:0.3" ),
- TestCase("opacity:0.5", "opacity:inherit", "opacity:0.5" ),
- TestCase("", "", "opacity:1.0" ),
-
- // SPILength
- TestCase("text-indent:3", "text-indent:3", "text-indent:3" ),
- TestCase("text-indent:6", "text-indent:3", "text-indent:3" ),
- TestCase("text-indent:6px", "text-indent:3", "text-indent:3" ),
- TestCase("text-indent:1px", "text-indent:12pc", "text-indent:12pc" ),
- // ex, em cannot be equal
- //TestCase("text-indent:2ex", "text-indent:2ex", "text-indent:2ex" ),
- TestCase("text-indent:3", "", "text-indent:3" ),
- TestCase("text-indent:3", "text-indent:inherit", "text-indent:3" ),
-
- // SPILengthOrNormal
- TestCase("letter-spacing:normal", "letter-spacing:normal", "letter-spacing:normal" ),
- TestCase("letter-spacing:2", "letter-spacing:normal", "letter-spacing:normal" ),
- TestCase("letter-spacing:normal", "letter-spacing:2", "letter-spacing:2" ),
- TestCase("letter-spacing:5px", "letter-spacing:5px", "letter-spacing:5px" ),
- TestCase("letter-spacing:10px", "letter-spacing:5px", "letter-spacing:5px" ),
- // ex, em cannot be equal
- // TestCase("letter-spacing:10em", "letter-spacing:10em", "letter-spacing:10em" ),
-
- // SPIEnum
- TestCase("text-anchor:start", "text-anchor:start", "text-anchor:start" ),
- TestCase("text-anchor:start", "text-anchor:middle", "text-anchor:middle" ),
- TestCase("text-anchor:start", "", "text-anchor:start" ),
- TestCase("text-anchor:start", "text-anchor:junk", "text-anchor:start" ),
- TestCase("text-anchor:end", "text-anchor:inherit", "text-anchor:end" ),
-
- TestCase("font-weight:400", "font-weight:400", "font-weight:400" ),
- TestCase("font-weight:400", "font-weight:700", "font-weight:700" ),
- TestCase("font-weight:400", "font-weight:bolder", "font-weight:700" ),
- TestCase("font-weight:700", "font-weight:bolder", "font-weight:900" ),
- TestCase("font-weight:400", "font-weight:lighter", "font-weight:100" ),
- TestCase("font-weight:200", "font-weight:lighter", "font-weight:100" ),
-
- TestCase("font-stretch:condensed","font-stretch:expanded", "font-stretch:expanded" ),
- TestCase("font-stretch:condensed","font-stretch:wider", "font-stretch:semi-condensed" ),
-
- // SPIString and SPIFontString
-
- // SPIPaint
-
- // SPIPaintOrder
-
- // SPIDashArray
-
- // SPIFilter
-
- // SPIFontSize
-
- // SPIBaselineShift
-
-
- // SPITextDecorationLine
- TestCase("text-decoration-line:overline", "text-decoration-line:underline",
- "text-decoration-line:underline" ),
-
- // SPITextDecorationStyle
-
- // SPITextDecoration
-
- // Terminate
- TestCase(0,0,0)
- };
- for ( gint i = 0; cases[i].parent; i++ ) {
- // std::cout << "Test three: " << i << std::endl;
- SPStyle style_parent(_doc);
- SPStyle style_child( _doc);
- SPStyle style_result(_doc);
-
- style_parent.mergeString( cases[i].parent );
- style_child.mergeString( cases[i].child );
- style_result.mergeString( cases[i].result );
-
- // std::cout << "Test:" << std::endl;
- // std::cout << " Input: ";
- // std::cout << " Parent: " << cases[i].parent
- // << " Child: " << cases[i].child
- // << " Result: " << cases[i].result << std::endl;
- // std::cout << " Write: ";
- // std::cout << " Parent: " << style_parent.write( SP_STYLE_FLAG_IFSET )
- // << " Child: " << style_child.write( SP_STYLE_FLAG_IFSET )
- // << " Result: " << style_result.write( SP_STYLE_FLAG_IFSET ) << std::endl;
-
- style_child.cascade( &style_parent );
-
- TS_ASSERT(style_child == style_result );
-
- // std::cout << "End Test: *************\n" << std::endl;
- }
- }
-
-};
-
-
-#endif // SEEN_STYLE_TEST_H
-
-/*
- Local Variables:
- mode:c++
- c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
- indent-tabs-mode:nil
- fill-column:99
- End:
-*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/testfiles/src/style-test.cpp b/testfiles/src/style-test.cpp
new file mode 100644
index 000000000..8c0f4dd5f
--- /dev/null
+++ b/testfiles/src/style-test.cpp
@@ -0,0 +1,575 @@
+
+/*
+ * Unit test for style properties.
+ *
+ * Author:
+ * Tavmjong Bah <tavjong@free.fr>
+ *
+ * Copyright (C) 2017 Authors
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include <string>
+#include <vector>
+
+#include "gtest/gtest.h"
+
+#include "style.h"
+
+namespace {
+
+class StyleRead {
+
+public:
+ StyleRead(std::string const &src, std::string const &dst, std::string const &uri) :
+ src(src), dst(dst), uri(uri)
+ {
+ }
+
+ StyleRead(std::string const &src, std::string const &dst) :
+ src(src), dst(dst), uri("")
+ {
+ }
+
+ StyleRead(std::string const &src) :
+ src(src), dst(src), uri("")
+ {
+ }
+
+ std::string src;
+ std::string dst;
+ std::string uri;
+
+};
+
+std::vector<StyleRead> getStyleData()
+{
+ StyleRead all_style_data[] = {
+
+ // Paint -----------------------------------------------
+ StyleRead("fill:none" ),
+ StyleRead("fill:currentColor" ),
+ StyleRead("fill:#ff00ff" ),
+ StyleRead("fill:rgb(100%, 0%, 100%)", "fill:#ff00ff" ),
+ StyleRead("fill:rgb(255, 0, 255)", "fill:#ff00ff" ),
+
+ // TODO - fix this to preserve the string
+ // StyleRead("fill:url(#painter) rgb(100%, 0%, 100%)",
+ // "fill:url(#painter) #ff00ff", "#painter" ),
+
+ // TODO - fix this to preserve the string
+ //StyleRead("fill:url(#painter) rgb(255, 0, 255)",
+ // "fill:url(#painter) #ff00ff", "#painter"),
+
+
+// StyleRead("fill:#ff00ff icc-color(colorChange, 0.1, 0.5, 0.1)"),
+
+// StyleRead("fill:url(#painter)", "", "#painter"),
+// StyleRead("fill:url(#painter) none", "", "#painter"),
+// StyleRead("fill:url(#painter) currentColor", "", "#painter"),
+// StyleRead("fill:url(#painter) #ff00ff", "", "#painter"),
+// StyleRead("fill:url(#painter) rgb(100%, 0%, 100%)", "", "#painter"),
+// StyleRead("fill:url(#painter) rgb(255, 0, 255)", "", "#painter"),
+
+// StyleRead("fill:url(#painter) #ff00ff icc-color(colorChange, 0.1, 0.5, 0.1)", "", "#painter"),
+
+// StyleRead("fill:url(#painter) inherit", "", "#painter"),
+
+ StyleRead("fill:inherit"),
+
+
+ // General tests (in general order of appearance in sp_style_read), SPIPaint tested above
+ StyleRead("visibility:hidden"), // SPIEnum
+ StyleRead("visibility:collapse"),
+ StyleRead("visibility:visible"),
+ StyleRead("display:none"), // SPIEnum
+ StyleRead("overflow:visible"), // SPIEnum
+ StyleRead("overflow:auto"), // SPIEnum
+
+ StyleRead("color:#ff0000"),
+ StyleRead("color:blue", "color:#0000ff"),
+ // StyleRead("color:currentColor"), SVG 1.1 does not allow color value 'currentColor'
+
+ // Font shorthand
+ StyleRead("font:bold 12px Arial",
+ "font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12px;line-height:normal;font-family:Arial"),
+ StyleRead("font:bold 12px/24px 'Times New Roman'",
+ "font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12px;line-height:24px;font-family:\'Times New Roman\'"),
+
+ // From CSS 3 Fonts (examples):
+ StyleRead("font: 12pt/15pt sans-serif",
+ "font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:15pt;font-family:sans-serif"),
+ //StyleRead("font: 80% sans-serif",
+ // "font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:80%;line-height:normal;font-family:sans-serif"),
+ //StyleRead("font: x-large/110% 'new century schoolbook', serif",
+ // "font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:x-large;line-height:110%;font-family:\'new century schoolbook\', serif"),
+ StyleRead("font: bold italic large Palatino, serif",
+ "font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:large;line-height:normal;font-family:Palatino, serif"),
+ //StyleRead("font: normal small-caps 120%/120% fantasy",
+ // "font-style:normal;font-variant:small-caps;font-weight:normal;font-stretch:normal;font-size:120%;line-height:120%;font-family:fantasy"),
+ StyleRead("font: condensed oblique 12pt 'Helvetica Neue', serif;",
+ "font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:16px;line-height:normal;font-family:\'Helvetica Neue\', serif"),
+
+ StyleRead("font-family:sans-serif"), // SPIString, text_private
+ StyleRead("font-family:Arial"),
+ // StyleRead("font-variant:normal;font-stretch:normal;-inkscape-font-specification:Nimbus Roman No9 L Bold Italic"),
+
+ // Needs to be fixed (quotes should be around each font-family):
+ StyleRead("font-family:Georgia, 'Minion Web'","font-family:Georgia, \'Minion Web\'"),
+ StyleRead("font-size:12", "font-size:12px"), // SPIFontSize
+ StyleRead("font-size:12px"),
+ StyleRead("font-size:12pt", "font-size:16px"),
+ StyleRead("font-size:medium"),
+ StyleRead("font-size:smaller"),
+ StyleRead("font-style:italic"), // SPIEnum
+ StyleRead("font-variant:small-caps"), // SPIEnum
+ StyleRead("font-weight:100"), // SPIEnum
+ StyleRead("font-weight:normal"),
+ StyleRead("font-weight:bolder"),
+ StyleRead("font-stretch:condensed"), // SPIEnum
+
+ StyleRead("font-variant-ligatures:none"), // SPILigatures
+ StyleRead("font-variant-ligatures:normal"),
+ StyleRead("font-variant-ligatures:no-common-ligatures"),
+ StyleRead("font-variant-ligatures:discretionary-ligatures"),
+ StyleRead("font-variant-ligatures:historical-ligatures"),
+ StyleRead("font-variant-ligatures:no-contextual"),
+ StyleRead("font-variant-ligatures:common-ligatures", "font-variant-ligatures:normal"),
+ StyleRead("font-variant-ligatures:contextual", "font-variant-ligatures:normal"),
+ StyleRead("font-variant-ligatures:no-common-ligatures historical-ligatures"),
+ StyleRead("font-variant-ligatures:historical-ligatures no-contextual"),
+ StyleRead("font-variant-position:normal"),
+ StyleRead("font-variant-position:sub"),
+ StyleRead("font-variant-position:super"),
+ StyleRead("font-variant-caps:normal"),
+ StyleRead("font-variant-caps:small-caps"),
+ StyleRead("font-variant-caps:all-small-caps"),
+ StyleRead("font-variant-numeric:normal"),
+ StyleRead("font-variant-numeric:lining-nums"),
+ StyleRead("font-variant-numeric:oldstyle-nums"),
+ StyleRead("font-variant-numeric:proportional-nums"),
+ StyleRead("font-variant-numeric:tabular-nums"),
+ StyleRead("font-variant-numeric:diagonal-fractions"),
+ StyleRead("font-variant-numeric:stacked-fractions"),
+ StyleRead("font-variant-numeric:ordinal"),
+ StyleRead("font-variant-numeric:slashed-zero"),
+ StyleRead("font-variant-numeric:tabular-nums slashed-zero"),
+ StyleRead("font-variant-numeric:tabular-nums proportional-nums", "font-variant-numeric:proportional-nums"),
+
+ // Should be moved down
+ StyleRead("text-indent:12em"), // SPILength?
+ StyleRead("text-align:center"), // SPIEnum
+
+ // SPITextDecoration
+ // The default value for 'text-decoration-color' is 'currentColor', but
+ // we cannot set the default to that value yet. (We need to switch
+ // SPIPaint to SPIColor and then add the ability to set default.)
+ // StyleRead("text-decoration: underline",
+ // "text-decoration: underline;text-decoration-line: underline;text-decoration-color:currentColor"),
+ // StyleRead("text-decoration: overline underline",
+ // "text-decoration: underline overline;text-decoration-line: underline overline;text-decoration-color:currentColor"),
+
+ StyleRead("text-decoration: underline wavy #0000ff",
+ "text-decoration: underline;text-decoration-line: underline;text-decoration-style:wavy;text-decoration-color:#0000ff"),
+ StyleRead("text-decoration: double overline underline #ff0000",
+ "text-decoration: underline overline;text-decoration-line: underline overline;text-decoration-style:double;text-decoration-color:#ff0000"),
+
+ // SPITextDecorationLine
+ StyleRead("text-decoration-line: underline",
+ "text-decoration: underline;text-decoration-line: underline"),
+
+ // SPITextDecorationStyle
+ StyleRead("text-decoration-style:solid"),
+ StyleRead("text-decoration-style:dotted"),
+
+ // SPITextDecorationColor
+ StyleRead("text-decoration-color:#ff00ff"),
+
+ // Should be moved up
+ StyleRead("line-height:24px"), // SPILengthOrNormal
+ StyleRead("line-height:1.5"),
+ StyleRead("letter-spacing:2px"), // SPILengthOrNormal
+ StyleRead("word-spacing:2px"), // SPILengthOrNormal
+ StyleRead("word-spacing:normal"),
+ StyleRead("text-transform:lowercase"), // SPIEnum
+ // ...
+ StyleRead("baseline-shift:baseline"), // SPIBaselineShift
+ StyleRead("baseline-shift:sub"),
+ StyleRead("baseline-shift:12.5%"),
+ StyleRead("baseline-shift:2px"),
+
+ StyleRead("opacity:0.1"), // SPIScale24
+ // ...
+ StyleRead("stroke-width:2px"), // SPILength
+ StyleRead("stroke-linecap:round"), // SPIEnum
+ StyleRead("stroke-linejoin:round"), // SPIEnum
+ StyleRead("stroke-miterlimit:4"), // SPIFloat
+ StyleRead("marker:url(#Arrow)"), // SPIString
+ StyleRead("marker-start:url(#Arrow)"),
+ StyleRead("marker-mid:url(#Arrow)"),
+ StyleRead("marker-end:url(#Arrow)"),
+ StyleRead("stroke-opacity:0.5"), // SPIScale24
+ StyleRead("stroke-dasharray:0, 1, 0, 1"), // SPIDashArray
+ StyleRead("stroke-dasharray:0 1 0 1","stroke-dasharray:0, 1, 0, 1"),
+ StyleRead("stroke-dasharray:0 1 2 3","stroke-dasharray:0, 1, 2, 3"),
+ StyleRead("stroke-dashoffset:13"), // SPILength
+ StyleRead("stroke-dashoffset:10px"),
+ // ...
+ //StyleRead("filter:url(#myfilter)"), // SPIFilter segfault in read
+ StyleRead("filter:inherit"),
+
+ StyleRead("opacity:0.1;fill:#ff0000;stroke:#0000ff;stroke-width:2px"),
+ StyleRead("opacity:0.1;fill:#ff0000;stroke:#0000ff;stroke-width:2px;stroke-dasharray:1, 2, 3, 4;stroke-dashoffset:15"),
+
+ StyleRead("paint-order:stroke"), // SPIPaintOrder
+ StyleRead("paint-order:normal"),
+ StyleRead("paint-order: markers stroke fill", "paint-order:markers stroke fill"),
+
+ // !important (in order of appearance in style-internal.h)
+ StyleRead("stroke-miterlimit:4 !important"), // SPIFloat
+ StyleRead("stroke-opacity:0.5 !important"), // SPIScale24
+ StyleRead("stroke-width:2px !important"), // SPILength
+ StyleRead("line-height:24px !important"), // SPILengthOrNormal
+ StyleRead("line-height:normal !important"),
+ StyleRead("font-stretch:condensed !important"), // SPIEnum
+ StyleRead("marker:url(#Arrow) !important"), // SPIString
+ StyleRead("color:#0000ff !important"), // SPIColor
+ StyleRead("fill:none !important"), // SPIPaint
+ StyleRead("fill:currentColor !important"),
+ StyleRead("fill:#ff00ff !important"),
+ StyleRead("paint-order:stroke !important"), // SPIPaintOrder
+ StyleRead("paint-order:normal !important"),
+ StyleRead("stroke-dasharray:0, 1, 0, 1 !important"), // SPIDashArray
+ StyleRead("font-size:12px !important"), // SPIFontSize
+ StyleRead("baseline-shift:baseline !important"), // SPIBaselineShift
+ StyleRead("baseline-shift:sub !important"),
+ //StyleRead("text-decoration-line: underline !important"), // SPITextDecorationLine
+
+ };
+
+ size_t count = sizeof(all_style_data) / sizeof(all_style_data[0]);
+ std::vector<StyleRead> vect(all_style_data, all_style_data + count);
+ return vect;
+}
+
+TEST(StyleTest, Read) {
+ std::vector<StyleRead> all_style = getStyleData();
+ EXPECT_GT(all_style.size(), 0);
+ for (auto i : all_style) {
+
+ SPStyle style;
+ style.mergeString (i.src.c_str());
+
+ if (!i.uri.empty()) {
+ //EXPECT_EQ (style.fill.value.href->getURI()->toString(), i.uri);
+ }
+
+ std::string out = style.write();
+ if (i.dst.empty()) {
+ // std::cout << "out: " << out << std::endl;
+ // std::cout << "i.src: " << i.src << std::endl;
+ EXPECT_EQ (out, i.src);
+ } else {
+ // std::cout << "out: " << out << std::endl;
+ // std::cout << "i.dst: " << i.dst << std::endl;
+ EXPECT_EQ (out, i.dst);
+ }
+ }
+}
+
+
+// ------------------------------------------------------------------------------------
+
+class StyleMatch {
+
+public:
+ StyleMatch(std::string const &src, std::string const &dst, bool const &match) :
+ src(src), dst(dst), match(match)
+ {
+ }
+
+ std::string src;
+ std::string dst;
+ bool match;
+
+};
+
+std::vector<StyleMatch> getStyleMatchData()
+{
+ StyleMatch all_style_data[] = {
+
+ // SPIFloat
+ StyleMatch("stroke-miterlimit:4", "stroke-miterlimit:4", true ),
+ StyleMatch("stroke-miterlimit:4", "stroke-miterlimit:2", false),
+ StyleMatch("stroke-miterlimit:4", "", true ), // Default
+
+ // SPIScale24
+ StyleMatch("opacity:0.3", "opacity:0.3", true ),
+ StyleMatch("opacity:0.3", "opacity:0.6", false),
+ StyleMatch("opacity:1.0", "", true ), // Default
+
+ // SPILength
+ StyleMatch("text-indent:3", "text-indent:3", true ),
+ StyleMatch("text-indent:6", "text-indent:3", false),
+ StyleMatch("text-indent:6px", "text-indent:3", false),
+ StyleMatch("text-indent:1px", "text-indent:12pc", false),
+ StyleMatch("text-indent:2ex", "text-indent:2ex", false),
+
+ // SPILengthOrNormal
+ StyleMatch("letter-spacing:normal", "letter-spacing:normal", true ),
+ StyleMatch("letter-spacing:2", "letter-spacing:normal", false),
+ StyleMatch("letter-spacing:normal", "letter-spacing:2", false),
+ StyleMatch("letter-spacing:5px", "letter-spacing:5px", true ),
+ StyleMatch("letter-spacing:10px", "letter-spacing:5px", false),
+ StyleMatch("letter-spacing:10em", "letter-spacing:10em", false),
+
+ // SPIEnum
+ StyleMatch("text-anchor:start", "text-anchor:start", true ),
+ StyleMatch("text-anchor:start", "text-anchor:middle", false),
+ StyleMatch("text-anchor:start", "", true ), // Default
+ StyleMatch("text-anchor:start", "text-anchor:junk", true ), // Bad value
+
+ StyleMatch("font-weight:normal", "font-weight:400", true ),
+ StyleMatch("font-weight:bold", "font-weight:700", true ),
+
+
+ // SPIString and SPIFontString
+ StyleMatch("font-family:Arial", "font-family:Arial", true ),
+ StyleMatch("font-family:A B", "font-family:A B", true ),
+ StyleMatch("font-family:A B", "font-family:A C", false),
+ // Default is not set by class... value is NULL which cannot be compared
+ // StyleMatch("font-family:sans-serif", "", true ), // Default
+
+ // SPIColor
+ StyleMatch("color:blue", "color:blue", true ),
+ StyleMatch("color:blue", "color:red", false),
+ StyleMatch("color:red", "color:#ff0000", true ),
+
+ // SPIPaint
+ StyleMatch("fill:blue", "fill:blue", true ),
+ StyleMatch("fill:blue", "fill:red", false),
+ StyleMatch("fill:currentColor", "fill:currentColor", true ),
+ StyleMatch("fill:url(#xxx)", "fill:url(#xxx)", true ),
+ // Needs URL defined as in test 1
+ //StyleMatch("fill:url(#xxx)", "fill:url(#yyy)", false),
+
+ // SPIPaintOrder
+ StyleMatch("paint-order:markers", "paint-order:markers", true ),
+ StyleMatch("paint-order:markers", "paint-order:stroke", false),
+ //StyleMatch("paint-order:fill stroke markers", "", true ), // Default
+ StyleMatch("paint-order:normal", "paint-order:normal", true ),
+ //StyleMatch("paint-order:fill stroke markers", "paint-order:normal", true ),
+
+ // SPIDashArray
+ StyleMatch("stroke-dasharray:0 1 2 3","stroke-dasharray:0 1 2 3",true ),
+ StyleMatch("stroke-dasharray:0 1", "stroke-dasharray:0 2", false),
+
+ // SPIFilter
+
+ // SPIFontSize
+ StyleMatch("font-size:12px", "font-size:12px", true ),
+ StyleMatch("font-size:12px", "font-size:24px", false),
+ StyleMatch("font-size:12ex", "font-size:24ex", false),
+ StyleMatch("font-size:medium", "font-size:medium", true ),
+ StyleMatch("font-size:medium", "font-size:large", false),
+
+ // SPIBaselineShift
+ StyleMatch("baseline-shift:baseline", "baseline-shift:baseline", true ),
+ StyleMatch("baseline-shift:sub", "baseline-shift:sub", true ),
+ StyleMatch("baseline-shift:sub", "baseline-shift:super", false),
+ StyleMatch("baseline-shift:baseline", "baseline-shift:sub", false),
+ StyleMatch("baseline-shift:10px", "baseline-shift:10px", true ),
+ StyleMatch("baseline-shift:10px", "baseline-shift:12px", false),
+
+
+ // SPITextDecorationLine
+ StyleMatch("text-decoration-line:underline", "text-decoration-line:underline", true ),
+ StyleMatch("text-decoration-line:underline", "text-decoration-line:overline", false),
+ StyleMatch("text-decoration-line:underline overline", "text-decoration-line:underline overline", true ),
+ StyleMatch("text-decoration-line:none", "", true ), // Default
+
+
+ // SPITextDecorationStyle
+ StyleMatch("text-decoration-style:solid", "text-decoration-style:solid", true ),
+ StyleMatch("text-decoration-style:dotted", "text-decoration-style:solid", false),
+ StyleMatch("text-decoration-style:solid", "", true ), // Default
+
+ // SPITextDecoration
+ StyleMatch("text-decoration:underline", "text-decoration:underline", true ),
+ StyleMatch("text-decoration:underline", "text-decoration:overline", false),
+ StyleMatch("text-decoration:underline overline","text-decoration:underline overline",true ),
+ StyleMatch("text-decoration:overline underline","text-decoration:underline overline",true ),
+ // StyleMatch("text-decoration:none", "text-decoration-color:currentColor", true ), // Default
+
+ };
+
+ size_t count = sizeof(all_style_data) / sizeof(all_style_data[0]);
+ std::vector<StyleMatch> vect(all_style_data, all_style_data + count);
+ return vect;
+}
+
+TEST(StyleTest, Match) {
+ std::vector<StyleMatch> all_style = getStyleMatchData();
+ EXPECT_GT(all_style.size(), 0);
+ for (auto i : all_style) {
+
+ SPStyle style_src;
+ SPStyle style_dst;
+
+ style_src.mergeString( i.src.c_str() );
+ style_dst.mergeString( i.dst.c_str() );
+
+ // std::cout << "Test:" << std::endl;
+ // std::cout << " C: |" << i.src
+ // << "| |" << i.dst << "|" << std::endl;
+ // std::cout << " S: |" << style_src.write( SP_STYLE_FLAG_IFSET )
+ // << "| |" << style_dst.write( SP_STYLE_FLAG_IFSET ) << "|" <<std::endl;
+
+ EXPECT_TRUE( (style_src == style_dst) == i.match );
+ }
+}
+
+// ------------------------------------------------------------------------------------
+
+class StyleCascade {
+
+public:
+ StyleCascade(std::string const &parent, std::string const &child, std::string const &result) :
+ parent(parent), child(child), result(result)
+ {
+ }
+
+ std::string parent;
+ std::string child;
+ std::string result;
+
+};
+
+std::vector<StyleCascade> getStyleCascadeData()
+{
+
+ StyleCascade all_style_data[] = {
+
+ // SPIFloat
+ StyleCascade("stroke-miterlimit:6", "stroke-miterlimit:2", "stroke-miterlimit:2" ),
+ StyleCascade("stroke-miterlimit:6", "", "stroke-miterlimit:6" ),
+ StyleCascade("", "stroke-miterlimit:2", "stroke-miterlimit:2" ),
+
+ // SPIScale24
+ StyleCascade("opacity:0.3", "opacity:0.3", "opacity:0.3" ),
+ StyleCascade("opacity:0.3", "opacity:0.6", "opacity:0.6" ),
+ // 'opacity' does not inherit
+ StyleCascade("opacity:0.3", "", "opacity:1.0" ),
+ StyleCascade("", "opacity:0.3", "opacity:0.3" ),
+ StyleCascade("opacity:0.5", "opacity:inherit", "opacity:0.5" ),
+ StyleCascade("", "", "opacity:1.0" ),
+
+ // SPILength
+ StyleCascade("text-indent:3", "text-indent:3", "text-indent:3" ),
+ StyleCascade("text-indent:6", "text-indent:3", "text-indent:3" ),
+ StyleCascade("text-indent:6px", "text-indent:3", "text-indent:3" ),
+ StyleCascade("text-indent:1px", "text-indent:12pc", "text-indent:12pc" ),
+ // ex, em cannot be equal
+ //StyleCascade("text-indent:2ex", "text-indent:2ex", "text-indent:2ex" ),
+ StyleCascade("text-indent:3", "", "text-indent:3" ),
+ StyleCascade("text-indent:3", "text-indent:inherit", "text-indent:3" ),
+
+ // SPILengthOrNormal
+ StyleCascade("letter-spacing:normal", "letter-spacing:normal", "letter-spacing:normal" ),
+ StyleCascade("letter-spacing:2", "letter-spacing:normal", "letter-spacing:normal" ),
+ StyleCascade("letter-spacing:normal", "letter-spacing:2", "letter-spacing:2" ),
+ StyleCascade("letter-spacing:5px", "letter-spacing:5px", "letter-spacing:5px" ),
+ StyleCascade("letter-spacing:10px", "letter-spacing:5px", "letter-spacing:5px" ),
+ // ex, em cannot be equal
+ // StyleCascade("letter-spacing:10em", "letter-spacing:10em", "letter-spacing:10em" ),
+
+ // SPIEnum
+ StyleCascade("text-anchor:start", "text-anchor:start", "text-anchor:start" ),
+ StyleCascade("text-anchor:start", "text-anchor:middle", "text-anchor:middle" ),
+ StyleCascade("text-anchor:start", "", "text-anchor:start" ),
+ StyleCascade("text-anchor:start", "text-anchor:junk", "text-anchor:start" ),
+ StyleCascade("text-anchor:end", "text-anchor:inherit", "text-anchor:end" ),
+
+ StyleCascade("font-weight:400", "font-weight:400", "font-weight:400" ),
+ StyleCascade("font-weight:400", "font-weight:700", "font-weight:700" ),
+ StyleCascade("font-weight:400", "font-weight:bolder", "font-weight:700" ),
+ StyleCascade("font-weight:700", "font-weight:bolder", "font-weight:900" ),
+ StyleCascade("font-weight:400", "font-weight:lighter", "font-weight:100" ),
+ StyleCascade("font-weight:200", "font-weight:lighter", "font-weight:100" ),
+
+ StyleCascade("font-stretch:condensed","font-stretch:expanded", "font-stretch:expanded" ),
+ StyleCascade("font-stretch:condensed","font-stretch:wider", "font-stretch:semi-condensed" ),
+
+ // SPIString and SPIFontString
+
+ // SPIPaint
+
+ // SPIPaintOrder
+
+ // SPIDashArray
+
+ // SPIFilter
+
+ // SPIFontSize
+
+ // SPIBaselineShift
+
+
+ // SPITextDecorationLine
+ StyleCascade("text-decoration-line:overline", "text-decoration-line:underline",
+ "text-decoration-line:underline" ),
+
+ // SPITextDecorationStyle
+
+ // SPITextDecoration
+ };
+
+ size_t count = sizeof(all_style_data) / sizeof(all_style_data[0]);
+ std::vector<StyleCascade> vect(all_style_data, all_style_data + count);
+ return vect;
+
+}
+
+TEST(StyleTest, Cascade) {
+ std::vector<StyleCascade> all_style = getStyleCascadeData();
+ EXPECT_GT(all_style.size(), 0);
+ for (auto i : all_style) {
+
+ SPStyle style_parent;
+ SPStyle style_child;
+ SPStyle style_result;
+
+ style_parent.mergeString( i.parent.c_str() );
+ style_child.mergeString( i.child.c_str() );
+ style_result.mergeString( i.result.c_str() );
+
+ // std::cout << "Test:" << std::endl;
+ // std::cout << " Input: ";
+ // std::cout << " Parent: " << i.parent
+ // << " Child: " << i.child
+ // << " Result: " << i.result << std::endl;
+ // std::cout << " Write: ";
+ // std::cout << " Parent: " << style_parent.write( SP_STYLE_FLAG_IFSET )
+ // << " Child: " << style_child.write( SP_STYLE_FLAG_IFSET )
+ // << " Result: " << style_result.write( SP_STYLE_FLAG_IFSET ) << std::endl;
+
+ style_child.cascade( &style_parent );
+
+ EXPECT_TRUE(style_child == style_result );
+ }
+}
+
+
+} // namespace
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :