void testExportAsSinglePage() { // Same testcase as testVerticalScaling, for now fillModel(1, 40); Report report; report.setReportMode(Report::SpreadSheet); report.mainTable()->setAutoTableElement(AutoTableElement(&m_model)); report.scaleTo(1, 2); // must cram 40 rows into 2 page vertically QFont font = QFont(QLatin1String(s_fontName)); font.setPointSize(86); // huge :) report.setDefaultFont(font); //QCOMPARE(report.numberOfPages(), 2); //report.exportToFile( "testExportAsSinglePage.pdf" ); // for debugging QTemporaryFile tempFile; QVERIFY(tempFile.open()); const QString filename = tempFile.fileName(); tempFile.close(); const QSize size(1000, 2000); bool ok = report.exportToImage( size, filename, "PNG" ); QVERIFY(ok); QVERIFY(QFile::exists(filename)); QPixmap pix; QVERIFY(pix.load(filename)); QCOMPARE(pix.size(), size); QCOMPARE(report.mainTable()->pageRects()[0], QRect(0,0,1,40)); QVERIFY(report.mainTable()->lastAutoFontScalingFactor() > 0.9999); // The only way to truly validate that it worked, though, is to open test-export.jpg and check... QFile::remove(filename); }
void testOnePageLayout() { SKIP_IF_FONT_NOT_FOUND fillModel(4, 8); Report report; report.setReportMode(Report::SpreadSheet); report.setDefaultFont(QFont(QLatin1String(s_fontName), 14)); report.mainTable()->setAutoTableElement(AutoTableElement(&m_model)); QCOMPARE(report.numberOfPages(), 1); QCOMPARE(report.mainTable()->pageRects(), QList<QRect>() << QRect(0,0,4,8)); QCOMPARE(report.mainTable()->lastAutoFontScalingFactor(), 1.0); }
void testVertAndHorizScaling() { fillModel(4, 20); // 20 rows Report report; report.setReportMode(Report::SpreadSheet); report.mainTable()->setAutoTableElement(AutoTableElement(&m_model)); report.scaleTo(2, 1); // must cram 20 rows into 1 page vertically report.setDefaultFont(QFont(QLatin1String(s_fontName), 48)); QCOMPARE(report.numberOfPages(), 2); QVERIFY(report.mainTable()->lastAutoFontScalingFactor() < 0.8); //qDebug() << report.mainTable()->pageRects(); QCOMPARE(report.mainTable()->pageRects(), QList<QRect>() << QRect(0,0,2,20) << QRect(2,0,2,20)); }
void testScaleToHuge() { SKIP_IF_FONT_NOT_FOUND fillModel(2, 2); Report report; report.setReportMode(Report::SpreadSheet); report.mainTable()->setAutoTableElement(AutoTableElement(&m_model)); report.scaleTo(4, 4); // that's much more than we need // Expected result: columns are split on the 2 pages horizontally, but rows are kept together report.setDefaultFont(QFont(QLatin1String(s_fontName), 48)); QCOMPARE(report.numberOfPages(), 2); QCOMPARE(report.mainTable()->lastAutoFontScalingFactor(), 1.0); QCOMPARE(report.mainTable()->pageRects(), QList<QRect>() << QRect(0,0,1,2) << QRect(1,0,1,2)); }
void testHorizontalScaling() { fillModel(10, 4); // 10 columns Report report; report.setReportMode(Report::SpreadSheet); report.mainTable()->setAutoTableElement(AutoTableElement(&m_model)); report.scaleTo(2, 1); // must fit in two pages horizontally report.setDefaultFont(QFont(QLatin1String(s_fontName), 48)); QCOMPARE(report.numberOfPages(), 2); QVERIFY(report.mainTable()->lastAutoFontScalingFactor() < 0.8); //qDebug() << report.mainTable()->pageRects(); const int columns = report.mainTable()->pageRects()[0].width(); Q_ASSERT(columns == 5 || columns == 6); // I get 6 on linux, but 5 on Windows QCOMPARE(report.mainTable()->pageRects(), QList<QRect>() << QRect(0,0,columns,4) << QRect(columns,0,10-columns,4)); }
void testVerticalScaling() // when scaleTo doesn't have enough room vertically { fillModel(1, 40); Report report; report.setReportMode(Report::SpreadSheet); report.mainTable()->setAutoTableElement(AutoTableElement(&m_model)); report.scaleTo(1, 2); // must cram 40 rows into 2 page vertically QFont font = QFont(QLatin1String(s_fontName)); font.setPointSize(86); report.setDefaultFont(font); QCOMPARE(report.numberOfPages(), 2); QVERIFY(report.mainTable()->lastAutoFontScalingFactor() < 0.8); QCOMPARE(report.mainTable()->pageRects()[0], QRect(0,0,1,20)); QCOMPARE(report.mainTable()->pageRects()[1], QRect(0,20,1,20)); }
void testVerticalHeader() { // Check that the font for vertical headers is taken into account // in the layouting. // For that, we make it huge, and we check that the report takes two pages. fillModel(4, 20); Report report; report.setReportMode(Report::SpreadSheet); report.setDefaultFont(QFont(QLatin1String(s_fontName), 8)); report.mainTable()->setVerticalHeaderFont(QFont(QLatin1String("courier"), 30)); AutoTableElement tableElement(&m_model); tableElement.setVerticalHeaderVisible(true); tableElement.setPadding(3); report.mainTable()->setAutoTableElement(tableElement); QCOMPARE(report.numberOfPages(), 2); }
void testHorizForcedBreaking() { SKIP_IF_FONT_NOT_FOUND // There would be room for a single page horizontally, but the user forced 2 fillModel(2, 10); Report report; report.setReportMode(Report::SpreadSheet); report.mainTable()->setAutoTableElement(AutoTableElement(&m_model)); report.scaleTo(2, 1); report.setDefaultFont(QFont(QLatin1String(s_fontName), 48)); QCOMPARE(report.numberOfPages(), 2); QCOMPARE(report.mainTable()->lastAutoFontScalingFactor(), 1.0); //qDebug() << report.mainTable()->pageRects(); QCOMPARE(report.mainTable()->pageRects(), QList<QRect>() << QRect(0,0,1,10) << QRect(1,0,1,10)); }
void testMaxVerticPages() { QFETCH(int, numColumns); QFETCH(int, numRows); QFETCH(int, maxHorizPages); QFETCH(int, maxVerticPages); QFETCH(int, minVerticPages); QFETCH(int, verticalHeaderFontSize); QFETCH(int, horizontalHeaderFontSize); fillModel(numColumns, numRows, true /*small cells*/); for (int i = 0; i < numRows; ++i) { m_model.setVerticalHeaderItem(i, new QStandardItem(QString::fromLatin1("Row_%1").arg(i))); } Report report; report.setReportMode(Report::SpreadSheet); const QString fontName = QString::fromLatin1("Arial"); QFont font(fontName); font.setPointSize(10); report.setDefaultFont(font); report.scaleTo(maxHorizPages, maxVerticPages); AutoTableElement tableElement(&m_model); tableElement.setHorizontalHeaderVisible(horizontalHeaderFontSize > 0); tableElement.setVerticalHeaderVisible(verticalHeaderFontSize > 0); tableElement.setPadding(3); report.mainTable()->setAutoTableElement(tableElement); if (horizontalHeaderFontSize > 0) report.mainTable()->setHorizontalHeaderFont(QFont(fontName, horizontalHeaderFontSize)); if (verticalHeaderFontSize > 0) { QFont vHeaderFont(fontName, verticalHeaderFontSize); qDebug() << "vHeaderFont:" << vHeaderFont << QFontInfo( vHeaderFont ).family() << QFontMetricsF( vHeaderFont ).height(); report.mainTable()->setVerticalHeaderFont(vHeaderFont); } report.setTableBreakingPageOrder(Report::RightThenDown); qDebug() << "numberOfPages=" << report.numberOfPages(); // If this is >, then KDReports is not respecting the scaleTo API. QVERIFY(report.numberOfPages() <= maxHorizPages*maxVerticPages); #ifndef Q_OS_WIN qDebug() << maxHorizPages << "*" << minVerticPages << "=" << maxHorizPages*minVerticPages; // If the DPI is known, we can even check that we're not down-scaling too much. QVERIFY(report.numberOfPages() >= maxHorizPages*minVerticPages); #else Q_UNUSED(minVerticPages); #endif }
void testFontScaling() { SKIP_IF_FONT_NOT_FOUND fillModel(2, 25); Report report; report.setReportMode(Report::SpreadSheet); report.setDefaultFont(QFont(QLatin1String(s_fontName), 48)); AutoTableElement tableElement(&m_model); tableElement.setHorizontalHeaderVisible(false); tableElement.setVerticalHeaderVisible(false); report.mainTable()->setAutoTableElement(tableElement); QCOMPARE(report.numberOfPages(), 2); QCOMPARE(report.mainTable()->pageRects().count(), 2); #ifndef Q_OS_MAC // Somehow the mac gets different font size for the headers, even compared to linux with DPI 72. const int rowsFirstPage = report.mainTable()->pageRects()[0].height(); QVERIFY(rowsFirstPage <= 20); QVERIFY(rowsFirstPage >= 18); QCOMPARE(report.mainTable()->pageRects()[0], QRect(0,0,2,rowsFirstPage)); QCOMPARE(report.mainTable()->pageRects()[1], QRect(0,rowsFirstPage,2,m_model.rowCount()-rowsFirstPage)); // Now show a huge horizontal header, and check we have less rows per page tableElement.setHorizontalHeaderVisible(true); report.mainTable()->setAutoTableElement(tableElement); report.mainTable()->setHorizontalHeaderFont(QFont(QLatin1String(s_fontName), 48)); QCOMPARE(report.numberOfPages(), 2); QVERIFY(report.mainTable()->pageRects()[0].height() < rowsFirstPage); // Now force a very small font scaling factor report.setFontScalingFactor(0.2); QCOMPARE(report.numberOfPages(), 1); QCOMPARE(report.mainTable()->lastAutoFontScalingFactor(), 0.2); QCOMPARE(report.mainTable()->pageRects()[0], QRect(0,0,2,m_model.rowCount())); #endif }
void testWithHeaders() { fillModel(4, 20); Report report; report.setReportMode(Report::SpreadSheet); report.setDefaultFont(QFont(QLatin1String(s_fontName), 8)); // A page header with a huge font KDReports::Header& header = report.header( KDReports::FirstPage ); header.setDefaultFont(QFont(QLatin1String("courier"), 40)); header.addElement( KDReports::TextElement( "This is the page header.\nIt's big.\nVery\nbig.\nHuge." ) ); AutoTableElement tableElement(&m_model); tableElement.setVerticalHeaderVisible(true); tableElement.setPadding(3); report.mainTable()->setAutoTableElement(tableElement); //report.exportToFile( "testWithHeaders.pdf" ); // for debugging #ifndef Q_OS_MAC QCOMPARE(report.numberOfPages(), 2); #endif }
void testSimpleScaleTo() { SKIP_IF_FONT_NOT_FOUND fillModel(4, 8); Report report; report.setReportMode(Report::SpreadSheet); report.setDefaultFont(QFont(QLatin1String(s_fontName), 14)); report.mainTable()->setAutoTableElement(AutoTableElement(&m_model)); report.scaleTo(1, 4); QCOMPARE(report.numberOfPages(), 1); // it fits QCOMPARE(report.mainTable()->lastAutoFontScalingFactor(), 1.0); QCOMPARE(report.mainTable()->pageRects(), QList<QRect>() << QRect(0,0,4,8)); report.scaleTo(4, 1); QCOMPARE(report.numberOfPages(), 4); // one column per page QCOMPARE(report.mainTable()->lastAutoFontScalingFactor(), 1.0); QCOMPARE(report.mainTable()->pageRects()[0], QRect(0,0,1,8)); QCOMPARE(report.mainTable()->pageRects()[1], QRect(1,0,1,8)); QCOMPARE(report.mainTable()->pageRects()[2], QRect(2,0,1,8)); QCOMPARE(report.mainTable()->pageRects()[3], QRect(3,0,1,8)); }
void test4000SmallCells() { fillModel(40, 100, true /*small cells*/); Report report; report.setReportMode(Report::SpreadSheet); AutoTableElement tableElement(&m_model); tableElement.setVerticalHeaderVisible(false); tableElement.setPadding(3); report.mainTable()->setAutoTableElement(tableElement); QFont font(QLatin1String("Arial")); font.setPixelSize(19); report.setDefaultFont(font); report.scaleTo(2, 50); report.mainTable()->setTableBreakingPageOrder(Report::RightThenDown); QCOMPARE(report.numberOfPages(), 6); // With point size 10, initially I was getting 0.583037. With FontScaler: 0.524504. // With pixel sizes: 0.478, on both machines. // Autobuild on linux gets 37 rows instead of 43, though (taller font, by one pixel...) qDebug() << report.mainTable()->lastAutoFontScalingFactor(); #ifdef Q_OS_MAC // Bah, fonts change too much. return; QVERIFY(report.mainTable()->lastAutoFontScalingFactor() >= 0.37); QVERIFY(report.mainTable()->lastAutoFontScalingFactor() <= 0.39); #else QVERIFY(report.mainTable()->lastAutoFontScalingFactor() >= 0.45); QVERIFY(report.mainTable()->lastAutoFontScalingFactor() <= 0.50); #endif const int rows = report.mainTable()->pageRects()[0].height(); qDebug() << rows << "rows"; QVERIFY(rows >= 37); QVERIFY(rows <= 48); const int columns = report.mainTable()->pageRects()[0].width(); QVERIFY(columns >= 20); QVERIFY(columns <= 21); //qDebug() << report.mainTable()->pageRects(); QCOMPARE(report.mainTable()->pageRects()[0], QRect(0,0,columns,rows)); QCOMPARE(report.mainTable()->pageRects()[1], QRect(columns,0,40-columns,rows)); QCOMPARE(report.mainTable()->pageRects()[2], QRect(0,rows,columns,rows)); QCOMPARE(report.mainTable()->pageRects()[3], QRect(columns,rows,40-columns,rows)); QCOMPARE(report.mainTable()->pageRects()[4], QRect(0,2*rows,columns,100-2*rows)); QCOMPARE(report.mainTable()->pageRects()[5], QRect(columns,2*rows,40-columns,100-2*rows)); report.setTableBreakingPageOrder(Report::DownThenRight); //qDebug() << report.mainTable()->pageRects(); QCOMPARE(report.mainTable()->pageRects(), QList<QRect>() << QRect(0,0,columns,rows) << QRect(0,rows,columns,rows) << QRect(0,2*rows,columns,100-2*rows) << QRect(columns,0,40-columns,rows) << QRect(columns,rows,40-columns,rows) << QRect(columns,2*rows,40-columns,100-2*rows)); }