Differences

This shows you the differences between two versions of the page.

Link to this comparison view

tutorial:testing_extensive [2020/04/16 10:56]
tutorial:testing_extensive [2020/04/16 10:56] (current)
Line 1: Line 1:
 +<WRAP adihi><​html><​center></​html>​Build a Test which checks that <wrap adicode>​databinding service</​wrap>​ process between editors.<​html></​center></​html>​
 +\\
 +Main aim of this test is to check the good running of <wrap adicode>​databinding service</​wrap>:​
 +  * Change on an entity in an editor is broadcasted on a second editor.
 +  * Dynamic process on controllers is broadcasted between editors.
 +</​WRAP>​
 +\\
 +=== Create the Test class ===
 +
 +Create java class <wrap adicode>​MyFirstTest.java</​wrap>​ in package <wrap adicode>​org.mycompany.myproject.testing</​wrap>​.
 +<sxh java; first-line: 1; highlight: [22, 29, 32, 37, 50, 53, 57, 70, 73, 74, 77, 78, 79, 82, 87, 90, 91, 94, 95, 96, 99, 100, 104, 106, 108, 110]; title: excerpt from '​MyFirstTest.java'​ class.>
 +package org.mycompany.myproject.testing;​
 +
 +import org.adichatz.engine.controller.collection.SectionController;​
 +import org.adichatz.engine.controller.collection.TabularController;​
 +import org.adichatz.engine.controller.nebula.PGroupController;​
 +import org.adichatz.engine.e4.part.BoundedPart;​
 +import org.adichatz.engine.e4.part.PartCore;​
 +import org.adichatz.engine.e4.resource.E4SimulationTools;​
 +import org.adichatz.engine.plugin.ParamMap;​
 +import org.adichatz.engine.simulation.SimulationTools;​
 +import org.adichatz.jpa.extra.JPAUtil;​
 +import org.adichatz.testing.AdiAssert;​
 +import org.adichatz.testing.TestingTools;​
 +import org.eclipse.swt.widgets.Display;​
 +import org.testng.Assert;​
 +import org.testng.annotations.Test;​
 +
 +public class FilmActorBindingTest {
 + @Test(priority = 1)
 + public void relationshipDatabinding() {
 + // Select Option queriesMenus/​filmQuery in navigator "​groupNavigator"​ and return a part.
 + BoundedPart filmQueryPart = E4SimulationTools.handleNavigatorOpenPartItem("​groupNavigator",​ "​queriesMenu",​ "​filmQUERY"​);​
 + // check that part is active.
 + AdiAssert.isPartActive(filmQueryPart);​
 + TestingTools.testInfo("​QueryForm with query '​filmQUERY'​ is active."​);​
 +
 + PartCore filmQueryCore = filmQueryPart.getGenCode();​
 + // Launch query in filmQuery part.
 + SimulationTools.handleContextMenuAction(filmQueryCore,​ "​tableCM:​contextMenu",​ "​launchQueryAction"​);​
 +
 + // Select "Film 1" in tabular controller "​tableInclude:​table"​.
 + SimulationTools.handleSelectBeanInTableViewer(filmQueryCore,​ "​tableInclude:​table",​ (short) 1);
 + // check that one row in selected in tabular controller "​tableInclude:​table"​.
 + AdiAssert.hasSelection(SimulationTools.getController(filmQueryCore,​ "​tableInclude:​table",​ TabularController.class));​
 +
 + // Open editor for "Film 1"
 + SimulationTools.handleContextMenuAction(filmQueryCore,​ "​tableCM:​contextMenu",​ "​editEntityAction"​);​
 +
 + // Check that an editor with following input parameters exists and is active.
 + String[][] film1Params = new String[][] { { ParamMap.TITLE,​ "Film 1" },
 + { ParamMap.CONTRIBUTION_URI,​ JPAUtil.ENTITY_EDITOR_CONTRIBUTION_URI }, //
 + { ParamMap.ADI_RESOURCE_URI,​ "​adi://​myproject/​model.film/​FilmEDITOR"​ } //
 + };
 + BoundedPart film1Part = E4SimulationTools.handleEditorPart(film1Params);​
 + Assert.assertNotNull(film1Part,​ "Do not find Editor for 'Film 1'"​);​
 + AdiAssert.isPartActive(film1Part);​
 + TestingTools.testInfo("​Editor for 'Film 1' is open and active."​);​
 +
 + // In Navigation item of outline page, select '​actorItem'​ item in '​DependenciesTabFolder'​ CTabFolder of '​Dependencies'​ page.
 + E4SimulationTools.handleNavigationPart(film1Part.getGenCode(),​ "​Dependencies,​ DependenciesTabFolder,​ actorsItem"​);​
 +
 + // Select "Actor 1" in tabular controller "​actorsTSI:​table"​.
 + SimulationTools.handleSelectBeanInTableViewer(film1Part.getGenCode(),​ "​actorsTSI:​table",​ (short) 1);
 + // check that one row in selected in tabular controller "​tableInclude:​table"​.
 + AdiAssert.hasSelection(SimulationTools.getController(film1Part.getGenCode(),​ "​actorsTSI:​table",​ TabularController.class));​
 + // double-click on row "Actor 1" (open or make active an editor for selected row).
 + SimulationTools.handleDoubleClick(film1Part.getGenCode(),​ "​actorsTSI:​table"​);​
 +
 + // Check that an editor with following input parameters exists and is active.
 + String[][] actor1Params = new String[][] { { ParamMap.TITLE,​ "Actor 1" },
 + { ParamMap.CONTRIBUTION_URI,​ JPAUtil.ENTITY_EDITOR_CONTRIBUTION_URI }, //
 + { ParamMap.ADI_RESOURCE_URI,​ "​adi://​myproject/​model.actor/​ActorEDITOR"​ } //
 + };
 + BoundedPart actor1Part = E4SimulationTools.handleEditorPart(actor1Params);​
 + Assert.assertNotNull(actor1Part,​ "Do not find Editor for 'Actor 1'"​);​
 + AdiAssert.isPartActive(actor1Part);​
 + TestingTools.testInfo("​Editor for 'Actor 1' is open and active."​);​
 +
 + // Select page "​Dependencies"​ in current editor ("​Actor 1").
 + E4SimulationTools.handlePage(actor1Part,​ "​Dependencies"​);​
 +
 + // In 'Film 1' editor, check if value hosted by '​filmDetail:​active'​ CheckController is '​false'​.
 + AdiAssert.assertTrue("'​active'​ field in 'Film 1' editor is not '​true'",​
 + ((boolean) SimulationTools.handleGetValueForFieldController(film1Part.getGenCode(),​ "​filmDetail:​active"​)));​
 +
 + // In 'Film 1' editor, check if control of '​filmDetail:​activeGroup'​ PGroupController is not disposed.
 + AdiAssert.assertTrue("'​activeGroup'​ PGroup is disposed in 'Film 1' editor",​
 + !SimulationTools.getController(film1Part.getGenCode(),​ "​filmDetail:​activeGroup",​ PGroupController.class)
 + .getControl().isDisposed());​
 +
 + // Select "Film 1" in tabular controller "​filmsTSI:​table"​.
 + SimulationTools.handleSelectBeanInTableViewer(actor1Part.getGenCode(),​ "​filmsTSI:​table",​ (short) 1);
 +
 + // Change value for "​filmsDIPart:​active"​ FieldController (set active = false simulate a user action on check button)
 + // This change must dispose '​filmDetail:​activeGroup'​ Group controller.
 + // Changes must be broadcasted in '​film1Part'​ editor.
 + SimulationTools.handleSetValueForFieldController(actor1Part.getGenCode(),​ "​filmsDIPart:​active",​ false);
 +
 + // In 'Film 1' editor, check if value hosted by '​filmDetail:​active'​ CheckController is '​false'​.
 + AdiAssert.assertTrue("'​active'​ field in 'Film 1' editor is not false",​
 + !((boolean) SimulationTools.handleGetValueForFieldController(film1Part.getGenCode(),​ "​filmDetail:​active"​)));​
 +
 + // In 'Film 1' editor, check if control of '​filmDetail:​activeGroup'​ PGroupController is disposed.
 + AdiAssert.assertTrue("'​activeGroup'​ PGroup is not disposed in 'Film 1' editor",​
 + SimulationTools.getController(film1Part.getGenCode(),​ "​filmDetail:​activeGroup",​ PGroupController.class)
 + .getControl().isDisposed());​
 +
 + // Check if field controllers in <wrap adicode>​filmDetail:​detailContainer</​wrap>​ SectionController are locks.
 + AdiAssert.isLocked(SimulationTools.getController(film1Part.getGenCode(),​ "​filmDetail:​detailContainer",​
 + SectionController.class));​
 +
 + // Process all deferred layouts before ending test
 + // here, display actor editor after executing all layouts. Otherwise 'Actor 1' editor is closed without displaying controls.
 + Display.getCurrent().readAndDispatch();​
 + // Wait 2 seconds
 + SimulationTools.sleep(2000);​
 + // Refresh change on editor 'Actor 1'.
 + E4SimulationTools.doRefresh(actor1Part.getGenCode(),​ false);
 + // Close all editors
 + E4SimulationTools.closeAll();​
 + }
 +}
 +</​sxh>​
 +<WRAP indic>
 +**Explanations**:​
 +  * line <wrap adicode>​22</​wrap>:​ Open a <wrap adicode>​Query Editor</​wrap>​ for the <wrap adicode>​FilmQUERY</​wrap>​ query using naviator item.
 +  * line <wrap adicode>​29</​wrap>:​ Launch the Query from context menu.
 +  * line <wrap adicode>​32</​wrap>:​ Select row  <wrap adicode>​Film 1</​wrap>​ in <wrap adicode>​tableInclude:​table</​wrap>​. ​  
 +  * line <wrap adicode>​37</​wrap>:​ Select <wrap adicode>​editEntityAction</​wrap>​ option in context menu on select row (opens an <wrap adicode>​Entity editor</​wrap>​).
 +  * line <wrap adicode>​50</​wrap>:​ <wrap adicode>​Film 1</​wrap>​ editor is active, ​ in Navigation item of outline page, select <wrap adicode>​actorItem</​wrap>​ item.
 +  * line <wrap adicode>​53</​wrap>:​ Select row <wrap adicode>​Actor 1</​wrap>​ in tabular controller <wrap adicode>​actorsTSI:​table</​wrap>​.
 +  * line <wrap adicode>​57</​wrap>:​ Double-click on row <wrap adicode>​Actor 1</​wrap>​ (open or make active an editor for selected row).
 +  * line <wrap adicode>​70</​wrap>:​ <wrap adicode>​Actor 1</​wrap>​ editor is active, ​ Select <wrap adicode>​Dependencies</​wrap>​ page.
 +Tests before changing value for <wrap adicode>​filmsDIPart:​active</​wrap>​ FieldController.
 +  * line <wrap adicode>​73</​wrap>:​ In <wrap adicode>​Film 1</​wrap>​ editor, check if value hosted by <wrap adicode>​filmDetail:​active</​wrap>​ CheckController is <wrap adicode>​false</​wrap>​.
 +  * line <wrap adicode>​77</​wrap>:​ In <wrap adicode>​Film 1</​wrap>​ editor, check if control of <wrap adicode>​filmDetail:​activeGroup</​wrap>​ PGroupController is disposed.
 +Change.
 +  * line <wrap adicode>​82</​wrap>:​ Select row  <wrap adicode>​Film 1</​wrap>​ in <wrap adicode>​filmsTSI:​table</​wrap>​.
 +  * line <wrap adicode>​87</​wrap>:​ Change value for <wrap adicode>​filmsDIPart:​active</​wrap>​ FieldController (set <wrap adicode>​active</​wrap>​ = <wrap adicode>​false</​wrap>​ simulate a user action on check button)
 +Tests after changing value for <wrap adicode>​filmsDIPart:​active</​wrap>​ FieldController.
 +  * line <wrap adicode>​90</​wrap>:​ In <wrap adicode>​Film 1</​wrap>​ editor, check if value hosted by <wrap adicode>​filmDetail:​active</​wrap>​ CheckController is <wrap adicode>​false</​wrap>​.
 +  * line <wrap adicode>​94</​wrap>:​ In <wrap adicode>​Film 1</​wrap>​ editor, check if control of <wrap adicode>​filmDetail:​activeGroup</​wrap>​ PGroupController is disposed.
 +  * line <wrap adicode>​99</​wrap>:​ Check if field controllers in <wrap adicode>​filmDetail:​detailContainer</​wrap>​ SectionController are locks. ​
 +Display and close edtors
 +  * line <wrap adicode>​104</​wrap>:​ Ends layouts process in <wrap adicode>​Actor 1</​wrap>​ editor (otherwise nothing is visible).
 +  * line <wrap adicode>​106</​wrap>:​ Refresh (cancel) cupdated entities in <wrap adicode>​Actor 1</​wrap>​ editor. ​
 +  * line <wrap adicode>​110</​wrap>:​ Close all editors. ​
 +</​WRAP>​
 +\\ \\
 +=== Create a intended bug ===
 +Use example: [[extend_controller#​example_2extend_a_specific_ccombocontroller_for_property_rating | extend a ccombo contorller for '​rating'​ property]].\\
 +Add a bug in the new controller named <wrap adicode>​org.mycompany.myProject.gencode.custom.RatingCComboController</​wrap>​ as shown:
 +<sxh java first-line: 1; highlight: [43, 44, 45, 46]; title: excerpt from '​RatingCComboController.java'​ class.>
 +package org.mycompany.myproject.gencode.custom;​
 +
 +import org.adichatz.engine.controller.IContainerController;​
 +import org.adichatz.engine.controller.field.CComboController;​
 +import org.adichatz.engine.core.ControllerCore;​
 +import org.eclipse.swt.SWT;​
 +import org.eclipse.swt.events.SelectionAdapter;​
 +import org.eclipse.swt.events.SelectionEvent;​
 +import org.eclipse.swt.widgets.Display;​
 +
 +public class RatingCComboController extends CComboController {
 +
 + public RatingCComboController(String id, IContainerController parentController,​ ControllerCore genCode) {
 + super(id, parentController,​ genCode);
 + }
 +
 + @Override
 + public void createControl() {
 + super.createControl();​
 + getCCombo().addSelectionListener(new SelectionAdapter() {
 + @Override
 + public void widgetSelected(SelectionEvent e) {
 + setRatingBackGroundColor();​
 + }
 + });
 + }
 +
 + @Override
 + public void setValue(Object value) {
 + super.setValue(value);​
 + setRatingBackGroundColor();​
 + }
 +
 + private void setRatingBackGroundColor() {
 + if ("​NC-17"​.equals(getValue()))
 + getCCombo().setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));​
 + else if ("​R"​.equals(getValue()))
 + getCCombo().setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_YELLOW));​
 + else
 + getCCombo().setBackground(null);​
 + }
 +
 + @Override
 + public void lockEntity(boolean locked) {
 + // BUG : this method must be deleted
 + }
 +}
 +</​sxh>​
 +<WRAP indic>
 +Lines 43-46: This intended bug is just as example.
 +</​WRAP>​
 +\\ \\
 +=== Step 3: Add entry to '​AdichatzRcpCongif.xml'​ file ===
 +<WRAP adihi>​You need to add an simple entry in file <wrap adicode>​$projectDirectory/​resources/​xml/​AdichatzRcpConfig.xml</​wrap>​ as shown below:</​WRAP>​
 +<sxh xml; first-line: 15; highlight: [19]; title: excerpt from '​AdichatzRcpConfig.xml'​ class.>
 +<?xml version="​1.0"​ encoding="​UTF-8"​ standalone="​yes"?>​
 +    <testing expanded="​true">​
 +        <suite id="​myFirstSuite"​ label="​Suite example"​ launchOnStartup="​false"​ expanded="​true">​
 +            <test id="​myFirstTest"​ label="​my first test" testURI="​bundleclass://​myproject/​org.mycompany.myproject.testing.MyFirstTest"/>​
 +            <test id="​filmActorTest"​ label="​Film/​Actor databinding test" testURI="​bundleclass://​myproject/​org.mycompany.myproject.testing.FilmActorBindingTest"​ expanded="​true"/>​
 +        </​suite>​
 +    </​testing>​
 +</​sxh>​
 +<WRAP indic>
 +Lines 19: Add this line in <wrap adicode>​AdichatzRcpConfig.xml</​wrap>,​ relaunch application or <wrap adicode>​Refresh testing menu</​wrap>​ in application:​ The new item is available.
 +</​WRAP>​
 +\\ \\
 +=== Step 4: Execute and reexecute tests ===
 +{{testing_film_actor.png |Execute the test}}
 +<WRAP indic>To execute the test: click on the corresponding item (<wrap adicode>​Film Actor databinding test</​wrap>​).
 +  * Test fails, at line <wrap adicode>​98</​wrap>​.
 +  * Close all editor and delete method <wrap adicode>​lockEntity</​wrap>​ of class <wrap adicode>​RatingCComboController</​wrap>​.
 +  * Rexecute test: Click on item <wrap adicode>​Film Actor databinding test</​wrap>​.
 +  * Test is sucessfull, All editors are closed.
 +</​WRAP> ​