Warning, file /education/step/autotests/test_worldcopy.cc was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
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)