From f26928cccf7e0fd9f06236476f2a6b52151e5dca Mon Sep 17 00:00:00 2001 From: Konstantin Ritt Date: Fri, 17 Jan 2014 17:38:55 +0200 Subject: Allow QTextCharFormat::setFont() to skip unresolved font props This makes the font merging possible and solves an issue with the default font properties inheritance when used in conjunction with QTextFormatCollection. Change-Id: If8b543c011122dde9f086f5d696df3b042f7b90c Reviewed-by: Lars Knoll --- tests/auto/gui/text/qtextformat/qtextformat.pro | 2 +- .../auto/gui/text/qtextformat/tst_qtextformat.cpp | 243 +++++++++++++++++++++ 2 files changed, 244 insertions(+), 1 deletion(-) (limited to 'tests/auto/gui') diff --git a/tests/auto/gui/text/qtextformat/qtextformat.pro b/tests/auto/gui/text/qtextformat/qtextformat.pro index b137dac9eb..c64d266916 100644 --- a/tests/auto/gui/text/qtextformat/qtextformat.pro +++ b/tests/auto/gui/text/qtextformat/qtextformat.pro @@ -1,5 +1,5 @@ CONFIG += testcase CONFIG += parallel_test TARGET = tst_qtextformat -QT += testlib +QT += testlib core-private gui-private SOURCES += tst_qtextformat.cpp diff --git a/tests/auto/gui/text/qtextformat/tst_qtextformat.cpp b/tests/auto/gui/text/qtextformat/tst_qtextformat.cpp index 1eb073d3b4..beb5069f06 100644 --- a/tests/auto/gui/text/qtextformat/tst_qtextformat.cpp +++ b/tests/auto/gui/text/qtextformat/tst_qtextformat.cpp @@ -46,6 +46,7 @@ #include #include #include +#include #include #include #include @@ -68,6 +69,10 @@ private slots: void getSetTabs(); void testTabsUsed(); void testFontStyleSetters(); + void setFont_data(); + void setFont(); + void setFont_collection_data(); + void setFont_collection(); }; /*! \internal @@ -410,5 +415,243 @@ void tst_QTextFormat::testFontStyleSetters() QCOMPARE(format.font().kerning(), false); } +Q_DECLARE_METATYPE(QTextCharFormat) + +void tst_QTextFormat::setFont_data() +{ + QTest::addColumn("format1"); + QTest::addColumn("format2"); + QTest::addColumn("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()); + } +} + QTEST_MAIN(tst_QTextFormat) #include "tst_qtextformat.moc" -- cgit v1.2.3