summaryrefslogtreecommitdiffstats
path: root/testfiles/src/object-style-test.cpp
blob: b23bc5e6685dac6c018387548c3411e2bcd42753 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*
 * Combination style and object testing for cascading and flags.
 *
 * Authors:
 *   Martin Owens
 *
 * Copyright (C) 2018 Authors
 *
 * Released under GNU GPL, read the file 'COPYING' for more information
 */

#include <gtest/gtest.h>
#include <doc-per-case-test.h>

#include <src/style.h>
#include <src/object/sp-root.h>
#include <src/object/sp-rect.h>

using namespace Inkscape;
using namespace Inkscape::XML;

class ObjectTest: public DocPerCaseTest {
public:
    ObjectTest() {
        char const *docString = "\
<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'>\
<style>\
rect { fill: #808080; opacity:0.5; }\
.extra { opacity:1.0; }\
.overload { fill: #d0d0d0 !important; stroke: #c0c0c0 !important; }\
</style>\
<g style='fill:blue; stroke-width:2px'>\
  <rect id='one' style='fill:red; stroke:green;'/>\
  <rect id='two' style='stroke:green; stroke-width:4px;'/>\
  <rect id='three' class='extra' style='fill: #cccccc;'/>\
  <rect id='four' class='overload' style='fill:green;stroke:red !important;'/>\
</g>\
</svg>";
        doc = SPDocument::createNewDocFromMem(docString, static_cast<int>(strlen(docString)), false);
    }

    ~ObjectTest() {
        doc->doUnref();
    }

    SPDocument *doc;
};

TEST_F(ObjectTest, Styles) {
    ASSERT_TRUE(doc != nullptr);
    ASSERT_TRUE(doc->getRoot() != nullptr);

    SPRoot *root = doc->getRoot();
    ASSERT_TRUE(root->getRepr() != nullptr);
    ASSERT_TRUE(root->hasChildren());

    SPRect *one = dynamic_cast<SPRect *>(doc->getObjectById("one"));
    ASSERT_TRUE(one != nullptr);

    // TODO: Fix when Inkscape preserves colour names (i.e. 'red')
    EXPECT_EQ(one->style->fill.get_value(), Glib::ustring("#ff0000"));
    EXPECT_EQ(one->style->stroke.get_value(), Glib::ustring("#008000"));
    EXPECT_EQ(one->style->opacity.get_value(), Glib::ustring("0.5"));
    EXPECT_EQ(one->style->stroke_width.get_value(), Glib::ustring("2px"));

    SPRect *two = dynamic_cast<SPRect *>(doc->getObjectById("two"));
    ASSERT_TRUE(two != nullptr);

    EXPECT_EQ(two->style->fill.get_value(), Glib::ustring("#808080"));
    EXPECT_EQ(two->style->stroke.get_value(), Glib::ustring("#008000"));
    EXPECT_EQ(two->style->opacity.get_value(), Glib::ustring("0.5"));
    EXPECT_EQ(two->style->stroke_width.get_value(), Glib::ustring("4px"));

    SPRect *three = dynamic_cast<SPRect *>(doc->getObjectById("three"));
    ASSERT_TRUE(three != nullptr);

    EXPECT_EQ(three->style->fill.get_value(), Glib::ustring("#cccccc"));
    EXPECT_EQ(three->style->stroke.get_value(), Glib::ustring(""));
    EXPECT_EQ(three->style->opacity.get_value(), Glib::ustring("1"));
    EXPECT_EQ(three->style->stroke_width.get_value(), Glib::ustring("2px"));

    SPRect *four = dynamic_cast<SPRect *>(doc->getObjectById("four"));
    ASSERT_TRUE(four != nullptr);

    EXPECT_EQ(four->style->fill.get_value(), Glib::ustring("#d0d0d0"));
    EXPECT_EQ(four->style->stroke.get_value(), Glib::ustring("#ff0000"));
    EXPECT_EQ(four->style->opacity.get_value(), Glib::ustring("0.5"));
    EXPECT_EQ(four->style->stroke_width.get_value(), Glib::ustring("2px"));
}

TEST_F(ObjectTest, StyleSource) {
    ASSERT_TRUE(doc != nullptr);
    ASSERT_TRUE(doc->getRoot() != nullptr);

    SPRoot *root = doc->getRoot();
    ASSERT_TRUE(root->getRepr() != nullptr);
    ASSERT_TRUE(root->hasChildren());

    SPRect *one = dynamic_cast<SPRect *>(doc->getObjectById("one"));
    ASSERT_TRUE(one != nullptr);

    EXPECT_EQ(one->style->fill.style_src, SP_STYLE_SRC_STYLE_PROP);
    EXPECT_EQ(one->style->stroke.style_src, SP_STYLE_SRC_STYLE_PROP);
    EXPECT_EQ(one->style->opacity.style_src, SP_STYLE_SRC_STYLE_SHEET);
    EXPECT_EQ(one->style->stroke_width.style_src, SP_STYLE_SRC_STYLE_PROP);

    SPRect *two = dynamic_cast<SPRect *>(doc->getObjectById("two"));
    ASSERT_TRUE(two != nullptr);

    EXPECT_EQ(two->style->fill.style_src, SP_STYLE_SRC_STYLE_SHEET);
    EXPECT_EQ(two->style->stroke.style_src, SP_STYLE_SRC_STYLE_PROP);
    EXPECT_EQ(two->style->opacity.style_src, SP_STYLE_SRC_STYLE_SHEET);
    EXPECT_EQ(two->style->stroke_width.style_src, SP_STYLE_SRC_STYLE_PROP);

    SPRect *three = dynamic_cast<SPRect *>(doc->getObjectById("three"));
    ASSERT_TRUE(three != nullptr);

    EXPECT_EQ(three->style->fill.style_src, SP_STYLE_SRC_STYLE_PROP);
    EXPECT_EQ(three->style->stroke.style_src, SP_STYLE_SRC_STYLE_PROP);
    EXPECT_EQ(three->style->opacity.style_src, SP_STYLE_SRC_STYLE_SHEET);
    EXPECT_EQ(three->style->stroke_width.style_src, SP_STYLE_SRC_STYLE_PROP);

    SPRect *four = dynamic_cast<SPRect *>(doc->getObjectById("four"));
    ASSERT_TRUE(four != nullptr);

    EXPECT_EQ(four->style->fill.style_src, SP_STYLE_SRC_STYLE_SHEET);
    EXPECT_EQ(four->style->stroke.style_src, SP_STYLE_SRC_STYLE_PROP);
    EXPECT_EQ(four->style->opacity.style_src, SP_STYLE_SRC_STYLE_SHEET);
    EXPECT_EQ(four->style->stroke_width.style_src, SP_STYLE_SRC_STYLE_PROP);

}