8#include <framework/datastore/StoreArray.h>
9#include <framework/dataobjects/EventMetaData.h>
10#include <framework/dataobjects/ProfileInfo.h>
11#include <framework/datastore/RelationsObject.h>
12#include <framework/utilities/TestHelpers.h>
14#include <gtest/gtest.h>
21 class RelationsObjectTest :
public ::testing::Test {
26 evtData.registerInDataStore();
27 profileData.registerInDataStore();
28 relObjData.registerInDataStore();
30 for (
int i = 0; i < 10; ++i) {
32 profileData.appendNew();
33 relObjData.appendNew();
38 void TearDown()
override
51 relObjData.registerRelationTo(profileData);
54 (relObjData)[0]->addRelationTo((profileData)[0], -42.0);
58 EXPECT_TRUE(rels.
size() == 1);
59 EXPECT_TRUE(rels.
object(0) == (profileData)[0]);
60 EXPECT_DOUBLE_EQ(rels.
weight(0), -42.0);
61 EXPECT_EQ(0u, relObjData[1]->getRelationsTo<ProfileInfo>().size());
62 EXPECT_EQ(0u, relObjData[0]->getRelationsFrom<ProfileInfo>().size());
63 EXPECT_EQ(1u, relObjData[0]->getRelationsWith<ProfileInfo>().size());
66 EXPECT_TRUE(profileData[0] == relObjData[0]->getRelatedTo<ProfileInfo>());
67 EXPECT_TRUE(
nullptr == relObjData[1]->getRelatedTo<ProfileInfo>());
68 EXPECT_TRUE(
nullptr == relObjData[0]->getRelatedFrom<ProfileInfo>());
69 EXPECT_TRUE(profileData[0] == relObjData[0]->getRelated<ProfileInfo>());
72 EXPECT_TRUE(std::make_pair(profileData[0], -42.0f) == relObjData[0]->getRelatedToWithWeight<ProfileInfo>());
74 EXPECT_TRUE(std::make_pair(profileNullPtr, 1.0f) == relObjData[1]->getRelatedToWithWeight<ProfileInfo>());
75 EXPECT_TRUE(std::make_pair(profileNullPtr, 1.0f) == relObjData[0]->getRelatedFromWithWeight<ProfileInfo>());
76 EXPECT_TRUE(std::make_pair(profileData[0], -42.0f) == relObjData[0]->getRelatedWithWeight<ProfileInfo>());
80 (relObjData)[0]->addRelationTo(
static_cast<TObject*
>(
nullptr));
81 (relObjData)[0]->addRelationTo(
static_cast<ProfileInfo*
>(
nullptr));
85 EXPECT_B2FATAL((relObjData)[0]->addRelationTo(¬InArray));
89 TEST_F(RelationsObjectTest, IndexUpdating)
91 relObjData.registerRelationTo(profileData);
95 EXPECT_FALSE((relObjData)[0]->getRelated<ProfileInfo>() !=
nullptr);
97 (relObjData)[0]->addRelationTo((profileData)[0], -42.0);
100 EXPECT_TRUE((relObjData)[0]->getRelated<ProfileInfo>() !=
nullptr);
103 EXPECT_FALSE((relObjData)[1]->getRelated<ProfileInfo>() !=
nullptr);
105 (relObjData)[1]->addRelationTo((profileData)[0], -42.0);
108 EXPECT_TRUE((relObjData)[1]->getRelated<ProfileInfo>() !=
nullptr);
112 TEST_F(RelationsObjectTest, RelationsObjectArrayIndex)
114 for (
int i = 0; i < relObjData.getEntries(); i++) {
115 EXPECT_TRUE((relObjData)[i]->getArrayName() == relObjData.getName());
116 EXPECT_TRUE((relObjData)[i]->getArrayIndex() == i);
125 TEST_F(RelationsObjectTest, DuplicateRelations)
127 evtData.registerRelationTo(relObjData);
128 relObjData.registerRelationTo(evtData);
138 EXPECT_EQ(2u, rels1.
size());
142 EXPECT_FLOAT_EQ(1.0, rels1.
weight(0));
143 EXPECT_FLOAT_EQ(2.0, rels1.
weight(1));
144 EXPECT_FLOAT_EQ(1.0, relObjData[1]->getRelatedFromWithWeight<EventMetaData>().second);
151 EXPECT_EQ(2u, rels2.
size());
154 EXPECT_EQ(3u, rels3.
size());
156 for (
int i = 0; i < (int)rels3.
size(); i++) {
159 EXPECT_DOUBLE_EQ(sum, 1.0 + 1.0 + 2.0);
162 TEST_F(RelationsObjectTest, RelationsToSameArray)
164 relObjData.registerRelationTo(relObjData);
167 relObjData[0]->addRelationTo(relObjData[1]);
168 EXPECT_TRUE(relObjData[0] == relObjData[1]->getRelated<RelationsObject>());
169 EXPECT_TRUE(relObjData[0] == relObjData[1]->getRelatedFrom<RelationsObject>());
170 EXPECT_TRUE(relObjData[1] == relObjData[0]->getRelated<RelationsObject>());
171 EXPECT_TRUE(relObjData[1] == relObjData[0]->getRelatedTo<RelationsObject>());
172 EXPECT_TRUE(
nullptr == relObjData[2]->getRelated<RelationsObject>());
173 EXPECT_TRUE(
nullptr == relObjData[2]->getRelatedFrom<RelationsObject>());
174 EXPECT_TRUE(
nullptr == relObjData[2]->getRelatedTo<RelationsObject>());
176 EXPECT_TRUE(
nullptr == relObjData[1]->getRelatedTo<RelationsObject>());
177 EXPECT_TRUE(
nullptr == relObjData[0]->getRelatedFrom<RelationsObject>());
180 relObjData[3]->addRelationTo(relObjData[3]);
181 EXPECT_TRUE(relObjData[3] == relObjData[3]->getRelated<RelationsObject>());
182 EXPECT_TRUE(relObjData[3] == relObjData[3]->getRelatedFrom<RelationsObject>());
183 EXPECT_TRUE(relObjData[3] == relObjData[3]->getRelatedTo<RelationsObject>());
186 TEST_F(RelationsObjectTest, ModifyRelations)
188 relObjData.registerRelationTo(profileData);
191 (relObjData)[0]->addRelationTo((profileData)[0], -42.0);
195 EXPECT_DOUBLE_EQ(rels.
weight(0), -42.0);
197 EXPECT_DOUBLE_EQ(rels.
weight(0), -3.0);
199 EXPECT_DOUBLE_EQ(rels2.
weight(0), -3.0);
202 EXPECT_EQ(1u, relObjData[0]->getRelationsTo<ProfileInfo>().size());
203 EXPECT_EQ(1u, relObjData[0]->getRelationsWith<ProfileInfo>().size());
205 EXPECT_EQ(0u, rels2.
size());
206 EXPECT_EQ(0u, relObjData[0]->getRelationsTo<ProfileInfo>().size());
207 EXPECT_EQ(0u, relObjData[0]->getRelationsWith<ProfileInfo>().size());
211 TEST_F(RelationsObjectTest, NamedRelationsWithInvalidName)
213 const std::string relationName =
"ExtraRelation WithSpaceInName";
218 TEST_F(RelationsObjectTest, NamedRelations)
220 const std::string relationName =
"ExtraRelation";
226 EXPECT_FALSE(profileData.hasRelationTo(relObjData,
DataStore::c_Event, relationName));
228 EXPECT_FALSE(relObjData.hasRelationTo(profileData));
229 EXPECT_FALSE(profileData.hasRelationTo(relObjData));
231 (relObjData)[0]->addRelationTo((profileData)[0], -42.0, relationName);
235 EXPECT_TRUE(rels.
size() == 1);
236 EXPECT_TRUE(rels.
object(0) == (profileData)[0]);
237 EXPECT_DOUBLE_EQ(rels.
weight(0), -42.0);
238 EXPECT_EQ(0u, relObjData[1]->getRelationsTo<ProfileInfo>(
"", relationName).size());
239 EXPECT_EQ(0u, relObjData[0]->getRelationsFrom<ProfileInfo>(
"", relationName).size());
240 EXPECT_EQ(1u, relObjData[0]->getRelationsWith<ProfileInfo>(
"", relationName).size());
243 EXPECT_TRUE(profileData[0] == relObjData[0]->getRelatedTo<ProfileInfo>(
"", relationName));
244 EXPECT_TRUE(
nullptr == relObjData[1]->getRelatedTo<ProfileInfo>(
"", relationName));
245 EXPECT_TRUE(
nullptr == relObjData[0]->getRelatedFrom<ProfileInfo>(
"", relationName));
246 EXPECT_TRUE(profileData[0] == relObjData[0]->getRelated<ProfileInfo>(
"", relationName));
249 EXPECT_TRUE(std::make_pair(profileData[0], -42.0f) == relObjData[0]->getRelatedToWithWeight<ProfileInfo>(
"", relationName));
251 EXPECT_TRUE(std::make_pair(profileNullPtr, 1.0f) == relObjData[1]->getRelatedToWithWeight<ProfileInfo>(
"", relationName));
252 EXPECT_TRUE(std::make_pair(profileNullPtr, 1.0f) == relObjData[0]->getRelatedFromWithWeight<ProfileInfo>(
"", relationName));
253 EXPECT_TRUE(std::make_pair(profileData[0], -42.0f) == relObjData[0]->getRelatedWithWeight<ProfileInfo>(
"", relationName));
259 TObject::Class(),
"ALL",
"");
262 (relObjData)[0]->addRelationTo(
static_cast<TObject*
>(
nullptr), 1.0, relationName);
263 (relObjData)[0]->addRelationTo(
static_cast<ProfileInfo*
>(
nullptr), 1.0, relationName);
267 EXPECT_B2FATAL((relObjData)[0]->addRelationTo(¬InArray, 1.0, relationName));
static void addRelationFromTo(const TObject *fromObject, const TObject *toObject, float weight=1.0, const std::string &namedRelation="")
Add a relation from an object in a store array to another object in a store array.
@ c_WriteOut
Object/array should be saved by output modules.
@ c_FromSide
Return relations/objects pointed from (to a given object).
@ c_Event
Different object in each event, all objects/arrays are invalidated after event() function has been ca...
static DataStore & Instance()
Instance of singleton Store.
void setInitializeActive(bool active)
Setter for m_initializeActive.
void reset(EDurability durability)
Frees memory occupied by data store items and removes all objects from the map.
RelationVectorBase getRelationsWith(ESearchSide searchSide, const TObject *object, StoreEntry *&entry, int &index, const TClass *withClass, const std::string &withName, const std::string &namedRelation)
Get the relations between an object and other objects in a store array.
Store execution time and memory usage.
Class for type safe access to objects that are referred to in relations.
void setWeight(int index, float weight)
Set a new weight for the given relation.
T * object(int index) const
Get object with index.
size_t size() const
Get number of relations.
void remove(int index)
Remove relation at given index.
float weight(int index) const
Get weight with index.
Defines interface for accessing relations of objects in StoreArray.
std::string getArrayName() const
Get name of array this object is stored in, or "" if not found.
int getArrayIndex() const
Returns this object's array index (in StoreArray), or -1 if not found.
Accessor to arrays stored in the data store.
Abstract base class for different kinds of events.
Wraps a stored array/object, stored under unique (name, durability) key.