summaryrefslogtreecommitdiffstats
path: root/tests/auto
diff options
context:
space:
mode:
authoraxis <qt-info@nokia.com>2009-05-06 06:55:50 (GMT)
committeraxis <qt-info@nokia.com>2009-05-06 06:55:50 (GMT)
commitb246f8a8beab858468777f433f49faf62edcb07e (patch)
tree120844101aca654bf2f69fef5ea2647bf0bee13a /tests/auto
parent5791fde8526afc49cdbeee080ead9e8a305e3cd5 (diff)
parenta1d2c3c589a03cc427dcc22d109003576add9500 (diff)
downloadQt-b246f8a8beab858468777f433f49faf62edcb07e.zip
Qt-b246f8a8beab858468777f433f49faf62edcb07e.tar.gz
Qt-b246f8a8beab858468777f433f49faf62edcb07e.tar.bz2
Merge branch '4.5' of git@scm.dev.nokia.troll.no:qt/qt
Diffstat (limited to 'tests/auto')
-rw-r--r--tests/auto/qfiledialog/tst_qfiledialog.cpp13
-rw-r--r--tests/auto/qgl/tst_qgl.cpp65
-rw-r--r--tests/auto/qitemselectionmodel/tst_qitemselectionmodel.cpp46
-rw-r--r--tests/auto/qlistview/tst_qlistview.cpp28
-rw-r--r--tests/auto/qnetworkcookie/tst_qnetworkcookie.cpp8
-rw-r--r--tests/auto/qnetworkcookiejar/tst_qnetworkcookiejar.cpp11
-rw-r--r--tests/auto/qpainter/tst_qpainter.cpp18
-rw-r--r--tests/auto/qpixmapcache/tst_qpixmapcache.cpp10
-rw-r--r--tests/auto/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp18
-rw-r--r--tests/auto/qstylesheetstyle/tst_qstylesheetstyle.cpp3
-rw-r--r--tests/auto/qtconcurrentmap/tst_qtconcurrentmap.cpp31
-rw-r--r--tests/auto/qwidget/tst_qwidget.cpp200
-rw-r--r--tests/auto/windowsmobile/test/ddhelper.cpp121
-rw-r--r--tests/auto/windowsmobile/test/ddhelper.h21
-rw-r--r--tests/auto/windowsmobile/test/test.pro24
-rw-r--r--tests/auto/windowsmobile/test/testQMenuBar_current.pngbin0 -> 23702 bytes
-rw-r--r--tests/auto/windowsmobile/test/testSimpleWidget_current.pngbin0 -> 21940 bytes
-rw-r--r--tests/auto/windowsmobile/test/tst_windowsmobile.cpp191
-rw-r--r--tests/auto/windowsmobile/test/windowsmobile.qrc6
-rw-r--r--tests/auto/windowsmobile/testQMenuBar/main.cpp72
-rw-r--r--tests/auto/windowsmobile/testQMenuBar/testQMenuBar.pro2
-rw-r--r--tests/auto/windowsmobile/windowsmobile.pro9
22 files changed, 892 insertions, 5 deletions
diff --git a/tests/auto/qfiledialog/tst_qfiledialog.cpp b/tests/auto/qfiledialog/tst_qfiledialog.cpp
index f554b6f..f5bcfec 100644
--- a/tests/auto/qfiledialog/tst_qfiledialog.cpp
+++ b/tests/auto/qfiledialog/tst_qfiledialog.cpp
@@ -1609,6 +1609,19 @@ void tst_QFiledialog::task227304_proxyOnFileDialog()
QTest::keyClick(list, Qt::Key_Return);
QTest::qWait(200);
+ dialog->close();
+ fd.close();
+
+ QNonNativeFileDialog fd2(0, "I should not crash with a proxy", QDir::tempPath(), 0);
+ QSortFilterProxyModel *pm = new QSortFilterProxyModel;
+ fd2.setProxyModel(pm);
+ fd2.show();
+ QSidebar *sidebar = qFindChild<QSidebar*>(&fd2, "sidebar");
+ sidebar->setFocus();
+ sidebar->selectUrl(QUrl::fromLocalFile(QDir::homePath()));
+ QTest::mouseClick(sidebar->viewport(), Qt::LeftButton, 0, sidebar->visualRect(sidebar->model()->index(1, 0)).center());
+ QTest::qWait(250);
+ //We shouldn't crash
}
void tst_QFiledialog::task227930_correctNavigationKeyboardBehavior()
diff --git a/tests/auto/qgl/tst_qgl.cpp b/tests/auto/qgl/tst_qgl.cpp
index a64dfc4..69141f3 100644
--- a/tests/auto/qgl/tst_qgl.cpp
+++ b/tests/auto/qgl/tst_qgl.cpp
@@ -66,6 +66,8 @@ private slots:
void getSetCheck();
void openGLVersionCheck();
void graphicsViewClipping();
+ void partialGLWidgetUpdates_data();
+ void partialGLWidgetUpdates();
};
tst_QGL::tst_QGL()
@@ -404,5 +406,68 @@ void tst_QGL::graphicsViewClipping()
#endif
}
+void tst_QGL::partialGLWidgetUpdates_data()
+{
+ QTest::addColumn<bool>("doubleBufferedContext");
+ QTest::addColumn<bool>("autoFillBackground");
+ QTest::addColumn<bool>("supportsPartialUpdates");
+
+ QTest::newRow("Double buffered context") << true << true << false;
+ QTest::newRow("Double buffered context without auto-fill background") << true << false << false;
+ QTest::newRow("Single buffered context") << false << true << false;
+ QTest::newRow("Single buffered context without auto-fill background") << false << false << true;
+}
+
+void tst_QGL::partialGLWidgetUpdates()
+{
+#ifdef QT_NO_OPENGL
+ QSKIP("QGL not yet supported", SkipAll);
+#else
+ if (!QGLFormat::hasOpenGL())
+ QSKIP("QGL not supported on this platform", SkipAll);
+
+ QFETCH(bool, doubleBufferedContext);
+ QFETCH(bool, autoFillBackground);
+ QFETCH(bool, supportsPartialUpdates);
+
+ class MyGLWidget : public QGLWidget
+ {
+ public:
+ QRegion paintEventRegion;
+ void paintEvent(QPaintEvent *e)
+ {
+ paintEventRegion = e->region();
+ }
+ };
+
+ QGLFormat format = QGLFormat::defaultFormat();
+ format.setDoubleBuffer(doubleBufferedContext);
+ QGLFormat::setDefaultFormat(format);
+
+ MyGLWidget widget;
+ widget.setFixedSize(150, 150);
+ widget.setAutoFillBackground(autoFillBackground);
+ widget.show();
+#ifdef Q_WS_X11
+ qt_x11_wait_for_window_manager(&widget);
+#endif
+ QTest::qWait(200);
+
+ if (widget.format().doubleBuffer() != doubleBufferedContext)
+ QSKIP("Platform does not support requested format", SkipAll);
+
+ widget.paintEventRegion = QRegion();
+ widget.repaint(50, 50, 50, 50);
+#ifdef Q_WS_MAC
+ // repaint() is not immediate on the Mac; it has to go through the event loop.
+ QTest::qWait(200);
+#endif
+ if (supportsPartialUpdates)
+ QCOMPARE(widget.paintEventRegion, QRegion(50, 50, 50, 50));
+ else
+ QCOMPARE(widget.paintEventRegion, QRegion(widget.rect()));
+#endif
+}
+
QTEST_MAIN(tst_QGL)
#include "tst_qgl.moc"
diff --git a/tests/auto/qitemselectionmodel/tst_qitemselectionmodel.cpp b/tests/auto/qitemselectionmodel/tst_qitemselectionmodel.cpp
index 15b36b8..9bd1ce3 100644
--- a/tests/auto/qitemselectionmodel/tst_qitemselectionmodel.cpp
+++ b/tests/auto/qitemselectionmodel/tst_qitemselectionmodel.cpp
@@ -89,6 +89,7 @@ private slots:
void merge_data();
void merge();
void task119433_isRowSelected();
+ void task252069_rowIntersectsSelection();
private:
QAbstractItemModel *model;
@@ -2140,6 +2141,51 @@ void tst_QItemSelectionModel::task119433_isRowSelected()
QVERIFY(sel.isRowSelected(0, QModelIndex()));
}
+void tst_QItemSelectionModel::task252069_rowIntersectsSelection()
+{
+ QStandardItemModel m;
+ for (int i=0; i<8; ++i) {
+ for (int j=0; j<8; ++j) {
+ QStandardItem *item = new QStandardItem(QString("Item number %1").arg(i));
+ if ((i % 2 == 0 && j == 0) ||
+ (j % 2 == 0 && i == 0) ||
+ j == 5 || i == 5 ) {
+ item->setEnabled(false);
+ //item->setSelectable(false);
+ }
+ m.setItem(i, j, item);
+ }
+ }
+
+ QItemSelectionModel selected(&m);
+ //nothing is selected
+ QVERIFY(!selected.rowIntersectsSelection(0, QModelIndex()));
+ QVERIFY(!selected.rowIntersectsSelection(2, QModelIndex()));
+ QVERIFY(!selected.rowIntersectsSelection(3, QModelIndex()));
+ QVERIFY(!selected.rowIntersectsSelection(5, QModelIndex()));
+ QVERIFY(!selected.columnIntersectsSelection(0, QModelIndex()));
+ QVERIFY(!selected.columnIntersectsSelection(2, QModelIndex()));
+ QVERIFY(!selected.columnIntersectsSelection(3, QModelIndex()));
+ QVERIFY(!selected.columnIntersectsSelection(5, QModelIndex()));
+ selected.select(m.index(2, 0), QItemSelectionModel::Select | QItemSelectionModel::Rows);
+ QVERIFY(!selected.rowIntersectsSelection(0, QModelIndex()));
+ QVERIFY( selected.rowIntersectsSelection(2, QModelIndex()));
+ QVERIFY(!selected.rowIntersectsSelection(3, QModelIndex()));
+ QVERIFY(!selected.rowIntersectsSelection(5, QModelIndex()));
+ QVERIFY(!selected.columnIntersectsSelection(0, QModelIndex()));
+ QVERIFY( selected.columnIntersectsSelection(2, QModelIndex()));
+ QVERIFY( selected.columnIntersectsSelection(3, QModelIndex()));
+ QVERIFY(!selected.columnIntersectsSelection(5, QModelIndex()));
+ selected.select(m.index(0, 5), QItemSelectionModel::Select | QItemSelectionModel::Columns);
+ QVERIFY(!selected.rowIntersectsSelection(0, QModelIndex()));
+ QVERIFY( selected.rowIntersectsSelection(2, QModelIndex()));
+ QVERIFY(!selected.rowIntersectsSelection(3, QModelIndex()));
+ QVERIFY(!selected.rowIntersectsSelection(5, QModelIndex()));
+ QVERIFY(!selected.columnIntersectsSelection(0, QModelIndex()));
+ QVERIFY( selected.columnIntersectsSelection(2, QModelIndex()));
+ QVERIFY( selected.columnIntersectsSelection(3, QModelIndex()));
+ QVERIFY(!selected.columnIntersectsSelection(5, QModelIndex()));
+}
QTEST_MAIN(tst_QItemSelectionModel)
#include "tst_qitemselectionmodel.moc"
diff --git a/tests/auto/qlistview/tst_qlistview.cpp b/tests/auto/qlistview/tst_qlistview.cpp
index cf20680..db11447 100644
--- a/tests/auto/qlistview/tst_qlistview.cpp
+++ b/tests/auto/qlistview/tst_qlistview.cpp
@@ -107,6 +107,7 @@ private slots:
void task203585_selectAll();
void task228566_infiniteRelayout();
void task248430_crashWith0SizedItem();
+ void task250446_scrollChanged();
};
// Testing get/set functions
@@ -1530,5 +1531,32 @@ void tst_QListView::task248430_crashWith0SizedItem()
QTest::qWait(100);
}
+void tst_QListView::task250446_scrollChanged()
+{
+ QStandardItemModel model(200, 1);
+ QListView view;
+ view.setModel(&model);
+ QModelIndex index = model.index(0, 0);
+ QVERIFY(index.isValid());
+ view.setCurrentIndex(index);
+ view.show();
+ QTest::qWait(100);
+ const int scrollValue = view.verticalScrollBar()->maximum();
+ view.verticalScrollBar()->setValue(scrollValue);
+ QCOMPARE(view.verticalScrollBar()->value(), scrollValue);
+ QCOMPARE(view.currentIndex(), index);
+
+ view.showMinimized();
+ QTest::qWait(100);
+ QCOMPARE(view.verticalScrollBar()->value(), scrollValue);
+ QCOMPARE(view.currentIndex(), index);
+
+ view.showNormal();
+ QTest::qWait(100);
+ QCOMPARE(view.verticalScrollBar()->value(), scrollValue);
+ QCOMPARE(view.currentIndex(), index);
+}
+
+
QTEST_MAIN(tst_QListView)
#include "tst_qlistview.moc"
diff --git a/tests/auto/qnetworkcookie/tst_qnetworkcookie.cpp b/tests/auto/qnetworkcookie/tst_qnetworkcookie.cpp
index 36a4b45..4ee5b9f 100644
--- a/tests/auto/qnetworkcookie/tst_qnetworkcookie.cpp
+++ b/tests/auto/qnetworkcookie/tst_qnetworkcookie.cpp
@@ -234,7 +234,7 @@ void tst_QNetworkCookie::parseSingleCookie_data()
QTest::newRow("path-with-utf8-2") << "a=b;path=/R%C3%A9sum%C3%A9" << cookie;
cookie.setPath(QString());
- cookie.setDomain("trolltech.com");
+ cookie.setDomain(".trolltech.com");
QTest::newRow("plain-domain1") << "a=b;domain=trolltech.com" << cookie;
QTest::newRow("plain-domain2") << "a=b; domain=trolltech.com " << cookie;
QTest::newRow("plain-domain3") << "a=b;domain=TROLLTECH.COM" << cookie;
@@ -246,7 +246,7 @@ void tst_QNetworkCookie::parseSingleCookie_data()
QTest::newRow("dot-domain3") << "a=b; domain=.TROLLTECH.COM" << cookie;
QTest::newRow("dot-domain4") << "a=b; Domain = .TROLLTECH.COM" << cookie;
- cookie.setDomain(QString::fromUtf8("d\303\270gn\303\245pent.troll.no"));
+ cookie.setDomain(QString::fromUtf8(".d\303\270gn\303\245pent.troll.no"));
QTest::newRow("idn-domain1") << "a=b;domain=xn--dgnpent-gxa2o.troll.no" << cookie;
QTest::newRow("idn-domain2") << "a=b;domain=d\303\270gn\303\245pent.troll.no" << cookie;
QTest::newRow("idn-domain3") << "a=b;domain=XN--DGNPENT-GXA2O.TROLL.NO" << cookie;
@@ -259,7 +259,7 @@ void tst_QNetworkCookie::parseSingleCookie_data()
QTest::newRow("dot-idn-domain3") << "a=b;domain=.XN--DGNPENT-GXA2O.TROLL.NO" << cookie;
QTest::newRow("dot-idn-domain4") << "a=b;domain=.D\303\230GN\303\205PENT.troll.NO" << cookie;
- cookie.setDomain("trolltech.com");
+ cookie.setDomain(".trolltech.com");
cookie.setPath("/");
QTest::newRow("two-fields") << "a=b;domain=trolltech.com;path=/" << cookie;
QTest::newRow("two-fields2") << "a=b; domain=trolltech.com; path=/" << cookie;
@@ -662,7 +662,7 @@ void tst_QNetworkCookie::parseMultipleCookies_data()
QTest::newRow("complex-1") << "c=d, a=, foo=bar; path=/" << list;
cookie.setName("baz");
- cookie.setDomain("trolltech.com");
+ cookie.setDomain(".trolltech.com");
list.prepend(cookie);
QTest::newRow("complex-2") << "baz=bar; path=/; domain=trolltech.com, c=d,a=,foo=bar; path=/" << list;
diff --git a/tests/auto/qnetworkcookiejar/tst_qnetworkcookiejar.cpp b/tests/auto/qnetworkcookiejar/tst_qnetworkcookiejar.cpp
index e87a3bf..7aa1d24 100644
--- a/tests/auto/qnetworkcookiejar/tst_qnetworkcookiejar.cpp
+++ b/tests/auto/qnetworkcookiejar/tst_qnetworkcookiejar.cpp
@@ -171,6 +171,17 @@ void tst_QNetworkCookieJar::setCookiesFromUrl_data()
result.clear();
result += finalCookie;
QTest::newRow("defaults-2") << preset << cookie << "http://www.foo.tld" << result << true;
+
+ // security test: do not accept cookie domains like ".com" nor ".com." (see RFC 2109 section 4.3.2)
+ result.clear();
+ preset.clear();
+ cookie.setDomain(".com");
+ QTest::newRow("rfc2109-4.3.2-ex3") << preset << cookie << "http://x.foo.com" << result << false;
+
+ result.clear();
+ preset.clear();
+ cookie.setDomain(".com.");
+ QTest::newRow("rfc2109-4.3.2-ex3-2") << preset << cookie << "http://x.foo.com" << result << false;
}
void tst_QNetworkCookieJar::setCookiesFromUrl()
diff --git a/tests/auto/qpainter/tst_qpainter.cpp b/tests/auto/qpainter/tst_qpainter.cpp
index 0cb8346..b813d1d 100644
--- a/tests/auto/qpainter/tst_qpainter.cpp
+++ b/tests/auto/qpainter/tst_qpainter.cpp
@@ -229,6 +229,8 @@ private slots:
void extendedBlendModes();
+ void zeroOpacity();
+
private:
void fillData();
QColor baseColor( int k, int intensity=255 );
@@ -4153,5 +4155,21 @@ void tst_QPainter::extendedBlendModes()
QVERIFY(testCompositionMode(191, 191, 96, QPainter::CompositionMode_Exclusion));
}
+void tst_QPainter::zeroOpacity()
+{
+ QImage source(1, 1, QImage::Format_ARGB32_Premultiplied);
+ source.fill(0xffffffff);
+
+ QImage target(1, 1, QImage::Format_RGB32);
+ target.fill(0xff000000);
+
+ QPainter p(&target);
+ p.setOpacity(0.0);
+ p.drawImage(0, 0, source);
+ p.end();
+
+ QCOMPARE(target.pixel(0, 0), 0xff000000);
+}
+
QTEST_MAIN(tst_QPainter)
#include "tst_qpainter.moc"
diff --git a/tests/auto/qpixmapcache/tst_qpixmapcache.cpp b/tests/auto/qpixmapcache/tst_qpixmapcache.cpp
index c163b52..1f515ff 100644
--- a/tests/auto/qpixmapcache/tst_qpixmapcache.cpp
+++ b/tests/auto/qpixmapcache/tst_qpixmapcache.cpp
@@ -166,6 +166,16 @@ void tst_QPixmapCache::insert()
QVERIFY(estimatedNum - 1 <= num <= estimatedNum + 1);
QPixmap p3;
QPixmapCache::insert("null", p3);
+
+ QPixmap c1(10, 10);
+ c1.fill(Qt::yellow);
+ QPixmapCache::insert("custom", c1);
+ QVERIFY(!c1.isDetached());
+ QPixmap c2(10, 10);
+ c2.fill(Qt::red);
+ QPixmapCache::insert("custom", c2);
+ //We have deleted the old pixmap in the cache for the same key
+ QVERIFY(c1.isDetached());
}
void tst_QPixmapCache::remove()
diff --git a/tests/auto/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp b/tests/auto/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp
index 18aa5fc..bd66fdf 100644
--- a/tests/auto/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp
+++ b/tests/auto/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp
@@ -133,6 +133,7 @@ private slots:
void task248868_dynamicSorting();
void task250023_fetchMore();
void task251296_hiddenChildren();
+ void task252507_mapFromToSource();
protected:
void buildHierarchy(const QStringList &data, QAbstractItemModel *model);
@@ -2612,6 +2613,7 @@ class QtTestModel: public QAbstractItemModel
return fetched.contains(parent) ? rows : 0;
}
int columnCount(const QModelIndex& parent = QModelIndex()) const {
+ Q_UNUSED(parent);
return cols;
}
@@ -2717,6 +2719,22 @@ void tst_QSortFilterProxyModel::task251296_hiddenChildren()
QCOMPARE(proxy.data(indexC).toString(), QString::fromLatin1("C VISIBLE"));
}
+void tst_QSortFilterProxyModel::task252507_mapFromToSource()
+{
+ QtTestModel source(10,10);
+ source.fetchMore(QModelIndex());
+ QSortFilterProxyModel proxy;
+ proxy.setSourceModel(&source);
+ QCOMPARE(proxy.mapFromSource(source.index(5, 4)), proxy.index(5, 4));
+ QCOMPARE(proxy.mapToSource(proxy.index(3, 2)), source.index(3, 2));
+ QCOMPARE(proxy.mapFromSource(QModelIndex()), QModelIndex());
+ QCOMPARE(proxy.mapToSource(QModelIndex()), QModelIndex());
+
+ QTest::ignoreMessage(QtWarningMsg, "QSortFilterProxyModel: index from wrong model passed to mapToSource ");
+ QCOMPARE(proxy.mapToSource(source.index(2, 3)), QModelIndex());
+ QTest::ignoreMessage(QtWarningMsg, "QSortFilterProxyModel: index from wrong model passed to mapFromSource ");
+ QCOMPARE(proxy.mapFromSource(proxy.index(6, 2)), QModelIndex());
+}
QTEST_MAIN(tst_QSortFilterProxyModel)
#include "tst_qsortfilterproxymodel.moc"
diff --git a/tests/auto/qstylesheetstyle/tst_qstylesheetstyle.cpp b/tests/auto/qstylesheetstyle/tst_qstylesheetstyle.cpp
index aa63753..24ccecf 100644
--- a/tests/auto/qstylesheetstyle/tst_qstylesheetstyle.cpp
+++ b/tests/auto/qstylesheetstyle/tst_qstylesheetstyle.cpp
@@ -605,8 +605,9 @@ void tst_QStyleSheetStyle::palettePropagation()
QVERIFY(COLOR(gb) == Qt::red);
QVERIFY(COLOR(pb) == APPCOLOR(pb)); // palette shouldn't propagate
gb.setStyleSheet("QGroupBox * { color: red }");
+
QVERIFY(COLOR(pb) == Qt::red);
- QVERIFY(COLOR(gb) == APPCOLOR(pb));
+ QVERIFY(COLOR(gb) == APPCOLOR(gb));
QWidget window;
window.setStyleSheet("* { color: white; }");
diff --git a/tests/auto/qtconcurrentmap/tst_qtconcurrentmap.cpp b/tests/auto/qtconcurrentmap/tst_qtconcurrentmap.cpp
index 139eb6e..116f46e 100644
--- a/tests/auto/qtconcurrentmap/tst_qtconcurrentmap.cpp
+++ b/tests/auto/qtconcurrentmap/tst_qtconcurrentmap.cpp
@@ -74,6 +74,7 @@ private slots:
void incrementalResults();
void noDetatch();
void stlContainers();
+ void qFutureAssignmentLeak();
void stressTest();
public slots:
void throttling();
@@ -2323,6 +2324,36 @@ void tst_map::stlContainers()
#endif
}
+InstanceCounter ic_fn(const InstanceCounter & ic)
+{
+ return InstanceCounter(ic);
+};
+
+// Verify that held results are deleted when a future is
+// assigned over with operator ==
+void tst_map::qFutureAssignmentLeak()
+{
+ currentInstanceCount = 0;
+ peakInstanceCount = 0;
+ QFuture<InstanceCounter> future;
+ {
+ QList<InstanceCounter> list;
+ for (int i=0;i<1000;++i)
+ list += InstanceCounter();
+ future = QtConcurrent::mapped(list, ic_fn);
+ future.waitForFinished();
+
+ future = QtConcurrent::mapped(list, ic_fn);
+ future.waitForFinished();
+
+ future = QtConcurrent::mapped(list, ic_fn);
+ future.waitForFinished();
+ }
+
+ QCOMPARE(int(currentInstanceCount), 1000);
+ future = QFuture<InstanceCounter>();
+ QCOMPARE(int(currentInstanceCount), 0);
+}
inline void increment(int &num)
{
diff --git a/tests/auto/qwidget/tst_qwidget.cpp b/tests/auto/qwidget/tst_qwidget.cpp
index 110a4e0..6b994cd 100644
--- a/tests/auto/qwidget/tst_qwidget.cpp
+++ b/tests/auto/qwidget/tst_qwidget.cpp
@@ -290,6 +290,10 @@ private slots:
void render_task217815();
void render_windowOpacity();
void render_systemClip();
+ void render_systemClip2_data();
+ void render_systemClip2();
+ void render_systemClip3_data();
+ void render_systemClip3();
void setContentsMargins();
@@ -6962,6 +6966,202 @@ void tst_QWidget::render_systemClip()
#endif
}
+void tst_QWidget::render_systemClip2_data()
+{
+ QTest::addColumn<bool>("autoFillBackground");
+ QTest::addColumn<bool>("usePaintEvent");
+ QTest::addColumn<QColor>("expectedColor");
+
+ QTest::newRow("Only auto-fill background") << true << false << QColor(Qt::blue);
+ QTest::newRow("Only draw in paintEvent") << false << true << QColor(Qt::green);
+ QTest::newRow("Auto-fill background and draw in paintEvent") << true << true << QColor(Qt::green);
+}
+
+void tst_QWidget::render_systemClip2()
+{
+ QFETCH(bool, autoFillBackground);
+ QFETCH(bool, usePaintEvent);
+ QFETCH(QColor, expectedColor);
+
+ Q_ASSERT_X(expectedColor != QColor(Qt::red), Q_FUNC_INFO,
+ "Qt::red is the reference color for the image, pick another color");
+
+ class MyWidget : public QWidget
+ {
+ public:
+ bool usePaintEvent;
+ void paintEvent(QPaintEvent *)
+ {
+ if (usePaintEvent)
+ QPainter(this).fillRect(rect(), Qt::green);
+ }
+ };
+
+ MyWidget widget;
+ widget.usePaintEvent = usePaintEvent;
+ widget.setPalette(Qt::blue);
+ // NB! widget.setAutoFillBackground(autoFillBackground) won't do the
+ // trick here since the widget is a top-level. The background is filled
+ // regardless, unless Qt::WA_OpaquePaintEvent or Qt::WA_NoSystemBackground
+ // is set. We therefore use the opaque attribute to turn off auto-fill.
+ if (!autoFillBackground)
+ widget.setAttribute(Qt::WA_OpaquePaintEvent);
+ widget.resize(100, 100);
+
+ QImage image(widget.size(), QImage::Format_RGB32);
+ image.fill(QColor(Qt::red).rgb());
+
+ QPaintEngine *paintEngine = image.paintEngine();
+ QVERIFY(paintEngine);
+
+ QRegion systemClip(QRegion(50, 0, 50, 10));
+ systemClip += QRegion(90, 10, 10, 40);
+ paintEngine->setSystemClip(systemClip);
+
+ // Render entire widget directly onto device.
+ widget.render(&image);
+
+#ifdef RENDER_DEBUG
+ image.save("systemclip_with_device.png");
+#endif
+ // All pixels within the system clip should now be
+ // the expectedColor, and the rest should be red.
+ for (int i = 0; i < image.height(); ++i) {
+ for (int j = 0; j < image.width(); ++j) {
+ if (systemClip.contains(QPoint(j, i)))
+ QCOMPARE(image.pixel(j, i), expectedColor.rgb());
+ else
+ QCOMPARE(image.pixel(j, i), QColor(Qt::red).rgb());
+ }
+ }
+
+ // Refill image with red.
+ image.fill(QColor(Qt::red).rgb());
+ paintEngine->setSystemClip(systemClip);
+
+ // Do the same with an untransformed painter.
+ QPainter painter(&image);
+ //Make sure we're using the same paint engine and has the right clip set.
+ QCOMPARE(painter.paintEngine(), paintEngine);
+ QCOMPARE(paintEngine->systemClip(), systemClip);
+
+ widget.render(&painter);
+
+#ifdef RENDER_DEBUG
+ image.save("systemclip_with_untransformed_painter.png");
+#endif
+ // All pixels within the system clip should now be
+ // the expectedColor, and the rest should be red.
+ for (int i = 0; i < image.height(); ++i) {
+ for (int j = 0; j < image.width(); ++j) {
+ if (systemClip.contains(QPoint(j, i)))
+ QCOMPARE(image.pixel(j, i), expectedColor.rgb());
+ else
+ QCOMPARE(image.pixel(j, i), QColor(Qt::red).rgb());
+ }
+ }
+}
+
+void tst_QWidget::render_systemClip3_data()
+{
+ QTest::addColumn<QSize>("size");
+ QTest::addColumn<bool>("useSystemClip");
+
+ // Reference: http://en.wikipedia.org/wiki/Flag_of_Norway
+ QTest::newRow("Norwegian Civil Flag") << QSize(220, 160) << false;
+ QTest::newRow("Norwegian War Flag") << QSize(270, 160) << true;
+}
+
+// This test ensures that the current engine clip (systemClip + painter clip)
+// is preserved after QPainter::setClipRegion(..., Qt::ReplaceClip);
+void tst_QWidget::render_systemClip3()
+{
+ QFETCH(QSize, size);
+ QFETCH(bool, useSystemClip);
+
+ // Calculate the inner/outer cross of the flag.
+ QRegion outerCross(0, 0, size.width(), size.height());
+ outerCross -= QRect(0, 0, 60, 60);
+ outerCross -= QRect(100, 0, size.width() - 100, 60);
+ outerCross -= QRect(0, 100, 60, 60);
+ outerCross -= QRect(100, 100, size.width() - 100, 60);
+
+ QRegion innerCross(0, 0, size.width(), size.height());
+ innerCross -= QRect(0, 0, 70, 70);
+ innerCross -= QRect(90, 0, size.width() - 90, 70);
+ innerCross -= QRect(0, 90, 70, 70);
+ innerCross -= QRect(90, 90, size.width() - 90, 70);
+
+ const QRegion redArea(QRegion(0, 0, size.width(), size.height()) - outerCross);
+ const QRegion whiteArea(outerCross - innerCross);
+ const QRegion blueArea(innerCross);
+ QRegion systemClip;
+
+ // Okay, here's the image that should look like a Norwegian civil/war flag in the end.
+ QImage flag(size, QImage::Format_ARGB32);
+ flag.fill(QColor(Qt::transparent).rgba());
+
+ if (useSystemClip) {
+ QPainterPath warClip(QPoint(size.width(), 0));
+ warClip.lineTo(size.width() - 110, 60);
+ warClip.lineTo(size.width(), 80);
+ warClip.lineTo(size.width() - 110, 100);
+ warClip.lineTo(size.width(), 160);
+ warClip.closeSubpath();
+ systemClip = QRegion(0, 0, size.width(), size.height()) - QRegion(warClip.toFillPolygon().toPolygon());
+ flag.paintEngine()->setSystemClip(systemClip);
+ }
+
+ QPainter painter(&flag);
+ painter.fillRect(QRect(QPoint(), size), Qt::red); // Fill image background with red.
+ painter.setClipRegion(outerCross); // Limit widget painting to inside the outer cross.
+
+ // Here's the widget that's supposed to draw the inner/outer cross of the flag.
+ // The outer cross (white) should be drawn when the background is auto-filled, and
+ // the inner cross (blue) should be drawn in the paintEvent.
+ class MyWidget : public QWidget
+ { public:
+ void paintEvent(QPaintEvent *)
+ {
+ QPainter painter(this);
+ // Be evil and try to paint outside the outer cross. This should not be
+ // possible since the shared painter is clipped to the outer cross.
+ painter.setClipRect(0, 0, 60, 60, Qt::ReplaceClip);
+ painter.fillRect(rect(), Qt::green);
+ painter.setClipRegion(clip, Qt::ReplaceClip);
+ painter.fillRect(rect(), Qt::blue);
+ }
+ QRegion clip;
+ };
+
+ MyWidget widget;
+ widget.clip = innerCross;
+ widget.setFixedSize(size);
+ widget.setPalette(Qt::white);
+ widget.setAutoFillBackground(true);
+ widget.render(&painter);
+
+#ifdef RENDER_DEBUG
+ flag.save("flag.png");
+#endif
+
+ // Let's make sure we got a Norwegian flag.
+ for (int i = 0; i < flag.height(); ++i) {
+ for (int j = 0; j < flag.width(); ++j) {
+ const QPoint pixel(j, i);
+ const QRgb pixelValue = flag.pixel(pixel);
+ if (useSystemClip && !systemClip.contains(pixel))
+ QCOMPARE(pixelValue, QColor(Qt::transparent).rgba());
+ else if (redArea.contains(pixel))
+ QCOMPARE(pixelValue, QColor(Qt::red).rgba());
+ else if (whiteArea.contains(pixel))
+ QCOMPARE(pixelValue, QColor(Qt::white).rgba());
+ else
+ QCOMPARE(pixelValue, QColor(Qt::blue).rgba());
+ }
+ }
+}
+
void tst_QWidget::setContentsMargins()
{
QLabel label("why does it always rain on me?");
diff --git a/tests/auto/windowsmobile/test/ddhelper.cpp b/tests/auto/windowsmobile/test/ddhelper.cpp
new file mode 100644
index 0000000..5955cd3
--- /dev/null
+++ b/tests/auto/windowsmobile/test/ddhelper.cpp
@@ -0,0 +1,121 @@
+
+#ifdef Q_OS_WINCE_WM
+
+#include <Ddraw.h>
+#include <QDebug>
+
+static LPDIRECTDRAW g_pDD = NULL; // DirectDraw object
+static LPDIRECTDRAWSURFACE g_pDDSSurface = NULL; // DirectDraw primary surface
+
+static DDSCAPS ddsCaps;
+static DDSURFACEDESC ddsSurfaceDesc;
+static void *buffer = NULL;
+
+static int width = 0;
+static int height = 0;
+static int pitch = 0;
+static int bitCount = 0;
+static int windowId = 0;
+
+static bool initialized = false;
+static bool locked = false;
+
+void q_lock()
+{
+ if (locked) {
+ qWarning("Direct Painter already locked (QDirectPainter::lock())");
+ return;
+ }
+ locked = true;
+
+
+ memset(&ddsSurfaceDesc, 0, sizeof(ddsSurfaceDesc));
+ ddsSurfaceDesc.dwSize = sizeof(ddsSurfaceDesc);
+
+ HRESULT h = g_pDDSSurface->Lock(0, &ddsSurfaceDesc, DDLOCK_WRITEONLY, 0);
+ if (h != DD_OK)
+ qDebug() << "GetSurfaceDesc failed!";
+
+ width = ddsSurfaceDesc.dwWidth;
+ height = ddsSurfaceDesc.dwHeight;
+ bitCount = ddsSurfaceDesc.ddpfPixelFormat.dwRGBBitCount;
+ pitch = ddsSurfaceDesc.lPitch;
+ buffer = ddsSurfaceDesc.lpSurface;
+}
+
+void q_unlock()
+{
+ if( !locked) {
+ qWarning("Direct Painter not locked (QDirectPainter::unlock()");
+ return;
+ }
+ g_pDDSSurface->Unlock(0);
+ locked = false;
+}
+
+void q_initDD()
+{
+ if (initialized)
+ return;
+
+ DirectDrawCreate(NULL, &g_pDD, NULL);
+
+ HRESULT h;
+ h = g_pDD->SetCooperativeLevel(0, DDSCL_NORMAL);
+
+ if (h != DD_OK)
+ qDebug() << "cooperation level failed";
+
+ h = g_pDD->TestCooperativeLevel();
+ if (h != DD_OK)
+ qDebug() << "cooperation level failed test";
+
+ DDSURFACEDESC ddsd;
+ memset(&ddsd, 0, sizeof(ddsd));
+ ddsd.dwSize = sizeof(ddsd);
+
+ ddsd.dwFlags = DDSD_CAPS;
+
+ ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
+
+ h = g_pDD->CreateSurface(&ddsd, &g_pDDSSurface, NULL);
+
+ if (h != DD_OK)
+ qDebug() << "CreateSurface failed!";
+
+ if (g_pDDSSurface->GetCaps(&ddsCaps) != DD_OK)
+ qDebug() << "GetCaps failed";
+
+ q_lock();
+ q_unlock();
+ initialized = true;
+}
+
+uchar* q_frameBuffer()
+{
+ return (uchar*) buffer;
+}
+
+int q_screenDepth()
+{
+ return bitCount;
+}
+
+int q_screenWidth()
+{
+ return width;
+}
+
+int q_screenHeight()
+{
+ return height;
+}
+
+int q_linestep()
+{
+ return pitch;
+}
+
+#endif //Q_OS_WINCE_WM
+
+
diff --git a/tests/auto/windowsmobile/test/ddhelper.h b/tests/auto/windowsmobile/test/ddhelper.h
new file mode 100644
index 0000000..3dfa9e6
--- /dev/null
+++ b/tests/auto/windowsmobile/test/ddhelper.h
@@ -0,0 +1,21 @@
+#ifndef __DDHELPER__
+#define __DDHELPER__
+
+extern uchar* q_frameBuffer();
+
+extern int q_screenDepth();
+
+extern int q_screenWidth();
+
+extern int q_screenHeight();
+
+extern int q_linestep();
+
+extern void q_initDD();
+
+extern void q_unlock();
+
+extern void q_lock();
+
+#endif //__DDHELPER__
+
diff --git a/tests/auto/windowsmobile/test/test.pro b/tests/auto/windowsmobile/test/test.pro
new file mode 100644
index 0000000..2420bf1
--- /dev/null
+++ b/tests/auto/windowsmobile/test/test.pro
@@ -0,0 +1,24 @@
+
+load(qttest_p4)
+
+HEADERS += ddhelper.h
+SOURCES += tst_windowsmobile.cpp ddhelper.cpp
+RESOURCES += windowsmobile.qrc
+
+TARGET = tst_windowsmobile
+
+wincewm*: {
+ addFiles.sources = \
+ ../testQMenuBar/*.exe
+
+
+ addFiles.path = "\Program Files\tst_windowsmobile"
+ DEPLOYMENT += addFiles
+}
+
+wincewm*: {
+ LIBS += Ddraw.lib
+}
+
+
+
diff --git a/tests/auto/windowsmobile/test/testQMenuBar_current.png b/tests/auto/windowsmobile/test/testQMenuBar_current.png
new file mode 100644
index 0000000..d03e69a
--- /dev/null
+++ b/tests/auto/windowsmobile/test/testQMenuBar_current.png
Binary files differ
diff --git a/tests/auto/windowsmobile/test/testSimpleWidget_current.png b/tests/auto/windowsmobile/test/testSimpleWidget_current.png
new file mode 100644
index 0000000..5cbc2bb
--- /dev/null
+++ b/tests/auto/windowsmobile/test/testSimpleWidget_current.png
Binary files differ
diff --git a/tests/auto/windowsmobile/test/tst_windowsmobile.cpp b/tests/auto/windowsmobile/test/tst_windowsmobile.cpp
new file mode 100644
index 0000000..391e206
--- /dev/null
+++ b/tests/auto/windowsmobile/test/tst_windowsmobile.cpp
@@ -0,0 +1,191 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtTest/QtTest>
+#include <QtCore/QDate>
+#include <QtCore/QDebug>
+#include <QtCore/QObject>
+#include <QtGui>
+#include <windows.h>
+#include <ddhelper.h>
+
+
+
+class tst_WindowsMobile : public QObject
+{
+ Q_OBJECT
+public:
+ tst_WindowsMobile()
+ {
+#ifdef Q_OS_WINCE_WM
+ q_initDD();
+#endif
+ }
+
+#ifdef Q_OS_WINCE_WM
+ private slots:
+ void testMainWindowAndMenuBar();
+ void testSimpleWidget();
+#endif
+};
+
+#ifdef Q_OS_WINCE_WM
+
+bool qt_wince_is_platform(const QString &platformString) {
+ TCHAR tszPlatform[64];
+ if (SystemParametersInfo(SPI_GETPLATFORMTYPE,
+ sizeof(tszPlatform)/sizeof(*tszPlatform),tszPlatform,0))
+ if (0 == _tcsicmp(reinterpret_cast<const wchar_t *> (platformString.utf16()), tszPlatform))
+ return true;
+ return false;
+}
+
+bool qt_wince_is_smartphone() {
+ return qt_wince_is_platform(QString::fromLatin1("Smartphone"));
+}
+
+void openMenu()
+{
+ ::mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_ABSOLUTE,450,630,0,0);
+ ::mouse_event(MOUSEEVENTF_LEFTUP | MOUSEEVENTF_ABSOLUTE,450,630,0,0);
+ QTest::qWait(2000);
+ ::mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_ABSOLUTE,65535,65535,0,0);
+ ::mouse_event(MOUSEEVENTF_LEFTUP | MOUSEEVENTF_ABSOLUTE,65535,65535,0,0);
+ QTest::qWait(2000);
+ ::mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_ABSOLUTE,55535,55535,0,0);
+ ::mouse_event(MOUSEEVENTF_LEFTUP | MOUSEEVENTF_ABSOLUTE,55535,55535,0,0);
+ QTest::qWait(2000);
+ ::mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_ABSOLUTE,55535,58535,0,0);
+ ::mouse_event(MOUSEEVENTF_LEFTUP | MOUSEEVENTF_ABSOLUTE,55535,58535,0,0);
+ QTest::qWait(2000);
+ ::mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_ABSOLUTE,40535,55535,0,0);
+ ::mouse_event(MOUSEEVENTF_LEFTUP | MOUSEEVENTF_ABSOLUTE,40535,55535,0,0);
+ QTest::qWait(2000);
+ ::mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_ABSOLUTE,32535,55535,0,0);
+ ::mouse_event(MOUSEEVENTF_LEFTUP | MOUSEEVENTF_ABSOLUTE,32535,55535,0,0);
+ QTest::qWait(2000);
+ ::mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_ABSOLUTE,65535,65535,0,0);
+ ::mouse_event(MOUSEEVENTF_LEFTUP | MOUSEEVENTF_ABSOLUTE,65535,65535,0,0);
+ QTest::qWait(2000);
+ ::mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_ABSOLUTE,55535,50535,0,0);
+ ::mouse_event(MOUSEEVENTF_LEFTUP | MOUSEEVENTF_ABSOLUTE,55535,50535,0,0);
+ QTest::qWait(2000);
+ ::mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_ABSOLUTE,55535,40535,0,0);
+ ::mouse_event(MOUSEEVENTF_LEFTUP | MOUSEEVENTF_ABSOLUTE,55535,40535,0,0);
+ QTest::qWait(2000);
+ ::mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_ABSOLUTE,48535,45535,0,0);
+ QTest::qWait(2000);
+ ::mouse_event(MOUSEEVENTF_LEFTUP | MOUSEEVENTF_ABSOLUTE,48535,45535,0,0);
+}
+
+void compareScreenshots(const QString &image1, const QString &image2)
+{
+ if (qt_wince_is_smartphone())
+ QSKIP("This test is only for Windows Mobile", SkipAll);
+ QImage screenShot(image1);
+ QImage original(image2);
+
+ //ignore the clock
+ QPainter p1(&screenShot);
+ QPainter p2(&original);
+ p1.fillRect(310, 6, 400, 34, Qt::black);
+ p2.fillRect(310, 6, 400, 34, Qt::black);
+
+ QVERIFY(original == screenShot);
+}
+
+void takeScreenShot(const QString filename)
+{
+ q_lock();
+ QImage image = QImage(( uchar *) q_frameBuffer(), q_screenWidth(),
+ q_screenHeight(), q_screenWidth() * q_screenDepth() / 8, QImage::Format_RGB16);
+ image.save(filename, "PNG");
+ q_unlock();
+}
+
+void tst_WindowsMobile::testMainWindowAndMenuBar()
+{
+ QProcess process;
+ process.start("testQMenuBar.exe");
+ QCOMPARE(process.state(), QProcess::Running);
+ QTest::qWait(6000);
+ openMenu();
+ QTest::qWait(1000);
+ takeScreenShot("testQMenuBar_current.png");
+ process.close();
+ compareScreenshots("testQMenuBar_current.png", ":/testQMenuBar_current.png");
+}
+
+void tst_WindowsMobile::testSimpleWidget()
+{
+ QMenuBar menubar;
+ menubar.show();
+ QWidget maximized;
+ QPalette pal = maximized.palette();
+ pal.setColor(QPalette::Background, Qt::red);
+ maximized.setPalette(pal);
+ maximized.showMaximized();
+ QWidget widget;
+ widget.setGeometry(100, 100, 200, 200);
+ widget.setWindowTitle("Widget");
+ widget.show();
+ qApp->processEvents();
+ QTest::qWait(1000);
+
+ QWidget widget2;
+ widget2.setGeometry(100, 380, 300, 200);
+ widget2.setWindowTitle("Widget 2");
+ widget2.setWindowFlags(Qt::Popup);
+ widget2.show();
+
+ qApp->processEvents();
+ QTest::qWait(1000);
+ takeScreenShot("testSimpleWidget_current.png");
+ compareScreenshots("testSimpleWidget_current.png", ":/testSimpleWidget_current.png");
+}
+
+
+#endif //Q_OS_WINCE_WM
+
+
+QTEST_MAIN(tst_WindowsMobile)
+#include "tst_windowsmobile.moc"
+
diff --git a/tests/auto/windowsmobile/test/windowsmobile.qrc b/tests/auto/windowsmobile/test/windowsmobile.qrc
new file mode 100644
index 0000000..5d6f614
--- /dev/null
+++ b/tests/auto/windowsmobile/test/windowsmobile.qrc
@@ -0,0 +1,6 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+ <file>testQMenuBar_current.png</file>
+ <file>testSimpleWidget_current.png</file>
+</qresource>
+</RCC>
diff --git a/tests/auto/windowsmobile/testQMenuBar/main.cpp b/tests/auto/windowsmobile/testQMenuBar/main.cpp
new file mode 100644
index 0000000..4a3b3b2
--- /dev/null
+++ b/tests/auto/windowsmobile/testQMenuBar/main.cpp
@@ -0,0 +1,72 @@
+#include <QtTest/QtTest>
+#include <QtCore/QDate>
+#include <QtCore/QDebug>
+#include <QtCore/QObject>
+#include <QtGui>
+#include <windows.h>
+
+int main(int argc, char * argv[])
+{
+ int widgetNum = 20;
+
+ QList<QWidget*> widgets;
+ QApplication app(argc, argv);
+
+ QMainWindow mainWindow;
+ mainWindow.setWindowTitle("Test");
+ QMenu *fileMenu = mainWindow.menuBar()->addMenu("File");
+ QMenu *editMenu = mainWindow.menuBar()->addMenu("Edit");
+ QMenu *viewMenu = mainWindow.menuBar()->addMenu("View");
+ QMenu *toolsMenu = mainWindow.menuBar()->addMenu("Tools");
+ QMenu *optionsMenu = mainWindow.menuBar()->addMenu("Options");
+ QMenu *helpMenu = mainWindow.menuBar()->addMenu("Help");
+
+ qApp->processEvents();
+
+ fileMenu->addAction("Open");
+ QAction *close = fileMenu->addAction("Close");
+ fileMenu->addSeparator();
+ fileMenu->addAction("Exit");
+
+ close->setEnabled(false);
+
+ editMenu->addAction("Cut");
+ editMenu->addAction("Pase");
+ editMenu->addAction("Copy");
+ editMenu->addSeparator();
+ editMenu->addAction("Find");
+
+ viewMenu->addAction("Hide");
+ viewMenu->addAction("Show");
+ viewMenu->addAction("Explore");
+ QAction *visible = viewMenu->addAction("Visible");
+ visible->setCheckable(true);
+ visible->setChecked(true);
+
+ toolsMenu->addMenu("Hammer");
+ toolsMenu->addMenu("Caliper");
+ toolsMenu->addMenu("Helm");
+
+ optionsMenu->addMenu("Settings");
+ optionsMenu->addMenu("Standard");
+ optionsMenu->addMenu("Extended");
+
+ QMenu *subMenu = helpMenu->addMenu("Help");
+ subMenu->addAction("Index");
+ subMenu->addSeparator();
+ subMenu->addAction("Vodoo Help");
+ helpMenu->addAction("Contens");
+ helpMenu->addSeparator();
+ helpMenu->addAction("About");
+
+ QToolBar toolbar;
+ mainWindow.addToolBar(&toolbar);
+ toolbar.addAction(QIcon(qApp->style()->standardPixmap(QStyle::SP_FileIcon)), QString("textAction"));
+
+ QTextEdit textEdit;
+ mainWindow.setCentralWidget(&textEdit);
+
+ mainWindow.showMaximized();
+
+ app.exec();
+}
diff --git a/tests/auto/windowsmobile/testQMenuBar/testQMenuBar.pro b/tests/auto/windowsmobile/testQMenuBar/testQMenuBar.pro
new file mode 100644
index 0000000..6dd288b
--- /dev/null
+++ b/tests/auto/windowsmobile/testQMenuBar/testQMenuBar.pro
@@ -0,0 +1,2 @@
+SOURCES += main.cpp
+DESTDIR = ./
diff --git a/tests/auto/windowsmobile/windowsmobile.pro b/tests/auto/windowsmobile/windowsmobile.pro
new file mode 100644
index 0000000..2e6b444
--- /dev/null
+++ b/tests/auto/windowsmobile/windowsmobile.pro
@@ -0,0 +1,9 @@
+
+TEMPLATE = subdirs
+
+wincewm* {
+ SUBDIRS = testQMenuBar
+}
+ SUBDIRS += test
+
+