File: qtestlib-tutorial4.html

package info (click to toggle)
qt4-x11 4%3A4.8.2%2Bdfsg-11
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 701,696 kB
  • sloc: cpp: 2,686,179; ansic: 375,485; python: 25,859; sh: 19,349; xml: 17,091; perl: 14,765; yacc: 5,383; asm: 5,038; makefile: 1,259; lex: 555; ruby: 526; objc: 347; cs: 112; pascal: 112; php: 54; sed: 34
file content (130 lines) | stat: -rw-r--r-- 9,200 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en_US" lang="en_US">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!-- qtestlib.qdoc -->
  <title>Qt 4.8: Chapter 4: Replaying GUI Events</title>
  <link rel="stylesheet" type="text/css" href="style/offline.css" />
</head>
<body>
<div class="header" id="qtdocheader">
  <div class="content"> 
    <a href="index.html" class="qtref"><span>Qt Reference Documentation</span></a>
  </div>
  <div class="breadcrumb toolblock">
    <ul>
      <li class="first"><a href="index.html">Home</a></li>
      <!--  Breadcrumbs go here -->
<li><a href="all-examples.html">Examples</a></li>
<li>Chapter 4: Replaying GUI Events</li>
    </ul>
  </div>
</div>
<div class="content mainContent">
  <link rel="prev" href="qtestlib-tutorial3.html" />
  <link rel="next" href="qtestlib-tutorial5.html" />
<p class="naviNextPrevious headerNavi">
<a class="prevPage" href="qtestlib-tutorial3.html">Chapter 3</a>
<a class="nextPage" href="qtestlib-tutorial5.html">Chapter 5</a>
</p><p/>
<div class="toc">
<h3><a name="toc">Contents</a></h3>
<ul>
<li class="level1"><a href="#writing-the-data-function">Writing the Data Function</a></li>
<li class="level1"><a href="#rewriting-the-test-function">Rewriting the Test Function</a></li>
</ul>
</div>
<h1 class="title">Chapter 4: Replaying GUI Events</h1>
<span class="subtitle"></span>
<!-- $$$qtestlib/tutorial4-description -->
<div class="descr"> <a name="details"></a>
<p>Files:</p>
<ul>
<li><a href="qtestlib-tutorial4-testgui-cpp.html">qtestlib/tutorial4/testgui.cpp</a></li>
<li><a href="qtestlib-tutorial4-tutorial4-pro.html">qtestlib/tutorial4/tutorial4.pro</a></li>
</ul>
<p>In this chapter, we will show how to simulate a GUI event, and how to store a series of GUI events as well as replay them on a widget.</p>
<p>The approach to storing a series of events and replay them, is quite similar to the approach explained in <a href="qtestlib-tutorial2.html">chapter 2</a>; all you need is to add a data function to your test class:</p>
<pre class="cpp"> <span class="keyword">class</span> TestGui: <span class="keyword">public</span> <span class="type"><a href="qobject.html">QObject</a></span>
 {
     Q_OBJECT

 <span class="keyword">private</span> <span class="keyword">slots</span>:
     <span class="type">void</span> testGui_data();
     <span class="type">void</span> testGui();
 };</pre>
<a name="writing-the-data-function"></a>
<h2>Writing the Data Function</h2>
<p>As before, a test function's associated data function carries the same name, appended by <tt>_data</tt>.</p>
<pre class="cpp"> <span class="type">void</span> TestGui<span class="operator">::</span>testGui_data()
 {
     <span class="type"><a href="qtest.html">QTest</a></span><span class="operator">::</span>addColumn<span class="operator">&lt;</span><span class="type"><a href="qtesteventlist.html">QTestEventList</a></span><span class="operator">&gt;</span>(<span class="string">&quot;events&quot;</span>);
     <span class="type"><a href="qtest.html">QTest</a></span><span class="operator">::</span>addColumn<span class="operator">&lt;</span><span class="type"><a href="qstring.html">QString</a></span><span class="operator">&gt;</span>(<span class="string">&quot;expected&quot;</span>);

     <span class="type"><a href="qtesteventlist.html">QTestEventList</a></span> list1;
     list1<span class="operator">.</span>addKeyClick(<span class="char">'a'</span>);
     <span class="type"><a href="qtest.html">QTest</a></span><span class="operator">::</span>newRow(<span class="string">&quot;char&quot;</span>) <span class="operator">&lt;</span><span class="operator">&lt;</span> list1 <span class="operator">&lt;</span><span class="operator">&lt;</span> <span class="string">&quot;a&quot;</span>;

     <span class="type"><a href="qtesteventlist.html">QTestEventList</a></span> list2;
     list2<span class="operator">.</span>addKeyClick(<span class="char">'a'</span>);
     list2<span class="operator">.</span>addKeyClick(<span class="type"><a href="qt.html">Qt</a></span><span class="operator">::</span>Key_Backspace);
     <span class="type"><a href="qtest.html">QTest</a></span><span class="operator">::</span>newRow(<span class="string">&quot;there and back again&quot;</span>) <span class="operator">&lt;</span><span class="operator">&lt;</span> list2 <span class="operator">&lt;</span><span class="operator">&lt;</span> <span class="string">&quot;&quot;</span>;
 }</pre>
