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

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