ACF $AcfVersion:0$
CCompactXmlArchiveTest.h
Go to the documentation of this file.
1// SPDX-License-Identifier: LGPL-2.1-or-later OR GPL-2.0-or-later OR GPL-3.0-or-later OR LicenseRef-ACF-Commercial
2#pragma once
3
4
5// Qt includes
6#include <QtCore/QObject>
7#include <QtTest/QtTest>
8
9// ACF includes
12#include <iser/ISerializable.h>
13#include <iser/IArchive.h>
14#include <iser/CArchiveTag.h>
15
16
17class CCompactXmlArchiveTest: public QObject
18{
19 Q_OBJECT
20
21private Q_SLOTS:
22 void BasicCompactXmlSerializationTest();
23 void CompactXmlComplexDataTest();
24 void CompactXmlArrayTest();
25
26private:
27 class SimpleModel: virtual public iser::ISerializable
28 {
29 public:
30 virtual bool Serialize(iser::IArchive& archive) override
31 {
32 static iser::CArchiveTag tag("Value", "Integer value");
33 bool retVal = archive.BeginTag(tag);
34 retVal = retVal && archive.Process(value);
35 retVal = retVal && archive.EndTag(tag);
36 return retVal;
37 }
38
39 int value = 0;
40 };
41
42 class ComplexModel: virtual public iser::ISerializable
43 {
44 public:
45 virtual bool Serialize(iser::IArchive& archive) override
46 {
47 static iser::CArchiveTag intTag("IntValue", "Integer value");
48 static iser::CArchiveTag doubleTag("DoubleValue", "Double value");
49 static iser::CArchiveTag stringTag("StringValue", "String value");
50
51 bool retVal = archive.BeginTag(intTag);
52 retVal = retVal && archive.Process(intValue);
53 retVal = retVal && archive.EndTag(intTag);
54
55 retVal = retVal && archive.BeginTag(doubleTag);
56 retVal = retVal && archive.Process(doubleValue);
57 retVal = retVal && archive.EndTag(doubleTag);
58
59 retVal = retVal && archive.BeginTag(stringTag);
60 retVal = retVal && archive.Process(stringValue);
61 retVal = retVal && archive.EndTag(stringTag);
62
63 return retVal;
64 }
65
66 int intValue = 0;
67 double doubleValue = 0.0;
68 QString stringValue;
69
70 bool operator==(const ComplexModel& other) const
71 {
72 return intValue == other.intValue &&
73 qFuzzyCompare(doubleValue, other.doubleValue) &&
74 stringValue == other.stringValue;
75 }
76 };
77
78 class ArrayModel: virtual public iser::ISerializable
79 {
80 public:
81 virtual bool Serialize(iser::IArchive& archive) override
82 {
83 static iser::CArchiveTag arrayTag("Numbers", "Numbers array", iser::CArchiveTag::TT_MULTIPLE);
84 static iser::CArchiveTag itemTag("Number", "Single number", iser::CArchiveTag::TT_LEAF, &arrayTag);
85
86 bool retVal = true;
87 int count = numbers.size();
88
89 retVal = retVal && archive.BeginMultiTag(arrayTag, itemTag, count);
90 if (!archive.IsStoring()) {
91 numbers.resize(count);
92 }
93
94 for (int i = 0; i < numbers.size(); ++i) {
95 retVal = retVal && archive.BeginTag(itemTag);
96 retVal = retVal && archive.Process(numbers[i]);
97 retVal = retVal && archive.EndTag(itemTag);
98 }
99
100 retVal = retVal && archive.EndTag(arrayTag);
101 return retVal;
102 }
103
104 QList<double> numbers;
105
106 bool operator==(const ArrayModel& other) const
107 {
108 if (numbers.size() != other.numbers.size())
109 return false;
110 for (int i = 0; i < numbers.size(); ++i) {
111 if (!qFuzzyCompare(numbers[i], other.numbers[i]))
112 return false;
113 }
114 return true;
115 }
116 };
117};
118
119
Process tag used to group data in archive stream.
Definition CArchiveTag.h:22
@ TT_LEAF
Leaf tag, it can contain only one primitive element.
Definition CArchiveTag.h:48
@ TT_MULTIPLE
Multiple tag containing variable number of child tags.
Definition CArchiveTag.h:42
Represents an input/output persistence archive for object serialization.
Definition IArchive.h:164
virtual bool Process(bool &value)=0
Processes (reads or writes) a boolean value.
virtual bool EndTag(const CArchiveTag &tag)=0
Ends a tagged section in the archive.
virtual bool BeginMultiTag(const CArchiveTag &tag, const CArchiveTag &subTag, int &count)=0
Begins a tagged section containing multiple elements of the same type.
virtual bool IsStoring() const =0
Checks if this archive is in storing (writing) or loading (reading) mode.
virtual bool BeginTag(const CArchiveTag &tag)=0
Begins a tagged section in the archive.
Common class for all classes which objects can be archived or restored from archive.