THM1176InstrumentDriver  1.0
C++ API for Metrolab THM1176
CTHM1176GetUtilitiesTest.cpp
Go to the documentation of this file.
1 // Copyright (c) 2020 Metrolab Technology S.A., Geneva, Switzerland (www.metrolab.com)
2 // See the included file LICENSE.txt for the licensing conditions.
3 
7 
8 #include "gtest/gtest.h"
9 #include "THM1176TestUtilities.h"
10 #include <regex>
11 
12 using namespace MTL::Instrument;
13 using namespace MTL::Instrument::THM1176Types;
14 
16 class CTHM1176GetUtilitiesTest : public ::testing::Test
17 {
18 protected:
19  static THM1176_TEST_RESOURCE_MANAGER_CLASS * pResourceManager;
21 
22  static void SetUpTestCase()
23  {
24  ASSERT_EQ(true, ConnectToTHM1176(pResourceManager, pTHM1176));
25  ASSERT_NE(nullptr, pResourceManager);
26  ASSERT_NE(nullptr, pTHM1176);
27  ASSERT_EQ(true, pTHM1176->IsOpen());
28  ASSERT_EQ(true, pTHM1176->Reset());
29  }
30 
31  static void TearDownTestCase()
32  {
33  delete pTHM1176;
34  pTHM1176 = nullptr;
35  delete pResourceManager;
36  pResourceManager = nullptr;
37  }
38 };
39 THM1176_TEST_RESOURCE_MANAGER_CLASS * CTHM1176GetUtilitiesTest::pResourceManager = nullptr;
41 
43 TEST_F(CTHM1176GetUtilitiesTest, GetIdentificationString)
44 {
45  std::string l_Identification;
46  ASSERT_EQ(true, pTHM1176->GetIdentification(l_Identification));
47 
48  std::regex l_Regex("([^,]+),([^,]+),([^,]+),([^,]+)");
49  std::smatch l_Match;
50  ASSERT_EQ(true, std::regex_match(l_Identification, l_Match, l_Regex));
51  EXPECT_EQ("Metrolab Technology SA", l_Match[1].str());
52  EXPECT_EQ("THM1176", l_Match[2].str().substr(0, 7));
53 
54  std::string l_SerialNumber = l_Match[3].str();
55  std::string l_Versions = l_Match[4].str();
56  EXPECT_EQ(true, std::regex_match(l_SerialNumber, std::regex("^0[0-9]+$")));
57  EXPECT_EQ(true, std::regex_match(l_Versions, l_Match, std::regex("^el[A-Z][0-9]-pr[A-Z][0-9]-fw[0-9]+\\.[0-9]+\\n$")));
58 }
59 
61 TEST_F(CTHM1176GetUtilitiesTest, GetIdentificationStruct)
62 {
63  struct sIdentifier l_Identification;
64  ASSERT_EQ(true, pTHM1176->GetIdentification(l_Identification));
65 
66  EXPECT_EQ("Metrolab Technology SA", l_Identification.Manufacturer);
67  EXPECT_EQ("THM1176", l_Identification.Model.substr(0, 7));
68  EXPECT_LT(0U, l_Identification.SerialNumber);
69  EXPECT_LT(0, l_Identification.ElectronicsVersion.Major);
70  EXPECT_LE(0, l_Identification.ElectronicsVersion.Minor);
71  EXPECT_LT(0, l_Identification.ProbeVersion.Major);
72  EXPECT_LE(0, l_Identification.ProbeVersion.Minor);
73  EXPECT_LT(0, l_Identification.FirmwareVersion.Major);
74  EXPECT_LT(0, l_Identification.FirmwareVersion.Minor);
75 }
76 
79 {
80  CFluxList l_Ranges;
81  ASSERT_EQ(true, pTHM1176->GetAllRanges(l_Ranges));
82  EXPECT_LT(0, l_Ranges.size());
83  for (auto l_Range : l_Ranges)
84  EXPECT_LT(0., l_Range);
85 }
86 
89 {
90  CUnitsList l_Units;
91  ASSERT_EQ(true, pTHM1176->GetAllUnits(l_Units));
92  EXPECT_LT(0, l_Units.size());
93  for (auto l_Unit : l_Units)
94  {
95  EXPECT_LE(kT, l_Unit);
96  EXPECT_GE(kMHzp, l_Unit);
97  }
98 }
99 
102 {
103  CUnitsList l_Units;
104  ASSERT_EQ(true, pTHM1176->GetAllUnits(l_Units));
105  for (auto l_Unit : l_Units)
106  {
107  U32 l_Divisor;
108  ASSERT_EQ(true, pTHM1176->GetDivisor(l_Unit, l_Divisor));
109  EXPECT_LT(0U, l_Divisor);
110  }
111 }
112 
114 TEST_F(CTHM1176GetUtilitiesTest, GetRotationMatrix)
115 {
116  // We expect the rotation matrix more or less to be an identity matrix.
117  Matrix3f l_Matrix;
118  ASSERT_EQ(true, pTHM1176->GetRotationMatrix(l_Matrix));
119  std::cout << l_Matrix << std::endl;
120  for (int i = 0; i< 3; i++)
121  for (int j = 0; j < 3; j++)
122  EXPECT_NEAR(l_Matrix(i,j), (i == j) ? 1. : 0., 0.1);
123 }
124 
126 TEST_F(CTHM1176GetUtilitiesTest, GetImmediateMeasurementPeriod)
127 {
128  sAveraging<uParm> l_Avg;
129  F64 l_Period1, l_Period2, l_Period3;
130 
131  // We expect that 0 averaging points to give an error.
132  l_Avg.NoPoints = 0;
133  EXPECT_EQ(false, pTHM1176->GetImmediateMeasurementPeriod(l_Avg, l_Period1));
134  EXPECT_EQ(0., l_Period1);
135 
136  // We expect that the time increases linearly with # averaging points.
137  l_Avg.NoPoints = 1;
138  EXPECT_EQ(true, pTHM1176->GetImmediateMeasurementPeriod(l_Avg, l_Period1));
139  l_Avg.NoPoints = 2;
140  EXPECT_EQ(true, pTHM1176->GetImmediateMeasurementPeriod(l_Avg, l_Period2));
141  l_Avg.NoPoints = 3;
142  EXPECT_EQ(true, pTHM1176->GetImmediateMeasurementPeriod(l_Avg, l_Period3));
143  EXPECT_NEAR((l_Period2 - l_Period1), (l_Period3 - l_Period2), 1E-8);
144 }
CTHM1176GetUtilitiesTest
Test THM1176 API: GetIdentification, GetAllRanges, GetAllUnits, GetDivisisor.
Definition: CTHM1176GetUtilitiesTest.cpp:17
CTHM1176GetUtilitiesTest::SetUpTestCase
static void SetUpTestCase()
Definition: CTHM1176GetUtilitiesTest.cpp:22
THM1176TestUtilities.h
Utility functions used to test THM1176 API.
CTHM1176GetUtilitiesTest::pTHM1176
static CTHM1176Instrument< THM1176_TEST_INSTRUMENT_CLASS, THM1176_TEST_RESOURCE_MANAGER_CLASS > * pTHM1176
Definition: CTHM1176GetUtilitiesTest.cpp:20
CTHM1176GetUtilitiesTest::pResourceManager
static THM1176_TEST_RESOURCE_MANAGER_CLASS * pResourceManager
Definition: CTHM1176GetUtilitiesTest.cpp:19
MTL::Instrument::CTHM1176Instrument< THM1176_TEST_INSTRUMENT_CLASS, THM1176_TEST_RESOURCE_MANAGER_CLASS >
ConnectToTHM1176
bool ConnectToTHM1176(THM1176_TEST_RESOURCE_MANAGER_CLASS *&rpResourceManager, CTHM1176Instrument< THM1176_TEST_INSTRUMENT_CLASS, THM1176_TEST_RESOURCE_MANAGER_CLASS > *&rpTHM1176)
Connect to a THM1176.
Definition: THM1176TestUtilities.cpp:41
MTL::Instrument::THM1176Types::sIdentifier::FirmwareVersion
struct sVersion FirmwareVersion
Version numbers of firmware.
Definition: THM1176Types.h:342
MTL::Instrument::THM1176Types::sIdentifier
Instrument's identification string - parsed version.
Definition: THM1176Types.h:336
MTL::Instrument::THM1176Types::sVersion::Minor
U8 Minor
Minor version number.
Definition: THM1176Types.h:316
MTL::Instrument
Definition: THM1176.h:75
MTL::Instrument::THM1176Types
Definition: THM1176TypeConversions.h:20
MTL::Instrument::THM1176Types::sAveraging< uParm >
TEST_F
TEST_F(CTHM1176GetUtilitiesTest, GetIdentificationString)
Definition: CTHM1176GetUtilitiesTest.cpp:43
MTL::Instrument::THM1176Types::sIdentifier::Manufacturer
std::string Manufacturer
Manufacturer name ("Metrolab Technology SA")
Definition: THM1176Types.h:337
MTL::Instrument::THM1176Types::sIdentifier::Model
std::string Model
Model name (e.g. "THM1176-MF")
Definition: THM1176Types.h:338
MTL::Instrument::THM1176Types::kMHzp
@ kMHzp
Equivalent proton NMR resonant frequency, in Mega-Hertz.
Definition: THM1176Types.h:190
MTL::Instrument::THM1176Types::sVersion::Major
U8 Major
Major version number.
Definition: THM1176Types.h:315
MTL::Instrument::THM1176Types::kT
@ kT
Tesla.
Definition: THM1176Types.h:183
MTL::Instrument::THM1176Types::CUnitsList
List of measurement units.
Definition: THM1176Types.h:194
MTL::Instrument::THM1176Types::CFluxList
List of flux density values.
Definition: THM1176Types.h:170
MTL::Instrument::CTHM1176Instrument::Reset
bool Reset()
Reset the instrument to power-on configuration.
Definition: THM1176.cpp:2104
MTL::Instrument::THM1176Types::sIdentifier::ElectronicsVersion
struct sVersion ElectronicsVersion
Version numbers of electronics.
Definition: THM1176Types.h:340
F64
double F64
64-bit floating-point number.
Definition: OSDefines.h:35
U32
unsigned int U32
32-bit unsigned integer.
Definition: OSDefines.h:32
CTHM1176GetUtilitiesTest::TearDownTestCase
static void TearDownTestCase()
Definition: CTHM1176GetUtilitiesTest.cpp:31
MTL::Instrument::THM1176Types::sAveraging::NoPoints
ParmType< U16 > NoPoints
Number of points in block average.
Definition: THM1176Types.h:368
MTL::Instrument::THM1176Types::sIdentifier::ProbeVersion
struct sVersion ProbeVersion
Version numbers of probe.
Definition: THM1176Types.h:341
MTL::Instrument::THM1176Types::sIdentifier::SerialNumber
U32 SerialNumber
Serial number.
Definition: THM1176Types.h:339