source: trunk/quest-plugin-mfc-test/src/test/java/de/ugoe/cs/quest/plugin/mfc/EventGenerationRuleTest.java @ 622

Last change on this file since 622 was 622, checked in by pharms, 12 years ago
  • adapted implementation of MFC plugin to now generate a full GUI model as well as concrete GUI interaction events
File size: 17.3 KB
Line 
1// Module    : $RCSfile: EventGenerationRuleTest.java,v $
2// Version   : $Revision: 0.0 $  $Author: pharms $  $Date: 23.08.2012 $
3// Project   : quest-plugin-mfc-test
4// Creation  : 2012 by pharms
5// Copyright : Patrick Harms, 2012
6package de.ugoe.cs.quest.plugin.mfc;
7
8import static org.junit.Assert.*;
9
10import java.io.ByteArrayInputStream;
11import java.io.IOException;
12import java.util.List;
13
14import org.jdom.Document;
15import org.jdom.Element;
16import org.jdom.JDOMException;
17import org.jdom.Namespace;
18import org.jdom.input.SAXBuilder;
19import org.junit.Test;
20
21import de.ugoe.cs.quest.plugin.mfc.EventGenerationRule.Term;
22import de.ugoe.cs.quest.plugin.mfc.eventcore.WindowsMessageType;
23import de.ugoe.cs.util.console.Console;
24
25/**
26 * <p>
27 * TODO comment
28 * </p>
29 *
30 * @version $Revision: $ $Date: 23.08.2012$
31 * @author 2012, last modified by $Author: pharms$
32 */
33public class EventGenerationRuleTest {
34
35    /**
36     *
37     */
38    Namespace rulesNamespace = null;
39   
40    /**
41     * <p>
42     * TODO: comment
43     * </p>
44     */
45    @Test
46    public void testRule1() {
47        String ruleXML =
48            "<rule name='LeftClickButton'>\n" +
49            "  <msg type='&WM_LBUTTONDOWN;'>\n" +
50            "    <store var='clicked'/>\n" +
51            "  </msg>\n" +
52            "  <msg type='&WM_LBUTTONUP;'>\n" +
53            "    <equals>\n" +
54            "      <constValue value='Button'/>\n" +
55            "      <winInfoValue obj='this' winParam='class'/>\n" +
56            "    </equals>\n" +
57            "    <equals>\n" +
58            "      <paramValue obj='clicked' param='window.hwnd'/>\n" +
59            "      <paramValue obj='this' param='window.hwnd'/>\n" +
60            "    </equals>\n" +
61            "  </msg>\n" +
62            "  <genMsg delay='500'>\n" +
63            "    <type>\n" +
64            "      <constValue value='&BM_CLICK;'/>\n" +
65            "    </type>\n" +
66            "    <target>\n" +
67            "      <msgInfoValue obj='clicked' msgParam='target'/>\n" +
68            "    </target>\n" +
69            "  </genMsg>\n" +
70            "</rule>";
71       
72        Element ruleElement = getRuleElement(ruleXML);
73       
74        EventGenerationRule rule = new EventGenerationRule(ruleElement, rulesNamespace);
75       
76        assertEquals("LeftClickButton", rule.getName());
77       
78        assertNotNull(rule.getMessageConditions());
79        assertEquals(2, rule.getMessageConditions().size());
80       
81        // check condition 1
82        EventGenerationRule.MessageCondition condition1 = rule.getMessageConditions().get(0);
83        assertEquals(WindowsMessageType.WM_LBUTTONDOWN, condition1.getMessageType());
84        assertFalse(condition1.matchMultiple());
85        assertNotNull(condition1.getAttributeConditions());
86        assertEquals(0, condition1.getAttributeConditions().size());
87        assertNotNull(condition1.getMessagesToStore());
88        assertEquals(1, condition1.getMessagesToStore().size());
89       
90        assertTerm(condition1.getMessagesToStore().get(0), "store", "clicked", null, null,
91                   null, null, null, null, null, null);
92
93        // check condition 2
94        EventGenerationRule.MessageCondition condition2 = rule.getMessageConditions().get(1);
95        assertEquals(WindowsMessageType.WM_LBUTTONUP, condition2.getMessageType());
96        assertFalse(condition2.matchMultiple());
97        assertNotNull(condition2.getAttributeConditions());
98        assertEquals(2, condition2.getAttributeConditions().size());
99        assertNotNull(condition2.getMessagesToStore());
100        assertEquals(0, condition2.getMessagesToStore().size());
101       
102        EventGenerationRule.AttributeCondition attrCond1 =
103            condition2.getAttributeConditions().get(0);
104       
105        assertTerm(attrCond1.getLeftHandSide(), "constValue", null, null, null,
106                   null, null, null, null, "Button", null);
107
108        assertTerm(attrCond1.getRightHandSide(), "winInfoValue", "this", null, null,
109                   null, null, null, null, null, "class");
110
111        EventGenerationRule.AttributeCondition attrCond2 =
112            condition2.getAttributeConditions().get(1);
113           
114        assertTerm(attrCond2.getLeftHandSide(), "paramValue", "clicked", null, "window.hwnd",
115                   null, null, null, null, null, null);
116
117        assertTerm(attrCond2.getRightHandSide(), "paramValue", "this", null, "window.hwnd",
118                   null, null, null, null, null, null);
119
120        // check event parameters
121        assertNotNull(rule.getEventParameters());
122        assertEquals(0, rule.getEventParameters().size());
123       
124        // check replay specs
125        assertNotNull(rule.getReplayMessageSpecifications());
126        assertEquals(1, rule.getReplayMessageSpecifications().size());
127       
128        // check replay spec 1
129        EventGenerationRule.ReplayMessageSpec replaySpec =
130            rule.getReplayMessageSpecifications().get(0);
131       
132        assertNotNull(replaySpec);
133        assertEquals(500, replaySpec.getDelay());
134        assertTrue(replaySpec.generateSingleMessage());
135        assertNull(replaySpec.getLparam());
136        assertNull(replaySpec.getLparamHiWord());
137        assertNull(replaySpec.getLparamLoWord());
138        assertNull(replaySpec.getReplayObjectId());
139        assertTerm(replaySpec.getTarget(), "msgInfoValue", "clicked", "target", null,
140                   null, null, null, null, null, null);
141        assertTerm(replaySpec.getType(), "constValue", null, null, null,
142                   null, null, null, null, "" + WindowsMessageType.BM_CLICK.getNumber(), null);
143        assertNull(replaySpec.getWparam());
144        assertNull(replaySpec.getWparamHiWord());
145        assertNull(replaySpec.getWparamLoWord());
146       
147    }
148
149    /**
150     * <p>
151     * TODO: comment
152     * </p>
153     */
154    @Test
155    public void testRule2() {
156       
157        String ruleXML =
158            "<rule name='HScroll_TrackBar'>\n" +
159            "  <msg type='&WM_LBUTTONDOWN;'>\n" +
160            "    <equals>\n" +
161            "      <winInfoValue obj='this' winParam='class'/>\n" +
162            "      <constValue value='msctls_trackbar32'/>\n" +
163            "    </equals>\n" +
164            "    <store var='clicked'/>\n" +
165            "  </msg>\n" +
166            "  <msg type='&WM_HSCROLL;' multiple='true'>\n" +
167            "    <equals>\n" +
168            "      <paramValue obj='this' param='scrollBarHandle'/>\n" +
169            "      <paramValue obj='clicked' param='window.hwnd'/>\n" +
170            "    </equals>\n" +
171            "    <storeSeq varSeq='scrolls'>\n" +
172            "      <resolveHwnd param='scrollBarHandle' storeParam='scrollBarTarget'/>\n" +
173            "    </storeSeq>\n" +
174            "  </msg>\n" +
175            "  <msg type='&WM_LBUTTONUP;'>\n" +
176            "    <equals>\n" +
177            "      <paramValue obj='this' param='window.hwnd'/>\n" +
178            "      <paramValue obj='clicked' param='window.hwnd'/>\n" +
179            "    </equals>\n" +
180            "  </msg>\n" +
181            "  <genMsgSeq delay='50'>\n" +
182            "    <type>\n" +
183            "      <constValue value='&TBM_SETPOS;'/>\n" +
184            "    </type>\n" +
185            "    <target>\n" +
186            "      <seqValue seqObj='scrolls' param='scrollBarTarget'/>\n" +
187            "    </target>\n" +
188            "    <LPARAM>\n" +
189            "      <seqValue seqObj='scrolls' param='scrollPos'/>\n" +
190            "    </LPARAM>\n" +
191            "    <WPARAM>\n" +
192            "      <constValue value='1'/>\n" +
193            "    </WPARAM>\n" +
194            "  </genMsgSeq>\n" +
195            "</rule>\n";
196       
197        Element ruleElement = getRuleElement(ruleXML);
198       
199        EventGenerationRule rule = new EventGenerationRule(ruleElement, rulesNamespace);
200       
201        assertEquals("HScroll_TrackBar", rule.getName());
202       
203        assertNotNull(rule.getMessageConditions());
204        assertEquals(3, rule.getMessageConditions().size());
205       
206        // check condition 1
207        EventGenerationRule.MessageCondition condition1 = rule.getMessageConditions().get(0);
208        assertEquals(WindowsMessageType.WM_LBUTTONDOWN, condition1.getMessageType());
209        assertFalse(condition1.matchMultiple());
210        assertNotNull(condition1.getAttributeConditions());
211        assertEquals(1, condition1.getAttributeConditions().size());
212        EventGenerationRule.AttributeCondition attrCond1 =
213            condition1.getAttributeConditions().get(0);
214           
215        assertTerm(attrCond1.getLeftHandSide(), "winInfoValue", "this", null, null,
216                   null, null, null, null, null, "class");
217
218        assertTerm(attrCond1.getRightHandSide(), "constValue", null, null, null,
219                   null, null, null, null, "msctls_trackbar32", null);
220
221        assertNotNull(condition1.getMessagesToStore());
222        assertEquals(1, condition1.getMessagesToStore().size());
223       
224        assertTerm(condition1.getMessagesToStore().get(0), "store", "clicked", null, null,
225                   null, null, null, null, null, null);
226
227        // check condition 2
228        EventGenerationRule.MessageCondition condition2 = rule.getMessageConditions().get(1);
229        assertEquals(WindowsMessageType.WM_HSCROLL, condition2.getMessageType());
230        assertTrue(condition2.matchMultiple());
231        assertNotNull(condition2.getAttributeConditions());
232        assertEquals(1, condition2.getAttributeConditions().size());
233       
234        EventGenerationRule.AttributeCondition attrCond2 =
235                condition2.getAttributeConditions().get(0);
236       
237        assertTerm(attrCond2.getLeftHandSide(), "paramValue", "this", null, "scrollBarHandle",
238                   null, null, null, null, null, null);
239
240        assertTerm(attrCond2.getRightHandSide(), "paramValue", "clicked", null, "window.hwnd",
241                   null, null, null, null, null, null);
242
243
244        assertNotNull(condition2.getMessagesToStore());
245        assertEquals(1, condition2.getMessagesToStore().size());
246       
247        String[][] resolveHwnd = { { "scrollBarHandle",  "scrollBarTarget" } };
248        assertTerm(condition2.getMessagesToStore().get(0), "storeSeq", null, null, null,
249                   resolveHwnd, "scrolls", null, null, null, null);
250
251        // check condition 3
252        EventGenerationRule.MessageCondition condition3 = rule.getMessageConditions().get(2);
253        assertEquals(WindowsMessageType.WM_LBUTTONUP, condition3.getMessageType());
254        assertFalse(condition3.matchMultiple());
255        assertNotNull(condition3.getAttributeConditions());
256        assertEquals(1, condition3.getAttributeConditions().size());
257        assertNotNull(condition3.getMessagesToStore());
258        assertEquals(0, condition3.getMessagesToStore().size());
259       
260        EventGenerationRule.AttributeCondition attrCond3 =
261            condition3.getAttributeConditions().get(0);
262       
263        assertTerm(attrCond3.getLeftHandSide(), "paramValue", "this", null, "window.hwnd",
264                   null, null, null, null, null, null);
265
266        assertTerm(attrCond3.getRightHandSide(), "paramValue", "clicked", null, "window.hwnd",
267                   null, null, null, null, null, null);
268
269        // check event parameters
270        assertNotNull(rule.getEventParameters());
271        assertEquals(0, rule.getEventParameters().size());
272       
273        // check replay specs
274        assertNotNull(rule.getReplayMessageSpecifications());
275        assertEquals(1, rule.getReplayMessageSpecifications().size());
276       
277        // check replay spec 1
278        EventGenerationRule.ReplayMessageSpec replaySpec =
279            rule.getReplayMessageSpecifications().get(0);
280       
281        assertNotNull(replaySpec);
282        assertEquals(50, replaySpec.getDelay());
283        assertFalse(replaySpec.generateSingleMessage());
284        assertTerm(replaySpec.getLparam(), "seqValue", null, null, null,
285                   null, "scrolls", "scrollPos", null, null, null);
286        assertNull(replaySpec.getLparamHiWord());
287        assertNull(replaySpec.getLparamLoWord());
288        assertEquals("scrolls", replaySpec.getReplayObjectId());
289        assertTerm(replaySpec.getTarget(), "seqValue", null, null, null,
290                   null, "scrolls", "scrollBarTarget", null, null, null);
291        assertTerm(replaySpec.getType(), "constValue", null, null, null,
292                   null, null, null, null, "" + WindowsMessageType.TBM_SETPOS.getNumber(), null);
293        assertTerm(replaySpec.getWparam(), "constValue", null, null, null,
294                   null, null, null, null, "1", null);
295        assertNull(replaySpec.getWparamHiWord());
296        assertNull(replaySpec.getWparamLoWord());
297       
298    }
299   
300    /**
301     *
302     */
303    private void assertTerm(Term       term,
304                            String     name,
305                            String     messageId,
306                            String     messageInfoName,
307                            String     messageParameterName,
308                            String[][] resolveHandles,
309                            String     sequenceId,
310                            String     sequenceParameterName,
311                            String     storeParameterName,
312                            String     value,
313                            String     windowParameterName)
314    {
315        assertNotNull(term);
316       
317        if (name != null) {
318            assertEquals("name does not match", name, term.getName());
319        }
320        else {
321            assertNull("name is not null", term.getName());
322        }
323       
324        if (messageId != null) {
325            assertEquals("messageId does not match", messageId, term.getMessageId());
326        }
327        else {
328            assertNull("messageId is not null", term.getMessageId());
329        }
330       
331        if (messageInfoName != null) {
332            assertEquals
333                ("messageInfoName does not match", messageInfoName, term.getMessageInfoName());
334        }
335        else {
336            assertNull("messageInfoName is not null", term.getMessageInfoName());
337        }
338
339        if (messageParameterName != null) {
340            assertEquals("messageParameterName does not match", messageParameterName,
341                         term.getMessageParameterName());
342        }
343        else {
344            assertNull("messageParameterName is not null", term.getMessageParameterName());
345        }
346       
347        if (resolveHandles != null) {
348            assertEquals("resolveHandles does not match", resolveHandles.length,
349                         term.getResolveHandles().size());
350           
351            for (int i = 0; i < resolveHandles.length; i++) {
352                assertTerm(term.getResolveHandles().get(i), "resolveHwnd", null, null,
353                           resolveHandles[i][0], null, null, null, resolveHandles[i][1], null, null);
354            }
355        }
356        else {
357            assertNull("resolveHandles is not null", term.getResolveHandles());
358        }
359       
360        if (sequenceId != null) {
361            assertEquals("sequenceId does not match", sequenceId, term.getSequenceId());
362        }
363        else {
364            assertNull("sequenceId is not null", term.getSequenceId());
365        }
366       
367        if (sequenceParameterName != null) {
368            assertEquals("sequenceParameter does not match", sequenceParameterName,
369                         term.getSequenceParameterName());
370        }
371        else {
372            assertNull("sequenceParameter is not null", term.getSequenceParameterName());
373        }
374       
375        if (storeParameterName != null) {
376            assertEquals("storeParameterName does not match",
377                         storeParameterName, term.getStoreParameterName());
378        }
379        else {
380            assertNull("storeParameterName is not null", term.getStoreParameterName());
381        }
382       
383        if (value != null) {
384            assertEquals("value does not match", value, term.getValue());
385        }
386        else {
387            assertNull("value is not null", term.getValue());
388        }
389       
390        if (windowParameterName != null) {
391            assertEquals("windowParameterName does not match", windowParameterName,
392                         term.getWindowParameterName());
393        }
394        else {
395            assertNull("windowParameterName is not null", term.getWindowParameterName());
396        }
397    }
398
399    /**
400     * <p>
401     * TODO: comment
402     * </p>
403     *
404     * @param ruleXML
405     * @return
406     */
407    private Element getRuleElement(String ruleXML) {
408        String fullXML =
409            "<?xml version='1.0' encoding='utf-8'?>\n" +
410            "<!DOCTYPE rules SYSTEM 'data/ruleDoctype.dtd'>\n" +
411            "<rules xmlns='ul:rules' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' " +
412            "                        xsi:schemaLocation='ul:rules ruleSchema.xsd'>\n";
413       
414        fullXML += ruleXML;
415        fullXML += "\n</rules>\n";
416
417        SAXBuilder builder = new SAXBuilder();
418        Document doc = null;
419
420        try {
421            ByteArrayInputStream in = new ByteArrayInputStream(fullXML.getBytes("UTF-8"));
422            doc = builder.build(in);
423            rulesNamespace = Namespace.getNamespace("ul:rules");
424        }
425        catch (JDOMException e) {
426            Console.printerrln("Invalid rules file.");
427            e.printStackTrace();
428        }
429        catch (IOException e) {
430            Console.printerrln("Invalid rules file.");
431            e.printStackTrace();
432        }
433
434        Element rulesRoot = doc.getRootElement();
435       
436        @SuppressWarnings("unchecked")
437        List<Element> ruleElements = rulesRoot.getChildren("rule", rulesNamespace);
438       
439        assertEquals(1, ruleElements.size());
440
441        return ruleElements.get(0);
442    }
443
444}
Note: See TracBrowser for help on using the repository browser.