src/lib/VDXParser.cpp                         |    2 -
 src/lib/VSDCollector.h                        |    2 -
 src/lib/VSDContentCollector.cpp               |   17 +++++++------
 src/lib/VSDContentCollector.h                 |    3 +-
 src/lib/VSDDocumentStructure.h                |    2 -
 src/lib/VSDFieldList.cpp                      |   34 ++++++++++++++++----------
 src/lib/VSDFieldList.h                        |    6 ++--
 src/lib/VSDParser.cpp                         |   15 ++++++-----
 src/lib/VSDStylesCollector.cpp                |    3 +-
 src/lib/VSDStylesCollector.h                  |    2 -
 src/lib/VSDXParser.cpp                        |    2 -
 src/lib/tokens.txt                            |   11 ++++++++
 src/test/data/tdf154379-DrawingUnits-type.vsd |binary
 src/test/importtest.cpp                       |   16 +++++++++++-
 14 files changed, 78 insertions(+), 37 deletions(-)

New commits:
commit b86ed4fb2d9c2bfe136972e046a26644938de4d8
Author:     Bartosz Kosiorek <[email protected]>
AuthorDate: Mon Oct 14 20:38:16 2024 +0200
Commit:     Bartosz Kosiorek <[email protected]>
CommitDate: Wed Oct 16 19:08:46 2024 +0200

    tdf#154379 Add support to DrawingUnits types
    
    There is number type DrawingUnits type,
    where type unit are taken form the DrawingScale cell of the page or
    master containing the cell.
    
    Thit commit implement such behaviour and cover it with tests
    
    More information:
    
https://learn.microsoft.com/en-us/office/vba/visio/concepts/about-units-of-measure-visio#default-units-of-measure
    
    Change-Id: Ib581e214c80e4f61195860dac83ae763c6398653
    Reviewed-on: https://gerrit.libreoffice.org/c/libvisio/+/174909
    Tested-by: Bartosz Kosiorek <[email protected]>
    Reviewed-by: Bartosz Kosiorek <[email protected]>

diff --git a/src/lib/VDXParser.cpp b/src/lib/VDXParser.cpp
index a5c204d..e15e365 100644
--- a/src/lib/VDXParser.cpp
+++ b/src/lib/VDXParser.cpp
@@ -788,7 +788,7 @@ void libvisio::VDXParser::readPageProps(xmlTextReaderPtr 
reader)
   else if (m_isPageStarted)
   {
     double scale = drawingScale > 0 || drawingScale < 0 ? 
pageScale/drawingScale : 1.0;
-    m_collector->collectPageProps(0, level, pageWidth, pageHeight, 
shadowOffsetX, shadowOffsetY, scale);
+    m_collector->collectPageProps(0, level, pageWidth, pageHeight, 
shadowOffsetX, shadowOffsetY, scale, 0);
   }
 }
 
diff --git a/src/lib/VSDCollector.h b/src/lib/VSDCollector.h
index 7b06712..5d4b62f 100644
--- a/src/lib/VSDCollector.h
+++ b/src/lib/VSDCollector.h
@@ -60,7 +60,7 @@ public:
   virtual void collectTxtXForm(unsigned level, const XForm &txtxform) = 0;
   virtual void collectShapesOrder(unsigned id, unsigned level, const 
std::vector<unsigned> &shapeIds) = 0;
   virtual void collectForeignDataType(unsigned level, unsigned foreignType, 
unsigned foreignFormat, double offsetX, double offsetY, double width, double 
height) = 0;
-  virtual void collectPageProps(unsigned id, unsigned level, double pageWidth, 
double pageHeight, double shadowOffsetX, double shadowOffsetY, double scale) = 
0;
+  virtual void collectPageProps(unsigned id, unsigned level, double pageWidth, 
double pageHeight, double shadowOffsetX, double shadowOffsetY, double scale, 
unsigned char drawingScaleUnit) = 0;
   virtual void collectPage(unsigned id, unsigned level, unsigned 
backgroundPageID, bool isBackgroundPage, const VSDName &pageName) = 0;
   virtual void collectShape(unsigned id, unsigned level, unsigned parent, 
unsigned masterPage, unsigned masterShape, unsigned lineStyle, unsigned 
fillStyle, unsigned textStyle) = 0;
   virtual void collectSplineStart(unsigned id, unsigned level, double x, 
double y, double secondKnot, double firstKnot, double lastKnot, unsigned 
degree) = 0;
diff --git a/src/lib/VSDContentCollector.cpp b/src/lib/VSDContentCollector.cpp
index 2456ce6..90ae6df 100644
--- a/src/lib/VSDContentCollector.cpp
+++ b/src/lib/VSDContentCollector.cpp
@@ -124,7 +124,8 @@ libvisio::VSDContentCollector::VSDContentCollector(
 ) :
   m_painter(painter), m_isPageStarted(false), m_pageWidth(0.0), 
