2013-01-24 10:58:12 +00:00
// Cyphesis Online RPG Server and AI Engine
// Copyright (C) 2013 Alistair Riddoch
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software Foundation,
// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
# ifdef NDEBUG
# undef NDEBUG
# endif
# ifndef DEBUG
# define DEBUG
# endif
# include "TestBase.h"
# include "rulesets/BaseMind.h"
# include "common/Unseen.h"
# include <Atlas/Objects/Anonymous.h>
# include <Atlas/Objects/Operation.h>
# include <Atlas/Objects/SmartPtr.h>
# include <cassert>
2013-01-24 20:39:04 +00:00
using Atlas : : Objects : : Entity : : Anonymous ;
2013-01-24 10:58:12 +00:00
class BaseMindMapEntityintegration : public Cyphesis : : TestBase
{
protected :
2013-01-24 20:19:54 +00:00
BaseMind * m_mind ;
2013-01-24 10:58:12 +00:00
public :
BaseMindMapEntityintegration ( ) ;
void setup ( ) ;
void teardown ( ) ;
2013-01-24 20:19:54 +00:00
void test_MemMapdel_top ( ) ;
void test_MemMapdel_mid ( ) ;
void test_MemMapdel_edge ( ) ;
2013-01-24 20:39:04 +00:00
void test_MemMapreadEntity_noloc ( ) ;
void test_MemMapreadEntity_changeloc ( ) ;
2013-06-03 22:08:15 +02:00
void test_MemMap_updateAdd_location_properties_have_effect ( ) ;
2013-01-24 20:53:48 +00:00
void test_MemMapcheck ( ) ;
2013-01-24 10:58:12 +00:00
} ;
BaseMindMapEntityintegration : : BaseMindMapEntityintegration ( )
{
2013-01-24 20:19:54 +00:00
ADD_TEST ( BaseMindMapEntityintegration : : test_MemMapdel_top ) ;
ADD_TEST ( BaseMindMapEntityintegration : : test_MemMapdel_mid ) ;
ADD_TEST ( BaseMindMapEntityintegration : : test_MemMapdel_edge ) ;
2013-01-24 20:39:04 +00:00
ADD_TEST ( BaseMindMapEntityintegration : : test_MemMapreadEntity_noloc ) ;
ADD_TEST ( BaseMindMapEntityintegration : : test_MemMapreadEntity_changeloc ) ;
2013-06-03 22:08:15 +02:00
ADD_TEST ( BaseMindMapEntityintegration : : test_MemMap_updateAdd_location_properties_have_effect ) ;
2013-01-24 20:53:48 +00:00
ADD_TEST ( BaseMindMapEntityintegration : : test_MemMapcheck ) ;
2013-01-24 10:58:12 +00:00
}
void BaseMindMapEntityintegration : : setup ( )
{
2013-01-24 20:19:54 +00:00
m_mind = new BaseMind ( " 1 " , 1 ) ;
2013-01-24 10:58:12 +00:00
}
void BaseMindMapEntityintegration : : teardown ( )
{
2013-01-24 20:19:54 +00:00
delete m_mind ;
2013-01-24 10:58:12 +00:00
}
2013-01-24 20:19:54 +00:00
void BaseMindMapEntityintegration : : test_MemMapdel_top ( )
2013-01-24 10:58:12 +00:00
{
2014-12-07 22:37:14 +01:00
//HACK: Disabled for now as we've disabled the deletion of entities from the mind. See MemMap::del(...)
return ;
2013-01-24 20:19:54 +00:00
MemEntity * tlve = new MemEntity ( " 0 " , 0 ) ;
tlve - > m_contains = new LocatedEntitySet ;
m_mind - > m_map . m_entities [ 0 ] = tlve ;
MemEntity * e2 = new MemEntity ( " 2 " , 2 ) ;
e2 - > m_contains = new LocatedEntitySet ;
e2 - > m_location . m_loc = tlve ;
tlve - > m_contains - > insert ( e2 ) ;
m_mind - > m_map . m_entities [ 2 ] = e2 ;
MemEntity * e3 = new MemEntity ( " 3 " , 3 ) ;
e3 - > m_contains = new LocatedEntitySet ;
e3 - > m_location . m_loc = e2 ;
e2 - > m_contains - > insert ( e3 ) ;
m_mind - > m_map . m_entities [ 3 ] = e3 ;
ASSERT_EQUAL ( m_mind - > m_map . m_entities . size ( ) , 4u ) ;
2013-01-24 20:53:48 +00:00
// Remove tlve from the map
2013-01-24 20:19:54 +00:00
m_mind - > m_map . del ( tlve - > getId ( ) ) ;
ASSERT_EQUAL ( m_mind - > m_map . m_entities . size ( ) , 3u ) ;
ASSERT_NULL ( e2 - > m_location . m_loc ) ;
ASSERT_TRUE ( e2 - > m_contains - > find ( e3 ) ! = e2 - > m_contains - > end ( ) ) ;
}
void BaseMindMapEntityintegration : : test_MemMapdel_mid ( )
{
2014-12-07 22:37:14 +01:00
//HACK: Disabled for now as we've disabled the deletion of entities from the mind. See MemMap::del(...)
return ;
2013-01-24 20:19:54 +00:00
MemEntity * tlve = new MemEntity ( " 0 " , 0 ) ;
tlve - > m_contains = new LocatedEntitySet ;
m_mind - > m_map . m_entities [ 0 ] = tlve ;
MemEntity * e2 = new MemEntity ( " 2 " , 2 ) ;
e2 - > m_contains = new LocatedEntitySet ;
e2 - > m_location . m_loc = tlve ;
tlve - > m_contains - > insert ( e2 ) ;
m_mind - > m_map . m_entities [ 2 ] = e2 ;
MemEntity * e3 = new MemEntity ( " 3 " , 3 ) ;
e3 - > m_contains = new LocatedEntitySet ;
e3 - > m_location . m_loc = e2 ;
e2 - > m_contains - > insert ( e3 ) ;
m_mind - > m_map . m_entities [ 3 ] = e3 ;
ASSERT_EQUAL ( m_mind - > m_map . m_entities . size ( ) , 4u ) ;
2013-01-24 20:53:48 +00:00
// Set a reference, so we can check e2 once it is removed
2013-01-24 20:19:54 +00:00
e2 - > incRef ( ) ;
2013-01-24 20:53:48 +00:00
// Remove e2 from the map
2013-01-24 20:19:54 +00:00
m_mind - > m_map . del ( e2 - > getId ( ) ) ;
ASSERT_EQUAL ( m_mind - > m_map . m_entities . size ( ) , 3u ) ;
ASSERT_TRUE ( tlve - > m_contains - > find ( e3 ) ! = tlve - > m_contains - > end ( ) ) ;
ASSERT_TRUE ( tlve - > m_contains - > find ( e2 ) = = tlve - > m_contains - > end ( ) ) ;
ASSERT_NULL ( e2 - > m_location . m_loc ) ;
ASSERT_EQUAL ( e2 - > checkRef ( ) , 0 ) ;
e2 - > decRef ( ) ;
}
void BaseMindMapEntityintegration : : test_MemMapdel_edge ( )
{
2014-12-07 22:37:14 +01:00
//HACK: Disabled for now as we've disabled the deletion of entities from the mind. See MemMap::del(...)
return ;
2013-01-24 20:19:54 +00:00
MemEntity * tlve = new MemEntity ( " 0 " , 0 ) ;
tlve - > m_contains = new LocatedEntitySet ;
m_mind - > m_map . m_entities [ 0 ] = tlve ;
MemEntity * e2 = new MemEntity ( " 2 " , 2 ) ;
e2 - > m_contains = new LocatedEntitySet ;
e2 - > m_location . m_loc = tlve ;
tlve - > m_contains - > insert ( e2 ) ;
m_mind - > m_map . m_entities [ 2 ] = e2 ;
MemEntity * e3 = new MemEntity ( " 3 " , 3 ) ;
e3 - > m_contains = new LocatedEntitySet ;
e3 - > m_location . m_loc = e2 ;
e2 - > m_contains - > insert ( e3 ) ;
m_mind - > m_map . m_entities [ 3 ] = e3 ;
ASSERT_EQUAL ( m_mind - > m_map . m_entities . size ( ) , 4u ) ;
2013-01-24 20:53:48 +00:00
// Set a reference, so we can check e3 once it is removed
2013-01-24 20:19:54 +00:00
e3 - > incRef ( ) ;
2013-01-24 20:53:48 +00:00
// Remove e3 from the map
2013-01-24 20:19:54 +00:00
m_mind - > m_map . del ( e3 - > getId ( ) ) ;
ASSERT_EQUAL ( m_mind - > m_map . m_entities . size ( ) , 3u ) ;
ASSERT_TRUE ( tlve - > m_contains - > find ( e2 ) ! = tlve - > m_contains - > end ( ) ) ;
ASSERT_TRUE ( e2 - > m_contains - > find ( e3 ) = = e2 - > m_contains - > end ( ) ) ;
ASSERT_NULL ( e3 - > m_location . m_loc ) ;
ASSERT_EQUAL ( e3 - > checkRef ( ) , 0 ) ;
e3 - > decRef ( ) ;
2013-01-24 10:58:12 +00:00
}
2013-01-24 20:39:04 +00:00
void BaseMindMapEntityintegration : : test_MemMapreadEntity_noloc ( )
{
MemEntity * tlve = new MemEntity ( " 0 " , 0 ) ;
tlve - > m_contains = new LocatedEntitySet ;
m_mind - > m_map . m_entities [ 0 ] = tlve ;
MemEntity * e2 = new MemEntity ( " 2 " , 2 ) ;
e2 - > m_contains = new LocatedEntitySet ;
e2 - > m_location . m_loc = tlve ;
tlve - > m_contains - > insert ( e2 ) ;
m_mind - > m_map . m_entities [ 2 ] = e2 ;
MemEntity * e3 = new MemEntity ( " 3 " , 3 ) ;
m_mind - > m_map . m_entities [ 3 ] = e3 ;
ASSERT_EQUAL ( m_mind - > m_map . m_entities . size ( ) , 4u ) ;
ASSERT_NULL ( e3 - > m_location . m_loc ) ;
Anonymous data ;
data - > setLoc ( tlve - > getId ( ) ) ;
2013-01-24 20:53:48 +00:00
// Read in entity data the sets the LOC of e3 to tlve
2016-06-09 22:40:05 +02:00
m_mind - > m_map . readEntity ( e3 , data , 0 ) ;
2013-01-24 20:39:04 +00:00
ASSERT_EQUAL ( e3 - > m_location . m_loc , tlve )
ASSERT_TRUE ( tlve - > m_contains - > find ( e3 ) ! = tlve - > m_contains - > end ( ) ) ;
}
void BaseMindMapEntityintegration : : test_MemMapreadEntity_changeloc ( )
{
MemEntity * tlve = new MemEntity ( " 0 " , 0 ) ;
tlve - > m_contains = new LocatedEntitySet ;
m_mind - > m_map . m_entities [ 0 ] = tlve ;
MemEntity * e2 = new MemEntity ( " 2 " , 2 ) ;
e2 - > m_contains = new LocatedEntitySet ;
e2 - > m_location . m_loc = tlve ;
tlve - > m_contains - > insert ( e2 ) ;
m_mind - > m_map . m_entities [ 2 ] = e2 ;
MemEntity * e3 = new MemEntity ( " 3 " , 3 ) ;
e3 - > m_contains = new LocatedEntitySet ;
e3 - > m_location . m_loc = e2 ;
e2 - > m_contains - > insert ( e3 ) ;
m_mind - > m_map . m_entities [ 3 ] = e3 ;
ASSERT_EQUAL ( m_mind - > m_map . m_entities . size ( ) , 4u ) ;
Anonymous data ;
data - > setLoc ( tlve - > getId ( ) ) ;
2013-01-24 20:53:48 +00:00
// Read in entity data that changes the LOC of e3 from e2 to TLVE
2016-06-09 22:40:05 +02:00
m_mind - > m_map . readEntity ( e3 , data , 0 ) ;
2013-01-24 20:39:04 +00:00
ASSERT_EQUAL ( e3 - > m_location . m_loc , tlve )
ASSERT_TRUE ( e2 - > m_contains - > find ( e3 ) = = e2 - > m_contains - > end ( ) ) ;
ASSERT_TRUE ( tlve - > m_contains - > find ( e3 ) ! = tlve - > m_contains - > end ( ) ) ;
}
2013-06-03 22:08:15 +02:00
void BaseMindMapEntityintegration : : test_MemMap_updateAdd_location_properties_have_effect ( )
2013-06-02 20:14:46 +02:00
{
MemEntity * tlve = new MemEntity ( " 0 " , 0 ) ;
Location location ( tlve ) ;
2013-06-03 22:08:15 +02:00
{
Atlas : : Objects : : Entity : : Anonymous args ;
location . addToEntity ( args ) ;
args - > setAttr ( " id " , " 0 " ) ;
m_mind - > m_map . updateAdd ( args , 1.0f ) ;
}
2013-06-02 20:14:46 +02:00
MemEntity * ent = m_mind - > m_map . get ( " 0 " ) ;
ASSERT_EQUAL ( " 0 " , ent - > getId ( ) ) ;
2013-06-03 22:08:15 +02:00
ASSERT_TRUE ( ent - > m_location . isSolid ( ) ) ;
ASSERT_TRUE ( ent - > m_location . isSimple ( ) ) ;
BBox bbox2 ( WFMath : : Point < 3 > ( 10 , 20 , 30 ) , WFMath : : Point < 3 > ( 40 , 50 , 60 ) ) ;
location . setBBox ( bbox2 ) ;
{
Atlas : : Objects : : Entity : : Anonymous args ;
location . addToEntity ( args ) ;
args - > setAttr ( " id " , " 0 " ) ;
args - > setAttr ( " solid " , 0 ) ;
args - > setAttr ( " simple " , 0 ) ;
m_mind - > m_map . updateAdd ( args , 2.0f ) ;
}
ent = m_mind - > m_map . get ( " 0 " ) ;
ASSERT_TRUE ( ! ent - > m_location . isSolid ( ) ) ;
ASSERT_TRUE ( ! ent - > m_location . isSimple ( ) ) ;
2013-06-02 20:14:46 +02:00
}
2013-01-24 20:53:48 +00:00
void BaseMindMapEntityintegration : : test_MemMapcheck ( )
{
MemEntity * tlve = new MemEntity ( " 0 " , 0 ) ;
2013-01-29 23:02:53 +00:00
tlve - > setType ( MemMap : : m_entity_type ) ;
2013-01-24 20:53:48 +00:00
tlve - > m_contains = new LocatedEntitySet ;
m_mind - > m_map . m_entities [ 0 ] = tlve ;
MemEntity * e2 = new MemEntity ( " 2 " , 2 ) ;
2013-01-29 23:02:53 +00:00
e2 - > setType ( MemMap : : m_entity_type ) ;
2013-01-24 20:53:48 +00:00
e2 - > m_contains = new LocatedEntitySet ;
e2 - > m_location . m_loc = tlve ;
tlve - > m_contains - > insert ( e2 ) ;
m_mind - > m_map . m_entities [ 2 ] = e2 ;
MemEntity * e3 = new MemEntity ( " 3 " , 3 ) ;
2013-01-29 23:02:53 +00:00
e3 - > setType ( MemMap : : m_entity_type ) ;
2013-01-24 20:53:48 +00:00
e3 - > m_contains = new LocatedEntitySet ;
e3 - > m_location . m_loc = e2 ;
e2 - > m_contains - > insert ( e3 ) ;
m_mind - > m_map . m_entities [ 3 ] = e3 ;
ASSERT_EQUAL ( m_mind - > m_map . m_entities . size ( ) , 4u ) ;
m_mind - > m_map . m_checkIterator = m_mind - > m_map . m_entities . find ( 3 ) ;
e3 - > setVisible ( false ) ;
e3 - > incRef ( ) ;
double time = e3 - > lastSeen ( ) + 900 ;
// We have set up e3 so it is due to be purged from memory.
m_mind - > m_map . check ( time ) ;
2016-06-09 22:40:05 +02:00
//TODO: Enable this check again, as we've disabled removal of entities from MemMap since there are issues
2013-01-24 20:53:48 +00:00
// Check it has been removed
2016-06-09 22:40:05 +02:00
//ASSERT_TRUE(e2->m_contains->find(e3) == e2->m_contains->end());
//ASSERT_TRUE(tlve->m_contains->find(e3) == tlve->m_contains->end());
2013-01-24 20:53:48 +00:00
2016-06-09 22:40:05 +02:00
//TODO: Enable this check again, as we've disabled removal of entities from MemMap since there are issues
2013-01-24 20:53:48 +00:00
// Check the reference we have is the only one remaining
2016-06-09 22:40:05 +02:00
//ASSERT_NULL(e3->m_location.m_loc)
2015-05-02 00:55:36 +02:00
//TODO: Enable this check again; it's disabled since we've disabled ref decrements in MemMap, since the knowledge code doesn't handle entity references correctly.
//ASSERT_EQUAL(e3->checkRef(), 0);
2013-01-24 20:53:48 +00:00
e3 - > decRef ( ) ;
}
2013-01-24 10:58:12 +00:00
int main ( )
{
BaseMindMapEntityintegration t ;
return t . run ( ) ;
}
// stubs
# include "rulesets/Script.h"
# include "common/Inheritance.h"
# include "common/log.h"
# include "common/TypeNode.h"
2015-05-23 16:47:45 +02:00
# include "stubs/common/stubCustom.h"
2016-09-02 23:40:19 +02:00
# include "stubs/rulesets/stubDensityProperty.h"
2013-01-24 10:58:12 +00:00
2018-02-26 12:05:10 +01:00
# define STUB_LocatedEntity_LocatedEntity_DTOR
2013-01-24 20:19:54 +00:00
// Deletions and reference count decrements are required to ensure map
// memory management works correctly.
2013-01-24 10:58:12 +00:00
LocatedEntity : : ~ LocatedEntity ( )
{
2013-01-24 20:19:54 +00:00
if ( m_location . m_loc ! = 0 ) {
m_location . m_loc - > decRef ( ) ;
}
delete m_contains ;
2013-01-24 10:58:12 +00:00
}
2018-02-26 12:05:10 +01:00
# define STUB_LocatedEntity_makeContainer
2013-01-24 10:58:12 +00:00
void LocatedEntity : : makeContainer ( )
{
if ( m_contains = = 0 ) {
m_contains = new LocatedEntitySet ;
}
}
2018-02-26 12:05:10 +01:00
# define STUB_LocatedEntity_merge
2013-01-24 10:58:12 +00:00
void LocatedEntity : : merge ( const Atlas : : Message : : MapType & ent )
{
2013-06-03 22:08:15 +02:00
for ( auto I : ent ) {
const std : : string & key = I . first ;
setAttr ( key , I . second ) ;
}
2013-01-24 10:58:12 +00:00
}
2018-02-26 12:05:10 +01:00
# define STUB_LocatedEntity_setType
2015-04-09 14:50:45 +02:00
void LocatedEntity : : setType ( const TypeNode * t ) {
m_type = t ;
}
2018-02-26 12:05:10 +01:00
# include "stubs/rulesets/stubLocatedEntity.h"
2015-05-28 22:05:09 +02:00
2013-01-24 10:58:12 +00:00
Router : : Router ( const std : : string & id , long intId ) : m_id ( id ) , m_intId ( intId )
{
}
Router : : ~ Router ( )
{
}
void Router : : addToMessage ( Atlas : : Message : : MapType & omap ) const
{
}
void Router : : addToEntity ( const Atlas : : Objects : : Entity : : RootEntity & ent ) const
{
}
2018-04-25 20:09:14 +02:00
# include "stubs/common/stubInheritance.h"
2013-01-24 10:58:12 +00:00
bool Script : : operation ( const std : : string & opname ,
const Atlas : : Objects : : Operation : : RootOperation & op ,
OpVector & res )
{
return false ;
}
void Script : : hook ( const std : : string & function , LocatedEntity * entity )
{
}
DateTime : : DateTime ( int t )
{
}
void DateTime : : update ( int t )
{
}
void WorldTime : : initTimeInfo ( )
{
}
TypeNode : : TypeNode ( const std : : string & name ) : m_name ( name ) , m_parent ( 0 )
{
}
void log ( LogLevel lvl , const std : : string & msg )
{
}
long integerId ( const std : : string & id )
{
long intId = strtol ( id . c_str ( ) , 0 , 10 ) ;
if ( intId = = 0 & & id ! = " 0 " ) {
intId = - 1L ;
}
return intId ;
}
static inline WFMath : : CoordType sqr ( WFMath : : CoordType x )
{
return x * x ;
}
WFMath : : CoordType squareDistance ( const Point3D & u , const Point3D & v )
{
return ( sqr ( u . x ( ) - v . x ( ) ) + sqr ( u . y ( ) - v . y ( ) ) + sqr ( u . z ( ) - v . z ( ) ) ) ;
}
2013-06-02 20:14:46 +02:00
void addToEntity ( const Point3D & p , std : : vector < double > & vd )
{
}
void addToEntity ( const Vector3D & v , std : : vector < double > & vd )
{
}
template < >
int fromStdVector < double > ( Point3D & p , const std : : vector < double > & vf )
{
if ( vf . size ( ) ! = 3 ) {
return - 1 ;
}
p [ 0 ] = vf [ 0 ] ;
p [ 1 ] = vf [ 1 ] ;
p [ 2 ] = vf [ 2 ] ;
p . setValid ( ) ;
return 0 ;
}
template < >
int fromStdVector < double > ( Vector3D & v , const std : : vector < double > & vf )
{
if ( vf . size ( ) ! = 3 ) {
return - 1 ;
}
v [ 0 ] = vf [ 0 ] ;
v [ 1 ] = vf [ 1 ] ;
v [ 2 ] = vf [ 2 ] ;
v . setValid ( ) ;
return 0 ;
}
WFMath : : CoordType sqrMag ( const Point3D & p ) {
return 0 ;
}