commit e7846d5572486b9e319ba1e0e10871c38a17acbb
Author: SebastianDiel <sebastian.diel@web.de>
Date:   Sun Oct 21 23:01:44 2018 +0200

    Added testcases for deep heritage

diff --git a/tests/em/em.pro b/tests/em/em.pro
index e056866..25770ca 100644
--- a/tests/em/em.pro
+++ b/tests/em/em.pro
@@ -19,10 +19,22 @@ TEMPLATE = app
 SOURCES += tst_em.cpp \
     ../models.cpp \
     main.cpp \
-    tst_querybuilder.cpp
+    tst_querybuilder.cpp \
+    ../model/testpupilchild.cpp \
+    ../model/testpupilgrandchild.cpp \
+    ../model/testpupilgreatgrandchild.cpp \
+    ../model/testperson.cpp \
+    ../model/testgroup.cpp \
+    ../model/testpupil.cpp
 DEFINES += SRCDIR=\\\"$$PWD/\\\"
 
 HEADERS += \
     ../models.h \
     tst_em.h \
-    tst_querybuilder.h
+    tst_querybuilder.h \
+    ../model/testpupilchild.h \
+    ../model/testpupilgrandchild.h \
+    ../model/testpupilgreatgrandchild.h \
+    ../model/testperson.h \
+    ../model/testgroup.h \
+    ../model/testpupil.h
diff --git a/tests/em/tst_em.cpp b/tests/em/tst_em.cpp
index 29700cf..ce6756c 100644
--- a/tests/em/tst_em.cpp
+++ b/tests/em/tst_em.cpp
@@ -1,6 +1,13 @@
 #include "tst_em.h"
+#include "../tests/model/testperson.h"
+#include "../tests/model/testpupil.h"
+#include "../tests/model/testpupilchild.h"
+#include "../tests/model/testpupilgrandchild.h"
+#include "../tests/model/testpupilgreatgrandchild.h"
+#include "../tests/model/testgroup.h"
 
 void EmTest::initTestCase() {
+    qSetGlobalQHashSeed(0);
     CuteEntityManager::EntityInstanceFactory::registerClass<Group>();
     CuteEntityManager::EntityInstanceFactory::registerClass<Person>();
     CuteEntityManager::EntityInstanceFactory::registerClass<Article>();
@@ -19,6 +26,119 @@ void EmTest::cleanupTestCase() {
     }
 }
 