m_pageHeight(0.0),
   m_shadowOffsetX(0.0), m_shadowOffsetY(0.0),
-  m_scale(1.0), m_x(0.0), m_y(0.0), m_originalX(0.0), m_originalY(0.0), 
m_xform(), m_txtxform(), m_misc(),
+  m_scale(1.0), m_defaultDrawingUnit(0),
+  m_x(0.0), m_y(0.0), m_originalX(0.0), m_originalY(0.0), m_xform(), 
m_txtxform(), m_misc(),
   m_currentFillGeometry(), m_currentLineGeometry(), 
m_groupXForms(groupXFormsSequence.empty() ? nullptr : &groupXFormsSequence[0]),
   m_currentForeignData(), m_currentOLEData(), m_currentForeignProps(), 
m_currentShapeId(0), m_foreignType((unsigned)-1),
   m_foreignFormat(0), m_foreignOffsetX(0.0), m_foreignOffsetY(0.0), 
m_foreignWidth(0.0), m_foreignHeight(0.0),
@@ -2562,7 +2563,8 @@ void 
libvisio::VSDContentCollector::collectForeignDataType(unsigned level, unsig
   m_foreignHeight = height;
 }
 
-void libvisio::VSDContentCollector::collectPageProps(unsigned /* id */, 
unsigned level, double pageWidth, double pageHeight, double shadowOffsetX, 
double shadowOffsetY, double scale)
+void libvisio::VSDContentCollector::collectPageProps(unsigned /* id */, 
unsigned level, double pageWidth, double pageHeight,
+                                                     double shadowOffsetX, 
double shadowOffsetY, double scale, unsigned char drawingScaleUnit)
 {
   _handleLevelChange(level);
   m_pageWidth = pageWidth;
@@ -2570,6 +2572,7 @@ void 
libvisio::VSDContentCollector::collectPageProps(unsigned /* id */, unsigned
   m_scale = scale;
   m_shadowOffsetX = shadowOffsetX;
   m_shadowOffsetY = shadowOffsetY;
+  m_defaultDrawingUnit = drawingScaleUnit;
 
   m_currentPage.m_pageWidth = m_scale*m_pageWidth;
   m_currentPage.m_pageHeight = m_scale*m_pageHeight;
@@ -2665,7 +2668,7 @@ void libvisio::VSDContentCollector::collectShape(unsigned 
id, unsigned level, un
     {
       VSDFieldListElement *elem = m_stencilFields.getElement(i);
       if (elem)
-        m_fields.push_back(elem->getString(m_stencilNames));
+        m_fields.push_back(elem->getString(m_stencilNames, 
m_defaultDrawingUnit));
       else
         m_fields.push_back(librevenge::RVNGString());
     }
@@ -3490,7 +3493,7 @@ void 
libvisio::VSDContentCollector::collectTextField(unsigned id, unsigned level
   if (element)
   {
     if (nameId == -2)
-      m_fields.push_back(element->getString(m_stencilNames));
+      m_fields.push_back(element->getString(m_stencilNames, 
m_defaultDrawingUnit));
     else
     {
       if (nameId >= 0)
@@ -3502,7 +3505,7 @@ void 
libvisio::VSDContentCollector::collectTextField(unsigned id, unsigned level
   else
   {
     VSDTextField tmpField(id, level, nameId, formatStringId);
-    m_fields.push_back(tmpField.getString(m_names));
+    m_fields.push_back(tmpField.getString(m_names, m_defaultDrawingUnit));
   }
 }
 
@@ -3526,13 +3529,13 @@ void 
libvisio::VSDContentCollector::collectNumericField(unsigned id, unsigned le
       if (format != VSD_FIELD_FORMAT_Unknown)
         element->setFormat(format);
 
-      m_fields.push_back(element->getString(m_names));
+      m_fields.push_back(element->getString(m_names, m_defaultDrawingUnit));
     }
   }
   else
   {
     VSDNumericField tmpField(id, level, format, cellType, number, 
formatStringId);
-    m_fields.push_back(tmpField.getString(m_names));
+    m_fields.push_back(tmpField.getString(m_names, m_defaultDrawingUnit));
   }
 }
 
diff --git a/src/lib/VSDContentCollector.h b/src/lib/VSDContentCollector.h
index 01f8598..fab81ad 100644
--- a/src/lib/VSDContentCollector.h
+++ b/src/lib/VSDContentCollector.h
@@ -77,7 +77,7 @@ public:
   void collectTxtXForm(unsigned level, const XForm &txtxform) override;
   void collectShapesOrder(unsigned id, unsigned level, const 
std::vector<unsigned> &shapeIds) override;
   void collectForeignDataType(unsigned level, unsigned foreignType, unsigned 
foreignFormat, double offsetX, double offsetY, double width, double height) 
override;
-  void collectPageProps(unsigned id, unsigned level, double pageWidth, double 
pageHeight, double shadowOffsetX, double shadowOffsetY, double scale) override;
+  void collectPageProps(unsigned id, unsigned level, double pageWidth, double 
pageHeight, double shadowOffsetX, double shadowOffsetY, double scale, unsigned 
char drawingScaleUnit) override;
   void collectPage(unsigned id, unsigned level, unsigned backgroundPageID, 
bool isBackgroundPage, const VSDName &pageName) override;
   void collectShape(unsigned id, unsigned level, unsigned parent, unsigned 
masterPage, unsigned masterShape, unsigned lineStyle, unsigned fillStyle, 
unsigned textStyle) override;
   void collectSplineStart(unsigned id, unsigned level, double x, double y, 
double secondKnot, double firstKnot, double lastKnot, unsigned degree) override;
@@ -238,6 +238,7 @@ private:
   double m_shadowOffsetX;
   double m_shadowOffsetY;
   double m_scale;
+  unsigned char m_defaultDrawingUnit;
   double m_x;
   double m_y;
   double m_originalX;
diff --git a/src/lib/VSDDocumentStructure.h b/src/lib/VSDDocumentStructure.h
index 93f5ad9..7d1cbba 100644
--- a/src/lib/VSDDocumentStructure.h
+++ b/src/lib/VSDDocumentStructure.h
@@ -150,8 +150,8 @@
 #define CELL_TYPE_Inches             65
 #define CELL_TYPE_Feet               66
 #define CELL_TYPE_FeetAndInches      67
-#define CELL_TYPE_Centimeters        69
 #define CELL_TYPE_Miles              68
+#define CELL_TYPE_Centimeters        69
 #define CELL_TYPE_Millimeters        70
 #define CELL_TYPE_Meters             71
 #define CELL_TYPE_Kilometers         72
diff --git a/src/lib/VSDFieldList.cpp b/src/lib/VSDFieldList.cpp
index f16b5f2..e261b58 100644
--- a/src/lib/VSDFieldList.cpp
+++ b/src/lib/VSDFieldList.cpp
@@ -24,7 +24,7 @@ libvisio::VSDFieldListElement *libvisio::VSDTextField::clone()
   return new VSDTextField(m_id, m_level, m_nameId, m_formatStringId);
 }
 
-librevenge::RVNGString libvisio::VSDTextField::getString(const 
std::map<unsigned, librevenge::RVNGString> &strVec)
+librevenge::RVNGString libvisio::VSDTextField::getString(const 
std::map<unsigned, librevenge::RVNGString> &strVec, unsigned /* defaultUnit */)
 {
   //TODO VSD_FIELD_FORMAT_StrNormal  37
   //TODO VSD_FIELD_FORMAT_StrLower  38
@@ -154,6 +154,10 @@ double convertNumber(const unsigned short cellType, const 
double number)
   }
 }
 
+/*
+ * More information about Visio Units:
+ * 
https://learn.microsoft.com/en-us/office/vba/visio/concepts/about-units-of-measure-visio
+*/
 const char *getUnitString(const unsigned short cellType)
 {
   switch (cellType)
@@ -218,64 +222,70 @@ const char *getUnitString(const unsigned short cellType)
   }
 }
 
-librevenge::RVNGString libvisio::VSDNumericField::getString(const 
std::map<unsigned, librevenge::RVNGString> &)
+librevenge::RVNGString libvisio::VSDNumericField::getString(const 
std::map<unsigned, librevenge::RVNGString> &, unsigned defaultDrawingUnit)
 {
   // Augmented BNF for Syntax Specifications: ABNF
   // http://www.rfc-editor.org/rfc/rfc5234.txt
   if (m_format == VSD_FIELD_FORMAT_Unknown)
     return librevenge::RVNGString();
+
+  auto cell_type = m_cell_type;
+  if ((m_cell_type == CELL_TYPE_DrawingUnits) || (m_cell_type == 
CELL_TYPE_PageUnits))
+
+    cell_type = defaultDrawingUnit;
+
   switch (m_format)
   {
   case VSD_FIELD_FORMAT_NumGenNoUnits:
   {
     // 0 Format string: 0.#### Example: 30060.9167
-    return doubleToString(convertNumber(m_cell_type, m_number), "%.4g%s", "");
+    return doubleToString(convertNumber(cell_type, m_number), "%.4g%s", "");
   }
   case VSD_FIELD_FORMAT_NumGenDefUnits:
   {
     // 1 Format string: 0.#### u Example: 30060.9167 cm
-    return doubleToString(convertNumber(m_cell_type, m_number), "%.4g%s", 
getUnitString(m_cell_type));
+    return doubleToString(convertNumber(cell_type, m_number), "%.4g%s", 
getUnitString(cell_type));
   }
   case VSD_FIELD_FORMAT_0PlNoUnits:
   {
     // 2 Format string: 0 Example: 30061
-    return doubleToString(convertNumber(m_cell_type, m_number), "%.0f%s", "");
+    return doubleToString(convertNumber(cell_type, m_number), "%.0f%s", "");
   }
   case VSD_FIELD_FORMAT_0PlDefUnits:
   {
     // 3 Format string: 0 u Example: 30061 cm
-    return doubleToString(convertNumber(m_cell_type, m_number), "%.0f%s", 
getUnitString(m_cell_type));
+    return doubleToString(convertNumber(cell_type, m_number), "%.0f%s", 
getUnitString(cell_type));
   }
   case VSD_FIELD_FORMAT_1PlNoUnits:
   {
     // 4 Format string: 0.0 Example: 30060.9
-    return doubleToString(convertNumber(m_cell_type, m_number), "%.1f%s", "");
+    return doubleToString(convertNumber(cell_type, m_number), "%.1f%s", "");
   }
   case VSD_FIELD_FORMAT_1PlDefUnits:
   {
     // 5 Format string: 0.0 u Example: 30060.9 cm
-    return doubleToString(convertNumber(m_cell_type, m_number), "%.1f%s", 
getUnitString(m_cell_type));
+    return doubleToString(convertNumber(cell_type, m_number), "%.1f%s", 
getUnitString(cell_type));
   }
   case VSD_FIELD_FORMAT_2PlNoUnits:
   {
     // 6 Format string: 0.00 Example: 30061.92
-    return doubleToString(convertNumber(m_cell_type, m_number), "%.2f%s", "");
+    return doubleToString(convertNumber(cell_type, m_number), "%.2f%s", "");
   }
   case VSD_FIELD_FORMAT_2PlDefUnits:
   {
     // 7 Format string: 0.00 u Example: 30061.92 cm
-    return doubleToString(convertNumber(m_cell_type, m_number), "%.2f%s", 
getUnitString(m_cell_type));
+    return doubleToString(convertNumber(cell_type, m_number), "%.2f%s", 
getUnitString(cell_type));
   }
 
   case VSD_FIELD_FORMAT_3PlNoUnits:
   {
     // 8 Format string: 0.000 Example: 30061.916
-    return doubleToString(convertNumber(m_cell_type, m_number), "%.3f%s", "");
+    return doubleToString(convertNumber(cell_type, m_number), "%.3f%s", "");
   }
   case VSD_FIELD_FORMAT_3PlDefUnits:
   {
     // 9 Format string: 0.000 u Example: 30061.916 cm
-    return doubleToString(convertNumber(m_cell_type, m_number), "%.3f%s", 
getUnitString(m_cell_type));
+    return doubleToString(convertNumber(cell_type, m_number), "%.3f%s", 
getUnitString(cell_type));
   }
   //TODO VSD_FIELD_FORMAT_FeetAndInches  10 Format string: <,FEET/INCH>0.000 u
   //TODO VSD_FIELD_FORMAT_Radians  11 Format string: <,rad>0.#### u
diff --git a/src/lib/VSDFieldList.h b/src/lib/VSDFieldList.h
index 54560bd..8b98739 100644
--- a/src/lib/VSDFieldList.h
+++ b/src/lib/VSDFieldList.h
@@ -29,7 +29,7 @@ public:
   virtual ~VSDFieldListElement() {}
   virtual void handle(VSDCollector *collector) const = 0;
   virtual VSDFieldListElement *clone() = 0;
-  virtual librevenge::RVNGString getString(const std::map<unsigned, 
librevenge::RVNGString> &) = 0;
+  virtual librevenge::RVNGString getString(const std::map<unsigned, 
librevenge::RVNGString> &, unsigned defaultUnit) = 0;
   virtual void setNameId(int) = 0;
   virtual void setFormat(unsigned short) = 0;
   virtual void setCellType(unsigned short) = 0;
@@ -47,7 +47,7 @@ public:
   ~VSDTextField() override {}
   void handle(VSDCollector *collector) const override;
   VSDFieldListElement *clone() override;
-  librevenge::RVNGString getString(const std::map<unsigned, 
librevenge::RVNGString> &strVec) override;
+  librevenge::RVNGString getString(const std::map<unsigned, 
librevenge::RVNGString> &strVec, unsigned defaultUnit) override;
   void setNameId(int nameId) override;
   void setFormat(unsigned short) override {}
   void setCellType(unsigned short) override {}
@@ -70,7 +70,7 @@ public:
   ~VSDNumericField() override {}
   void handle(VSDCollector *collector) const override;
   VSDFieldListElement *clone() override;
-  librevenge::RVNGString getString(const std::map<unsigned, 
librevenge::RVNGString> &) override;
+  librevenge::RVNGString getString(const std::map<unsigned, 
librevenge::RVNGString> &, unsigned defaultUnit) override;
   void setNameId(int) override {}
   void setFormat(unsigned short format) override;
   void setCellType(unsigned short cellType) override;
diff --git a/src/lib/VSDParser.cpp b/src/lib/VSDParser.cpp
index 03b24fd..0f75fba 100644
--- a/src/lib/VSDParser.cpp
+++ b/src/lib/VSDParser.cpp
@@ -1257,20 +1257,21 @@ void 
libvisio::VSDParser::readPageProps(librevenge::RVNGInputStream *input)
   input->seek(1, librevenge::RVNG_SEEK_CUR);
   m_shadowOffsetY = readDouble(input);
   input->seek(1, librevenge::RVNG_SEEK_CUR);
-  const double numerator = readDouble(input);
-  input->seek(1, librevenge::RVNG_SEEK_CUR);
-  double denominator = readDouble(input);
-  if (VSD_ALMOST_ZERO(denominator))
-    denominator = 1;
+  const double pageScale = readDouble(input);
+
+  const unsigned char drawingScaleUnit = readU8(input);
+  double drawingScale = readDouble(input);
+  if (VSD_ALMOST_ZERO(drawingScale))
+    drawingScale = 1;
 
-  const double scale = std::abs(numerator / denominator);
+  const double scale = std::abs(pageScale / drawingScale);
 
   if (m_isStencilStarted && m_currentStencil)
   {
     m_currentStencil->m_shadowOffsetX = m_shadowOffsetX;
     m_currentStencil->m_shadowOffsetY = m_shadowOffsetY;
   }
-  m_collector->collectPageProps(m_header.id, m_header.level, pageWidth, 
pageHeight, m_shadowOffsetX, m_shadowOffsetY, scale);
+  m_collector->collectPageProps(m_header.id, m_header.level, pageWidth, 
pageHeight, m_shadowOffsetX, m_shadowOffsetY, scale, drawingScaleUnit);
 }
 
 void libvisio::VSDParser::readShape(librevenge::RVNGInputStream *input)
diff --git a/src/lib/VSDStylesCollector.cpp b/src/lib/VSDStylesCollector.cpp
index 0e6a0a5..16c723a 100644
--- a/src/lib/VSDStylesCollector.cpp
+++ b/src/lib/VSDStylesCollector.cpp
@@ -222,7 +222,8 @@ void 
libvisio::VSDStylesCollector::collectForeignDataType(unsigned level, unsign
 }
 
 void libvisio::VSDStylesCollector::collectPageProps(unsigned /* id */, 
unsigned level, double /* pageWidth */, double /* pageHeight */,
-                                                    double /* shadowOffsetX 
*/, double /* shadowOffsetY */, double /* scale */)
+                                                    double /* shadowOffsetX 
*/, double /* shadowOffsetY */, double /* scale */,
+                                                    unsigned char /* 
drawingScaleUnit */)
 {
   _handleLevelChange(level);
 }
diff --git a/src/lib/VSDStylesCollector.h b/src/lib/VSDStylesCollector.h
index f52c435..2c838af 100644
--- a/src/lib/VSDStylesCollector.h
+++ b/src/lib/VSDStylesCollector.h
@@ -71,7 +71,7 @@ public:
   void collectTxtXForm(unsigned level, const XForm &txtxform) override;
   void collectShapesOrder(unsigned id, unsigned level, const 
std::vector<unsigned> &shapeIds) override;
   void collectForeignDataType(unsigned level, unsigned foreignType, unsigned 
foreignFormat, double offsetX, double offsetY, double width, double height) 
override;
-  void collectPageProps(unsigned id, unsigned level, double pageWidth, double 
pageHeight, double shadowOffsetX, double shadowOffsetY, double scale) override;
+  void collectPageProps(unsigned id, unsigned level, double pageWidth, double 
pageHeight, double shadowOffsetX, double shadowOffsetY, double scale, unsigned 
char drawingScaleUnit) override;
   void collectPage(unsigned id, unsigned level, unsigned backgroundPageID, 
bool isBackgroundPage, const VSDName &pageName) override;
   void collectShape(unsigned id, unsigned level, unsigned parent, unsigned 
masterPage, unsigned masterShape, unsigned lineStyle, unsigned fillStyle, 
unsigned textStyle) override;
   void collectSplineStart(unsigned id, unsigned level, double x, double y, 
double secondKnot, double firstKnot, double lastKnot, unsigned degree) override;
diff --git a/src/lib/VSDXParser.cpp b/src/lib/VSDXParser.cpp
index 46efdd3..6b94181 100644
--- a/src/lib/VSDXParser.cpp
+++ b/src/lib/VSDXParser.cpp
@@ -668,7 +668,7 @@ void 
libvisio::VSDXParser::readPageSheetProperties(xmlTextReaderPtr reader)
   else if (m_isPageStarted)
   {
     double scale = drawingScale > 0 || drawingScale < 0 ? 
pageScale/drawingScale : 1.0;
-    m_collector->collectPageProps(0, level, pageWidth, pageHeight, 
shadowOffsetX, shadowOffsetY, scale);
+    m_collector->collectPageProps(0, level, pageWidth, pageHeight, 
shadowOffsetX, shadowOffsetY, scale, 0);
   }
 }
 
