summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarim Pinter <karim.pinter@qt.io>2017-01-18 11:00:13 +0200
committerKarim Pinter <karim.pinter@qt.io>2017-01-20 09:40:12 +0000
commit82c5cc6532ac5d0323ecda94b6767e1fdaef2639 (patch)
tree116a67e467457c394c7b2d62ea168082332e7ea4
parentb7f8783f25cf1ff0eadbab59701acd46bff58e9a (diff)
downloadqtxmlpatterns-82c5cc6532ac5d0323ecda94b6767e1fdaef2639.tar.gz
fractionDigits doesn't count the trailing 0s anymore
fractionDigits were counting also the trailing 0s, which is against the standard https://www.w3.org/TR/xmlschema-2/#rf-fractionDigits Task-number: QTBUG-58245 Change-Id: I9175d4870de82e25c4df2317394ccfba8048fb48 Reviewed-by: Andy Shaw <andy.shaw@qt.io>
-rw-r--r--src/xmlpatterns/schema/qxsdtypechecker.cpp13
-rw-r--r--tests/auto/xmlpatternsvalidator/files/fractiondigits.xml4
-rw-r--r--tests/auto/xmlpatternsvalidator/files/fractiondigits.xsd15
-rw-r--r--tests/auto/xmlpatternsvalidator/tst_xmlpatternsvalidator.cpp5
4 files changed, 31 insertions, 6 deletions
diff --git a/src/xmlpatterns/schema/qxsdtypechecker.cpp b/src/xmlpatterns/schema/qxsdtypechecker.cpp
index 2e4ce8e..d6b224f 100644
--- a/src/xmlpatterns/schema/qxsdtypechecker.cpp
+++ b/src/xmlpatterns/schema/qxsdtypechecker.cpp
@@ -37,6 +37,8 @@
**
****************************************************************************/
+#include <QtMath>
+
#include "qxsdtypechecker_p.h"
#include "qabstractdatetime_p.h"
@@ -150,13 +152,12 @@ static int fractionDigitsForDecimal(const QString &lexicalValue)
{
// we use the lexical value here, as the conversion to double might strip
// away decimal positions
-
- QString trimmedValue(lexicalValue.trimmed());
- const int pos = trimmedValue.indexOf(QLatin1Char('.'));
- if (pos == -1) // no '.' -> 0 fraction digits
+ bool ok = false;
+ double dbl = lexicalValue.toDouble(&ok);
+ if (!ok)
return 0;
- else
- return (trimmedValue.length() - pos - 1);
+ dbl = dbl - qFloor(dbl);
+ return QString::number(dbl).length() - 2;
}
XsdTypeChecker::XsdTypeChecker(const XsdSchemaContext::Ptr &context, const QVector<QXmlName> &namespaceBindings, const QSourceLocation &location)
diff --git a/tests/auto/xmlpatternsvalidator/files/fractiondigits.xml b/tests/auto/xmlpatternsvalidator/files/fractiondigits.xml
new file mode 100644
index 0000000..55c2ee8
--- /dev/null
+++ b/tests/auto/xmlpatternsvalidator/files/fractiondigits.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<tns:number xmlns:tns="http://www.example.org/FractionDigitsTest" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/FractionDigitsTest FractionDigitsTest.xsd">
+ <tns:value>1234.560000</tns:value>
+</tns:number>
diff --git a/tests/auto/xmlpatternsvalidator/files/fractiondigits.xsd b/tests/auto/xmlpatternsvalidator/files/fractiondigits.xsd
new file mode 100644
index 0000000..b8f266a
--- /dev/null
+++ b/tests/auto/xmlpatternsvalidator/files/fractiondigits.xsd
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/FractionDigitsTest" xmlns:tns="http://www.example.org/FractionDigitsTest" elementFormDefault="qualified">
+ <element name="number" type="tns:NumberType" />
+ <complexType name="NumberType">
+ <sequence>
+ <element name="value">
+ <simpleType>
+ <restriction base="decimal">
+ <fractionDigits value="2"/>
+ </restriction>
+ </simpleType>
+ </element>
+ </sequence>
+ </complexType>
+</schema>
diff --git a/tests/auto/xmlpatternsvalidator/tst_xmlpatternsvalidator.cpp b/tests/auto/xmlpatternsvalidator/tst_xmlpatternsvalidator.cpp
index 8e86dd9..8a11418 100644
--- a/tests/auto/xmlpatternsvalidator/tst_xmlpatternsvalidator.cpp
+++ b/tests/auto/xmlpatternsvalidator/tst_xmlpatternsvalidator.cpp
@@ -227,6 +227,11 @@ void tst_XmlPatternsValidator::xsdSupport_data() const
<< (QStringList() << path + QLatin1String("substitution-group-invalid.xml")
<< path + QLatin1String("substitution-group.xsd"))
<< QString();
+ QTest::newRow("QTBUG-58245 fraction digits shouldn't take trailing 0 into account")
+ << 0
+ << (QStringList() << path + QLatin1String("fractiondigits.xml")
+ << path + QLatin1String("fractiondigits.xsd"))
+ << QString();
}
QTEST_MAIN(tst_XmlPatternsValidator)