+void EmTest::testChainedHeritageCreate() {
+//    QList<QSharedPointer<TestGroup>> groups;
+//    QList<QSharedPointer<TestPerson>> childListAAA;
+//    QList<QSharedPointer<TestPerson>> grandChildListBBB;
+//    QList<QSharedPointer<TestPerson>> greatGrandChildListCCC;
+
+    auto testPerson = QSharedPointer<TestPerson>(new TestPerson());
+    auto testPupil = QSharedPointer<TestPupil>(new TestPupil());
+    auto testPupilChild = QSharedPointer<TestPupilChild>(new TestPupilChild());
+    auto testPupilGrandChild = QSharedPointer<TestPupilGrandChild>(new TestPupilGrandChild());
+    auto testPupilGreatGrandChild = QSharedPointer<TestPupilGreatGrandChild>(new TestPupilGreatGrandChild());
+
+    QVERIFY(this->e->save(testPerson));
+    QVERIFY(this->e->save(testPupil));
+    QVERIFY(this->e->save(testPupilChild));
+    QVERIFY(this->e->save(testPupilGrandChild));
+    QVERIFY(this->e->save(testPupilGreatGrandChild));
+
+    auto tim =  QSharedPointer<TestPupilGreatGrandChild>(new TestPupilGreatGrandChild());
+//    //set TestPerson's properties
+//    tim->setFirstName("Tim");
+//    tim->setFamilyName("Thaler");
+//    tim->setNickName("Timmy");
+//    tim->setBirthday(QDate(1973,3,8));
+//    tim->setGender(TestPerson::Gender::MALE);
+//    tim->setCustomPictureFileName("someFile.jpg");
+
+//    //set TestPupil's properties
+//    tim->setLegalGuardianNote("lost his parens, lives with stepmother");
+//    tim->setGroups(groups);
+
+//    //setTestPupilChild's properties
+//    tim->setChildPropertyString("childPropertyStringAAA");
+//    tim->setChildPropertyPersons(childListAAA);
+
+//    //setTestPupilGrandChild's properties
+//    tim->setGrandChildPropertyString("grandChildPropertyStringBBB");
+//    tim->setGrandChildPropertyPersons(grandChildListBBB);
+
+//    //setTestPupilGreatGrandChild's properties
+//    tim->setGreatGrandChildPropertyString("greatGrandChildPropertyStringCCC");
+//    tim->setGrandChildPropertyPersons(greatGrandChildListCCC);
+
+    QVERIFY(this->e->save(tim));
+}
+
+void EmTest::testChainedHeritageUpdate()
+{
+//    auto albert = QSharedPointer<TestPupil> (new TestPupil());
+//    albert->setFirstName("Albert");
+//    albert->setFamilyName("Einstein");
+//    auto bette = QSharedPointer<TestPupil> (new TestPupil());
+//    bette->setFirstName("Bette");
+//    bette->setFamilyName("Middler");
+//    auto cassandra  = QSharedPointer<TestPupil> (new TestPupil());
+//    cassandra ->setFirstName("Cassandra ");
+//    cassandra ->setFamilyName("Wilson");
+//    auto dean  = QSharedPointer<TestPupil> (new TestPupil());
+//    dean ->setFirstName("Dean ");
+//    dean ->setFamilyName("Martin");
+
+//    auto group1 = QSharedPointer<TestGroup>(new TestGroup());
+//    group1->setName("group one");
+//    auto group2 = QSharedPointer<TestGroup>(new TestGroup());
+//    group1->setName("group two");
+
+//    QList<QSharedPointer<TestGroup>> groups;
+//    groups << group1;
+//    groups << group2;
+
+//    QList<QSharedPointer<TestPerson>> childListAAA;
+//    childListAAA << albert;
+//    childListAAA << bette;
+//    childListAAA << cassandra;
+//    childListAAA << dean;
+
+//    QList<QSharedPointer<TestPerson>> grandChildListBBB;
+//    grandChildListBBB << bette;
+//    grandChildListBBB << cassandra;
+//    grandChildListBBB << dean;
+
+//    QList<QSharedPointer<TestPerson>> greatGrandChildListCCC;
+//    greatGrandChildListCCC << cassandra;
+//    greatGrandChildListCCC << dean;
+
+    auto tim =  QSharedPointer<TestPupilGreatGrandChild>(new TestPupilGreatGrandChild());
+//    //set TestPerson's properties
+//    tim->setFirstName("Tim");
+//    tim->setFamilyName("Thaler");
+//    tim->setNickName("Timmy");
+//    tim->setBirthday(QDate(1973,3,8));
+//    tim->setGender(TestPerson::Gender::MALE);
+//    tim->setCustomPictureFileName("someFile.jpg");
+
+//    //set TestPupil's properties
+//    tim->setLegalGuardianNote("lost his parens, lives with stepmother");
+//    tim->setGroups(groups);
+
+//    //setTestPupilChild's properties
+//    tim->setChildPropertyString("childPropertyStringAAA");
+//    tim->setChildPropertyPersons(childListAAA);
+
+//    //setTestPupilGrandChild's properties
+//    tim->setGrandChildPropertyString("grandChildPropertyStringBBB");
+//    tim->setGrandChildPropertyPersons(grandChildListBBB);
+
+//    //setTestPupilGreatGrandChild's properties
+//    tim->setGreatGrandChildPropertyString("greatGrandChildPropertyStringCCC");
+//    tim->setGrandChildPropertyPersons(greatGrandChildListCCC);
+
+    QVERIFY(this->e->save(tim));
+    qDebug()<<"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<";
+}
 void EmTest::testCheckDuplicates() {
     QSharedPointer<Article> article = QSharedPointer<Article>(new Article(10,
                                       QString("TestItem")));
diff --git a/tests/em/tst_em.h b/tests/em/tst_em.h
index 27cc3d9..cce5306 100644
--- a/tests/em/tst_em.h
+++ b/tests/em/tst_em.h
@@ -13,6 +13,8 @@ class EmTest : public QObject {
   private Q_SLOTS:
     void initTestCase();
     void cleanupTestCase();
+    void testChainedHeritageCreate();
+    void testChainedHeritageUpdate();
     void testCheckDuplicates();
     void testBasics();
     void init();
diff --git a/tests/model/testgroup.cpp b/tests/model/testgroup.cpp
new file mode 100644
index 0000000..5cf6436
--- /dev/null
+++ b/tests/model/testgroup.cpp
@@ -0,0 +1,33 @@
+#include "testgroup.h"
+#include "testperson.h"
+#include "testpupil.h"
+#include <QDebug>
+
+TestGroup::TestGroup() : Entity() {
+}
+
+const QHash<QString, CuteEntityManager::Relation> TestGroup::getRelations() const {
+    auto hash = QHash<QString, CuteEntityManager::Relation>();
+    hash.insert("pupils", CuteEntityManager::Relation(
+                    "pupils", CuteEntityManager::RelationType::MANY_TO_MANY));
+    return hash;
+}
+
+
+QList<QSharedPointer<TestPupil> > TestGroup::pupils() const {
+    return m_pupils;
+}
+
+void TestGroup::setPupils(const QList<QSharedPointer<TestPupil> > &pupils) {
+    m_pupils = pupils;
+}
+
+QString TestGroup::name() const {
+    return m_name;
+}
+
+void TestGroup::setName(const QString &value) {
+    m_name = value;
+}
+
+
diff --git a/tests/model/testgroup.h b/tests/model/testgroup.h
new file mode 100644
index 0000000..51edf50
--- /dev/null
+++ b/tests/model/testgroup.h
@@ -0,0 +1,42 @@
+#ifndef TESTGROUP_H
+#define TESTGROUP_H
+
+#include <QDebug>
+#include "entitymanager.h"
+
+class TestPupil;
+class SeatingPlan;
+class TestPerson;
+class AppData;
+
+using namespace CuteEntityManager;
+
+class TestGroup: public CuteEntityManager::Entity
+{
+    Q_OBJECT
+
+    Q_PROPERTY(QString name READ name WRITE setName)
+    Q_PROPERTY(QList<QSharedPointer<TestPupil>> pupils READ pupils WRITE setPupils)
+
+public:
+    EM_MACRO(TestGroup)
+    Q_INVOKABLE TestGroup();
+    virtual ~TestGroup() override {}
+
+    QString name() const;
+    void setName(const QString &value);
+
+    QList<QSharedPointer<TestPupil> > pupils() const;
+    void setPupils(const QList<QSharedPointer<TestPupil> > &pupils);
+    QSharedPointer<TestPupil> pupilAt(int i) { return m_pupils.at(i); }
+    void addPupil(QSharedPointer<TestPupil> p) {m_pupils.append(p);}
+
+    virtual const QHash<QString, CuteEntityManager::Relation> getRelations() const override;
+
+protected:
+    // members
+    QString m_name;
+    QList<QSharedPointer<TestPupil> > m_pupils;
+};
+
+#endif // TESTGROUP_H
diff --git a/tests/model/testperson.cpp b/tests/model/testperson.cpp
new file mode 100644
index 0000000..4898cb4
--- /dev/null
+++ b/tests/model/testperson.cpp
@@ -0,0 +1,13 @@
+#include "testperson.h"
+
+TestPerson::TestPerson()
+    : Entity()
+{
+}
+
+const QHash<QString, Relation> TestPerson::getRelations() const
+{
+    auto hash = QHash<QString, Relation>();
+    return hash;
+
+}
diff --git a/tests/model/testperson.h b/tests/model/testperson.h
new file mode 100644
index 0000000..fb09c70
--- /dev/null
+++ b/tests/model/testperson.h
@@ -0,0 +1,91 @@
+#ifndef TESTPERSON_H
+#define TESTPERSON_H
+
+#include <QDateTime>
+#include <QDebug>
+
+#include "entity.h"
+#include "testgroup.h"
+
+using namespace CuteEntityManager;
+
+class Gender;
+class NameOrder;
+
+class TestPerson: public Entity
+{
+    Q_OBJECT
+    Q_PROPERTY(QString firstName READ firstName WRITE setFirstName)
+    Q_PROPERTY(QString familyName READ familyName WRITE setFamilyName)
+    Q_PROPERTY(QString namePrefix READ namePrefix WRITE setNamePrefix)
+    Q_PROPERTY(QString nickName READ nickName WRITE setNickName)
+    Q_PROPERTY(QDate birthday READ birthday WRITE setBirthday)
+    Q_PROPERTY(Gender gender READ gender WRITE setGender)
+    Q_PROPERTY(QString customPictureFileName READ customPictureFileName WRITE setCustomPictureFileName)
+
+signals:
+    void firstNameChanged();
+    void familyNameChanged();
+    void namePrefixChanged();
+    void nickNameChanged();
+    void birthdayChanged();
+    void genderChanged();
+    void customPictureFileNameChanged();
+
+public:
+    EM_MACRO(TestPerson)
+
+    enum class Gender {
+        MALE = 0,
+        FEMALE = 1,
+        UNKNOWNGENDER = -1
+    };
+    Q_ENUM(Gender)
+
+    enum class NameOrder {
+        FIRST_FAMILY=0,
+        FAMILY_FIRST=1
+    };
+    Q_ENUM(NameOrder)
+
+
+    Q_INVOKABLE explicit TestPerson();
+    virtual ~TestPerson() override {}
+
+    virtual const QHash<QString, CuteEntityManager::Relation> getRelations() const override;
+
+    // getters
+    QString firstName() const {return m_firstName;}
+    QString familyName() const {return m_familyName;}
+    QString namePrefix() const {return m_namePrefix;}
+    QString nickName() const {return m_nickName;}
+
+    QDate birthday() const {return m_birthday;}
+    Gender gender() const {return m_gender;}
+    QString customPictureFileName() const {return m_customPictureFileName;}
+
+    // setters
+    void setFirstName(QString firstName) {m_firstName=firstName; emit firstNameChanged();}
+    void setFamilyName(QString familyName) {m_familyName=familyName; emit familyNameChanged();}
+    void setNamePrefix(QString namePrefix) {m_namePrefix=namePrefix; emit namePrefixChanged();}
+    void setNickName(QString nickName) {m_nickName=nickName; emit nickNameChanged();}
+
+    void setBirthday(QDate birthday) {m_birthday=birthday; emit birthdayChanged();}
+    void setGender(Gender gender) {m_gender=gender; emit genderChanged();}
+    void setCustomPictureFileName(QString fileName) {m_customPictureFileName=fileName; emit customPictureFileNameChanged();}
+
+    QList<QSharedPointer<TestGroup> > groups() const;
+    void setGroups(const QList<QSharedPointer<TestGroup> > &groups);
+
+protected:
+    // members
+    QString m_firstName = QString();
+    QString m_familyName = QString();
+    QString m_namePrefix = QString();
+    QString m_nickName = QString();
+    QDate m_birthday = QDate();
+    Gender m_gender = Gender::UNKNOWNGENDER;
+    QString m_customPictureFileName = QString();
+};
+
+#endif // TESTPERSON_H
diff --git a/tests/model/testpupil.cpp b/tests/model/testpupil.cpp
new file mode 100644
index 0000000..426c93b
--- /dev/null
+++ b/tests/model/testpupil.cpp
@@ -0,0 +1,32 @@
+#include "testpupil.h"
+
+TestPupil::TestPupil()
+    :TestPerson()
+{
+}
+
+const QHash<QString, Relation> TestPupil::getRelations() const
+{
+    auto hash = TestPerson::getRelations();
+    hash.insert("groups",Relation("groups",CuteEntityManager::RelationType::MANY_TO_MANY,QString("pupils")));
+    return hash;
+}
+QList<QSharedPointer<TestGroup> > TestPupil::groups() const
+{
+    return m_groups;
+}
+
+void TestPupil::setGroups(const QList<QSharedPointer<TestGroup> > &groups)
+{
+    m_groups = groups;
+}
+
+QString TestPupil::legalGuardianNote() const
+{
+    return m_legalGuardianNote;
+}
+
+void TestPupil::setLegalGuardianNote(const QString &legalGuardianNote)
+{
+    m_legalGuardianNote = legalGuardianNote;
+}
diff --git a/tests/model/testpupil.h b/tests/model/testpupil.h
new file mode 100644
index 0000000..8fcac1e
--- /dev/null
+++ b/tests/model/testpupil.h
@@ -0,0 +1,29 @@
+#ifndef TESTPUPIL_H
+#define TESTPUPIL_H
+
+#include "testperson.h"
+
+class TestPupil : public TestPerson
+{
+    Q_OBJECT
+    Q_PROPERTY(QString legalGuardianNote READ legalGuardianNote WRITE setLegalGuardianNote)
+    Q_PROPERTY(QList<QSharedPointer<TestGroup>> groups READ groups WRITE setGroups)
+public:
+    EM_MACRO(TestPupil)
+    Q_INVOKABLE TestPupil();
+    virtual ~TestPupil() override {}
+
+    virtual const QHash<QString, CuteEntityManager::Relation> getRelations() const override;
+
+    QList<QSharedPointer<TestGroup> > groups() const;
+    void setGroups(const QList<QSharedPointer<TestGroup> > &groups);
+
+    QString legalGuardianNote() const;
+    void setLegalGuardianNote(const QString &legalGuardianNote);
+
+protected:
+    QString m_legalGuardianNote = QString();
+    QList<QSharedPointer<TestGroup>> m_groups = QList<QSharedPointer<TestGroup>>();
+};
+
+#endif // TESTPUPIL_H
diff --git a/tests/model/testpupilchild.cpp b/tests/model/testpupilchild.cpp
new file mode 100644
index 0000000..de76bbd
--- /dev/null
+++ b/tests/model/testpupilchild.cpp
@@ -0,0 +1,32 @@
+#include "testpupilchild.h"
+
+TestPupilChild::TestPupilChild() : TestPupil()
+{
+}
+
+QString TestPupilChild::childPropertyString() const
+{
+    return m_childPropertyString;
+}
+
+void TestPupilChild::setChildPropertyString(const QString &childPropertyString)
+{
+    m_childPropertyString = childPropertyString;
+}
+
+QList<QSharedPointer<TestPerson> > TestPupilChild::childPropertyPersons() const
+{
+    return m_childPropertyPersons;
+}
+
+void TestPupilChild::setChildPropertyPersons(const QList<QSharedPointer<TestPerson> > &childPropertyPersons)
+{
+    m_childPropertyPersons = childPropertyPersons;
+}
+
+const QHash<QString, Relation> TestPupilChild::getRelations() const
+{
+    auto hash = TestPupil::getRelations();
+    hash.insert("childPropertyPersons", Relation("childPropertyPersons",RelationType::MANY_TO_MANY));
+    return hash;
+}
diff --git a/tests/model/testpupilchild.h b/tests/model/testpupilchild.h
new file mode 100644
index 0000000..494d8b1
--- /dev/null
+++ b/tests/model/testpupilchild.h
@@ -0,0 +1,37 @@
+#ifndef TESTPUPILCHILD_H
+#define TESTPUPILCHILD_H
+
+#include <QObject>
+#include "testpupil.h"
+#include "entitymanager.h"
+
+class TestPupilChild : public TestPupil
+{
+    Q_OBJECT
+    Q_PROPERTY(QString childPropertyString READ childPropertyString WRITE setChildPropertyString)
+    Q_PROPERTY(QList<QSharedPointer<TestPerson>> childPropertyPersons READ childPropertyPersons WRITE setChildPropertyPersons)
+
+public:
+    EM_MACRO(TestPupilChild)
+    Q_INVOKABLE TestPupilChild();
+    virtual ~TestPupilChild() override {}
+
+    QString childPropertyString() const;
+    void setChildPropertyString(const QString &childPropertyString);
+
+    QList<QSharedPointer<TestPerson> > childPropertyPersons() const;
+    void setChildPropertyPersons(const QList<QSharedPointer<TestPerson> > &childPropertyPersons);
+
+    virtual const QHash<QString, CuteEntityManager::Relation> getRelations() const override;
+    virtual InheritanceStrategy getInheritanceStrategy() const override { return InheritanceStrategy::JOINED_TABLE; }
+
+signals:
+
+public slots:
+private:
+    QString m_childPropertyString = "m_childPropertyString";
+    QList<QSharedPointer<TestPerson>> m_childPropertyPersons = QList<QSharedPointer<TestPerson>>();
+
+};
+
+#endif // TESTPUPILCHILD_H
diff --git a/tests/model/testpupilgrandchild.cpp b/tests/model/testpupilgrandchild.cpp
new file mode 100644
index 0000000..c04ea92
--- /dev/null
+++ b/tests/model/testpupilgrandchild.cpp
@@ -0,0 +1,32 @@
+#include "testpupilgrandchild.h"
+
+TestPupilGrandChild::TestPupilGrandChild() : TestPupilChild()
+{
+}
+
+QString TestPupilGrandChild::grandChildPropertyString() const
+{
+    return m_grandChildPropertyString;
+}
+
+void TestPupilGrandChild::setGrandChildPropertyString(const QString &grandChildPropertyString)
+{
+    m_grandChildPropertyString = grandChildPropertyString;
+}
+
+QList<QSharedPointer<TestPerson> > TestPupilGrandChild::grandChildPropertyPersons() const
+{
+    return m_grandChildPropertyPersons;
+}
+
+void TestPupilGrandChild::setGrandChildPropertyPersons(const QList<QSharedPointer<TestPerson> > &grandChildPropertyPersons)
+{
+    m_grandChildPropertyPersons = grandChildPropertyPersons;
+}
+
+const QHash<QString, Relation> TestPupilGrandChild::getRelations() const
+{
+    auto hash = TestPupilChild::getRelations();
+    hash.insert("grandChildPropertyPersons", Relation("grandChildPropertyPersons",RelationType::MANY_TO_MANY));
+    return hash;
+}
diff --git a/tests/model/testpupilgrandchild.h b/tests/model/testpupilgrandchild.h
new file mode 100644
index 0000000..e79f174
--- /dev/null
+++ b/tests/model/testpupilgrandchild.h
@@ -0,0 +1,36 @@
+#ifndef TESTPUPILGRANDCHILD_H
+#define TESTPUPILGRANDCHILD_H
+
+#include <QObject>
+#include "testpupilchild.h"
+#include "entitymanager.h"
+#include "testpupilchild.h"
+
+class TestPupilGrandChild : public TestPupilChild
+{
+    Q_OBJECT
+    Q_PROPERTY(QString grandChildPropertyString READ grandChildPropertyString WRITE setGrandChildPropertyString)
+    Q_PROPERTY(QList<QSharedPointer<TestPerson>> grandChildPropertyPersons READ grandChildPropertyPersons WRITE setGrandChildPropertyPersons)
+
+
+public:
+    EM_MACRO(TestPupilGrandChild)
+    Q_INVOKABLE TestPupilGrandChild();
+    virtual ~TestPupilGrandChild() override {}
+
+    QString grandChildPropertyString() const;
+    void setGrandChildPropertyString(const QString &grandChildPropertyString);
+
+    QList<QSharedPointer<TestPerson> > grandChildPropertyPersons() const;
+    void setGrandChildPropertyPersons(const QList<QSharedPointer<TestPerson> > &grandChildPropertyPersons);
+
+    virtual const QHash<QString, CuteEntityManager::Relation> getRelations() const override;
+    virtual InheritanceStrategy getInheritanceStrategy() const override { return InheritanceStrategy::JOINED_TABLE; }
+
+private:
+    QString m_grandChildPropertyString = "m_grandChildPropertyString";
+    QList<QSharedPointer<TestPerson>> m_grandChildPropertyPersons = QList<QSharedPointer<TestPerson>>();
+
+};
+
+#endif // TESTPUPILGRANDCHILD_H
diff --git a/tests/model/testpupilgreatgrandchild.cpp b/tests/model/testpupilgreatgrandchild.cpp
new file mode 100644
index 0000000..52ba98d
--- /dev/null
+++ b/tests/model/testpupilgreatgrandchild.cpp
@@ -0,0 +1,33 @@
+#include "testpupilgreatgrandchild.h"
+
+TestPupilGreatGrandChild::TestPupilGreatGrandChild() : TestPupilGrandChild()
+{
+}
+
+QString TestPupilGreatGrandChild::greatGrandChildPropertyString() const
+{
+    return m_greatGrandChildPropertyString;
+}
+
+void TestPupilGreatGrandChild::setGreatGrandChildPropertyString(const QString &greatGrandChildPropertyString)
+{
+    m_greatGrandChildPropertyString = greatGrandChildPropertyString;
+}
+
+QList<QSharedPointer<TestPerson> > TestPupilGreatGrandChild::greatGrandChildPropertyPersons() const
+{
+    return m_greatGrandChildPropertyPersons;
+}
+
+void TestPupilGreatGrandChild::setGreatGrandChildPropertyPersons(const QList<QSharedPointer<TestPerson> > &greatGrandChildPropertyPersons)
+{
+    m_greatGrandChildPropertyPersons = greatGrandChildPropertyPersons;
+}
+
+const QHash<QString, Relation> TestPupilGreatGrandChild::getRelations() const
+{
+    auto hash = TestPupilGrandChild::getRelations();
+//    hash.insert("greatGrandChildPropertyPersons", Relation("greatGrandChildPropertyPersons",RelationType::MANY_TO_MANY));
+    return hash;
+}
+
diff --git a/tests/model/testpupilgreatgrandchild.h b/tests/model/testpupilgreatgrandchild.h
new file mode 100644
index 0000000..ffcd01d
--- /dev/null
+++ b/tests/model/testpupilgreatgrandchild.h
@@ -0,0 +1,37 @@
+#ifndef TESTPUPILGREATGRANDCHILD_H
+#define TESTPUPILGREATGRANDCHILD_H
+
+#include <QObject>
+#include "testpupilgrandchild.h"
+#include "entitymanager.h"
+
+class TestPupilGreatGrandChild : public TestPupilGrandChild
+{
+    Q_OBJECT
+    Q_PROPERTY(QString greatGrandChildPropertyString READ greatGrandChildPropertyString WRITE setGreatGrandChildPropertyString)
+
+public:
+    EM_MACRO(TestPupilGreatGrandChild)
+    Q_INVOKABLE TestPupilGreatGrandChild();
+    virtual ~TestPupilGreatGrandChild() override {}
+
+    QString greatGrandChildPropertyString() const;
+    void setGreatGrandChildPropertyString(const QString &greatGrandChildPropertyString);
+
+    // not used with Q_PROPERTY, nor in getRelations
+    QList<QSharedPointer<TestPerson> > greatGrandChildPropertyPersons() const;
+    void setGreatGrandChildPropertyPersons(const QList<QSharedPointer<TestPerson> > &greatGrandChildPropertyPersons);
+
+    virtual const QHash<QString, CuteEntityManager::Relation> getRelations() const override;
+    virtual InheritanceStrategy getInheritanceStrategy() const override { return InheritanceStrategy::JOINED_TABLE; }
+
+signals:
+
+public slots:
+private:
+    QString m_greatGrandChildPropertyString = "m_greatGrandChildPropertyString";
+    QList<QSharedPointer<TestPerson>> m_greatGrandChildPropertyPersons;
+};
+
+
+#endif // TESTPUPILGREATGRANDCHILD_H
