forked from npshub/mantid
-
Notifications
You must be signed in to change notification settings - Fork 0
/
CoordTransformAffineParserTest.h
112 lines (92 loc) · 5.04 KB
/
CoordTransformAffineParserTest.h
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
// Mantid Repository : https://github.com/mantidproject/mantid
//
// Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI,
// NScD Oak Ridge National Laboratory, European Spallation Source,
// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS
// SPDX - License - Identifier: GPL - 3.0 +
#pragma once
#include "MantidAPI/CoordTransform.h"
#include "MantidDataObjects/CoordTransformAffine.h"
#include "MantidDataObjects/CoordTransformAffineParser.h"
#include <cxxtest/TestSuite.h>
#include <Poco/DOM/DOMParser.h>
#include <Poco/DOM/Document.h>
#include <Poco/DOM/Element.h>
using namespace Mantid::DataObjects;
class CoordTransformAffineParserTest : public CxxTest::TestSuite {
private:
class MockCoordTransformAffineParser : public CoordTransformAffineParser {
Mantid::API::CoordTransform *createTransform(Poco::XML::Element *) const override {
return new CoordTransformAffine(1, 1);
}
};
public:
void testSuccessfulParse() {
std::string xmlToParse = std::string("<CoordTransform>") + "<Type>CoordTransformAffine</Type>" + "<ParameterList>" +
"<Parameter><Type>InDimParameter</Type><Value>2</Value></Parameter>" +
"<Parameter><Type>OutDimParameter</Type><Value>2</Value></Parameter>" +
"<Parameter><Type>AffineMatrixParameter</"
"Type><Value>0,1,2;3,4,5;6,7,8</Value></Parameter>" +
"</ParameterList></CoordTransform>";
Poco::XML::DOMParser pParser;
Poco::AutoPtr<Poco::XML::Document> pDoc = pParser.parseString(xmlToParse);
Poco::XML::Element *pRootElem = pDoc->documentElement();
CoordTransformAffineParser parser;
CoordTransformAffine *transform = dynamic_cast<CoordTransformAffine *>(parser.createTransform(pRootElem));
AffineMatrixType product = transform->getMatrix();
// Check that matrix is recovered.
TS_ASSERT_EQUALS(0, product[0][0]);
TS_ASSERT_EQUALS(1, product[0][1]);
TS_ASSERT_EQUALS(2, product[0][2]);
TS_ASSERT_EQUALS(3, product[1][0]);
TS_ASSERT_EQUALS(4, product[1][1]);
TS_ASSERT_EQUALS(5, product[1][2]);
TS_ASSERT_EQUALS(6, product[2][0]);
TS_ASSERT_EQUALS(7, product[2][1]);
TS_ASSERT_EQUALS(8, product[2][2]);
// Circular check. Acutally hard to debug, but gives certainty that
// serialization and deserialization cause no side effects.
TSM_ASSERT_EQUALS("Parsing has not occured correctly if the output is not "
"equal to the intput",
transform->toXMLString(), xmlToParse);
delete transform;
}
void testNotACoordTransformThrows() {
std::string xmlToParse = std::string("<OTHER></OTHER>");
Poco::XML::DOMParser pParser;
Poco::AutoPtr<Poco::XML::Document> pDoc = pParser.parseString(xmlToParse);
Poco::XML::Element *pRootElem = pDoc->documentElement();
CoordTransformAffineParser parser;
TSM_ASSERT_THROWS("XML root node must be a coordinate transform", parser.createTransform(pRootElem),
const std::invalid_argument &);
}
void testNoSuccessorThrows() {
std::string xmlToParse = "<CoordTransform><Type>OTHER</Type></CoordTransform>"; // type is not a
// coordinate
// transform, so
// should try to
// use it's
// successor
Poco::XML::DOMParser pParser;
Poco::AutoPtr<Poco::XML::Document> pDoc = pParser.parseString(xmlToParse);
Poco::XML::Element *pRootElem = pDoc->documentElement();
CoordTransformAffineParser parser;
TSM_ASSERT_THROWS("Should throw since no successor parser has been set", parser.createTransform(pRootElem),
const std::runtime_error &);
}
void testDelegateToSuccessor() {
std::string xmlToParse = "<CoordTransform><Type>OTHER</Type></CoordTransform>"; // type is not a
// coordinate
// transform, so
// should try to
// use it's
// successor
Poco::XML::DOMParser pParser;
Poco::AutoPtr<Poco::XML::Document> pDoc = pParser.parseString(xmlToParse);
Poco::XML::Element *pRootElem = pDoc->documentElement();
CoordTransformAffineParser parser;
parser.setSuccessor(new MockCoordTransformAffineParser);
Mantid::API::CoordTransform *product = parser.createTransform(pRootElem);
delete product;
}
};