1 // This file is part of Heimer.
2 // Copyright (C) 2018 Jussi Lind <jussi.lind@iki.fi>
3 //
4 // Heimer is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 // Heimer is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with Heimer. If not, see <http://www.gnu.org/licenses/>.
15 
16 #include "serializer_test.hpp"
17 
18 #include "alz_serializer.hpp"
19 #include "mind_map_data.hpp"
20 #include "test_mode.hpp"
21 
SerializerTest()22 SerializerTest::SerializerTest()
23 {
24     TestMode::setEnabled(true);
25 }
26 
testEmptyDesign()27 void SerializerTest::testEmptyDesign()
28 {
29     MindMapData outData;
30     const auto inData = AlzSerializer::fromXml(AlzSerializer::toXml(outData));
31     QCOMPARE(QString(inData->version()), QString(VERSION));
32 }
33 
testBackgroundColor()34 void SerializerTest::testBackgroundColor()
35 {
36     MindMapData outData;
37     outData.setBackgroundColor(QColor(1, 2, 3));
38     const auto inData = AlzSerializer::fromXml(AlzSerializer::toXml(outData));
39     QCOMPARE(inData->backgroundColor(), outData.backgroundColor());
40 }
41 
testCornerRadius()42 void SerializerTest::testCornerRadius()
43 {
44     MindMapData outData;
45     outData.setCornerRadius(Constants::Node::DEFAULT_CORNER_RADIUS + 1);
46     const auto inData = AlzSerializer::fromXml(AlzSerializer::toXml(outData));
47     QCOMPARE(inData->cornerRadius(), outData.cornerRadius());
48 }
49 
testEdgeColor()50 void SerializerTest::testEdgeColor()
51 {
52     MindMapData outData;
53     outData.setEdgeColor(QColor(1, 2, 3));
54     const auto inData = AlzSerializer::fromXml(AlzSerializer::toXml(outData));
55     QCOMPARE(inData->edgeColor(), outData.edgeColor());
56 }
57 
testEdgeWidth()58 void SerializerTest::testEdgeWidth()
59 {
60     MindMapData outData;
61     outData.setEdgeWidth(666.42);
62     const auto inData = AlzSerializer::fromXml(AlzSerializer::toXml(outData));
63     QCOMPARE(inData->edgeWidth(), outData.edgeWidth());
64 }
65 
testFontItalic()66 void SerializerTest::testFontItalic()
67 {
68     MindMapData outData;
69     QFont font("Foobar", 42, 666, true);
70     outData.setFont(font);
71     outData.setTextSize(24);
72     const auto inData = AlzSerializer::fromXml(AlzSerializer::toXml(outData));
73     QCOMPARE(inData->font().family(), outData.font().family());
74     QCOMPARE(inData->font().italic(), true);
75     QCOMPARE(inData->font().weight(), outData.font().weight());
76     QCOMPARE(inData->textSize(), outData.textSize()); // Font shouldn't change text size
77 }
78 
testFontNonItalic()79 void SerializerTest::testFontNonItalic()
80 {
81     MindMapData outData;
82     QFont font;
83     outData.setFont(font);
84     const auto inData = AlzSerializer::fromXml(AlzSerializer::toXml(outData));
85     QCOMPARE(inData->font().italic(), false);
86 }
87 
testFontBold()88 void SerializerTest::testFontBold()
89 {
90     MindMapData outData;
91     QFont font;
92     font.setBold(true);
93     outData.setFont(font);
94     const auto inData = AlzSerializer::fromXml(AlzSerializer::toXml(outData));
95     QCOMPARE(inData->font().bold(), true);
96 }
97 
testFontNonBold()98 void SerializerTest::testFontNonBold()
99 {
100     MindMapData outData;
101     QFont font;
102     outData.setFont(font);
103     const auto inData = AlzSerializer::fromXml(AlzSerializer::toXml(outData));
104     QCOMPARE(inData->font().bold(), false);
105 }
106 
testFontOverline()107 void SerializerTest::testFontOverline()
108 {
109     MindMapData outData;
110     QFont font;
111     font.setOverline(true);
112     outData.setFont(font);
113     const auto inData = AlzSerializer::fromXml(AlzSerializer::toXml(outData));
114     QCOMPARE(inData->font().overline(), true);
115 }
116 
testFontNonOverline()117 void SerializerTest::testFontNonOverline()
118 {
119     MindMapData outData;
120     QFont font;
121     outData.setFont(font);
122     const auto inData = AlzSerializer::fromXml(AlzSerializer::toXml(outData));
123     QCOMPARE(inData->font().overline(), false);
124 }
125 
testFontStrikeOut()126 void SerializerTest::testFontStrikeOut()
127 {
128     MindMapData outData;
129     QFont font;
130     font.setStrikeOut(true);
131     outData.setFont(font);
132     const auto inData = AlzSerializer::fromXml(AlzSerializer::toXml(outData));
133     QCOMPARE(inData->font().strikeOut(), true);
134 }
135 
testFontNonStrikeOut()136 void SerializerTest::testFontNonStrikeOut()
137 {
138     MindMapData outData;
139     QFont font;
140     outData.setFont(font);
141     const auto inData = AlzSerializer::fromXml(AlzSerializer::toXml(outData));
142     QCOMPARE(inData->font().strikeOut(), false);
143 }
144 
testFontUnderline()145 void SerializerTest::testFontUnderline()
146 {
147     MindMapData outData;
148     QFont font("Foobar");
149     font.setUnderline(true);
150     outData.setFont(font);
151     const auto inData = AlzSerializer::fromXml(AlzSerializer::toXml(outData));
152     QCOMPARE(inData->font().underline(), true);
153 }
154 
testFontNonUnderline()155 void SerializerTest::testFontNonUnderline()
156 {
157     MindMapData outData;
158     QFont font("Foobar");
159     outData.setFont(font);
160     const auto inData = AlzSerializer::fromXml(AlzSerializer::toXml(outData));
161     QCOMPARE(inData->font().underline(), false);
162 }
163 
testGridColor()164 void SerializerTest::testGridColor()
165 {
166     MindMapData outData;
167     outData.setGridColor(QColor(1, 2, 3));
168     const auto inData = AlzSerializer::fromXml(AlzSerializer::toXml(outData));
169     QCOMPARE(inData->gridColor(), outData.gridColor());
170 }
171 
testLayoutOptimizer()172 void SerializerTest::testLayoutOptimizer()
173 {
174     MindMapData outData;
175     outData.setAspectRatio(3.14);
176     outData.setMinEdgeLength(42.666);
177     const auto inData = AlzSerializer::fromXml(AlzSerializer::toXml(outData));
178     QCOMPARE(inData->aspectRatio(), outData.aspectRatio());
179     QCOMPARE(inData->minEdgeLength(), outData.minEdgeLength());
180 }
181 
testNotUsedImages()182 void SerializerTest::testNotUsedImages()
183 {
184     MindMapData outData;
185     outData.imageManager().addImage(Image {});
186     outData.imageManager().addImage(Image {});
187     const auto outXml = AlzSerializer::toXml(outData);
188     outData.imageManager().clear(); // ImageManager is a static class
189     QCOMPARE(outData.imageManager().images().size(), size_t { 0 });
190     const auto inData = AlzSerializer::fromXml(outXml);
191     // No nodes are using the added images, so nothing should have been serialized
192     QCOMPARE(outData.imageManager().images().size(), size_t { 0 });
193 }
194 
testUsedImages()195 void SerializerTest::testUsedImages()
196 {
197     MindMapData outData;
198     const auto id1 = outData.imageManager().addImage(Image {});
199     const auto id2 = outData.imageManager().addImage(Image {});
200     auto node1 = std::make_shared<Node>();
201     outData.graph().addNode(node1);
202     node1->setImageRef(id1);
203     auto node2 = std::make_shared<Node>();
204     outData.graph().addNode(node2);
205     node2->setImageRef(id2);
206 
207     const auto outXml = AlzSerializer::toXml(outData);
208     outData.imageManager().clear(); // ImageManager is a static class
209     QCOMPARE(outData.imageManager().images().size(), size_t { 0 });
210     const auto inData = AlzSerializer::fromXml(outXml);
211     QCOMPARE(outData.imageManager().images().size(), size_t { 2 });
212 }
213 
testTextSize()214 void SerializerTest::testTextSize()
215 {
216     MindMapData outData;
217     outData.setTextSize(42);
218     const auto inData = AlzSerializer::fromXml(AlzSerializer::toXml(outData));
219     QCOMPARE(inData->textSize(), outData.textSize());
220 }
221 
testNodeDeletion()222 void SerializerTest::testNodeDeletion()
223 {
224     MindMapData outData;
225 
226     auto outNode0 = std::make_shared<Node>();
227     outData.graph().addNode(outNode0);
228 
229     auto outNode1 = std::make_shared<Node>();
230     outData.graph().addNode(outNode1);
231 
232     auto outNode2 = std::make_shared<Node>();
233     outData.graph().addNode(outNode2);
234 
235     outData.graph().addEdge(std::make_shared<Edge>(*outNode0, *outNode1));
236 
237     outData.graph().addEdge(std::make_shared<Edge>(*outNode0, *outNode2));
238 
239     outData.graph().deleteNode(outNode1->index()); // Delete node in between
240 
241     const auto inData = AlzSerializer::fromXml(AlzSerializer::toXml(outData));
242     const auto edges = inData->graph().getEdgesFromNode(outNode0);
243     QCOMPARE(edges.size(), static_cast<size_t>(1));
244 }
245 
testSingleEdge()246 void SerializerTest::testSingleEdge()
247 {
248     MindMapData outData;
249 
250     const auto outNode0 = std::make_shared<Node>();
251     outData.graph().addNode(outNode0);
252 
253     const auto outNode1 = std::make_shared<Node>();
254     outData.graph().addNode(outNode1);
255 
256     const auto edge = std::make_shared<Edge>(*outNode0, *outNode1);
257     const QString text = "Lorem ipsum";
258     edge->setText(text);
259     edge->setReversed(true);
260     edge->setArrowMode(Edge::ArrowMode::Double);
261     outData.graph().addEdge(edge);
262 
263     const auto inData = AlzSerializer::fromXml(AlzSerializer::toXml(outData));
264     const auto edges = inData->graph().getEdgesFromNode(outNode0);
265     QCOMPARE(edges.size(), static_cast<size_t>(1));
266     QCOMPARE((*edges.begin())->text(), edge->text());
267     QCOMPARE((*edges.begin())->reversed(), edge->reversed());
268     QCOMPARE((*edges.begin())->arrowMode(), edge->arrowMode());
269 }
270 
testSingleNode()271 void SerializerTest::testSingleNode()
272 {
273     MindMapData outData;
274 
275     const auto outNode = std::make_shared<Node>();
276     outNode->setColor(QColor(1, 2, 3));
277     const auto imageRef = outData.imageManager().addImage(Image {});
278     outNode->setImageRef(imageRef);
279     outNode->setLocation(QPointF(333.333, 666.666));
280     outNode->setSize(QSize(123, 321));
281     outNode->setText("Lorem ipsum");
282     outNode->setTextColor(QColor(4, 5, 6));
283     outData.graph().addNode(outNode);
284 
285     const auto inData = AlzSerializer::fromXml(AlzSerializer::toXml(outData));
286     QVERIFY(inData->graph().numNodes() == 1);
287 
288     const auto node = inData->graph().getNode(0);
289     QVERIFY(node != nullptr);
290     QCOMPARE(node->index(), outNode->index());
291     QCOMPARE(node->color(), outNode->color());
292     QCOMPARE(node->imageRef(), outNode->imageRef());
293     QCOMPARE(node->location(), outNode->location());
294     QCOMPARE(node->size(), outNode->size());
295     QCOMPARE(node->text(), outNode->text());
296     QCOMPARE(node->textColor(), outNode->textColor());
297 }
298 
299 QTEST_GUILESS_MAIN(SerializerTest)
300