diff --git a/src/lib/tokens.txt b/src/lib/tokens.txt
index c15e7ef..23eacaf 100644
--- a/src/lib/tokens.txt
+++ b/src/lib/tokens.txt
@@ -191,12 +191,23 @@ Properties
 QuickStyleEffectsMatrix
 QuickStyleFillColor
 QuickStyleFillMatrix
+QuickStyleFontColor
 QuickStyleFontMatrix
 QuickStyleLineColor
 QuickStyleLineMatrix
 QuickStyleShadowColor
 QuickStyleType
 QuickStyleVariation
+Hyperlink
+Description
+Address
+SubAddress
+ExtraInfo
+Frame
+NewWindow
+Default
+Invisible
+SortKey
 Rel
 RelCubBezTo
 RelEllipticalArcTo
diff --git a/src/test/data/tdf154379-DrawingUnits-type.vsd 
b/src/test/data/tdf154379-DrawingUnits-type.vsd
new file mode 100644
index 0000000..bfde536
Binary files /dev/null and b/src/test/data/tdf154379-DrawingUnits-type.vsd 
differ
diff --git a/src/test/importtest.cpp b/src/test/importtest.cpp
index d26eb08..b38940d 100644
--- a/src/test/importtest.cpp
+++ b/src/test/importtest.cpp
@@ -187,7 +187,7 @@ xmlDocPtr parse(const char *filename, xmlBufferPtr buffer)
   xmlTextWriterEndDocument(writer);
   xmlFreeTextWriter(writer);
 
