From 15ba3f6420ed5ef08ea859f05b3049c1b3f55958 Mon Sep 17 00:00:00 2001
From: Remco de Boer <redeboer@ep1.rub.de>
Date: Mon, 29 Jun 2020 13:48:40 +0200
Subject: [PATCH] test!: set up unit test suite (#10)

Using EventReaderDefault as example
---
 .gitlab-ci.yml                       |  6 +--
 Event/JamfilePython27                | 29 ++++++++----
 Event/test/SampleFileNoHeader.dat    |  9 ++++
 Event/test/TestEventReaderDefault.cc | 67 ++++++++++++++++++++++++++++
 JamrootCentos8                       |  4 ++
 JamrootSL7                           |  4 ++
 6 files changed, 107 insertions(+), 12 deletions(-)
 create mode 100644 Event/test/SampleFileNoHeader.dat
 create mode 100644 Event/test/TestEventReaderDefault.cc

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index bcbe6cae..51d75aef 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -4,12 +4,12 @@
     - master
 
 .print-system-info: &print-system-info
-  - lsb_release -a
   - inxi
-  - git --version
+  - lsb_release -a
   - pwd
-  - g++ --version
   - clang++ --version
+  - g++ --version
+  - git --version
 
 before_script:
   - *print-system-info
diff --git a/Event/JamfilePython27 b/Event/JamfilePython27
index 72c581a7..8faf6f20 100644
--- a/Event/JamfilePython27
+++ b/Event/JamfilePython27
@@ -27,14 +27,25 @@ project :
 project : 
 	;
 
-lib Event : 
-	[ glob *.cc : *App.cc ] 
-	$(TOP)/ErrLogger//ErrLogger $(TOP)/Particle//Particle 
+lib Event
+  : [ glob *.cc : *App.cc ]
+	  $(TOP)/ErrLogger//ErrLogger
+    $(TOP)/Particle//Particle
 	: <use>$(TOP)//HepMc
-	: 
-	: <library>$(TOP)//HepMc ;
+	:
+	: <library>$(TOP)//HepMc
+  ;
 
-exe HepMCEvtReaderTestApp : HepMCEvtReaderTestApp.cc Event 
-    			  $(TOP)/ErrLogger//ErrLogger
-			  $(TOP)/Utils//Utils
-    			  : ;
+exe HepMCEvtReaderTestApp
+  : HepMCEvtReaderTestApp.cc Event
+    $(TOP)/ErrLogger//ErrLogger
+		$(TOP)/Utils//Utils
+  ;
+
+unit-test test_Event
+  : [ glob test/*.cc ]
+    $(TOP)//boost_test
+    $(TOP)/ErrLogger//ErrLogger
+    $(TOP)/Particle//Particle
+    Event
+  ;
diff --git a/Event/test/SampleFileNoHeader.dat b/Event/test/SampleFileNoHeader.dat
new file mode 100644
index 00000000..7540adbd
--- /dev/null
+++ b/Event/test/SampleFileNoHeader.dat
@@ -0,0 +1,9 @@
+.3
+ 0.200134   -1.2208     -0.692975     1.41796
+-0.185839    0.858663    0.00401993   0.88886
+-0.0142958   0.362135    0.688955     0.790078
+
+  .5
+ 0.0695714   1.38152     0.110471     1.38767
+-0.127614   -0.233811   -0.416389     0.512397
+ 0.0580429  -1.14771     0.305918     1.19683
diff --git a/Event/test/TestEventReaderDefault.cc b/Event/test/TestEventReaderDefault.cc
new file mode 100644
index 00000000..5fd99db5
--- /dev/null
+++ b/Event/test/TestEventReaderDefault.cc
@@ -0,0 +1,67 @@
+/*
+ * This file is part of Pawian, which is distributed under
+ * GNU General Public License v3 (https://www.gnu.org/licenses/gpl-3.0.html)
+ */
+
+#define BOOST_TEST_DYN_LINK
+#define BOOST_TEST_MODULE EventReader
+
+#include "Event/Event.hh"
+#include "Event/EventList.hh"
+#include "Event/EventReaderDefault.hh"
+#include "qft++/topincludes/tensor.hh"
+
+#include <boost/test/unit_test.hpp>
+
+BOOST_AUTO_TEST_SUITE(TestEventReaderDefault);
+
+BOOST_AUTO_TEST_CASE(test_fill) {
+  std::vector<std::string> inputFiles = {"Event/test/SampleFileNoHeader.dat"};
+  int numberOfParticles = 3;
+  int skipFirstLines = 0;
+  bool hasWeights = true;
+  EventReaderDefault gevEventReader(inputFiles, numberOfParticles,
+                                    skipFirstLines, hasWeights);
+  EventReaderDefault mevEventReader(inputFiles, numberOfParticles,
+                                    skipFirstLines, hasWeights);
+  EventList gevEvents, mevEvents;
+
+  gevEventReader.setUnit("GEV");
+  gevEventReader.setOrder("Px Py Pz E");
+  gevEventReader.fill(gevEvents);
+
+  mevEventReader.setUnit("MEV");
+  mevEventReader.setOrder("E Px Py Pz"); // ! note mock order
+  mevEventReader.fill(mevEvents);
+
+  BOOST_CHECK_EQUAL(gevEvents.size(), 2);
+  BOOST_CHECK_EQUAL(mevEvents.size(), 2);
+  if (gevEvents.size() != mevEvents.size())
+    throw std::runtime_error("Same number of events required to continue");
+
+  std::vector<double> expectedWeights = {.3, .5};
+  std::vector<float> gevParticle1Energy = {1.41796, 1.38767};
+  std::vector<float> gevParticle2Pz = {0.00401993, -0.416389};
+  std::vector<float> mevParticle2Energy = {-0.185839, -0.127614};
+  std::vector<float> mevParticle3Pz = {0.790078, 1.19683};
+  for (int i = 0; i < gevEvents.size(); ++i) {
+    auto gevEvent = gevEvents.nextEvent();
+    auto mevEvent = mevEvents.nextEvent();
+    if (!gevEvent || !mevEvent)
+      throw std::runtime_error("Nullpointer event!");
+    BOOST_CHECK_EQUAL(gevEvent->size(), 3);
+    BOOST_CHECK_EQUAL(mevEvent->size(), 3);
+    BOOST_CHECK_EQUAL(mevEvent->Weight(), expectedWeights.at(i));
+    BOOST_CHECK_EQUAL(gevEvent->Weight(), expectedWeights.at(i));
+    auto gevParticle1 = gevEvent->p4(0);
+    auto gevParticle2 = gevEvent->p4(1);
+    auto mevParticle2 = mevEvent->p4(1);
+    auto mevParticle3 = mevEvent->p4(2);
+    BOOST_CHECK_CLOSE(gevParticle1->E(), gevParticle1Energy.at(i), 1e-5);
+    BOOST_CHECK_CLOSE(gevParticle2->Pz(), gevParticle2Pz.at(i), 1e-5);
+    BOOST_CHECK_CLOSE(mevParticle2->E(), mevParticle2Energy.at(i) / 1e3, 1e-5);
+    BOOST_CHECK_CLOSE(mevParticle3->Pz(), mevParticle3Pz.at(i) / 1e3, 1e-5);
+  }
+}
+
+BOOST_AUTO_TEST_SUITE_END();
diff --git a/JamrootCentos8 b/JamrootCentos8
index 77a12f7e..9180f545 100644
--- a/JamrootCentos8
+++ b/JamrootCentos8
@@ -1,4 +1,5 @@
 import os ;
+import testing ;
 
 path-constant TOP : . ;
 local extern = [ os.environ extern ] ;
@@ -14,9 +15,12 @@ BOOSTLIBS =
   -lboost_serialization
   -lboost_system
   -lboost_timer
+  -lboost_unit_test_framework
   -lrt
   ;
 
+lib boost_test : : <name>boost_unit_test_framework ;
+
 project :
   requirements <include>./
   <include>$(TOP)
diff --git a/JamrootSL7 b/JamrootSL7
index 071a9021..9180f545 100644
--- a/JamrootSL7
+++ b/JamrootSL7
@@ -1,4 +1,6 @@
 import os ;
+import testing ;
+
 path-constant TOP : . ;
 local extern = [ os.environ extern ] ;
 local ROOTSYS = [ os.environ ROOTSYS ] ;
@@ -13,9 +15,11 @@ BOOSTLIBS =
   -lboost_serialization
   -lboost_system
   -lboost_timer
+  -lboost_unit_test_framework
   -lrt
   ;
 
+lib boost_test : : <name>boost_unit_test_framework ;
 
 project :
   requirements <include>./
-- 
GitLab