Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-10-28 07:55:40

0001 // This file is part of the ACTS project.
0002 //
0003 // Copyright (C) 2016 CERN for the benefit of the ACTS project
0004 //
0005 // This Source Code Form is subject to the terms of the Mozilla Public
0006 // License, v. 2.0. If a copy of the MPL was not distributed with this
0007 // file, You can obtain one at https://mozilla.org/MPL/2.0/.
0008 
0009 #include <boost/test/unit_test.hpp>
0010 
0011 #include "Acts/Utilities/RangeXD.hpp"
0012 
0013 #include <limits>
0014 #include <utility>
0015 #include <vector>
0016 
0017 namespace {
0018 std::vector<int> v = {-100, -90, -80, -70, -60, -50, -40, -30, -20, 10, 0,
0019                       10,   20,  30,  40,  50,  60,  70,  80,  90,  100};
0020 }
0021 
0022 using namespace Acts;
0023 
0024 namespace ActsTests {
0025 
0026 BOOST_AUTO_TEST_SUITE(UtilitiesSuite)
0027 
0028 BOOST_AUTO_TEST_SUITE(Range1DSuite)
0029 
0030 BOOST_AUTO_TEST_CASE(infinite_range_int) {
0031   Range1D<int> r;
0032 
0033   BOOST_CHECK_EQUAL(r.min(), std::numeric_limits<int>::lowest());
0034   BOOST_CHECK_EQUAL(r.max(), std::numeric_limits<int>::max());
0035 }
0036 
0037 BOOST_AUTO_TEST_CASE(infinite_range_double) {
0038   Range1D<double> r;
0039 
0040   BOOST_CHECK_EQUAL(r.min(), std::numeric_limits<double>::lowest());
0041   BOOST_CHECK_EQUAL(r.max(), std::numeric_limits<double>::max());
0042 }
0043 
0044 BOOST_AUTO_TEST_CASE(constructor_range_int) {
0045   Range1D<int> r(-11, 2);
0046 
0047   BOOST_CHECK_EQUAL(r.min(), -11);
0048   BOOST_CHECK_EQUAL(r.max(), 2);
0049 }
0050 
0051 BOOST_AUTO_TEST_CASE(constructor_range_double) {
0052   Range1D<double> r(-11.0, 2.0);
0053 
0054   BOOST_CHECK_EQUAL(r.min(), -11.0);
0055   BOOST_CHECK_EQUAL(r.max(), 2.0);
0056 }
0057 
0058 BOOST_AUTO_TEST_CASE(constructor_copy_double) {
0059   Range1D<double> q(-11.0, 2.0);
0060   Range1D<double> r(q);
0061 
0062   BOOST_CHECK_EQUAL(r.min(), -11.0);
0063   BOOST_CHECK_EQUAL(r.max(), 2.0);
0064 }
0065 
0066 BOOST_AUTO_TEST_CASE(constructor_tuple_double) {
0067   Range1D<double> r(std::pair<double, double>(-11.0, 2.0));
0068 
0069   BOOST_CHECK_EQUAL(r.min(), -11.0);
0070   BOOST_CHECK_EQUAL(r.max(), 2.0);
0071 }
0072 
0073 BOOST_AUTO_TEST_CASE(assign_double) {
0074   Range1D<double> q(-11.0, 2.0);
0075   Range1D<double> r = q;
0076 
0077   BOOST_CHECK_EQUAL(r.min(), -11.0);
0078   BOOST_CHECK_EQUAL(r.max(), 2.0);
0079 }
0080 
0081 BOOST_AUTO_TEST_CASE(shrinkMin_double) {
0082   Range1D<double> r;
0083 
0084   r.shrinkMin(-11.0);
0085 
0086   BOOST_CHECK_EQUAL(r.min(), -11.0);
0087   BOOST_CHECK_EQUAL(r.max(), std::numeric_limits<double>::max());
0088 }
0089 
0090 BOOST_AUTO_TEST_CASE(shrinkMax_double) {
0091   Range1D<double> r;
0092 
0093   r.shrinkMax(2.0);
0094 
0095   BOOST_CHECK_EQUAL(r.min(), std::numeric_limits<double>::lowest());
0096   BOOST_CHECK_EQUAL(r.max(), 2.0);
0097 }
0098 
0099 BOOST_AUTO_TEST_CASE(shrink_both_double) {
0100   Range1D<double> r;
0101 
0102   r.shrinkMin(-11.0);
0103   r.shrinkMax(2.0);
0104 
0105   BOOST_CHECK_EQUAL(r.min(), -11.0);
0106   BOOST_CHECK_EQUAL(r.max(), 2.0);
0107 }
0108 
0109 BOOST_AUTO_TEST_CASE(shrink_double) {
0110   Range1D<double> r;
0111 
0112   r.shrink(-11.0, 2.0);
0113 
0114   BOOST_CHECK_EQUAL(r.min(), -11.0);
0115   BOOST_CHECK_EQUAL(r.max(), 2.0);
0116 }
0117 
0118 BOOST_AUTO_TEST_CASE(shrink_twice_double) {
0119   Range1D<double> r;
0120 
0121   r.shrink(-100.0, 20.0);
0122   r.shrink(-11.0, 2.0);
0123 
0124   BOOST_CHECK_EQUAL(r.min(), -11.0);
0125   BOOST_CHECK_EQUAL(r.max(), 2.0);
0126 }
0127 
0128 BOOST_AUTO_TEST_CASE(shrink_noop_double) {
0129   Range1D<double> r;
0130 
0131   r.shrink(-11.0, 2.0);
0132   r.shrink(-100.0, 20.0);
0133 
0134   BOOST_CHECK_EQUAL(r.min(), -11.0);
0135   BOOST_CHECK_EQUAL(r.max(), 2.0);
0136 }
0137 
0138 BOOST_AUTO_TEST_CASE(shrink_noop_min_double) {
0139   Range1D<double> r;
0140 
0141   r.shrink(-11.0, 2.0);
0142   r.shrink(-100.0, 1.0);
0143 
0144   BOOST_CHECK_EQUAL(r.min(), -11.0);
0145   BOOST_CHECK_EQUAL(r.max(), 1.0);
0146 }
0147 
0148 BOOST_AUTO_TEST_CASE(shrink_noop_max_double) {
0149   Range1D<double> r;
0150 
0151   r.shrink(-11.0, 2.0);
0152   r.shrink(-10.0, 20.0);
0153 
0154   BOOST_CHECK_EQUAL(r.min(), -10.0);
0155   BOOST_CHECK_EQUAL(r.max(), 2.0);
0156 }
0157 
0158 BOOST_AUTO_TEST_CASE(shrinkMin_noop_double) {
0159   Range1D<double> r;
0160 
0161   r.shrinkMin(-11.0);
0162   r.shrinkMin(-100.0);
0163 
0164   BOOST_CHECK_EQUAL(r.min(), -11.0);
0165   BOOST_CHECK_EQUAL(r.max(), std::numeric_limits<double>::max());
0166 }
0167 
0168 BOOST_AUTO_TEST_CASE(shrinkMax_noop_double) {
0169   Range1D<double> r;
0170 
0171   r.shrinkMax(2.0);
0172   r.shrinkMax(4.0);
0173 
0174   BOOST_CHECK_EQUAL(r.min(), std::numeric_limits<double>::lowest());
0175   BOOST_CHECK_EQUAL(r.max(), 2.0);
0176 }
0177 
0178 BOOST_AUTO_TEST_CASE(setMin_double) {
0179   Range1D<double> r;
0180 
0181   r.setMin(2.0);
0182 
0183   BOOST_CHECK_EQUAL(r.min(), 2.0);
0184   BOOST_CHECK_EQUAL(r.max(), std::numeric_limits<double>::max());
0185 }
0186 
0187 BOOST_AUTO_TEST_CASE(setMin_twice_double) {
0188   Range1D<double> r;
0189 
0190   r.setMin(-2.0);
0191   r.setMin(-4.0);
0192 
0193   BOOST_CHECK_EQUAL(r.min(), -4.0);
0194   BOOST_CHECK_EQUAL(r.max(), std::numeric_limits<double>::max());
0195 }
0196 
0197 BOOST_AUTO_TEST_CASE(setMax_double) {
0198   Range1D<double> r;
0199 
0200   r.setMax(2.0);
0201 
0202   BOOST_CHECK_EQUAL(r.min(), std::numeric_limits<double>::lowest());
0203   BOOST_CHECK_EQUAL(r.max(), 2.0);
0204 }
0205 
0206 BOOST_AUTO_TEST_CASE(setMax_twice_double) {
0207   Range1D<double> r;
0208 
0209   r.setMax(2.0);
0210   r.setMax(4.0);
0211 
0212   BOOST_CHECK_EQUAL(r.min(), std::numeric_limits<double>::lowest());
0213   BOOST_CHECK_EQUAL(r.max(), 4.0);
0214 }
0215 
0216 BOOST_AUTO_TEST_CASE(expandMin_double) {
0217   Range1D<double> r(0.0, 0.0);
0218 
0219   r.expandMin(-11.0);
0220 
0221   BOOST_CHECK_EQUAL(r.min(), -11.0);
0222   BOOST_CHECK_EQUAL(r.max(), 0.0);
0223 }
0224 
0225 BOOST_AUTO_TEST_CASE(expandMax_double) {
0226   Range1D<double> r(0.0, 0.0);
0227 
0228   r.expandMax(2.0);
0229 
0230   BOOST_CHECK_EQUAL(r.min(), 0.0);
0231   BOOST_CHECK_EQUAL(r.max(), 2.0);
0232 }
0233 
0234 BOOST_AUTO_TEST_CASE(expand_both_double) {
0235   Range1D<double> r(0.0, 0.0);
0236 
0237   r.expandMin(-11.0);
0238   r.expandMax(2.0);
0239 
0240   BOOST_CHECK_EQUAL(r.min(), -11.0);
0241   BOOST_CHECK_EQUAL(r.max(), 2.0);
0242 }
0243 
0244 BOOST_AUTO_TEST_CASE(expand_double) {
0245   Range1D<double> r(0.0, 0.0);
0246 
0247   r.expand(-11.0, 2.0);
0248 
0249   BOOST_CHECK_EQUAL(r.min(), -11.0);
0250   BOOST_CHECK_EQUAL(r.max(), 2.0);
0251 }
0252 
0253 BOOST_AUTO_TEST_CASE(expand_twice_double) {
0254   Range1D<double> r(0.0, 0.0);
0255 
0256   r.expand(-11.0, 2.0);
0257   r.expand(-100.0, 20.0);
0258 
0259   BOOST_CHECK_EQUAL(r.min(), -100.0);
0260   BOOST_CHECK_EQUAL(r.max(), 20.0);
0261 }
0262 
0263 BOOST_AUTO_TEST_CASE(expand_noop_double) {
0264   Range1D<double> r(0.0, 0.0);
0265 
0266   r.expand(-100.0, 20.0);
0267   r.expand(-11.0, 2.0);
0268 
0269   BOOST_CHECK_EQUAL(r.min(), -100.0);
0270   BOOST_CHECK_EQUAL(r.max(), 20.0);
0271 }
0272 
0273 BOOST_AUTO_TEST_CASE(expand_noop_min_double) {
0274   Range1D<double> r(0.0, 0.0);
0275 
0276   r.expand(-100.0, 1.0);
0277   r.expand(-11.0, 2.0);
0278 
0279   BOOST_CHECK_EQUAL(r.min(), -100.0);
0280   BOOST_CHECK_EQUAL(r.max(), 2.0);
0281 }
0282 
0283 BOOST_AUTO_TEST_CASE(expand_noop_max_double) {
0284   Range1D<double> r(0.0, 0.0);
0285 
0286   r.expand(-10.0, 20.0);
0287   r.expand(-11.0, 2.0);
0288 
0289   BOOST_CHECK_EQUAL(r.min(), -11.0);
0290   BOOST_CHECK_EQUAL(r.max(), 20.0);
0291 }
0292 
0293 BOOST_AUTO_TEST_CASE(expandMin_noop_double) {
0294   Range1D<double> r(0.0, 0.0);
0295 
0296   r.expandMin(-100.0);
0297   r.expandMin(-11.0);
0298 
0299   BOOST_CHECK_EQUAL(r.min(), -100.0);
0300   BOOST_CHECK_EQUAL(r.max(), 0.0);
0301 }
0302 
0303 BOOST_AUTO_TEST_CASE(expandMax_noop_double) {
0304   Range1D<double> r(0.0, 0.0);
0305 
0306   r.expandMax(4.0);
0307   r.expandMax(2.0);
0308 
0309   BOOST_CHECK_EQUAL(r.min(), 0.0);
0310   BOOST_CHECK_EQUAL(r.max(), 4.0);
0311 }
0312 
0313 BOOST_AUTO_TEST_CASE(size_double) {
0314   Range1D<double> r(-10.0, 25.0);
0315 
0316   BOOST_CHECK_EQUAL(r.size(), 35.0);
0317 }
0318 
0319 BOOST_AUTO_TEST_CASE(size_zero_double) {
0320   Range1D<double> r(-10.0, -10.0);
0321 
0322   BOOST_CHECK_EQUAL(r.size(), 0.0);
0323 }
0324 
0325 BOOST_AUTO_TEST_CASE(size_zero2_double) {
0326   Range1D<double> r(-10.0, -50.0);
0327 
0328   BOOST_CHECK_EQUAL(r.size(), 0.0);
0329 }
0330 
0331 BOOST_AUTO_TEST_CASE(degenerate_false_double) {
0332   Range1D<double> r(-10.0, 25.0);
0333 
0334   BOOST_CHECK(!r.degenerate());
0335 }
0336 
0337 BOOST_AUTO_TEST_CASE(degenerate_true_double) {
0338   Range1D<double> r(-10.0, -25.0);
0339 
0340   BOOST_CHECK(r.degenerate());
0341 }
0342 
0343 BOOST_AUTO_TEST_CASE(contains_double) {
0344   Range1D<double> r(-10.0, 25.0);
0345 
0346   BOOST_CHECK(!r.contains(-11.0));
0347   BOOST_CHECK(!r.contains(-30.0));
0348   BOOST_CHECK(r.contains(-5.0));
0349   BOOST_CHECK(r.contains(0.0));
0350   BOOST_CHECK(r.contains(10.0));
0351 }
0352 
0353 BOOST_AUTO_TEST_CASE(contains_degenerate_double) {
0354   Range1D<double> r(-10.0, -25.0);
0355 
0356   BOOST_CHECK(!r.contains(-11.0));
0357   BOOST_CHECK(!r.contains(-30.0));
0358   BOOST_CHECK(!r.contains(-5.0));
0359   BOOST_CHECK(!r.contains(0.0));
0360   BOOST_CHECK(!r.contains(10.0));
0361 }
0362 
0363 BOOST_AUTO_TEST_CASE(intersect_true1_double) {
0364   Range1D<double> r(-10.0, 25.0);
0365   Range1D<double> q(5.0, 50.0);
0366 
0367   BOOST_CHECK((r && q));
0368 }
0369 
0370 BOOST_AUTO_TEST_CASE(intersect_true2_double) {
0371   Range1D<double> r(-10.0, 25.0);
0372   Range1D<double> q(-100.0, 50.0);
0373 
0374   BOOST_CHECK((r && q));
0375 }
0376 
0377 BOOST_AUTO_TEST_CASE(intersect_true3_double) {
0378   Range1D<double> r(-10.0, 25.0);
0379   Range1D<double> q(-5.0, 5.0);
0380 
0381   BOOST_CHECK((r && q));
0382 }
0383 
0384 BOOST_AUTO_TEST_CASE(intersect_false1_double) {
0385   Range1D<double> r(-10.0, 25.0);
0386   Range1D<double> q(-50.0, -15.0);
0387 
0388   BOOST_CHECK(!(r && q));
0389 }
0390 
0391 BOOST_AUTO_TEST_CASE(intersect_false2_double) {
0392   Range1D<double> r(-10.0, 25.0);
0393   Range1D<double> q(50.0, 55.0);
0394 
0395   BOOST_CHECK(!(r && q));
0396 }
0397 
0398 BOOST_AUTO_TEST_CASE(equals_true_int) {
0399   Range1D<int> r(-5, 5);
0400   Range1D<int> q(-5, 5);
0401 
0402   BOOST_CHECK((r == q));
0403 }
0404 
0405 BOOST_AUTO_TEST_CASE(equals_false_int) {
0406   Range1D<int> r(-5, 5);
0407   Range1D<int> q(-6, 4);
0408 
0409   BOOST_CHECK(!(r == q));
0410 }
0411 
0412 BOOST_AUTO_TEST_CASE(subset1_double) {
0413   Range1D<double> r(-10.0, 25.0);
0414   Range1D<double> q(5.0, 50.0);
0415 
0416   BOOST_CHECK(!(r <= q));
0417   BOOST_CHECK(!(q <= r));
0418 }
0419 
0420 BOOST_AUTO_TEST_CASE(subset2_double) {
0421   Range1D<double> r(-10.0, 25.0);
0422   Range1D<double> q(-100.0, 50.0);
0423 
0424   BOOST_CHECK((r <= q));
0425   BOOST_CHECK(!(q <= r));
0426 }
0427 
0428 BOOST_AUTO_TEST_CASE(subset3_double) {
0429   Range1D<double> r(-10.0, 25.0);
0430   Range1D<double> q(-5.0, 5.0);
0431 
0432   BOOST_CHECK(!(r <= q));
0433   BOOST_CHECK((q <= r));
0434 }
0435 
0436 BOOST_AUTO_TEST_CASE(subset4_double) {
0437   Range1D<double> r(-10.0, 25.0);
0438   Range1D<double> q(-50.0, -15.0);
0439 
0440   BOOST_CHECK(!(r <= q));
0441   BOOST_CHECK(!(q <= r));
0442 }
0443 
0444 BOOST_AUTO_TEST_CASE(subset5_double) {
0445   Range1D<double> r(-10.0, 25.0);
0446   Range1D<double> q(50.0, 55.0);
0447 
0448   BOOST_CHECK(!(r <= q));
0449   BOOST_CHECK(!(q <= r));
0450 }
0451 
0452 BOOST_AUTO_TEST_CASE(superset1_double) {
0453   Range1D<double> r(-10.0, 25.0);
0454   Range1D<double> q(5.0, 50.0);
0455 
0456   BOOST_CHECK(!(r >= q));
0457   BOOST_CHECK(!(q >= r));
0458 }
0459 
0460 BOOST_AUTO_TEST_CASE(superset2_double) {
0461   Range1D<double> r(-10.0, 25.0);
0462   Range1D<double> q(-100.0, 50.0);
0463 
0464   BOOST_CHECK(!(r >= q));
0465   BOOST_CHECK((q >= r));
0466 }
0467 
0468 BOOST_AUTO_TEST_CASE(superset3_double) {
0469   Range1D<double> r(-10.0, 25.0);
0470   Range1D<double> q(-5.0, 5.0);
0471 
0472   BOOST_CHECK((r >= q));
0473   BOOST_CHECK(!(q >= r));
0474 }
0475 
0476 BOOST_AUTO_TEST_CASE(superset4_double) {
0477   Range1D<double> r(-10.0, 25.0);
0478   Range1D<double> q(-50.0, -15.0);
0479 
0480   BOOST_CHECK(!(r >= q));
0481   BOOST_CHECK(!(q >= r));
0482 }
0483 
0484 BOOST_AUTO_TEST_CASE(superset5_double) {
0485   Range1D<double> r(-10.0, 25.0);
0486   Range1D<double> q(50.0, 55.0);
0487 
0488   BOOST_CHECK(!(r >= q));
0489   BOOST_CHECK(!(q >= r));
0490 }
0491 
0492 BOOST_AUTO_TEST_CASE(intersection1_double) {
0493   Range1D<double> r(-10.0, 25.0);
0494   Range1D<double> q(5.0, 50.0);
0495   Range1D<double> i = r & q;
0496 
0497   BOOST_CHECK_EQUAL(i.min(), 5.0);
0498   BOOST_CHECK_EQUAL(i.max(), 25.0);
0499 }
0500 
0501 BOOST_AUTO_TEST_CASE(intersection2_double) {
0502   Range1D<double> r(-10.0, 25.0);
0503   Range1D<double> q(-100.0, 50.0);
0504   Range1D<double> i = r & q;
0505 
0506   BOOST_CHECK_EQUAL(i.min(), -10.0);
0507   BOOST_CHECK_EQUAL(i.max(), 25.0);
0508 }
0509 
0510 BOOST_AUTO_TEST_CASE(intersection3_double) {
0511   Range1D<double> r(-10.0, 25.0);
0512   Range1D<double> q(-5.0, 5.0);
0513   Range1D<double> i = r & q;
0514 
0515   BOOST_CHECK_EQUAL(i.min(), -5.0);
0516   BOOST_CHECK_EQUAL(i.max(), 5.0);
0517 }
0518 
0519 BOOST_AUTO_TEST_CASE(intersection4_double) {
0520   Range1D<double> r(-10.0, 25.0);
0521   Range1D<double> q(-50.0, -15.0);
0522   Range1D<double> i = r & q;
0523 
0524   BOOST_CHECK(i.degenerate());
0525 }
0526 
0527 BOOST_AUTO_TEST_CASE(intersection5_double) {
0528   Range1D<double> r(-10.0, 25.0);
0529   Range1D<double> q(50.0, 55.0);
0530   Range1D<double> i = r & q;
0531 
0532   BOOST_CHECK(i.degenerate());
0533 }
0534 
0535 BOOST_AUTO_TEST_CASE(intersects_edge_int_positive) {
0536   Range1D<int> r(-10, 11);
0537   Range1D<int> q(10, 20);
0538 
0539   BOOST_CHECK((r && q));
0540 }
0541 
0542 BOOST_AUTO_TEST_CASE(intersects_edge_int_negative) {
0543   Range1D<int> r(-10, 10);
0544   Range1D<int> q(10, 20);
0545 
0546   BOOST_CHECK(!(r && q));
0547 }
0548 
0549 BOOST_AUTO_TEST_CASE(single_value_not_degenerate_int_positive) {
0550   Range1D<int> r(10, 10);
0551 
0552   BOOST_CHECK(r.degenerate());
0553 }
0554 
0555 BOOST_AUTO_TEST_CASE(single_value_not_degenerate_int_negative) {
0556   Range1D<int> r(10, 11);
0557 
0558   BOOST_CHECK(!r.degenerate());
0559 }
0560 
0561 BOOST_AUTO_TEST_CASE(intersects_implies_non_degenerate_intersection) {
0562   for (int i1 : v) {
0563     for (int i2 : v) {
0564       for (int j1 : v) {
0565         for (int j2 : v) {
0566           Range1D<int> r(i1, i2);
0567           Range1D<int> q(j1, j2);
0568 
0569           if (r.degenerate() || q.degenerate()) {
0570             continue;
0571           }
0572 
0573           if (r && q) {
0574             BOOST_CHECK(!((r & q).degenerate()));
0575           } else {
0576             BOOST_CHECK(((r & q).degenerate()));
0577           }
0578         }
0579       }
0580     }
0581   }
0582 }
0583 
0584 BOOST_AUTO_TEST_CASE(degeneracy_implies_size_zero_intersection) {
0585   for (int i1 : v) {
0586     for (int i2 : v) {
0587       Range1D<int> r(i1, i2);
0588 
0589       if (r.degenerate()) {
0590         BOOST_CHECK_EQUAL(r.size(), 0);
0591       } else {
0592         BOOST_CHECK_GE(r.size(), 0);
0593       }
0594     }
0595   }
0596 }
0597 
0598 BOOST_AUTO_TEST_CASE(range_inclusive_left) {
0599   Range1D<int> r(10, 20);
0600 
0601   BOOST_CHECK(!r.contains(9));
0602   BOOST_CHECK(r.contains(10));
0603   BOOST_CHECK(r.contains(11));
0604 }
0605 
0606 BOOST_AUTO_TEST_CASE(range_exclusive_right) {
0607   Range1D<int> r(10, 20);
0608 
0609   BOOST_CHECK(r.contains(19));
0610   BOOST_CHECK(!r.contains(20));
0611   BOOST_CHECK(!r.contains(21));
0612 }
0613 
0614 BOOST_AUTO_TEST_SUITE_END()
0615 
0616 BOOST_AUTO_TEST_SUITE_END()
0617 
0618 }  // namespace ActsTests