[app] Display 'transaction.value' after completion (bug #25)
[abstract.git] / app / aaTestVC.js
blobc618cbc1e20eca78ba051e69e245c39613a3ef92
1 /* vim:set ts=2 sw=2 sts=2 et cindent tw=79 ft=javascript: */
2 /*
3  * Copyright (C) 2007 Sergey Yanovich <ynvich@gmail.com>
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License as
7  * published by the Free Software Foundation; either version 2 of the
8  * License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public
16  * License along with this program; if not, write to the
17  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18  * Boston, MA 02111-1307, USA.
19  */
21 const nsCI                   = Components.interfaces
22 const moduleName             = "aaVCTest";
23 const moduleCID              = "{c23f7275-3b2f-432a-b2fe-c560b7b0a069}";
24 const moduleContractID       = "@aasii.org/abstract/test/vc-base;1";
26 Components.utils.import("resource:///modules/aaTestVC.jsm");
29  * Module entry point
30  * The NSGetModule function is the magic entry point that XPCOM uses to find
31  * what XPCOM components this module provides
32  */
33 function NSGetModule(comMgr, fileSpec)
35   var loader = Components.classes["@mozilla.org/moz/jssubscript-loader;1"]
36     .getService(Components.interfaces.mozIJSSubScriptLoader);
37   loader.loadSubScript("resource:///modules/nsTestFrame.jsm");
39   var aaVCTestModule = new JSTestModule();
40   aaVCTestModule.init = ModuleInit;
41   aaVCTestModule.init();
42   return aaVCTestModule;
45 function ModuleInit()
47   this._name = moduleName;
48   this._CID = Components.ID(moduleCID);
49   this._contractID = moduleContractID;
51   /*  0 */
52   this._add(top_CID, top_contractID, top_name, top_test, top_check);
53   /*  1 */
54   this._add(show_entity_CID, show_entity_contractID, show_entity_name,
55       show_entity_test, show_entity_check);
56   /*  2 */
57   this._add(entity_CID, entity_contractID, entity_name, entity_test, null);
58   /*  3 */
59   this._add(show_resource_CID, show_resource_contractID, show_resource_name,
60       show_resource_test, show_resource_check);
61   /*  4 */
62   this._add(resource_CID, resource_contractID, resource_name, resource_test, null);
63   /*  5 */
64   this._add(flow_CID, flow_contractID, flow_name, flow_test, flow_page_check);
65   /*  6 */
66   this._add(flow_entity_CID, flow_entity_contractID, flow_entity_name,
67       flow_entity_test, flow_entity_check);
68   /*  7 */
69   this._add(entity_discard_CID, entity_discard_contractID, entity_discard_name,
70       entity_discard_test, entity_discard_check);
71   /*  8 */
72   this._repeat(6);
73   /*  9 */
74   this._add(entity_submit_CID, entity_submit_contractID, entity_submit_name,
75       entity_submit_test, entity_submit_check);
76   /* 10 */
77   this._add(flow_give_CID, flow_give_contractID, flow_give_name,
78       flow_give_test, flow_resource_check);
79   /* 11 */
80   this._add(give_discard_CID, give_discard_contractID, give_discard_name,
81       resource_discard_test, give_discard_check);
82   /* 12 */
83   this._repeat(10);
84   /* 13 */
85   this._add(give_submit_CID, give_submit_contractID, give_submit_name,
86       resource_submit_test, give_submit_check);
87   /* 14 */
88   this._add(flow_take_CID, flow_take_contractID, flow_take_name,
89       flow_take_test, flow_resource_check);
90   /* 15 */
91   this._add(take_discard_CID, take_discard_contractID, take_discard_name,
92       resource_discard_test, take_discard_check);
93   /* 16 */
94   this._repeat(14);
95   /* 17 */
96   this._add(take_submit_CID, take_submit_contractID, take_submit_name,
97       resource_submit_test, take_submit_check);
98   /* 18 */
99   this._add(flow_save_CID, flow_save_contractID, flow_save_name,
100       flow_save_test, null);
103 /* Module-specific Defines and Utilities */
104 var contentId = "content";
105 var treeId = "page1.tree";
106 var gItem = -1;
108 /* Top Window Test */
109 const top_contractID = "@aasii.org/abstract/test/vc-top;1";
110 const top_name = "aaVCTopTest";
111 const top_CID = Components.ID("{5274ac84-fc9c-4bf9-9689-0a89f5638e1c}");
113 function top_test(runner)
115   runner.watchWindow = runner.testWindow;
118 function top_check(runner)
120   var doc = runner.testWindow.document;
121   if ( doc.documentElement.tagName != "window" )
122     runner.addJSFailure("main window not created");
124   var web = doc.getElementById("content").docShell
125     .QueryInterface(nsCI.nsIWebNavigation);
127   if (web.currentURI.spec != "about:blank")
128     runner.addJSFailure("content is not expected at startup: " + web.currentURI.spec);
129   var session = web.sessionHistory.QueryInterface(nsCI.aaISession);
130   if (! session)
131     runner.addJSFailure("session not started");
134 /* 'cmd_show1' Test */
135 const show_entity_contractID = "@aasii.org/abstract/test/show-entity;1";
136 const show_entity_name = "aaVCShow1Test";
137 const show_entity_CID = Components.ID("{8a57485e-fed0-4eed-ab93-5f9c01aacbe8}");
138 const entityTagId = "entity.tag";
140 function show_entity_test(runner)
142   runner.doCommand("cmd_view_entity");
143   runner.watchWindow = getFrame(runner).contentWindow;
146 function show_entity_check(runner)
148   var tree = getElement(runner,treeId);
149   var box = getElement(runner, entityTagId);
151   if (! tree)
152     runner.addJSFailure("entity page failed");
153   if (tree.view.getCellText(0,tree.columns[0]) != "abstract")
154     runner.addJSFailure("entity.tree.line1 failed");
155   if (tree.view.getCellText(1,tree.columns[0]) != "Sergey")
156     runner.addJSFailure("entity.tree.line2 failed");
157   if (! entity_details_check(tree, box))
158     runner.addJSFailure("entity.tag failed");
159   // XXX 403202 'Unflexing' the tree speeds up reflow significantly
160   if (tree && tree.hasAttribute("flex"))
161     tree.removeAttribute("flex");
164 /* page1 Test */
165 const entity_contractID = "@aasii.org/abstract/test/entity;1";
166 const entity_name = "aaVCPage1OnSelectTest";
167 const entity_CID = Components.ID("{213e5e73-f6d7-42c4-9d04-746fd6d7f01a}");
169 function entity_details_check(tree, box)
171   if (! tree || ! box)
172     return null;
173   var row = tree.view.selection.currentIndex;
174   var text = box.value;
175   if (row == -1 || ! tree.view.selection.isSelected(row)) {
176     if (text == "")
177       return true;
178     else
179       return false;
180   } else {
181     if (tree.view.getCellText(row,tree.columns[0]) == text)
182       return true;
183     else
184       return false;
185   }
188 function entity_test(runner)
190   var tree = getElement(runner,treeId);
191   var box = getElement(runner, entityTagId);
193   tree.view.selection.select(0);
194   if (! entity_details_check(tree, box))
195     runner.addJSFailure("page1.tag not synched");
196   runner.doCommand("cmd_page1_new");
197   if (box.getAttribute("focused") != "true")
198     runner.addJSFailure("entity.tag not focused");
199   if (tree.view.selection.currentIndex != -1)
200     runner.addJSFailure("entity.tree selection not cleared");
201   if (! entity_details_check(tree, box))
202     runner.addJSFailure("entity.tag not synched");
204   runner.doCommand("cmd_page1_cancel");
205   if (tree.view.selection.currentIndex != 0)
206     runner.addJSFailure("page1.tree selection not restored");
207   if (! entity_details_check(tree, box))
208     runner.addJSFailure("page1.tag not synched");
210   tree.view.selection.select(-1);
211   runner.doCommand("cmd_page1_new");
212   if (tree.view.getCellText(0,tree.columns[0]) != "abstract")
213     runner.addJSFailure("entity.tree.line1 failed");
214   box.value = "junk";
215   runner.doCommand("cmd_page1_cancel");
216   if (! entity_details_check(tree, box))
217     runner.addJSFailure("page1.tag not synched");
219   tree.view.selection.select(0);
220   runner.doCommand("cmd_page1_new");
221   box.value = "junk";
222   runner.doCommand("cmd_page1_reset");
223   if (! entity_details_check(tree, box))
224     runner.addJSFailure("page1.tag not synched");
226   try {
227     runner.doCommand("cmd_page1_save");
228     runner.addJSFailure("page1.save not disabled");
229   } catch (e) {
230   }
231   box.value="insert";
232   var entity = getFrame(runner).contentWindow.wrappedJSObject
233     .gDetails.buffer;
234   if (entity.edited)
235     runner.addJSFailure("blank entity marked edited");
236   sendOnInput(box);
237   if (! entity.edited)
238     runner.addJSFailure("edited entity marked blank");
239   entity = null;
241   var count = tree.view.rowCount;
242   runner.doCommand("cmd_page1_save");
243   if (tree.view.selection.currentIndex != count)
244     runner.addJSFailure("page1.tree insert not focused");
246   runner.doCommand("cmd_page1_cancel");
247   if (tree.view.selection.currentIndex != -1)
248     runner.addJSFailure("page1.tree selection not cleared");
250   try {
251     runner.doCommand("cmd_page1_change");
252     runner.addJSFailure("page1.change not disabled");
253   } catch (e) {
254   }
255   tree.view.selection.select(count);
256   runner.doCommand("cmd_page1_change");
257   box.value="abstract";
258   sendOnInput(box);
259   runner.doCommand("cmd_page1_save");
260   if (box.value != "insert")
261     runner.addJSFailure("page1.tag not unique");
262   box.value="A.N. Onymous";
263   sendOnInput(box);
264   runner.doCommand("cmd_page1_save");
265   if (! entity_details_check(tree, box))
266     runner.addJSFailure("page1.tag not synched");
267   if (tree.view.selection.currentIndex != count)
268     runner.addJSFailure("page1.change on wrong index");
269   if (box.value != "A.N. Onymous")
270     runner.addJSFailure("entity.change not saved");
272   if (getAnnoElement(runner, "header", "header.discard")
273       .getAttribute("collapsed") != "true")
274     runner.addJSFailure("entity.discard button should not be visible");
275   if (getAnnoElement(runner, "header", "header.submit")
276       .getAttribute("collapsed") != "true")
277     runner.addJSFailure("entity.submit button should not be visible");
278   if (getElement(runner, "cmd_page1_discard")
279       .getAttribute("disabled") != "true")
280     runner.addJSFailure("entity_discard command should be disabled");
281   if (getElement(runner, "cmd_page1_submit")
282       .getAttribute("disabled") != "true")
283     runner.addJSFailure("entity_submit command should be disabled");
286 /* 'cmd_show2' Test */
287 const show_resource_contractID = "@aasii.org/abstract/test/show-resource;1";
288 const show_resource_name = "aaVCShow2Test";
289 const show_resource_CID = Components.ID("{2aa28aa0-d25c-4fdc-a32b-27fe83afab1d}");
290 const resourceTagId = "resource.tag";
292 function show_resource_test(runner)
294   runner.doCommand("cmd_view_resource");
295   runner.watchWindow = getFrame(runner).contentWindow;
298 function resource_details_check(tree, box)
300   if (! tree || ! box)
301     return null;
302   var row = tree.view.selection.currentIndex;
303   var text = box.value;
304   if (row == -1 || ! tree.view.selection.isSelected(row)) {
305     if (text == "")
306       return true;
307     else
308       return false;
309   } else {
310     if (tree.view.getCellText(row,tree.columns[0]) == text)
311       return true;
312     else
313       return false;
314   }
317 function show_resource_check(runner)
319   var tree = getElement(runner,treeId);
320   var box = getElement(runner, resourceTagId);
322   if (! tree)
323     runner.addJSFailure("Browse->Resources failed");
324   if (tree.view.getCellText(0,tree.columns[0]) != "RUB")
325     runner.addJSFailure("resources page1.tree.line1 failed");
326   if (! resource_details_check(tree, box))
327     runner.addJSFailure("resource.tag failed");
328   // XXX 403202 'Unflexing' the tree speeds up reflow significantly
329   if (tree && tree.hasAttribute("flex"))
330     tree.removeAttribute("flex");
333 /* page2 Test */
334 const resource_contractID = "@aasii.org/abstract/test/resource;1";
335 const resource_name = "aaVCPage2OnSelectTest";
336 const resource_CID = Components.ID("{540d4ac5-d104-473c-846a-052d50ca62be}");
338 function resource_test(runner)
340   var tree = getElement(runner,treeId);
341   var box = getElement(runner, resourceTagId);
343   tree.view.selection.select(0);
344   if (! resource_details_check(tree, box))
345     runner.addJSFailure("resource page1.tag not synched");
346   runner.doCommand("cmd_page1_new");
347   if (box.getAttribute("focused") != "true")
348     runner.addJSFailure("resource page1.tag not focused");
349   if (tree.view.selection.currentIndex != -1)
350     runner.addJSFailure("resource page1.tree selection not cleared");
351   if (! resource_details_check(tree, box))
352     runner.addJSFailure("resource page1.tag not synched");
354   runner.doCommand("cmd_page1_cancel");
355   if (tree.view.selection.currentIndex != 0)
356     runner.addJSFailure("resource page1.tree selection not restored");
357   if (! resource_details_check(tree, box))
358     runner.addJSFailure("resource page1.tag not synched");
360   tree.view.selection.select(-1);
361   runner.doCommand("cmd_page1_new");
362   box.value = "junk";
363   runner.doCommand("cmd_page1_cancel");
364   if (! resource_details_check(tree, box))
365     runner.addJSFailure("resource page1.tag not synched");
367   tree.view.selection.select(0);
368   runner.doCommand("cmd_page1_new");
369   box.value = "junk";
370   runner.doCommand("cmd_page1_reset");
371   if (! resource_details_check(tree, box))
372     runner.addJSFailure("resource page1.tag not synched");
374   try {
375     runner.doCommand("cmd_page1_save");
376     runner.addJSFailure("resource page1.save not disabled");
377   } catch (e) {
378   }
379   box.value="EU";
380   sendOnInput(box);
382   var count = tree.view.rowCount;
383   runner.doCommand("cmd_page1_save");
384   if (tree.view.selection.currentIndex != count)
385     runner.addJSFailure("resource page1.tree insert not focused");
386   if (! resource_details_check(tree, box))
387     runner.addJSFailure("resource page1.tag not synched");
389   tree.view.selection.select(-1);
390   try {
391     runner.doCommand("cmd_page1_change");
392     runner.addJSFailure("resource page1.change not disabled");
393   } catch (e) {
394   }
395   tree.view.selection.select(count);
396   runner.doCommand("cmd_page1_change");
397   box.value="AASI share";
398   sendOnInput(box);
399   runner.doCommand("cmd_page1_save");
400   if (box.value != "EU")
401     runner.addJSFailure("resource page1.tag not unique");
402   box.value="USD";
403   sendOnInput(box);
404   runner.doCommand("cmd_page1_save");
405   if (! resource_details_check(tree, box))
406     runner.addJSFailure("resource page1.tag not synched");
407   if (tree.view.selection.currentIndex != count)
408     runner.addJSFailure("resource page1.change on wrong index");
409   if (box.value != "USD")
410     runner.addJSFailure("resource page1.change not saved");
413 /* flow Test */
414 const flow_contractID = "@aasii.org/abstract/test/flow;1";
415 const flow_name = "aaVCFlowPageTest";
416 const flow_CID = Components.ID("{b2c6addf-862e-4457-99b7-1909ef6208e0}");
417 const flowTagId = "flow.tag";
419 function flow_test(runner)
421   runner.doCommand("cmd_process_flow");
422   runner.watchWindow = getFrame(runner).contentWindow;
425 function flow_page_check(runner)
427   var tree = getElement(runner,treeId);
428   // XXX 403202 'Unflexing' the tree speeds up reflow significantly
429   if (tree && tree.hasAttribute("flex"))
430     tree.removeAttribute("flex");
432   flow_check(runner);
433   if (getAnnoElement(runner, "header", "header.discard")
434       .getAttribute("collapsed") != "true")
435     runner.addJSFailure("flow.discard button should be invisible");
436   if (getAnnoElement(runner, "header", "header.submit")
437       .getAttribute("collapsed") != "true")
438     runner.addJSFailure("flow.submit button should be invisible");
439   if (getElement(runner, "cmd_page1_discard")
440       .getAttribute("disabled") != "true")
441     runner.addJSFailure("flow_discard command should be disabled");
442   if (getElement(runner, "cmd_page1_submit")
443       .getAttribute("disabled") != "true")
444     runner.addJSFailure("flow_submit command should be disabled");
446   tree.view.selection.select(3);
447   if (! flow_details_check(runner))
448     runner.addJSFailure("[flow] page not synched");
449   getElement(runner, "rate.direction").selectedIndex = 1;
450   if (! flow_details_check(runner))
451     runner.addJSFailure("[flow] page not synched");
452   //var details = getFrame(runner).contentWindow.wrappedJSObject.gDetails;
453   //jsdump("flow_page: " +tree.view.selection.currentIndex + " - " + details.index);
454   runner.doCommand("cmd_page1_new");
455   //var details = getFrame(runner).contentWindow.wrappedJSObject.gDetails;
456   //jsdump("flow_page: " +tree.view.selection.currentIndex + " - " + details.index);
457   if (! flow_details_check(runner))
458     runner.addJSFailure("[flow] page not synched");
461 /* ask for entity from flow page */
462 const flow_entity_contractID = "@aasii.org/abstract/test/flow-entity;1";
463 const flow_entity_name = "aaVCFlowEntityTest";
464 const flow_entity_CID = Components.ID("{1b16209f-d818-4bf1-862d-64953ff8c414}");
466 function flow_entity_test(runner)
468   runner.doCommand("cmd_flow_entity");
469   runner.watchWindow = getFrame(runner).contentWindow;
472 const entity_discard_contractID = "@aasii.org/abstract/test/entity-discard;1";
473 const entity_discard_name = "aaVCEntityDiscardTest";
474 const entity_discard_CID = Components.ID("{21737fb5-a114-4a9a-bc45-907ecbffeb23}");
476 function entity_discard_check(runner)
478   flow_check(runner);
479   if (getElement(runner, entityTagId).value != "")
480     runner.addJSFailure("entity discard failed");
483 const entity_submit_contractID = "@aasii.org/abstract/test/entity-submit;1";
484 const entity_submit_name = "aaVCEntitySubmitTest";
485 const entity_submit_CID = Components.ID("{755a6691-7d04-4b02-95e8-894b3dd17034}");
487 function entity_submit_check(runner)
489   flow_check(runner);
490   if (getElement(runner, entityTagId).value != "Sergey")
491     runner.addJSFailure("entity submit failed");
494 /* submit/discard from entity page */
495 function flow_entity_check(runner)
497   show_entity_check(runner);
499   if (getAnnoElement(runner, "header", "header.discard")
500       .getAttribute("collapsed") == "true")
501     runner.addJSFailure("entity.discard button should be visible");
502   if (getAnnoElement(runner, "header", "header.submit")
503       .getAttribute("collapsed") == "true")
504     runner.addJSFailure("entity.submit button should be visible");
505   if (getElement(runner, "cmd_page1_discard")
506       .getAttribute("disabled") == "true")
507     runner.addJSFailure("entity_discard command should be enabled");
508   if (getElement(runner, "cmd_page1_submit")
509       .getAttribute("disabled") == "true")
510     runner.addJSFailure("entity_submit command should be enabled");
513 function entity_discard_test(runner)
515   getElement(runner,treeId).view.selection.select(1);
516   runner.doCommand("cmd_page1_discard");
517   runner.watchWindow = getFrame(runner).contentWindow;
520 function entity_submit_test(runner)
522   getElement(runner,treeId).view.selection.select(1);
523   runner.doCommand("cmd_page1_submit");
524   runner.watchWindow = getFrame(runner).contentWindow;
527 /* submit/discard from resource page */
528 function flow_resource_check(runner)
530   show_resource_check(runner);
532   if (getAnnoElement(runner, "header", "header.discard")
533       .getAttribute("collapsed") == "true")
534     runner.addJSFailure("resource.discard button should be visible");
535   if (getAnnoElement(runner, "header", "header.submit")
536       .getAttribute("collapsed") == "true")
537     runner.addJSFailure("resource.submit button should be visible");
538   if (getElement(runner, "cmd_page1_discard")
539       .getAttribute("disabled") == "true")
540     runner.addJSFailure("resource_discard command should be enabled");
541   if (getElement(runner, "cmd_page1_submit")
542       .getAttribute("disabled") == "true")
543     runner.addJSFailure("resource_submit command should be enabled");
546 function resource_discard_test(runner)
548   getElement(runner,treeId).view.selection.select(1);
549   runner.doCommand("cmd_page1_discard");
550   runner.watchWindow = getFrame(runner).contentWindow;
553 function resource_submit_test(runner)
555   getElement(runner,treeId).view.selection.select(gItem);
556   runner.doCommand("cmd_page1_submit");
557   runner.watchWindow = getFrame(runner).contentWindow;
560 /* ask for give resource from flow page */
561 const flow_give_contractID = "@aasii.org/abstract/test/flow-give;1";
562 const flow_give_name = "aaVCFlowGiveResourceTest";
563 const flow_give_CID = Components.ID("{fc969e46-99d8-4612-b502-2494e2d372cd}");
565 function flow_give_test(runner)
567   gItem = 0;
568   runner.doCommand("cmd_flow_give");
569   runner.watchWindow = getFrame(runner).contentWindow;
572 const give_discard_contractID = "@aasii.org/abstract/test/give-discard;1";
573 const give_discard_name = "aaGiveResourceDiscardTest";
574 const give_discard_CID = Components.ID("{6b3c8a33-e4eb-41f3-8367-0926ef033197}");
576 function give_discard_check(runner)
578   flow_check(runner);
579   if (getElement(runner, "give.tag").value != "")
580     runner.addJSFailure("resource dsicard failed");
583 const give_submit_contractID = "@aasii.org/abstract/test/give-submit;1";
584 const give_submit_name = "aaGiveResourceSubmitTest";
585 const give_submit_CID = Components.ID("{a7a676e9-45c2-49cd-be2b-c40da915fb20}");
587 function give_submit_check(runner)
589   flow_check(runner);
590   if (getElement(runner, "give.tag").value != "RUB")
591     runner.addJSFailure("resource submit failed");
594 /* ask for take resource from flow page */
595 const flow_take_contractID = "@aasii.org/abstract/test/flow-take;1";
596 const flow_take_name = "aaVCFlowTakeResourceTest";
597 const flow_take_CID = Components.ID("{573b04f4-2d4c-4a70-a880-939f960ea883}");
599 function flow_take_test(runner)
601   gItem = 3;
602   runner.doCommand("cmd_flow_take");
603   runner.watchWindow = getFrame(runner).contentWindow;
606 const take_discard_contractID = "@aasii.org/abstract/test/take-discard;1";
607 const take_discard_name = "aaTakeResourceDiscardTest";
608 const take_discard_CID = Components.ID("{8a096221-c744-4cc9-9689-ed53b3b28858}");
610 function take_discard_check(runner)
612   flow_check(runner);
613   if (getElement(runner, "take.tag").value != "")
614     runner.addJSFailure("resource discard failed");
617 const take_submit_contractID = "@aasii.org/abstract/test/take-submit;1";
618 const take_submit_name = "aaTakeResourceSubmitTest";
619 const take_submit_CID = Components.ID("{fed26559-2aee-458c-8778-0f5d363cab86}");
621 function take_submit_check(runner)
623   flow_check(runner);
624   if (getElement(runner, "take.tag").value != "EUR")
625     runner.addJSFailure("resource submit failed");
628 const flow_save_contractID = "@aasii.org/abstract/test/flow-save;1";
629 const flow_save_name = "aaVCFlowSaveTest";
630 const flow_save_CID = Components.ID("{a8704d86-db0e-4256-bdc4-4774d11cf2fb}");
632 function flow_save_test(runner)
634   var tree = getElement(runner,treeId);
635   var tagBox = getElement(runner, "flow.tag")
636   var rateBox = getElement(runner, "flow.rate")
637   var count = tree.view.rowCount;
639   tagBox.value = "equipment storage 1";
640   sendOnInput(tagBox);
641   if (! flow_details_check(runner))
642     runner.addJSFailure("[flow save] page not synched");
643   rateBox.value = "1";
644   sendOnInput(rateBox);
645   if (! flow_details_check(runner))
646     runner.addJSFailure("[flow save] page not synched");
647   runner.doCommand("cmd_page1_save");
648   if (tree.view.selection.currentIndex != count)
649     runner.addJSFailure("[flow save] insert not focused in the tree");
650   if (! flow_details_check(runner))
651     runner.addJSFailure("[flow save] page not synched");
652   try {
653     runner.doCommand("cmd_page1_change");
654     runner.addJSFailure("[flow save] 'change' not disabled");
655   } catch (e) {
656   }