File indexing completed on 2024-04-28 07:39:35

0001 /*
0002     SPDX-FileCopyrightText: 2007 Vladimir Kuznetsov <ks.vladimir@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "test_worldcopy.h"
0008 
0009 #include "stepcore/world.h"
0010 #include "stepcore/solver.h"
0011 #include "stepcore/types.h"
0012 
0013 #include <QTest>
0014 
0015 class WorldCopyTestItem: public StepCore::Body,
0016                          public StepCore::Force
0017 {
0018     STEPCORE_OBJECT(WorldCopyTestItem)
0019 
0020 public:
0021     WorldCopyTestItem(): _world1(NULL), _link(NULL) {}
0022     void worldItemRemoved(Item* item);
0023     void setWorld(StepCore::World* world);
0024 
0025     WorldCopyTestItem* link() const { return _link; }
0026     void setLink(WorldCopyTestItem* link) { _link = link; }
0027 
0028     StepCore::World* world1() const { return _world1; }
0029 
0030     virtual int  variablesCount() { return 0; }
0031     virtual void setVariables(const double* position, const double* velocity,
0032                const double* positionVariance, const double* velocityVariance) {}
0033     virtual void getVariables(double* position, double* velocity,
0034                      double* positionVariance, double* velocityVariance) {}
0035     virtual void addForce(const double* force, const double* forceVariance) {}
0036     virtual void resetForce(bool resetVariance) {}
0037     virtual void getAccelerations(double* acceleration, double* accelerationVariance) {}
0038     virtual void getInverseMass(StepCore::VectorXd* inverseMass,
0039                             StepCore::DynSparseRowMatrix* variance, int offset) {}
0040 
0041     virtual void calcForce(bool calcVariances) {}
0042 
0043 private:
0044     StepCore::World* _world1;
0045     WorldCopyTestItem* _link;
0046 };
0047 
0048 class WorldCopyTestSolver: public StepCore::Solver
0049 {
0050     STEPCORE_OBJECT(WorldCopyTestSolver)
0051 
0052 public:
0053     virtual int doCalcFn(double* t, const StepCore::VectorXd* y, const StepCore::VectorXd* yvar = 0,
0054                             StepCore::VectorXd* f = 0, StepCore::VectorXd* fvar = 0) { return Solver::OK; }
0055     virtual int doEvolve(double* t, double t1, StepCore::VectorXd* y, StepCore::VectorXd* yvar) { return Solver::OK; }
0056 };
0057 
0058 STEPCORE_META_OBJECT(WorldCopyTestItem, "WorldCopyTestItem", "TestItem", 0,
0059     STEPCORE_SUPER_CLASS(StepCore::Item) STEPCORE_SUPER_CLASS(StepCore::Body) STEPCORE_SUPER_CLASS(StepCore::Force),)
0060 STEPCORE_META_OBJECT(WorldCopyTestSolver, "WorldCopyTestSolver", "TestSolver", 0, STEPCORE_SUPER_CLASS(StepCore::Solver),)
0061 
0062 void WorldCopyTestItem::worldItemRemoved(Item* item)
0063 {
0064     if(item == _link) _link = 0;
0065 }
0066 
0067 void WorldCopyTestItem::setWorld(StepCore::World* world)
0068 {
0069     _world1 = world;
0070     if(world == NULL) _link = NULL;
0071     else if(this->world() != NULL && _link != NULL) {
0072         _link = dynamic_cast<WorldCopyTestItem*>(
0073             world->items()[ this->world()->childItemIndex(dynamic_cast<const Item*>(_link)) ]);
0074     }
0075     StepCore::Item::setWorld(world);
0076 }
0077 
0078 void MainTest::testWorldCopy()
0079 {
0080     /* Initialize and create some objects */
0081     StepCore::World* world = new StepCore::World();
0082     world->addItem(new WorldCopyTestItem());
0083     world->addItem(new WorldCopyTestItem());
0084     world->setSolver(new WorldCopyTestSolver());
0085 
0086     QCOMPARE( int(world->items().size()), 2 );
0087     QCOMPARE( int(world->bodies().size()), 2 );
0088     QCOMPARE( int(world->forces().size()), 2 );
0089 
0090     world->setName("world1");
0091     world->setTime(10);
0092     world->setTimeScale(20);
0093     world->items()[0]->setName("item0");
0094     world->items()[1]->setName("item1");
0095     world->solver()->setName("solver1");
0096 
0097     dynamic_cast<WorldCopyTestItem*>(world->items()[0])->setLink(
0098                     dynamic_cast<WorldCopyTestItem*>(world->items()[1]));
0099 
0100     /* Copy constructor */
0101     StepCore::World* world1 = new StepCore::World(*world);
0102     
0103     QCOMPARE(world1->name(), world->name());
0104     QCOMPARE(world1->time(), world->time());
0105     QCOMPARE(world1->timeScale(), world->timeScale());
0106     QCOMPARE(world1->items().size(), world->items().size());
0107     QCOMPARE(world1->bodies().size(), world->bodies().size());
0108     QCOMPARE(world1->forces().size(), world->forces().size());
0109     QCOMPARE(world1->items()[0]->name(), world->items()[0]->name());
0110     QCOMPARE(world1->items()[1]->name(), world->items()[1]->name());
0111     QCOMPARE(world1->solver()->name(), world->solver()->name());
0112 
0113     QVERIFY(world1->items()[0] != world->items()[0]);
0114     QVERIFY(world1->items()[1] != world->items()[1]);
0115     QVERIFY(world1->solver() != world->solver());
0116 
0117     QVERIFY(dynamic_cast<StepCore::Item*>(world1->bodies()[0]) == world1->items()[0]);
0118     QVERIFY(dynamic_cast<StepCore::Item*>(world1->bodies()[1]) == world1->items()[1]);
0119     QVERIFY(dynamic_cast<StepCore::Item*>(world1->forces()[0]) == world1->items()[0]);
0120     QVERIFY(dynamic_cast<StepCore::Item*>(world1->forces()[1]) == world1->items()[1]);
0121 
0122     QVERIFY(dynamic_cast<WorldCopyTestItem*>(world1->items()[0])->world1() == world1);
0123     QVERIFY(dynamic_cast<WorldCopyTestItem*>(world1->items()[1])->world1() == world1);
0124     QVERIFY(dynamic_cast<WorldCopyTestItem*>(world1->items()[0])->link() ==
0125                     dynamic_cast<WorldCopyTestItem*>(world1->items()[1]));
0126 
0127     /* Remove item */
0128     //world1->deleteItem(world1->items()[1]);
0129     //QVERIFY(world1->items().size() == 1);
0130     //QVERIFY(dynamic_cast<WorldCopyTestItem*>(world1->items()[0])->link() == NULL);
0131 }
0132 
0133 QTEST_MAIN(TestWorldCopy)
0134 
0135 #include "moc_test_worldcopy.cpp"