-  //std::cerr << "XML is '" << (const char *)xmlBufferContent(buffer) << "'" 
<< std::endl;
+  // std::cerr << "XML is '" << (const char *)xmlBufferContent(buffer) << "'" 
<< std::endl;
   return xmlParseMemory((const char *)xmlBufferContent(buffer), 
xmlBufferLength(buffer));
 }
 
@@ -216,6 +216,7 @@ class ImportTest : public CPPUNIT_NS::TestFixture
   CPPUNIT_TEST(testVsd11FormatLine);
   CPPUNIT_TEST(testVsd6TextfieldsWithUnits);
   CPPUNIT_TEST(testVsd11TextfieldsWithUnits);
+  CPPUNIT_TEST(testVsd11DrawingUnitsType);
   CPPUNIT_TEST(testBmpFileHeader);
   CPPUNIT_TEST(testBmpFileHeader2);
   CPPUNIT_TEST(testVsdxImportDefaultFillColour);
@@ -237,8 +238,10 @@ class ImportTest : public CPPUNIT_NS::TestFixture
   void testVsdDateTimeFormatting();
   void testVsd6TextfieldsWithUnits();
   void testVsd11TextfieldsWithUnits();
+  void testVsd11DrawingUnitsType();
   void testBmpFileHeader();
   void testBmpFileHeader2();
+
   void testVsdxImportDefaultFillColour();
   void testVsdxQuickStyleFillMatrix();
   void testVsdxQuickStyleFillStyle();
@@ -515,6 +518,17 @@ void ImportTest::testVsd11TextfieldsWithUnits()
   // TODO assertXPathContent(m_doc, 
"/document/page/textObject[40]/paragraph[1]/span/insertText", "1 date with 
currency unit zł 1,00");
 }
 
+void ImportTest::testVsd11DrawingUnitsType()
+{
+  // Without the accompanying fix in place, this test would have failed with:
+  //   Test name: ImportTest::testVsd11DrawingUnitsTypeequality assertion 
failed
+  // - Expected: 180.0 cm x 394.0 cm
+  // - Actual  : 70.9 x 394.0 cm
+  // - XPath '/document/page/textObject[12]/paragraph/span/insertText': 
contents of child does not match.
+  m_doc = parse("tdf154379-DrawingUnits-type.vsd", m_buffer);
+  assertXPathContent(m_doc, 
"/document/page/textObject[12]/paragraph/span/insertText", "180.0 cm x 394.0 
cm");
+}
+
 void ImportTest::testBmpFileHeader()
 {
   m_doc = parse("bitmaps.vsd", m_buffer);

Reply via email to