File indexing completed on 2025-08-06 08:11:28
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <boost/test/data/test_case.hpp>
0010 #include <boost/test/tools/output_test_stream.hpp>
0011 #include <boost/test/unit_test.hpp>
0012
0013 #include "Acts/Definitions/Algebra.hpp"
0014 #include "Acts/Surfaces/BoundaryCheck.hpp"
0015 #include "Acts/Surfaces/EllipseBounds.hpp"
0016 #include "Acts/Surfaces/RectangleBounds.hpp"
0017 #include "Acts/Surfaces/SurfaceBounds.hpp"
0018
0019 #include <algorithm>
0020 #include <array>
0021 #include <cmath>
0022 #include <stdexcept>
0023 #include <vector>
0024
0025 namespace Acts {
0026
0027 namespace Test {
0028 BOOST_AUTO_TEST_SUITE(Surfaces)
0029
0030
0031 BOOST_AUTO_TEST_CASE(EllipseBoundsConstruction) {
0032 double innerRx(10.), innerRy(15.), outerRx(25.), outerRy(30.),
0033 phiSector(M_PI / 2.), averagePhi(0.);
0034
0035
0036
0037
0038
0039 BOOST_CHECK_EQUAL(
0040 EllipseBounds(innerRx, innerRy, outerRx, outerRy, phiSector, averagePhi)
0041 .type(),
0042 SurfaceBounds::eEllipse);
0043
0044
0045 EllipseBounds original(innerRx, innerRy, outerRx, outerRy, phiSector,
0046 averagePhi);
0047 EllipseBounds copied(original);
0048 BOOST_CHECK_EQUAL(copied, original);
0049 }
0050
0051
0052 BOOST_AUTO_TEST_CASE(EllipseBoundsRecreation) {
0053 double innerRx(10.), innerRy(15.), outerRx(25.), outerRy(30.),
0054 phiSector(M_PI / 2.), averagePhi(0.);
0055
0056 EllipseBounds original(innerRx, innerRy, outerRx, outerRy, phiSector,
0057 averagePhi);
0058 auto valvector = original.values();
0059 std::array<double, EllipseBounds::eSize> values{};
0060 std::copy_n(valvector.begin(), EllipseBounds::eSize, values.begin());
0061 EllipseBounds recreated(values);
0062 BOOST_CHECK_EQUAL(recreated, original);
0063 }
0064
0065
0066 BOOST_AUTO_TEST_CASE(ConeBoundsExceptions) {
0067 double innerRx(10.), innerRy(15.), outerRx(25.), outerRy(30.),
0068 phiSector(M_PI / 2.), averagePhi(0.);
0069
0070 BOOST_CHECK_THROW(
0071 EllipseBounds(-innerRx, innerRy, outerRx, outerRy, phiSector, averagePhi),
0072 std::logic_error);
0073
0074 BOOST_CHECK_THROW(
0075 EllipseBounds(innerRx, -innerRy, outerRx, outerRy, phiSector, averagePhi),
0076 std::logic_error);
0077
0078 BOOST_CHECK_THROW(EllipseBounds(-innerRx, -innerRy, outerRx, outerRy,
0079 phiSector, averagePhi),
0080 std::logic_error);
0081
0082 BOOST_CHECK_THROW(
0083 EllipseBounds(innerRx, innerRy, 0., outerRy, phiSector, averagePhi),
0084 std::logic_error);
0085
0086 BOOST_CHECK_THROW(
0087 EllipseBounds(innerRx, innerRy, outerRx, 0., phiSector, averagePhi),
0088 std::logic_error);
0089
0090 BOOST_CHECK_THROW(EllipseBounds(innerRx, innerRy, -outerRx, -outerRy,
0091 phiSector, averagePhi),
0092 std::logic_error);
0093
0094 BOOST_CHECK_THROW(
0095 EllipseBounds(outerRx, innerRy, innerRx, outerRy, phiSector, averagePhi),
0096 std::logic_error);
0097
0098 BOOST_CHECK_THROW(
0099 EllipseBounds(innerRx, outerRy, outerRx, innerRy, phiSector, averagePhi),
0100 std::logic_error);
0101
0102 BOOST_CHECK_THROW(
0103 EllipseBounds(innerRx, innerRy, outerRx, outerRy, -phiSector, averagePhi),
0104 std::logic_error);
0105
0106 BOOST_CHECK_THROW(
0107 EllipseBounds(innerRx, innerRy, outerRx, outerRy, phiSector, 4.),
0108 std::logic_error);
0109 }
0110
0111
0112 BOOST_AUTO_TEST_CASE(EllipseBoundsProperties) {
0113 double innerRx(10.), outerRx(15.), innerRy(15.), outerRy(20.), averagePhi(0.),
0114 phiSector(M_PI / 2.);
0115
0116 EllipseBounds ellipseBoundsObject(innerRx, innerRy, outerRx, outerRy,
0117 phiSector, averagePhi);
0118
0119
0120 BOOST_CHECK_EQUAL(ellipseBoundsObject.type(), SurfaceBounds::eEllipse);
0121
0122
0123
0124
0125 Vector2 origin(0., 0.);
0126 Vector2 outsideBy15(0., 30.);
0127 Vector2 inRectangle(17., 11.);
0128
0129
0130 BOOST_CHECK_EQUAL(ellipseBoundsObject.get(EllipseBounds::eInnerRx), innerRx);
0131
0132
0133 BOOST_CHECK_EQUAL(ellipseBoundsObject.get(EllipseBounds::eOuterRx), outerRx);
0134
0135
0136 BOOST_CHECK_EQUAL(ellipseBoundsObject.get(EllipseBounds::eInnerRy), innerRy);
0137
0138
0139 BOOST_CHECK_EQUAL(ellipseBoundsObject.get(EllipseBounds::eOuterRy), outerRy);
0140
0141
0142 BOOST_CHECK_EQUAL(ellipseBoundsObject.get(EllipseBounds::eAveragePhi),
0143 averagePhi);
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154 BOOST_CHECK_EQUAL(ellipseBoundsObject.boundingBox(),
0155 RectangleBounds(15., 20.));
0156
0157
0158 BOOST_CHECK_EQUAL(ellipseBoundsObject.get(EllipseBounds::eHalfPhiSector),
0159 M_PI / 2.);
0160
0161
0162 boost::test_tools::output_test_stream dumpOuput;
0163 ellipseBoundsObject.toStream(dumpOuput);
0164 BOOST_CHECK(dumpOuput.is_equal(
0165 "Acts::EllipseBounds: (innerRadius0, outerRadius0, innerRadius1, "
0166 "outerRadius1, hPhiSector, averagePhi) = (10.0000000, 15.0000000, "
0167 "15.0000000, "
0168 "20.0000000, 0.0000000, 1.5707963, 0.0000000)"));
0169
0170
0171 BOOST_CHECK(!ellipseBoundsObject.inside(inRectangle, BoundaryCheck(true)));
0172
0173 BOOST_CHECK(!ellipseBoundsObject.inside(outsideBy15, BoundaryCheck(true)));
0174 }
0175
0176 BOOST_AUTO_TEST_CASE(EllipseBoundsAssignment) {
0177 double innerRx(10.), outerRx(15.), innerRy(15.), outerRy(20.), averagePhi(0.),
0178 phiSector(M_PI / 2.);
0179 EllipseBounds ellipseBoundsObject(innerRx, outerRx, innerRy, outerRy,
0180 averagePhi, phiSector);
0181 EllipseBounds similarlyConstructeEllipseBoundsObject(
0182 innerRx, outerRx, innerRy, outerRy, averagePhi, phiSector);
0183
0184 BOOST_CHECK_EQUAL(ellipseBoundsObject,
0185 similarlyConstructeEllipseBoundsObject);
0186
0187
0188 EllipseBounds assignedEllipseBoundsObject(11., 12., 17., 18., 1.);
0189
0190 assignedEllipseBoundsObject = ellipseBoundsObject;
0191 BOOST_CHECK_EQUAL(assignedEllipseBoundsObject, ellipseBoundsObject);
0192 }
0193
0194 BOOST_AUTO_TEST_SUITE_END()
0195
0196 }
0197
0198 }