<p>First, we define the elements of the table using the <a href="qtest.html#addColumn">QTest::addColumn</a>() function: A list of GUI events, and the expected result of applying the list of events on a <a href="qwidget.html">QWidget</a>. Note that the type of the first element is <a href="qtesteventlist.html">QTestEventList</a>.</p>
<p>A <a href="qtesteventlist.html">QTestEventList</a> can be populated with GUI events that can be stored as test data for later usage, or be replayed on any <a href="qwidget.html">QWidget</a>.</p>
<p>In our current data function, we create two <a href="qtesteventlist.html">QTestEventList</a>s. The first list consists of a single click to the 'a' key. We add the event to the list using the <a href="qtesteventlist.html#addKeyClick">QTestEventList::addKeyClick</a>() function. Then we use the <a href="qtest.html#newRow">QTest::newRow</a>() function to give the data set a name, and stream the event list and the expected result into the table.</p>
<p>The second list consists of two key clicks: an 'a' with a following 'backspace'. Again we use the <a href="qtesteventlist.html#addKeyClick">QTestEventList::addKeyClick</a>() to add the events to the list, and <a href="qtest.html#newRow">QTest::newRow</a>() to put the event list and the expected result into the table with an associated name.</p>
<a name="rewriting-the-test-function"></a>
<h2>Rewriting the Test Function</h2>
<p>Our test can now be rewritten:</p>
<pre class="cpp"> <span class="type">void</span> TestGui<span class="operator">::</span>testGui()
 {
     QFETCH(<span class="type"><a href="qtesteventlist.html">QTestEventList</a></span><span class="operator">,</span> events);
     QFETCH(<span class="type"><a href="qstring.html">QString</a></span><span class="operator">,</span> expected);

     <span class="type"><a href="qlineedit.html">QLineEdit</a></span> lineEdit;

     events<span class="operator">.</span>simulate(<span class="operator">&amp;</span>lineEdit);

     QCOMPARE(lineEdit<span class="operator">.</span>text()<span class="operator">,</span> expected);
 }</pre>
<p>The TestGui::testGui() function will be executed two times, once for each entry in the test data that we created in the associated TestGui::testGui_data() function.</p>
<p>First, we fetch the two elements of the data set using the <a href="qtest.html#QFETCH">QFETCH</a>() macro. <a href="qtest.html#QFETCH">QFETCH</a>() takes two arguments: The data type of the element and the element name. Then we create a <a href="qlineedit.html">QLineEdit</a>, and apply the list of events on that widget using the <a href="qtesteventlist.html#simulate">QTestEventList::simulate</a>() function.</p>
<p>Finally, we use the <a href="qtest.html#QCOMPARE">QCOMPARE</a>() macro to check if the line edit's text is as expected.</p>
<p>As before, to make our test case a stand-alone executable, the following two lines are needed:</p>
<pre class="cpp"> <a href="qtest.html#QTEST_MAIN">QTEST_MAIN</a>(TestGui)
 <span class="preprocessor">#include &quot;testgui.moc&quot;</span></pre>
<p>The <a href="qtest.html#QTEST_MAIN">QTEST_MAIN</a>() macro expands to a simple main() method that runs all the test functions, and since both the declaration and the implementation of our test class are in a .cpp file, we also need to include the generated moc file to make Qt's introspection work.</p>
</div>
<!-- @@@qtestlib/tutorial4 -->
<p class="naviNextPrevious footerNavi">
<a class="prevPage" href="qtestlib-tutorial3.html">Chapter 3</a>
<a class="nextPage" href="qtestlib-tutorial5.html">Chapter 5</a>
</p>
  <div class="ft">
    <span></span>
  </div>
</div> 
<div class="footer">
    <p>
      <acronym title="Copyright">&copy;</acronym> 2012 Nokia Corporation and/or its
      subsidiaries. Documentation contributions included herein are the copyrights of
      their respective owners.</p>
    <br />
    <p>
      The documentation provided herein is licensed under the terms of the
      <a href="http://www.gnu.org/licenses/fdl.html">GNU Free Documentation
      License version 1.3</a> as published by the Free Software Foundation.</p>
    <p>
      Documentation sources may be obtained from <a href="http://www.qt-project.org">
      www.qt-project.org</a>.</p>
    <br />
    <p>
      Nokia, Qt and their respective logos are trademarks of Nokia Corporation 
      in Finland and/or other countries worldwide. All other trademarks are property
      of their respective owners. <a title="Privacy Policy"
      href="http://en.gitorious.org/privacy_policy/">Privacy Policy</a></p>
</div>
</body>
</html>