diff options
5 files changed, 38 insertions, 8 deletions
diff --git a/src/xmlpatterns/schema/qxsdtypechecker.cpp b/src/xmlpatterns/schema/qxsdtypechecker.cpp index d6b224f..d165a1f 100644 --- a/src/xmlpatterns/schema/qxsdtypechecker.cpp +++ b/src/xmlpatterns/schema/qxsdtypechecker.cpp @@ -150,14 +150,14 @@ static int totalDigitsForDecimal(const QString &lexicalValue) static int fractionDigitsForDecimal(const QString &lexicalValue) { - // we use the lexical value here, as the conversion to double might strip - // away decimal positions - bool ok = false; - double dbl = lexicalValue.toDouble(&ok); - if (!ok) + const int pos = lexicalValue.indexOf(QLatin1Char('.')); + if (pos == -1) return 0; - dbl = dbl - qFloor(dbl); - return QString::number(dbl).length() - 2; + const QStringRef fraction = QStringRef(&lexicalValue).mid(pos).trimmed(); + int i = fraction.length() - 1; // fraction[0] is '.' so fraction is not empty + while (fraction.at(i) == QLatin1Char('0')) + --i; + return i; // The significant fraction-digits are fraction[1 through i]. } XsdTypeChecker::XsdTypeChecker(const XsdSchemaContext::Ptr &context, const QVector<QXmlName> &namespaceBindings, const QSourceLocation &location) diff --git a/tests/auto/xmlpatternsvalidator/files/fractiondigits-invalid.xml b/tests/auto/xmlpatternsvalidator/files/fractiondigits-invalid.xml new file mode 100644 index 0000000..893c837 --- /dev/null +++ b/tests/auto/xmlpatternsvalidator/files/fractiondigits-invalid.xml @@ -0,0 +1,5 @@ +<?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.560000000000000001</tns:value> +</tns:number> + diff --git a/tests/auto/xmlpatternsvalidator/files/fractiondigits-nodot.xml b/tests/auto/xmlpatternsvalidator/files/fractiondigits-nodot.xml new file mode 100644 index 0000000..6024b9e --- /dev/null +++ b/tests/auto/xmlpatternsvalidator/files/fractiondigits-nodot.xml @@ -0,0 +1,5 @@ +<?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>123456</tns:value> +</tns:number> + diff --git a/tests/auto/xmlpatternsvalidator/files/fractiondigits-nonumber.xml b/tests/auto/xmlpatternsvalidator/files/fractiondigits-nonumber.xml new file mode 100644 index 0000000..ef17df3 --- /dev/null +++ b/tests/auto/xmlpatternsvalidator/files/fractiondigits-nonumber.xml @@ -0,0 +1,5 @@ +<?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>.56</tns:value> +</tns:number> + diff --git a/tests/auto/xmlpatternsvalidator/tst_xmlpatternsvalidator.cpp b/tests/auto/xmlpatternsvalidator/tst_xmlpatternsvalidator.cpp index 8a11418..79f86d9 100644 --- a/tests/auto/xmlpatternsvalidator/tst_xmlpatternsvalidator.cpp +++ b/tests/auto/xmlpatternsvalidator/tst_xmlpatternsvalidator.cpp @@ -227,11 +227,26 @@ 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") + QTest::newRow("QTBUG-58245 fraction digits should ignore trailing 0") << 0 << (QStringList() << path + QLatin1String("fractiondigits.xml") << path + QLatin1String("fractiondigits.xsd")) << QString(); + QTest::newRow("QTBUG-58245 fraction digits should ignore trailing 0 with no dots") + << 0 + << (QStringList() << path + QLatin1String("fractiondigits-nodot.xml") + << path + QLatin1String("fractiondigits.xsd")) + << QString(); + QTest::newRow("QTBUG-58245 fraction digits should ignore trailing 0 with no number before dot") + << 0 + << (QStringList() << path + QLatin1String("fractiondigits-nonumber.xml") + << path + QLatin1String("fractiondigits.xsd")) + << QString(); + QTest::newRow("QTBUG-58245 fraction digits should ignore trailing 0 invalid") + << 1 + << (QStringList() << path + QLatin1String("fractiondigits-invalid.xml") + << path + QLatin1String("fractiondigits.xsd")) + << QString(); } QTEST_MAIN(tst_XmlPatternsValidator) |