From b2173b54ef9ede85d88cb0fdf025b26e732ed44a Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Thu, 5 Jan 2017 15:43:21 +0100 Subject: Long live QTest::addRow()! This new function does the same as newRow(), except that it has a less confusing name (in line with _add_Column()), and accepts printf-style arguments to avoid the need to newRow(qPrintable(QString::asprintf())), a common pattern in client code. It uses qvsnprintf() under the hoods, avoiding the need for the QString const char* round-trip. Port all in-tree users of newRow(qPrintable(QString::asnprintf())) to the new function. Change-Id: Icd5de9b7ea4f6759d98080ec30f5aecadb8bec39 Reviewed-by: Thiago Macieira --- .../doc/snippets/code/src_qtestlib_qtestcase.cpp | 11 ++++++ src/testlib/qtestcase.cpp | 42 ++++++++++++++++++++++ src/testlib/qtestcase.h | 1 + 3 files changed, 54 insertions(+) (limited to 'src') diff --git a/src/testlib/doc/snippets/code/src_qtestlib_qtestcase.cpp b/src/testlib/doc/snippets/code/src_qtestlib_qtestcase.cpp index 2c57550c3d..01ee8102f4 100644 --- a/src/testlib/doc/snippets/code/src_qtestlib_qtestcase.cpp +++ b/src/testlib/doc/snippets/code/src_qtestlib_qtestcase.cpp @@ -208,6 +208,17 @@ void myTestFunction_data() //! [20] +//! [addRow] +void myTestFunction_data() +{ + QTest::addColumn("input"); + QTest::addColumn("output"); + QTest::addRow("%d", 0) << 0 << QString("0"); + QTest::addRow("%d", 1) << 1 << QString("1"); +} +//! [addRow] + + //! [21] void myTestFunction_data() { QTest::addColumn("intval"); diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp index 1f07ff3f91..98faf55266 100644 --- a/src/testlib/qtestcase.cpp +++ b/src/testlib/qtestcase.cpp @@ -2195,6 +2195,48 @@ QTestData &QTest::newRow(const char *dataTag) return *tbl->newData(dataTag); } +/*! + \since 5.9 + + Appends a new row to the current test data. The function's arguments are passed + to qsnprintf() for formatting according to \a format. See the qvsnprintf() + documentation for caveats and limitations. + + The formatted string will appear as the name of this test data in the test output. + + Returns a QTestData reference that can be used to stream in data. + + Example: + \snippet code/src_qtestlib_qtestcase.cpp addRow + + \b {Note:} This function can only be used in a test's data function + that is invoked by the test framework. + + See \l {Chapter 2: Data Driven Testing}{Data Driven Testing} for + a more extensive example. + + \sa addColumn(), QFETCH() +*/ +QTestData &QTest::addRow(const char *format, ...) +{ + QTEST_ASSERT_X(format, "QTest::addRow()", "Format string cannot be null"); + QTestTable *tbl = QTestTable::currentTestTable(); + QTEST_ASSERT_X(tbl, "QTest::addRow()", "Cannot add testdata outside of a _data slot."); + QTEST_ASSERT_X(tbl->elementCount(), "QTest::addRow()", "Must add columns before attempting to add rows."); + + char buf[1024]; + + va_list va; + va_start(va, format); + // we don't care about failures, we accept truncation, as well as trailing garbage. + // Names with more than 1K characters are nonsense, anyway. + (void)qvsnprintf(buf, sizeof buf, format, va); + buf[sizeof buf - 1] = '\0'; + va_end(va); + + return *tbl->newData(buf); +} + /*! \fn void QTest::addColumn(const char *name, T *dummy = 0) Adds a column with type \c{T} to the current test data. diff --git a/src/testlib/qtestcase.h b/src/testlib/qtestcase.h index 4c226830e9..058c0b3295 100644 --- a/src/testlib/qtestcase.h +++ b/src/testlib/qtestcase.h @@ -316,6 +316,7 @@ namespace QTest addColumnInternal(qMetaTypeId(), name); } Q_TESTLIB_EXPORT QTestData &newRow(const char *dataTag); + Q_TESTLIB_EXPORT QTestData &addRow(const char *format, ...) Q_ATTRIBUTE_FORMAT_PRINTF(1, 2); template inline bool qCompare(T const &t1, T const &t2, const char *actual, const char *expected, -- cgit v1.2.3