Belle II Software  release-05-01-25
generalCut.cc
1 #include <framework/utilities/GeneralCut.h>
2 #include <gtest/gtest.h>
3 
4 using namespace Belle2;
5 namespace {
7  struct MockObjectType {
9  double value = 4.2;
10  };
11 
17  class MockVariableType {
18  public:
20  double function(const MockObjectType* object) const
21  {
22  return object->value;
23  }
24 
26  const std::string name = "mocking_variable";
27  };
28 
33  class MockVariableManager {
34  public:
36  using Object = MockObjectType;
38  using Var = MockVariableType;
39 
41  static MockVariableManager& Instance()
42  {
43  static MockVariableManager instance;
44  return instance;
45  }
46 
48  Var* getVariable(const std::string& name)
49  {
50  if (name == "mocking_variable") {
51  return &m_mocking_variable;
52  } else {
53  return nullptr;
54  }
55  }
56 
58  Var m_mocking_variable;
59  };
60 
62  using MockGeneralCut = GeneralCut<MockVariableManager>;
63 
65  TEST(GeneralCutTest, cutCheck)
66  {
67  MockObjectType testObject;
68 
69  std::unique_ptr<MockGeneralCut> a = MockGeneralCut::compile("1.2 < 1.5 ");
70  EXPECT_TRUE(a->check(&testObject));
71  a = MockGeneralCut::compile(" 1.5<1.2");
72  EXPECT_FALSE(a->check(&testObject));
73 
74  // Check for regression
75  // This was broken in the past due to the abs function in almostEqual
76  a = MockGeneralCut::compile("-1 == 1");
77  EXPECT_FALSE(a->check(&testObject));
78  a = MockGeneralCut::compile("-1 != 1");
79  EXPECT_TRUE(a->check(&testObject));
80 
81  a = MockGeneralCut::compile(" 12.3 >1.5 ");
82  EXPECT_TRUE(a->check(&testObject));
83  a = MockGeneralCut::compile("12 > 15");
84  EXPECT_FALSE(a->check(&testObject));
85 
86  a = MockGeneralCut::compile("1.2 == 1.2");
87  EXPECT_TRUE(a->check(&testObject));
88  a = MockGeneralCut::compile(" 1.5!=1.2");
89  EXPECT_TRUE(a->check(&testObject));
90 
91  a = MockGeneralCut::compile("1.2 == 1.2 == 1.2");
92  EXPECT_TRUE(a->check(&testObject));
93  a = MockGeneralCut::compile(" 1.5 == 1.5!=1.2");
94  EXPECT_TRUE(a->check(&testObject));
95  a = MockGeneralCut::compile(" 1.5 == 1.5!=1.5");
96  EXPECT_FALSE(a->check(&testObject));
97 
98  a = MockGeneralCut::compile("1.0 < 1.2 == 1.2");
99  EXPECT_TRUE(a->check(&testObject));
100  a = MockGeneralCut::compile(" 1.5 < 1.6 != 1.6");
101  EXPECT_FALSE(a->check(&testObject));
102  a = MockGeneralCut::compile(" 1.5 < 1.6 != 1.7");
103  EXPECT_TRUE(a->check(&testObject));
104 
105  a = MockGeneralCut::compile(" [12 >= 12 ]");
106  EXPECT_TRUE(a->check(&testObject));
107  a = MockGeneralCut::compile("[ 15>= 16 ]");
108  EXPECT_FALSE(a->check(&testObject));
109 
110  a = MockGeneralCut::compile(" [12 <= 12 ]");
111  EXPECT_TRUE(a->check(&testObject));
112  a = MockGeneralCut::compile(" [ 17<= 16.7 ]");
113  EXPECT_FALSE(a->check(&testObject));
114 
115  a = MockGeneralCut::compile(" [12 <= 12 < 13]");
116  EXPECT_TRUE(a->check(&testObject));
117  a = MockGeneralCut::compile(" [ 17<= 16.7 < 18 ]");
118  EXPECT_FALSE(a->check(&testObject));
119 
120  a = MockGeneralCut::compile(" [12 >= 12 < 13]");
121  EXPECT_TRUE(a->check(&testObject));
122  a = MockGeneralCut::compile(" [ 15> 16.7 <= 18 ]");
123  EXPECT_FALSE(a->check(&testObject));
124 
125  a = MockGeneralCut::compile("mocking_variable > 1.0");
126  EXPECT_TRUE(a->check(&testObject));
127  a = MockGeneralCut::compile("1.0 < mocking_variable <= mocking_variable");
128  EXPECT_TRUE(a->check(&testObject));
129 
130  a = MockGeneralCut::compile("mocking_variable < 100.0");
131  EXPECT_TRUE(a->check(&testObject));
132  a = MockGeneralCut::compile("mocking_variable <= mocking_variable <= mocking_variable");
133  EXPECT_TRUE(a->check(&testObject));
134 
135  a = MockGeneralCut::compile("1 < 2 and 3 < 4");
136  EXPECT_TRUE(a->check(&testObject));
137  a = MockGeneralCut::compile("1 < 2 and 4 < 3");
138  EXPECT_FALSE(a->check(&testObject));
139  a = MockGeneralCut::compile("2 < 1 and 4 < 3");
140  EXPECT_FALSE(a->check(&testObject));
141  a = MockGeneralCut::compile("2 < 1 and 3 < 4");
142  EXPECT_FALSE(a->check(&testObject));
143 
144  a = MockGeneralCut::compile("1 < 2 or 3 < 4");
145  EXPECT_TRUE(a->check(&testObject));
146  a = MockGeneralCut::compile("1 < 2 or 4 < 3");
147  EXPECT_TRUE(a->check(&testObject));
148  a = MockGeneralCut::compile("2 < 1 or 4 < 3");
149  EXPECT_FALSE(a->check(&testObject));
150  a = MockGeneralCut::compile("2 < 1 or 3 < 4");
151  EXPECT_TRUE(a->check(&testObject));
152 
153  a = MockGeneralCut::compile("1 < 2 and 3 < 4 and [ 5 < 6 or 7 > 6 ]");
154  EXPECT_TRUE(a->check(&testObject));
155  a = MockGeneralCut::compile("[1 < 2 < 3 or 3 > 4 ] and [ 5 < 6 or 7 > 6 ]");
156  EXPECT_TRUE(a->check(&testObject));
157  a = MockGeneralCut::compile("[1 < 2 < 3 or 3 > 4 ] or [ 5 < 6 and 7 > 6 ]");
158  EXPECT_TRUE(a->check(&testObject));
159 
160  a = MockGeneralCut::compile("1 < 2 and 3 < 4 or 5 > 6");
161  EXPECT_TRUE(a->check(&testObject));
162  a = MockGeneralCut::compile("1 < 2 or 3 < 4 and 5 > 6");
163  EXPECT_TRUE(a->check(&testObject));
164  a = MockGeneralCut::compile("1 < 2 and 4 < 3 or 6 > 5");
165  EXPECT_TRUE(a->check(&testObject));
166  a = MockGeneralCut::compile("1 < 2 or 4 < 3 and 6 > 5");
167  EXPECT_TRUE(a->check(&testObject));
168 
169  a = MockGeneralCut::compile("1 != 2 and 3 < 4 or 5 > 6");
170  EXPECT_TRUE(a->check(&testObject));
171  a = MockGeneralCut::compile("1 < 2 or 3 != 4 and 5 > 6");
172  EXPECT_TRUE(a->check(&testObject));
173 
174  a = MockGeneralCut::compile("1 != 2 and 3 == 4 or 5 > 6");
175  EXPECT_FALSE(a->check(&testObject));
176  a = MockGeneralCut::compile("1 < 2 or 3 == 4 and 5 > 6");
177  EXPECT_TRUE(a->check(&testObject));
178 
179  a = MockGeneralCut::compile("15 != 0x15");
180  EXPECT_TRUE(a->check(&testObject));
181 
182  a = MockGeneralCut::compile("15 == 0xF");
183  EXPECT_TRUE(a->check(&testObject));
184 
185  // Should throw an exception
186  EXPECT_THROW(a = MockGeneralCut::compile("15 == 15.0 bla"), std::runtime_error);
187  EXPECT_TRUE(a->check(&testObject));
188  EXPECT_THROW(a = MockGeneralCut::compile("15 == other_var"), std::runtime_error);
189  EXPECT_TRUE(a->check(&testObject));
190  EXPECT_THROW(a = MockGeneralCut::compile("15 == 15e1000"), std::out_of_range);
191  EXPECT_TRUE(a->check(&testObject));
192 
193  a = MockGeneralCut::compile("1e-3 < 1e3");
194  EXPECT_TRUE(a->check(&testObject));
195 
196  a = MockGeneralCut::compile("1e-3 == 0.001");
197  EXPECT_TRUE(a->check(&testObject));
198 
199  a = MockGeneralCut::compile("1000 < infinity");
200  EXPECT_TRUE(a->check(&testObject));
201 
202  a = MockGeneralCut::compile("1000 > infinity");
203  EXPECT_FALSE(a->check(&testObject));
204 
205  a = MockGeneralCut::compile("1000 < nan");
206  EXPECT_FALSE(a->check(&testObject));
207 
208  a = MockGeneralCut::compile("1000 > nan");
209  EXPECT_FALSE(a->check(&testObject));
210 
211  // Check if we have double precision
212  a = MockGeneralCut::compile("3.141592653589793 == 3.141592653589792");
213  EXPECT_FALSE(a->check(&testObject));
214 
215  a = MockGeneralCut::compile("3.1415926535897931234567890 == 3.1415926535897931234567891");
216  EXPECT_TRUE(a->check(&testObject));
217 
218  a = MockGeneralCut::compile("3141592653589 != 3141592653588");
219  EXPECT_TRUE(a->check(&testObject));
220 
221  a = MockGeneralCut::compile("");
222  EXPECT_TRUE(a->check(&testObject));
223 
224  a = MockGeneralCut::compile(" ");
225  EXPECT_TRUE(a->check(&testObject));
226 
227  a = MockGeneralCut::compile("[ ]");
228  EXPECT_TRUE(a->check(&testObject));
229 
230  a = MockGeneralCut::compile("[ ] and []");
231  EXPECT_TRUE(a->check(&testObject));
232  }
233 
235  TEST(GeneralCutTest, compileAndDecompile)
236  {
237 
238  std::unique_ptr<MockGeneralCut> a = MockGeneralCut::compile("1 < 2");
239  EXPECT_EQ(a->decompile(), "[1 < 2]");
240 
241  a = MockGeneralCut::compile("[1 < 2]");
242  EXPECT_EQ(a->decompile(), "[1 < 2]");
243 
244  a = MockGeneralCut::compile("1 < 2 < 3");
245  EXPECT_EQ(a->decompile(), "[[1 < 2] and [2 < 3]]");
246 
247  a = MockGeneralCut::compile("[1 < 2 < 3] or [[ 2 < 4] and [ mocking_variable < 4.4231 and [1 < 3 and 4 < mocking_variable]]]");
248  EXPECT_EQ(a->decompile(),
249  "[[[1 < 2] and [2 < 3]] or [[2 < 4] and [[mocking_variable < 4.4231] and [[1 < 3] and [4 < mocking_variable]]]]]");
250  }
251 
252 
253 } // namespace
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::TEST
TEST(TestgetDetectorRegion, TestgetDetectorRegion)
Test Constructors.
Definition: utilityFunctions.cc:18
Belle2::GeneralCut
This class implements a common way to implement cut/selection functionality for arbitrary objects.
Definition: GeneralCut.h:101