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
43 StoreArray<EventMetaData> evtData;
44 StoreArray<ProfileInfo> profileData;
45 StoreArray<RelationsObject> relObjData;
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.
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.
RelationsInterface< TObject > RelationsObject
Provides interface for getting/adding relations to objects in StoreArrays.
Abstract base class for different kinds of events.
Wraps a stored array/object, stored under unique (name, durability) key.