mirror of
https://github.com/qgis/QGIS.git
synced 2025-06-19 00:02:48 -04:00
Add some unit tests
This commit is contained in:
parent
b74a0efa34
commit
f60da58256
@ -30,8 +30,17 @@ class QgsComposerItem: QgsComposerObject, QGraphicsRectItem
|
||||
#include <qgscomposerpolygon.h>
|
||||
#include <qgscomposerpolyline.h>
|
||||
#include <qgscomposertexttable.h>
|
||||
#include <qgslayoutitemshape.h>
|
||||
#include <qgslayoutitempage.h>
|
||||
#include "qgslayoutitemgroup.h"
|
||||
#include "qgslayoutitemmap.h"
|
||||
#include "qgslayoutitempicture.h"
|
||||
#include "qgslayoutitemlabel.h"
|
||||
#include "qgslayoutitemlegend.h"
|
||||
#include "qgslayoutitempolygon.h"
|
||||
#include "qgslayoutitempolyline.h"
|
||||
#include "qgslayoutitemscalebar.h"
|
||||
#include "qgslayoutframe.h"
|
||||
#include "qgslayoutitemshape.h"
|
||||
#include "qgslayoutitempage.h"
|
||||
%End
|
||||
%ConvertToSubClassCode
|
||||
// the conversions have to be static, because they're using multiple inheritance
|
||||
@ -102,9 +111,49 @@ class QgsComposerItem: QgsComposerObject, QGraphicsRectItem
|
||||
{
|
||||
// really, these *should* use the constants from QgsLayoutItemRegistry, but sip doesn't like that!
|
||||
case QGraphicsItem::UserType + 101:
|
||||
sipType = sipType_QgsLayoutItemGroup;
|
||||
*sipCppRet = static_cast<QgsLayoutItemGroup *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 102:
|
||||
sipType = sipType_QgsLayoutItemPage;
|
||||
*sipCppRet = static_cast<QgsLayoutItemPage *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 103:
|
||||
sipType = sipType_QgsLayoutItemMap;
|
||||
*sipCppRet = static_cast<QgsLayoutItemMap *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 104:
|
||||
sipType = sipType_QgsLayoutItemPicture;
|
||||
*sipCppRet = static_cast<QgsLayoutItemPicture *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 105:
|
||||
sipType = sipType_QgsLayoutItemLabel;
|
||||
*sipCppRet = static_cast<QgsLayoutItemLabel *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 106:
|
||||
sipType = sipType_QgsLayoutItemLegend;
|
||||
*sipCppRet = static_cast<QgsLayoutItemLegend *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 107:
|
||||
sipType = sipType_QgsLayoutItemShape;
|
||||
*sipCppRet = static_cast<QgsLayoutItemShape *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 108:
|
||||
sipType = sipType_QgsLayoutItemPolygon;
|
||||
*sipCppRet = static_cast<QgsLayoutItemPolygon *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 109:
|
||||
sipType = sipType_QgsLayoutItemPolyline;
|
||||
*sipCppRet = static_cast<QgsLayoutItemPolyline *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 110:
|
||||
sipType = sipType_QgsLayoutItemScaleBar;
|
||||
*sipCppRet = static_cast<QgsLayoutItemScaleBar *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 111:
|
||||
sipType = sipType_QgsLayoutFrame;
|
||||
*sipCppRet = static_cast<QgsLayoutFrame *>( sipCpp );
|
||||
break;
|
||||
default:
|
||||
sipType = 0;
|
||||
}
|
||||
|
@ -424,7 +424,7 @@ class QgsLayout : QGraphicsScene, QgsExpressionContextGenerator, QgsLayoutUndoOb
|
||||
:rtype: bool
|
||||
%End
|
||||
|
||||
QVector< QgsLayoutItem * > addItemsFromXml( const QDomElement &parentElement, const QDomDocument &document,
|
||||
QList< QgsLayoutItem * > addItemsFromXml( const QDomElement &parentElement, const QDomDocument &document,
|
||||
const QgsReadWriteContext &context,
|
||||
QPointF *position = 0, bool pasteInPlace = false );
|
||||
%Docstring
|
||||
|
@ -18,8 +18,17 @@ class QgsLayoutItem : QgsLayoutObject, QGraphicsRectItem, QgsLayoutUndoObjectInt
|
||||
|
||||
%TypeHeaderCode
|
||||
#include "qgslayoutitem.h"
|
||||
#include <qgslayoutitemshape.h>
|
||||
#include <qgslayoutitempage.h>
|
||||
#include "qgslayoutitemgroup.h"
|
||||
#include "qgslayoutitemmap.h"
|
||||
#include "qgslayoutitempicture.h"
|
||||
#include "qgslayoutitemlabel.h"
|
||||
#include "qgslayoutitemlegend.h"
|
||||
#include "qgslayoutitempolygon.h"
|
||||
#include "qgslayoutitempolyline.h"
|
||||
#include "qgslayoutitemscalebar.h"
|
||||
#include "qgslayoutframe.h"
|
||||
#include "qgslayoutitemshape.h"
|
||||
#include "qgslayoutitempage.h"
|
||||
%End
|
||||
%ConvertToSubClassCode
|
||||
// the conversions have to be static, because they're using multiple inheritance
|
||||
@ -28,9 +37,49 @@ class QgsLayoutItem : QgsLayoutObject, QGraphicsRectItem, QgsLayoutUndoObjectInt
|
||||
{
|
||||
// really, these *should* use the constants from QgsLayoutItemRegistry, but sip doesn't like that!
|
||||
case QGraphicsItem::UserType + 101:
|
||||
sipType = sipType_QgsLayoutItemGroup;
|
||||
*sipCppRet = static_cast<QgsLayoutItemGroup *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 102:
|
||||
sipType = sipType_QgsLayoutItemPage;
|
||||
*sipCppRet = static_cast<QgsLayoutItemPage *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 103:
|
||||
sipType = sipType_QgsLayoutItemMap;
|
||||
*sipCppRet = static_cast<QgsLayoutItemMap *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 104:
|
||||
sipType = sipType_QgsLayoutItemPicture;
|
||||
*sipCppRet = static_cast<QgsLayoutItemPicture *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 105:
|
||||
sipType = sipType_QgsLayoutItemLabel;
|
||||
*sipCppRet = static_cast<QgsLayoutItemLabel *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 106:
|
||||
sipType = sipType_QgsLayoutItemLegend;
|
||||
*sipCppRet = static_cast<QgsLayoutItemLegend *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 107:
|
||||
sipType = sipType_QgsLayoutItemShape;
|
||||
*sipCppRet = static_cast<QgsLayoutItemShape *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 108:
|
||||
sipType = sipType_QgsLayoutItemPolygon;
|
||||
*sipCppRet = static_cast<QgsLayoutItemPolygon *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 109:
|
||||
sipType = sipType_QgsLayoutItemPolyline;
|
||||
*sipCppRet = static_cast<QgsLayoutItemPolyline *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 110:
|
||||
sipType = sipType_QgsLayoutItemScaleBar;
|
||||
*sipCppRet = static_cast<QgsLayoutItemScaleBar *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 111:
|
||||
sipType = sipType_QgsLayoutFrame;
|
||||
*sipCppRet = static_cast<QgsLayoutFrame *>( sipCpp );
|
||||
break;
|
||||
default:
|
||||
sipType = 0;
|
||||
}
|
||||
|
@ -54,8 +54,17 @@ class CORE_EXPORT QgsComposerItem: public QgsComposerObject, public QGraphicsRec
|
||||
#include <qgscomposerpolygon.h>
|
||||
#include <qgscomposerpolyline.h>
|
||||
#include <qgscomposertexttable.h>
|
||||
#include <qgslayoutitemshape.h>
|
||||
#include <qgslayoutitempage.h>
|
||||
#include "qgslayoutitemgroup.h"
|
||||
#include "qgslayoutitemmap.h"
|
||||
#include "qgslayoutitempicture.h"
|
||||
#include "qgslayoutitemlabel.h"
|
||||
#include "qgslayoutitemlegend.h"
|
||||
#include "qgslayoutitempolygon.h"
|
||||
#include "qgslayoutitempolyline.h"
|
||||
#include "qgslayoutitemscalebar.h"
|
||||
#include "qgslayoutframe.h"
|
||||
#include "qgslayoutitemshape.h"
|
||||
#include "qgslayoutitempage.h"
|
||||
#endif
|
||||
|
||||
|
||||
@ -129,9 +138,49 @@ class CORE_EXPORT QgsComposerItem: public QgsComposerObject, public QGraphicsRec
|
||||
{
|
||||
// really, these *should* use the constants from QgsLayoutItemRegistry, but sip doesn't like that!
|
||||
case QGraphicsItem::UserType + 101:
|
||||
sipType = sipType_QgsLayoutItemGroup;
|
||||
*sipCppRet = static_cast<QgsLayoutItemGroup *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 102:
|
||||
sipType = sipType_QgsLayoutItemPage;
|
||||
*sipCppRet = static_cast<QgsLayoutItemPage *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 103:
|
||||
sipType = sipType_QgsLayoutItemMap;
|
||||
*sipCppRet = static_cast<QgsLayoutItemMap *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 104:
|
||||
sipType = sipType_QgsLayoutItemPicture;
|
||||
*sipCppRet = static_cast<QgsLayoutItemPicture *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 105:
|
||||
sipType = sipType_QgsLayoutItemLabel;
|
||||
*sipCppRet = static_cast<QgsLayoutItemLabel *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 106:
|
||||
sipType = sipType_QgsLayoutItemLegend;
|
||||
*sipCppRet = static_cast<QgsLayoutItemLegend *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 107:
|
||||
sipType = sipType_QgsLayoutItemShape;
|
||||
*sipCppRet = static_cast<QgsLayoutItemShape *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 108:
|
||||
sipType = sipType_QgsLayoutItemPolygon;
|
||||
*sipCppRet = static_cast<QgsLayoutItemPolygon *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 109:
|
||||
sipType = sipType_QgsLayoutItemPolyline;
|
||||
*sipCppRet = static_cast<QgsLayoutItemPolyline *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 110:
|
||||
sipType = sipType_QgsLayoutItemScaleBar;
|
||||
*sipCppRet = static_cast<QgsLayoutItemScaleBar *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 111:
|
||||
sipType = sipType_QgsLayoutFrame;
|
||||
*sipCppRet = static_cast<QgsLayoutFrame *>( sipCpp );
|
||||
break;
|
||||
default:
|
||||
sipType = 0;
|
||||
}
|
||||
|
@ -716,11 +716,11 @@ bool QgsLayout::readXml( const QDomElement &layoutElement, const QDomDocument &d
|
||||
return true;
|
||||
}
|
||||
|
||||
QVector< QgsLayoutItem * > QgsLayout::addItemsFromXml( const QDomElement &parentElement, const QDomDocument &document, const QgsReadWriteContext &context, QPointF *position, bool pasteInPlace )
|
||||
QList< QgsLayoutItem * > QgsLayout::addItemsFromXml( const QDomElement &parentElement, const QDomDocument &document, const QgsReadWriteContext &context, QPointF *position, bool pasteInPlace )
|
||||
{
|
||||
std::unique_ptr< QPointF > pasteInPlacePt;
|
||||
QVector< QgsLayoutItem * > newItems;
|
||||
QVector< QgsLayoutMultiFrame * > newMultiFrames;
|
||||
QList< QgsLayoutItem * > newItems;
|
||||
QList< QgsLayoutMultiFrame * > newMultiFrames;
|
||||
|
||||
//if we are adding items to a layout which already contains items, we need to make sure
|
||||
//these items are placed at the top of the layout and that zValues are not duplicated
|
||||
|
@ -482,7 +482,7 @@ class CORE_EXPORT QgsLayout : public QGraphicsScene, public QgsExpressionContext
|
||||
*
|
||||
* A list of the newly added items is returned.
|
||||
*/
|
||||
QVector< QgsLayoutItem * > addItemsFromXml( const QDomElement &parentElement, const QDomDocument &document,
|
||||
QList< QgsLayoutItem * > addItemsFromXml( const QDomElement &parentElement, const QDomDocument &document,
|
||||
const QgsReadWriteContext &context,
|
||||
QPointF *position = nullptr, bool pasteInPlace = false );
|
||||
|
||||
|
@ -41,8 +41,17 @@ class QgsLayoutEffect;
|
||||
class CORE_EXPORT QgsLayoutItem : public QgsLayoutObject, public QGraphicsRectItem, public QgsLayoutUndoObjectInterface
|
||||
{
|
||||
#ifdef SIP_RUN
|
||||
#include <qgslayoutitemshape.h>
|
||||
#include <qgslayoutitempage.h>
|
||||
#include "qgslayoutitemgroup.h"
|
||||
#include "qgslayoutitemmap.h"
|
||||
#include "qgslayoutitempicture.h"
|
||||
#include "qgslayoutitemlabel.h"
|
||||
#include "qgslayoutitemlegend.h"
|
||||
#include "qgslayoutitempolygon.h"
|
||||
#include "qgslayoutitempolyline.h"
|
||||
#include "qgslayoutitemscalebar.h"
|
||||
#include "qgslayoutframe.h"
|
||||
#include "qgslayoutitemshape.h"
|
||||
#include "qgslayoutitempage.h"
|
||||
#endif
|
||||
|
||||
|
||||
@ -54,9 +63,49 @@ class CORE_EXPORT QgsLayoutItem : public QgsLayoutObject, public QGraphicsRectIt
|
||||
{
|
||||
// really, these *should* use the constants from QgsLayoutItemRegistry, but sip doesn't like that!
|
||||
case QGraphicsItem::UserType + 101:
|
||||
sipType = sipType_QgsLayoutItemGroup;
|
||||
*sipCppRet = static_cast<QgsLayoutItemGroup *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 102:
|
||||
sipType = sipType_QgsLayoutItemPage;
|
||||
*sipCppRet = static_cast<QgsLayoutItemPage *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 103:
|
||||
sipType = sipType_QgsLayoutItemMap;
|
||||
*sipCppRet = static_cast<QgsLayoutItemMap *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 104:
|
||||
sipType = sipType_QgsLayoutItemPicture;
|
||||
*sipCppRet = static_cast<QgsLayoutItemPicture *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 105:
|
||||
sipType = sipType_QgsLayoutItemLabel;
|
||||
*sipCppRet = static_cast<QgsLayoutItemLabel *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 106:
|
||||
sipType = sipType_QgsLayoutItemLegend;
|
||||
*sipCppRet = static_cast<QgsLayoutItemLegend *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 107:
|
||||
sipType = sipType_QgsLayoutItemShape;
|
||||
*sipCppRet = static_cast<QgsLayoutItemShape *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 108:
|
||||
sipType = sipType_QgsLayoutItemPolygon;
|
||||
*sipCppRet = static_cast<QgsLayoutItemPolygon *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 109:
|
||||
sipType = sipType_QgsLayoutItemPolyline;
|
||||
*sipCppRet = static_cast<QgsLayoutItemPolyline *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 110:
|
||||
sipType = sipType_QgsLayoutItemScaleBar;
|
||||
*sipCppRet = static_cast<QgsLayoutItemScaleBar *>( sipCpp );
|
||||
break;
|
||||
case QGraphicsItem::UserType + 111:
|
||||
sipType = sipType_QgsLayoutFrame;
|
||||
*sipCppRet = static_cast<QgsLayoutFrame *>( sipCpp );
|
||||
break;
|
||||
default:
|
||||
sipType = 0;
|
||||
}
|
||||
|
@ -21,6 +21,7 @@ from qgis.core import (QgsUnitTypes,
|
||||
QgsLayoutGuide,
|
||||
QgsLayoutObject,
|
||||
QgsProject,
|
||||
QgsLayoutItemGroup,
|
||||
QgsProperty,
|
||||
QgsLayoutPageCollection,
|
||||
QgsLayoutMeasurement,
|
||||
@ -62,6 +63,14 @@ class TestQgsLayout(unittest.TestCase):
|
||||
snapper = l.snapper()
|
||||
snapper.setSnapTolerance(7)
|
||||
|
||||
# add some items
|
||||
item1 = QgsLayoutItemMap(l)
|
||||
item1.setId('xxyyxx')
|
||||
l.addItem(item1)
|
||||
item2 = QgsLayoutItemMap(l)
|
||||
item2.setId('zzyyzz')
|
||||
l.addItem(item2)
|
||||
|
||||
doc = QDomDocument("testdoc")
|
||||
elem = l.writeXml(doc, QgsReadWriteContext())
|
||||
|
||||
@ -81,6 +90,64 @@ class TestQgsLayout(unittest.TestCase):
|
||||
self.assertEqual(l2.guides().guidesOnPage(0)[0].position().units(), QgsUnitTypes.LayoutCentimeters)
|
||||
self.assertEqual(l2.snapper().snapTolerance(), 7)
|
||||
|
||||
# check restored items
|
||||
new_item1 = l2.itemByUuid(item1.uuid())
|
||||
self.assertTrue(new_item1)
|
||||
self.assertEqual(new_item1.id(), 'xxyyxx')
|
||||
new_item2 = l2.itemByUuid(item2.uuid())
|
||||
self.assertTrue(new_item2)
|
||||
self.assertEqual(new_item2.id(), 'zzyyzz')
|
||||
|
||||
def testAddItemsFromXml(self):
|
||||
p = QgsProject()
|
||||
l = QgsLayout(p)
|
||||
|
||||
# add some items
|
||||
item1 = QgsLayoutItemMap(l)
|
||||
item1.setId('xxyyxx')
|
||||
l.addItem(item1)
|
||||
item2 = QgsLayoutItemMap(l)
|
||||
item2.setId('zzyyzz')
|
||||
l.addItem(item2)
|
||||
|
||||
doc = QDomDocument("testdoc")
|
||||
# store in xml
|
||||
elem = l.writeXml(doc, QgsReadWriteContext())
|
||||
|
||||
l2 = QgsLayout(p)
|
||||
new_items = l2.addItemsFromXml(elem, doc, QgsReadWriteContext())
|
||||
self.assertEqual(len(new_items), 2)
|
||||
items = l2.items()
|
||||
self.assertTrue([i for i in items if i.id() == 'xxyyxx'])
|
||||
self.assertTrue([i for i in items if i.id() == 'zzyyzz'])
|
||||
self.assertTrue(new_items[0] in l2.items())
|
||||
self.assertTrue(new_items[1] in l2.items())
|
||||
|
||||
# test with a group
|
||||
group = QgsLayoutItemGroup(l)
|
||||
group.addItem(item1)
|
||||
group.addItem(item2)
|
||||
l.addLayoutItem(group)
|
||||
elem = l.writeXml(doc, QgsReadWriteContext())
|
||||
|
||||
l3 = QgsLayout(p)
|
||||
new_items = l3.addItemsFromXml(elem, doc, QgsReadWriteContext())
|
||||
self.assertEqual(len(new_items), 3)
|
||||
items = l3.items()
|
||||
self.assertTrue([i for i in items if i.id() == 'xxyyxx'])
|
||||
self.assertTrue([i for i in items if i.id() == 'zzyyzz'])
|
||||
self.assertTrue(new_items[0] in l3.items())
|
||||
self.assertTrue(new_items[1] in l3.items())
|
||||
self.assertTrue(new_items[2] in l3.items())
|
||||
|
||||
# f*** you sip, I'll just manually cast
|
||||
new_group = sip.cast(l3.itemByUuid(group.uuid()), QgsLayoutItemGroup)
|
||||
self.assertIsNotNone(new_group)
|
||||
other_items = [i for i in new_items if i.type() != new_group.type()]
|
||||
self.assertCountEqual(new_group.items(), other_items)
|
||||
|
||||
#TODO - test restoring multiframe, test item positions
|
||||
|
||||
def testSelectedItems(self):
|
||||
p = QgsProject()
|
||||
l = QgsLayout(p)
|
||||
|
Loading…
x
Reference in New Issue
Block a user