| /**************************************************************************** |
| ** |
| ** Copyright (C) 2016 The Qt Company Ltd. |
| ** Contact: https://www.qt.io/licensing/ |
| ** |
| ** This file is part of the test suite of the Qt Toolkit. |
| ** |
| ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ |
| ** Commercial License Usage |
| ** Licensees holding valid commercial Qt licenses may use this file in |
| ** accordance with the commercial license agreement provided with the |
| ** Software or, alternatively, in accordance with the terms contained in |
| ** a written agreement between you and The Qt Company. For licensing terms |
| ** and conditions see https://www.qt.io/terms-conditions. For further |
| ** information use the contact form at https://www.qt.io/contact-us. |
| ** |
| ** GNU General Public License Usage |
| ** Alternatively, this file may be used under the terms of the GNU |
| ** General Public License version 3 as published by the Free Software |
| ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT |
| ** included in the packaging of this file. Please review the following |
| ** information to ensure the GNU General Public License requirements will |
| ** be met: https://www.gnu.org/licenses/gpl-3.0.html. |
| ** |
| ** $QT_END_LICENSE$ |
| ** |
| ****************************************************************************/ |
| |
| |
| #include <QtTest/QtTest> |
| |
| #include <qcoreapplication.h> |
| #include <qdebug.h> |
| #include <qsettings.h> |
| #include <qtextformat.h> |
| #include <private/qtextformat_p.h> |
| #include <qtextdocument.h> |
| #include <qtextcursor.h> |
| #include <qtextobject.h> |
| #include <qtextlayout.h> |
| #include <qabstracttextdocumentlayout.h> |
| |
| class tst_QTextFormat : public QObject |
| { |
| Q_OBJECT |
| |
| private slots: |
| void getSetCheck(); |
| void defaultAlignment(); |
| void testQTextCharFormat() const; |
| void testUnderlinePropertyPrecedence(); |
| void toFormat(); |
| void resolveFont(); |
| void testLetterSpacing(); |
| void testFontStretch(); |
| void getSetTabs(); |
| void testTabsUsed(); |
| void testFontStyleSetters(); |
| void setFont_data(); |
| void setFont(); |
| void setFont_collection_data(); |
| void setFont_collection(); |
| void clearCollection(); |
| }; |
| |
| /*! \internal |
| This (used to) trigger a crash in: |
| |
| QDataStream &operator>>(QDataStream &stream, QTextFormat &fmt) |
| |
| which is most easily produced through QSettings. |
| */ |
| void tst_QTextFormat::testQTextCharFormat() const |
| { |
| QSettings settings("test", "test"); |
| QTextCharFormat test; |
| |
| settings.value("test", test); |
| } |
| |
| // Testing get/set functions |
| void tst_QTextFormat::getSetCheck() |
| { |
| QTextFormat obj1; |
| // int QTextFormat::objectIndex() |
| // void QTextFormat::setObjectIndex(int) |
| obj1.setObjectIndex(0); |
| QCOMPARE(0, obj1.objectIndex()); |
| obj1.setObjectIndex(INT_MIN); |
| QCOMPARE(INT_MIN, obj1.objectIndex()); |
| obj1.setObjectIndex(INT_MAX); |
| QCOMPARE(INT_MAX, obj1.objectIndex()); |
| } |
| |
| void tst_QTextFormat::defaultAlignment() |
| { |
| QTextBlockFormat fmt; |
| QVERIFY(!fmt.hasProperty(QTextFormat::BlockAlignment)); |
| QCOMPARE(fmt.intProperty(QTextFormat::BlockAlignment), 0); |
| QCOMPARE(fmt.alignment(), Qt::AlignLeft); |
| } |
| |
| void tst_QTextFormat::testUnderlinePropertyPrecedence() |
| { |
| QTextCharFormat format; |
| // use normal accessors and check internal state |
| format.setUnderlineStyle(QTextCharFormat::NoUnderline); |
| QCOMPARE(format.property(QTextFormat::FontUnderline).isNull(), false); |
| QCOMPARE(format.property(QTextFormat::TextUnderlineStyle).isNull(), false); |
| QCOMPARE(format.property(QTextFormat::FontUnderline).toBool(), false); |
| QCOMPARE(format.property(QTextFormat::TextUnderlineStyle).toInt(), 0); |
| |
| format = QTextCharFormat(); |
| format.setUnderlineStyle(QTextCharFormat::SingleUnderline); |
| QCOMPARE(format.property(QTextFormat::FontUnderline).isNull(), false); |
| QCOMPARE(format.property(QTextFormat::TextUnderlineStyle).isNull(), false); |
| QCOMPARE(format.property(QTextFormat::FontUnderline).toBool(), true); |
| QCOMPARE(format.property(QTextFormat::TextUnderlineStyle).toInt(), 1); |
| |
| format = QTextCharFormat(); |
| format.setUnderlineStyle(QTextCharFormat::DotLine); |
| QCOMPARE(format.property(QTextFormat::FontUnderline).isNull(), false); |
| QCOMPARE(format.property(QTextFormat::TextUnderlineStyle).isNull(), false); |
| QCOMPARE(format.property(QTextFormat::FontUnderline).toBool(), false); |
| QVERIFY(format.property(QTextFormat::TextUnderlineStyle).toInt() > 0); |
| |
| // override accessors and use setProperty to create a false state. |
| // then check font() |
| format = QTextCharFormat(); |
| format.setProperty(QTextCharFormat::FontUnderline, true); |
| QCOMPARE(format.property(QTextFormat::FontUnderline).isNull(), false); |
| QCOMPARE(format.property(QTextFormat::TextUnderlineStyle).isNull(), true); |
| QCOMPARE(format.fontUnderline(), true); |
| QCOMPARE(format.font().underline(), true); |
| |
| format = QTextCharFormat(); |
| // create conflict. Should use the new property |
| format.setProperty(QTextCharFormat::TextUnderlineStyle, QTextCharFormat::SingleUnderline); |
| format.setProperty(QTextCharFormat::FontUnderline, false); |
| QCOMPARE(format.fontUnderline(), true); |
| QCOMPARE(format.font().underline(), true); |
| |
| format = QTextCharFormat(); |
| // create conflict. Should use the new property |
| format.setProperty(QTextCharFormat::TextUnderlineStyle, QTextCharFormat::NoUnderline); |
| format.setProperty(QTextCharFormat::FontUnderline, true); |
| QCOMPARE(format.fontUnderline(), false); |
| QCOMPARE(format.font().underline(), false); |
| |
| // do it again, but reverse the ordering (we use a QVector internally, so test a LOT ;) |
| // create conflict. Should use the new property |
| format.setProperty(QTextCharFormat::FontUnderline, false); |
| format.setProperty(QTextCharFormat::TextUnderlineStyle, QTextCharFormat::SingleUnderline); |
| QCOMPARE(format.fontUnderline(), true); |
| QCOMPARE(format.font().underline(), true); |
| |
| format = QTextCharFormat(); |
| // create conflict. Should use the new property |
| format.setProperty(QTextCharFormat::FontUnderline, true); |
| format.setProperty(QTextCharFormat::TextUnderlineStyle, QTextCharFormat::NoUnderline); |
| QCOMPARE(format.fontUnderline(), false); |
| QCOMPARE(format.font().underline(), false); |
| } |
| |
| void tst_QTextFormat::toFormat() |
| { |
| { |
| QTextFormat fmt = QTextFrameFormat(); |
| QCOMPARE(fmt.toFrameFormat().type(), int(QTextFormat::FrameFormat)); |
| } |
| |
| { |
| QTextFormat fmt = QTextTableFormat(); |
| QCOMPARE(fmt.toTableFormat().type(), int(QTextFormat::FrameFormat)); |
| QCOMPARE(fmt.toTableFormat().objectType(), int(QTextFormat::TableObject)); |
| } |
| |
| { |
| QTextFormat fmt = QTextBlockFormat(); |
| QCOMPARE(fmt.toBlockFormat().type(), int(QTextFormat::BlockFormat)); |
| } |
| |
| { |
| QTextFormat fmt = QTextCharFormat(); |
| QCOMPARE(fmt.toCharFormat().type(), int(QTextFormat::CharFormat)); |
| } |
| |
| { |
| QTextFormat fmt = QTextListFormat(); |
| QCOMPARE(fmt.toListFormat().type(), int(QTextFormat::ListFormat)); |
| } |
| } |
| |
| void tst_QTextFormat::resolveFont() |
| { |
| QTextDocument doc; |
| |
| QTextCharFormat fmt; |
| fmt.setProperty(QTextFormat::ForegroundBrush, QColor(Qt::blue)); |
| QCOMPARE(fmt.property(QTextFormat::ForegroundBrush).userType(), qMetaTypeId<QColor>()); |
| QCOMPARE(fmt.property(QTextFormat::ForegroundBrush).value<QColor>(), QColor(Qt::blue)); |
| fmt.setProperty(QTextFormat::FontItalic, true); |
| QTextCursor(&doc).insertText("Test", fmt); |
| |
| QVector<QTextFormat> formats = doc.allFormats(); |
| QCOMPARE(formats.count(), 3); |
| |
| QCOMPARE(formats.at(2).type(), int(QTextFormat::CharFormat)); |
| fmt = formats.at(2).toCharFormat(); |
| |
| QVERIFY(!fmt.font().underline()); |
| QVERIFY(fmt.hasProperty(QTextFormat::ForegroundBrush)); |
| |
| QFont f; |
| f.setUnderline(true); |
| doc.setDefaultFont(f); |
| formats = doc.allFormats(); |
| fmt = formats.at(2).toCharFormat(); |
| |
| QVERIFY(fmt.font().underline()); |
| QVERIFY(!fmt.hasProperty(QTextFormat::FontUnderline)); |
| |
| // verify that deleting a non-existent property does not affect the font resolving |
| |
| QVERIFY(!fmt.hasProperty(QTextFormat::BackgroundBrush)); |
| fmt.clearProperty(QTextFormat::BackgroundBrush); |
| QVERIFY(!fmt.hasProperty(QTextFormat::BackgroundBrush)); |
| |
| QVERIFY(!fmt.hasProperty(QTextFormat::FontUnderline)); |
| QVERIFY(fmt.font().underline()); |
| |
| // verify that deleting an existent but font _unrelated_ property does not affect the font resolving |
| |
| QVERIFY(fmt.hasProperty(QTextFormat::ForegroundBrush)); |
| fmt.clearProperty(QTextFormat::ForegroundBrush); |
| QVERIFY(!fmt.hasProperty(QTextFormat::ForegroundBrush)); |
| |
| QVERIFY(!fmt.hasProperty(QTextFormat::FontUnderline)); |
| QVERIFY(fmt.font().underline()); |
| |
| // verify that removing a font property _does_ clear the resolving |
| |
| QVERIFY(fmt.hasProperty(QTextFormat::FontItalic)); |
| fmt.clearProperty(QTextFormat::FontItalic); |
| QVERIFY(!fmt.hasProperty(QTextFormat::FontItalic)); |
| |
| QVERIFY(!fmt.hasProperty(QTextFormat::FontUnderline)); |
| QVERIFY(!fmt.font().underline()); |
| QVERIFY(!fmt.font().italic()); |
| |
| // reset |
| fmt = formats.at(2).toCharFormat(); |
| |
| QVERIFY(fmt.font().underline()); |
| QVERIFY(!fmt.hasProperty(QTextFormat::FontUnderline)); |
| |
| // verify that _setting_ an unrelated property does _not_ affect the resolving |
| |
| QVERIFY(!fmt.hasProperty(QTextFormat::IsAnchor)); |
| fmt.setProperty(QTextFormat::IsAnchor, true); |
| QVERIFY(fmt.hasProperty(QTextFormat::IsAnchor)); |
| |
| QVERIFY(fmt.font().underline()); |
| QVERIFY(!fmt.hasProperty(QTextFormat::FontUnderline)); |
| |
| // verify that setting a _related_ font property does affect the resolving |
| // |
| QVERIFY(!fmt.hasProperty(QTextFormat::FontStrikeOut)); |
| fmt.setProperty(QTextFormat::FontStrikeOut, true); |
| QVERIFY(fmt.hasProperty(QTextFormat::FontStrikeOut)); |
| |
| QVERIFY(!fmt.font().underline()); |
| QVERIFY(!fmt.hasProperty(QTextFormat::FontUnderline)); |
| QVERIFY(fmt.font().strikeOut()); |
| } |
| |
| |
| void tst_QTextFormat::testLetterSpacing() |
| { |
| QTextCharFormat format; |
| |
| QCOMPARE(format.hasProperty(QTextFormat::FontLetterSpacing), false); |
| QCOMPARE(format.hasProperty(QTextFormat::FontLetterSpacingType), false); |
| |
| format.setFontLetterSpacingType(QFont::AbsoluteSpacing); |
| QCOMPARE(format.font().letterSpacingType(), QFont::AbsoluteSpacing); |
| |
| format.setFontLetterSpacing(10.0); |
| QCOMPARE(format.font().letterSpacing(), 10.0); |
| |
| QCOMPARE(format.hasProperty(QTextFormat::FontLetterSpacing), true); |
| QCOMPARE(format.property(QTextFormat::FontLetterSpacing).toDouble(), 10.0); |
| QCOMPARE(format.property(QTextFormat::FontLetterSpacingType).toInt(), int(QFont::AbsoluteSpacing)); |
| |
| format.setFontLetterSpacingType(QFont::PercentageSpacing); |
| QCOMPARE(format.font().letterSpacingType(), QFont::PercentageSpacing); |
| |
| format.setFontLetterSpacing(110.0); |
| QCOMPARE(format.font().letterSpacing(), 110.0); |
| |
| QCOMPARE(format.property(QTextFormat::FontLetterSpacing).toDouble(), 110.0); |
| QCOMPARE(format.property(QTextFormat::FontLetterSpacingType).toInt(), int(QFont::PercentageSpacing)); |
| |
| format.setFontLetterSpacingType(QFont::AbsoluteSpacing); |
| QCOMPARE(format.font().letterSpacingType(), QFont::AbsoluteSpacing); |
| |
| format.setFontLetterSpacing(10.0); |
| QCOMPARE(format.font().letterSpacing(), 10.0); |
| |
| QCOMPARE(format.property(QTextFormat::FontLetterSpacingType).toInt(), int(QFont::AbsoluteSpacing)); |
| QCOMPARE(format.property(QTextFormat::FontLetterSpacing).toDouble(), 10.0); |
| } |
| |
| void tst_QTextFormat::testFontStretch() |
| { |
| QTextCharFormat format; |
| |
| QCOMPARE(format.hasProperty(QTextFormat::FontStretch), false); |
| |
| format.setFontStretch(130.0); |
| |
| QCOMPARE(format.property(QTextFormat::FontStretch).toInt(), 130); |
| } |
| |
| void tst_QTextFormat::getSetTabs() |
| { |
| class Comparator { |
| public: |
| Comparator(const QList<QTextOption::Tab> &tabs, const QList<QTextOption::Tab> &tabs2) |
| { |
| QCOMPARE(tabs.count(), tabs2.count()); |
| for(int i=0; i < tabs.count(); i++) { |
| QTextOption::Tab t1 = tabs[i]; |
| QTextOption::Tab t2 = tabs2[i]; |
| QCOMPARE(t1.position, t2.position); |
| QCOMPARE(t1.type, t2.type); |
| QCOMPARE(t1.delimiter, t2.delimiter); |
| } |
| } |
| }; |
| |
| QList<QTextOption::Tab> tabs; |
| QTextBlockFormat format; |
| format.setTabPositions(tabs); |
| Comparator c1(tabs, format.tabPositions()); |
| |
| QTextOption::Tab tab1; |
| tab1.position = 1234; |
| tabs.append(tab1); |
| format.setTabPositions(tabs); |
| Comparator c2(tabs, format.tabPositions()); |
| |
| QTextOption::Tab tab2(3456, QTextOption::RightTab, QChar('x')); |
| tabs.append(tab2); |
| format.setTabPositions(tabs); |
| Comparator c3(tabs, format.tabPositions()); |
| } |
| |
| void tst_QTextFormat::testTabsUsed() |
| { |
| QTextDocument doc; |
| QTextCursor cursor(&doc); |
| |
| QList<QTextOption::Tab> tabs; |
| QTextBlockFormat format; |
| QTextOption::Tab tab; |
| tab.position = 100; |
| tabs.append(tab); |
| format.setTabPositions(tabs); |
| cursor.mergeBlockFormat(format); |
| cursor.insertText("foo\tbar"); |
| //doc.setPageSize(QSizeF(200, 200)); |
| doc.documentLayout()->pageCount(); // force layout; |
| |
| QTextBlock block = doc.begin(); |
| QTextLayout *layout = block.layout(); |
| QVERIFY(layout); |
| QCOMPARE(layout->lineCount(), 1); |
| QTextLine line = layout->lineAt(0); |
| QCOMPARE(line.cursorToX(4), 100.); |
| |
| QTextOption option = layout->textOption(); |
| QCOMPARE(option.tabs().count(), tabs.count()); |
| |
| } |
| |
| void tst_QTextFormat::testFontStyleSetters() |
| { |
| QTextCharFormat format; |
| |
| // test the setters |
| format.setFontStyleHint(QFont::Serif); |
| QCOMPARE(format.font().styleHint(), QFont::Serif); |
| QCOMPARE(format.font().styleStrategy(), QFont::PreferDefault); |
| format.setFontStyleStrategy(QFont::PreferOutline); |
| QCOMPARE(format.font().styleStrategy(), QFont::PreferOutline); |
| |
| // test setting properties through setFont() |
| QFont font; |
| font.setStyleHint(QFont::SansSerif, QFont::PreferAntialias); |
| format.setFont(font); |
| QCOMPARE(format.font().styleHint(), QFont::SansSerif); |
| QCOMPARE(format.font().styleStrategy(), QFont::PreferAntialias); |
| |
| // test kerning |
| format.setFontKerning(false); |
| QCOMPARE(format.font().kerning(), false); |
| format.setFontKerning(true); |
| QCOMPARE(format.font().kerning(), true); |
| font.setKerning(false); |
| format.setFont(font); |
| QCOMPARE(format.font().kerning(), false); |
| } |
| |
| Q_DECLARE_METATYPE(QTextCharFormat) |
| |
| void tst_QTextFormat::setFont_data() |
| { |
| QTest::addColumn<QTextCharFormat>("format1"); |
| QTest::addColumn<QTextCharFormat>("format2"); |
| QTest::addColumn<bool>("overrideAll"); |
| |
| QTextCharFormat format1; |
| format1.setFontStyleHint(QFont::Serif); |
| format1.setFontStyleStrategy(QFont::PreferOutline); |
| format1.setFontCapitalization(QFont::AllUppercase); |
| format1.setFontKerning(true); |
| |
| { |
| QTest::newRow("noop|override") << format1 << format1 << true; |
| QTest::newRow("noop|inherit") << format1 << format1 << false; |
| } |
| |
| { |
| QTextCharFormat format2; |
| format2.setFontStyleHint(QFont::SansSerif); |
| format2.setFontStyleStrategy(QFont::PreferAntialias); |
| format2.setFontCapitalization(QFont::MixedCase); |
| format2.setFontKerning(false); |
| |
| QTest::newRow("coverage|override") << format1 << format2 << true; |
| QTest::newRow("coverage|inherit") << format1 << format2 << false; |
| } |
| |
| { |
| QTextCharFormat format2; |
| format2.setFontStyleHint(QFont::SansSerif); |
| format2.setFontStyleStrategy(QFont::PreferAntialias); |
| |
| QTest::newRow("partial|override") << format1 << format2 << true; |
| QTest::newRow("partial|inherit") << format1 << format2 << false; |
| } |
| } |
| |
| void tst_QTextFormat::setFont() |
| { |
| QFETCH(QTextCharFormat, format1); |
| QFETCH(QTextCharFormat, format2); |
| QFETCH(bool, overrideAll); |
| |
| QTextCharFormat f; |
| |
| f.merge(format1); |
| QCOMPARE((int)f.fontStyleHint(), (int)format1.fontStyleHint()); |
| QCOMPARE((int)f.fontStyleStrategy(), (int)format1.fontStyleStrategy()); |
| QCOMPARE((int)f.fontCapitalization(), (int)format1.fontCapitalization()); |
| QCOMPARE(f.fontKerning(), format1.fontKerning()); |
| |
| QCOMPARE((int)f.font().styleHint(), (int)f.fontStyleHint()); |
| QCOMPARE((int)f.font().styleStrategy(), (int)f.fontStyleStrategy()); |
| QCOMPARE((int)f.font().capitalization(), (int)f.fontCapitalization()); |
| QCOMPARE(f.font().kerning(), f.fontKerning()); |
| |
| f.merge(format2); |
| QCOMPARE((int)f.font().styleHint(), (int)f.fontStyleHint()); |
| QCOMPARE((int)f.font().styleStrategy(), (int)f.fontStyleStrategy()); |
| QCOMPARE((int)f.font().capitalization(), (int)f.fontCapitalization()); |
| QCOMPARE(f.font().kerning(), f.fontKerning()); |
| |
| if (format2.hasProperty(QTextFormat::FontStyleHint)) |
| QCOMPARE((int)f.font().styleHint(), (int)format2.fontStyleHint()); |
| else |
| QCOMPARE((int)f.font().styleHint(), (int)format1.fontStyleHint()); |
| if (format2.hasProperty(QTextFormat::FontStyleStrategy)) |
| QCOMPARE((int)f.font().styleStrategy(), (int)format2.fontStyleStrategy()); |
| else |
| QCOMPARE((int)f.font().styleStrategy(), (int)format1.fontStyleStrategy()); |
| if (format2.hasProperty(QTextFormat::FontCapitalization)) |
| QCOMPARE((int)f.font().capitalization(), (int)format2.fontCapitalization()); |
| else |
| QCOMPARE((int)f.font().capitalization(), (int)format1.fontCapitalization()); |
| if (format2.hasProperty(QTextFormat::FontKerning)) |
| QCOMPARE(f.font().kerning(), format2.fontKerning()); |
| else |
| QCOMPARE(f.font().kerning(), format1.fontKerning()); |
| |
| |
| QFont font1 = format1.font(); |
| QFont font2 = format2.font(); |
| |
| f = QTextCharFormat(); |
| |
| { |
| QTextCharFormat tmp; |
| tmp.setFont(font1, overrideAll ? QTextCharFormat::FontPropertiesAll |
| : QTextCharFormat::FontPropertiesSpecifiedOnly); |
| f.merge(tmp); |
| } |
| QCOMPARE((int)f.fontStyleHint(), (int)format1.fontStyleHint()); |
| QCOMPARE((int)f.fontStyleStrategy(), (int)format1.fontStyleStrategy()); |
| QCOMPARE((int)f.fontCapitalization(), (int)format1.fontCapitalization()); |
| QCOMPARE(f.fontKerning(), format1.fontKerning()); |
| |
| QCOMPARE((int)f.font().styleHint(), (int)f.fontStyleHint()); |
| QCOMPARE((int)f.font().styleStrategy(), (int)f.fontStyleStrategy()); |
| QCOMPARE((int)f.font().capitalization(), (int)f.fontCapitalization()); |
| QCOMPARE(f.font().kerning(), f.fontKerning()); |
| |
| { |
| QTextCharFormat tmp; |
| tmp.setFont(font2, overrideAll ? QTextCharFormat::FontPropertiesAll |
| : QTextCharFormat::FontPropertiesSpecifiedOnly); |
| f.merge(tmp); |
| } |
| QCOMPARE((int)f.font().styleHint(), (int)f.fontStyleHint()); |
| QCOMPARE((int)f.font().styleStrategy(), (int)f.fontStyleStrategy()); |
| QCOMPARE((int)f.font().capitalization(), (int)f.fontCapitalization()); |
| QCOMPARE(f.font().kerning(), f.fontKerning()); |
| |
| if (overrideAll || (font2.resolve() & QFont::StyleHintResolved)) |
| QCOMPARE((int)f.font().styleHint(), (int)font2.styleHint()); |
| else |
| QCOMPARE((int)f.font().styleHint(), (int)font1.styleHint()); |
| if (overrideAll || (font2.resolve() & QFont::StyleStrategyResolved)) |
| QCOMPARE((int)f.font().styleStrategy(), (int)font2.styleStrategy()); |
| else |
| QCOMPARE((int)f.font().styleStrategy(), (int)font1.styleStrategy()); |
| if (overrideAll || (font2.resolve() & QFont::CapitalizationResolved)) |
| QCOMPARE((int)f.font().capitalization(), (int)font2.capitalization()); |
| else |
| QCOMPARE((int)f.font().capitalization(), (int)font1.capitalization()); |
| if (overrideAll || (font2.resolve() & QFont::KerningResolved)) |
| QCOMPARE(f.font().kerning(), font2.kerning()); |
| else |
| QCOMPARE(f.font().kerning(), font1.kerning()); |
| } |
| |
| void tst_QTextFormat::setFont_collection_data() |
| { |
| setFont_data(); |
| } |
| |
| void tst_QTextFormat::setFont_collection() |
| { |
| QFETCH(QTextCharFormat, format1); |
| QFETCH(QTextCharFormat, format2); |
| QFETCH(bool, overrideAll); |
| |
| QFont font1 = format1.font(); |
| QFont font2 = format2.font(); |
| |
| { |
| QTextFormatCollection collection; |
| collection.setDefaultFont(font1); |
| |
| int formatIndex = collection.indexForFormat(format1); |
| QTextCharFormat f = collection.charFormat(formatIndex); |
| |
| QCOMPARE((int)f.fontStyleHint(), (int)format1.fontStyleHint()); |
| QCOMPARE((int)f.fontStyleStrategy(), (int)format1.fontStyleStrategy()); |
| QCOMPARE((int)f.fontCapitalization(), (int)format1.fontCapitalization()); |
| QCOMPARE(f.fontKerning(), format1.fontKerning()); |
| |
| QCOMPARE((int)f.font().styleHint(), (int)f.fontStyleHint()); |
| QCOMPARE((int)f.font().styleStrategy(), (int)f.fontStyleStrategy()); |
| QCOMPARE((int)f.font().capitalization(), (int)f.fontCapitalization()); |
| QCOMPARE(f.font().kerning(), f.fontKerning()); |
| } |
| { |
| QTextFormatCollection collection; |
| collection.setDefaultFont(font1); |
| |
| int formatIndex = collection.indexForFormat(format2); |
| QTextCharFormat f = collection.charFormat(formatIndex); |
| |
| if (format2.hasProperty(QTextFormat::FontStyleHint)) |
| QCOMPARE((int)f.font().styleHint(), (int)format2.fontStyleHint()); |
| else |
| QCOMPARE((int)f.font().styleHint(), (int)format1.fontStyleHint()); |
| if (format2.hasProperty(QTextFormat::FontStyleStrategy)) |
| QCOMPARE((int)f.font().styleStrategy(), (int)format2.fontStyleStrategy()); |
| else |
| QCOMPARE((int)f.font().styleStrategy(), (int)format1.fontStyleStrategy()); |
| if (format2.hasProperty(QTextFormat::FontCapitalization)) |
| QCOMPARE((int)f.font().capitalization(), (int)format2.fontCapitalization()); |
| else |
| QCOMPARE((int)f.font().capitalization(), (int)format1.fontCapitalization()); |
| if (format2.hasProperty(QTextFormat::FontKerning)) |
| QCOMPARE(f.font().kerning(), format2.fontKerning()); |
| else |
| QCOMPARE(f.font().kerning(), format1.fontKerning()); |
| } |
| |
| { |
| QTextFormatCollection collection; |
| collection.setDefaultFont(font1); |
| |
| QTextCharFormat tmp; |
| tmp.setFont(font1, overrideAll ? QTextCharFormat::FontPropertiesAll |
| : QTextCharFormat::FontPropertiesSpecifiedOnly); |
| int formatIndex = collection.indexForFormat(tmp); |
| QTextCharFormat f = collection.charFormat(formatIndex); |
| |
| QCOMPARE((int)f.fontStyleHint(), (int)format1.fontStyleHint()); |
| QCOMPARE((int)f.fontStyleStrategy(), (int)format1.fontStyleStrategy()); |
| QCOMPARE((int)f.fontCapitalization(), (int)format1.fontCapitalization()); |
| QCOMPARE(f.fontKerning(), format1.fontKerning()); |
| |
| QCOMPARE((int)f.font().styleHint(), (int)f.fontStyleHint()); |
| QCOMPARE((int)f.font().styleStrategy(), (int)f.fontStyleStrategy()); |
| QCOMPARE((int)f.font().capitalization(), (int)f.fontCapitalization()); |
| QCOMPARE(f.font().kerning(), f.fontKerning()); |
| } |
| { |
| QTextFormatCollection collection; |
| collection.setDefaultFont(font1); |
| |
| QTextCharFormat tmp; |
| tmp.setFont(font2, overrideAll ? QTextCharFormat::FontPropertiesAll |
| : QTextCharFormat::FontPropertiesSpecifiedOnly); |
| int formatIndex = collection.indexForFormat(tmp); |
| QTextCharFormat f = collection.charFormat(formatIndex); |
| |
| if (overrideAll || (font2.resolve() & QFont::StyleHintResolved)) |
| QCOMPARE((int)f.font().styleHint(), (int)font2.styleHint()); |
| else |
| QCOMPARE((int)f.font().styleHint(), (int)font1.styleHint()); |
| if (overrideAll || (font2.resolve() & QFont::StyleStrategyResolved)) |
| QCOMPARE((int)f.font().styleStrategy(), (int)font2.styleStrategy()); |
| else |
| QCOMPARE((int)f.font().styleStrategy(), (int)font1.styleStrategy()); |
| if (overrideAll || (font2.resolve() & QFont::CapitalizationResolved)) |
| QCOMPARE((int)f.font().capitalization(), (int)font2.capitalization()); |
| else |
| QCOMPARE((int)f.font().capitalization(), (int)font1.capitalization()); |
| if (overrideAll || (font2.resolve() & QFont::KerningResolved)) |
| QCOMPARE(f.font().kerning(), font2.kerning()); |
| else |
| QCOMPARE(f.font().kerning(), font1.kerning()); |
| } |
| } |
| |
| void tst_QTextFormat::clearCollection() |
| { |
| QTextFormatCollection collection; |
| QFont f; |
| f.setUnderline(true); |
| collection.setDefaultFont(f); |
| QTextCharFormat charFormat; |
| charFormat.setFontStyleHint(QFont::SansSerif); |
| int formatIndex = collection.indexForFormat(charFormat); |
| QCOMPARE(formatIndex, 0); |
| QTextCharFormat charFormat2; |
| charFormat2.setUnderlineStyle(QTextCharFormat::SingleUnderline); |
| int formatIndex2 = collection.indexForFormat(charFormat2); |
| QCOMPARE(formatIndex2, 1); |
| QCOMPARE(collection.formats.count(), 2); |
| QCOMPARE(collection.hashes.count(), 2); |
| QCOMPARE(collection.defaultFont(), f); |
| |
| collection.clear(); |
| QCOMPARE(collection.formats.count(), 0); |
| QCOMPARE(collection.hashes.count(), 0); |
| QCOMPARE(collection.indexForFormat(charFormat2), 0); |
| QCOMPARE(collection.formats.count(), 1); |
| QCOMPARE(collection.hashes.count(), 1); |
| QCOMPARE(collection.defaultFont(), f); // kept, QTextDocument::clear or setPlainText should not reset the font set by setDefaultFont |
| } |
| |
| QTEST_MAIN(tst_QTextFormat) |
| #include "tst_qtextformat.moc" |