package org.drools.workbench.screens.guided.dtable.client.widget;
import com.google.gwt.event.dom.client.BlurEvent;
import com.google.gwt.event.dom.client.BlurHandler;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwtmockito.GwtMockitoTestRunner;
import com.google.gwtmockito.WithClassesToStub;
import org.drools.workbench.models.datamodel.rule.BaseSingleFieldConstraint;
import org.drools.workbench.models.guided.dtable.shared.model.ConditionCol52;
import org.drools.workbench.models.guided.dtable.shared.model.GuidedDecisionTable52;
import org.drools.workbench.models.guided.dtable.shared.model.Pattern52;
import org.drools.workbench.screens.guided.dtable.client.resources.i18n.GuidedDecisionTableConstants;
import org.drools.workbench.screens.guided.dtable.client.resources.images.GuidedDecisionTableImageResources508;
import org.drools.workbench.screens.guided.rule.client.editor.CEPWindowOperatorsDropdown;
import org.gwtbootstrap3.client.ui.InlineRadio;
import org.gwtbootstrap3.client.ui.Modal;
import org.gwtbootstrap3.client.ui.TextBox;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.kie.workbench.common.services.shared.preferences.ApplicationPreferences;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.uberfire.ext.widgets.common.client.common.ImageButton;
import java.util.HashMap;
import java.util.Map;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.mock;
@WithClassesToStub( {Modal.class,
GuidedDecisionTableImageResources508.class,
CEPWindowOperatorsDropdown.class} )
@RunWith(GwtMockitoTestRunner.class)
public class ConditionPopupViewTest {
@Mock
private ConditionPopup presenter;
@Mock
private Pattern52 pattern52;
@Mock
private ConditionCol52 conditionCol52;
@Mock
private ImageButton changePattern;
@Mock
private InlineRadio literal;
@Mock
private InlineRadio predicate;
@Mock
private InlineRadio formula;
@Mock
private TextBox binding;
@Mock
private TextBox fieldLabel;
@Mock
private ImageButton editField;
@Mock
private ImageButton operator;
@Mock
private TextBox entryPoint;
@Mock
private TextBox header;
@Mock
private TextBox valueList;
@Mock
private BlurEvent blurEvent;
@Mock
private ClickEvent event;
@Mock
private ChangeEvent changeEvent;
@Captor
private ArgumentCaptor<BlurHandler> blurHandlerCaptor;
@Captor
private ArgumentCaptor<ClickHandler> clickHandlerCaptor;
@Captor
private ArgumentCaptor<ChangeHandler> changeHandlerCaptor;
private ConditionPopupView view;
@Before
public void setUp() throws Exception {
Map<String, String> args = new HashMap<>();
args.put( ApplicationPreferences.DATE_FORMAT, "dd-MM-yyyy" );
ApplicationPreferences.setUp( args );
when( pattern52.getEntryPointName() ).thenReturn( "entry_point_name" );
when( presenter.getEditingCol() ).thenReturn( conditionCol52 );
when( presenter.getEditingPattern() ).thenReturn( pattern52 );
when( presenter.getConstraintValueType() ).thenReturn( BaseSingleFieldConstraint.TYPE_LITERAL );
when( presenter.getTableFormat() ).thenReturn( GuidedDecisionTable52.TableFormat.EXTENDED_ENTRY );
view = spy( new ConditionPopupView( presenter ) {
@Override
protected Image getEditImage(){
return mock(Image.class);
}
@Override
protected Image getDisabledImage(){
return mock(Image.class);
}
});
}
@Test
public void testInitializeViewChangePattern() throws Exception {
view.changePattern = changePattern;
view.initializeView();
verify( changePattern ).addClickHandler( clickHandlerCaptor.capture() );
clickHandlerCaptor.getValue().onClick( event );
verify( presenter ).showChangePattern( event );
verify( changePattern ).setEnabled( true );
}
@Test
public void testInitializeViewExtendedEntries() throws Exception {
view.predicate = predicate;
view.formula = formula;
view.literal = literal;
view.initializeView();
verify( literal ).setValue( true );
verify( predicate, never() ).setValue( anyBoolean() );
verify( formula, never() ).setValue( anyBoolean() );
verify( literal ).addClickHandler( clickHandlerCaptor.capture() );
clickHandlerCaptor.getValue().onClick( event );
verify( presenter, never() ).setFactField( null );
verify( presenter ).applyConsTypeChange( BaseSingleFieldConstraint.TYPE_LITERAL );
verify( formula ).addClickHandler( clickHandlerCaptor.capture() );
clickHandlerCaptor.getValue().onClick( event );
verify( presenter, never() ).setFactField( null );
verify( presenter ).applyConsTypeChange( BaseSingleFieldConstraint.TYPE_RET_VALUE );
verify( predicate ).addClickHandler( clickHandlerCaptor.capture() );
clickHandlerCaptor.getValue().onClick( event );
verify( presenter, times( 1 ) ).setFactField( null );
verify( presenter ).applyConsTypeChange( BaseSingleFieldConstraint.TYPE_PREDICATE );
}
@Test
public void testInitializeViewLimitedEntries() throws Exception {
when( presenter.getTableFormat() ).thenReturn( GuidedDecisionTable52.TableFormat.LIMITED_ENTRY );
view.binding = binding;
view.initializeView();
verify( binding ).setEnabled( true );
}
@Test
public void testInitializeViewField() throws Exception {
view.editField = editField;
view.fieldLabel = fieldLabel;
view.initializeView();
verify( fieldLabel ).setEnabled( true );
verify( editField ).addClickHandler( clickHandlerCaptor.capture() );
clickHandlerCaptor.getValue().onClick( event );
verify( presenter ).showFieldChange();
verify( editField ).setEnabled( true );
}
@Test
public void testInitializeViewOperator() throws Exception {
view.editOp = operator;
view.initializeView();
verify( operator ).addClickHandler( clickHandlerCaptor.capture() );
clickHandlerCaptor.getValue().onClick( event );
verify( presenter ).showOperatorChange();
verify( operator ).setEnabled( true );
}
@Test
public void testInitializeViewEntryPoint() throws Exception {
when( entryPoint.getText() ).thenReturn( "new_ep_name" );
view.entryPointName = entryPoint;
view.initializeView();
verify( entryPoint ).setText( "entry_point_name" );
verify( entryPoint ).setEnabled( true );
verify( entryPoint ).addChangeHandler( changeHandlerCaptor.capture() );
changeHandlerCaptor.getValue().onChange( changeEvent );
verify( pattern52 ).setEntryPointName( "new_ep_name" );
}
@Test
public void testInitializeViewHeader() throws Exception {
when( header.getText() ).thenReturn( "NewConditionHeader" );
when( presenter.getHeader() ).thenReturn( "ConditionHeader" );
view.header = header;
view.initializeView();
verify( header ).setEnabled( true );
verify( header ).setText( "ConditionHeader" );
verify( header ).addChangeHandler( changeHandlerCaptor.capture() );
changeHandlerCaptor.getValue().onChange( changeEvent );
verify( presenter ).setHeader( "NewConditionHeader" );
}
@Test
public void testInitializeViewValueListWidget() throws Exception {
when( presenter.getValueList() ).thenReturn( "a,b,c" );
when( valueList.getText() ).thenReturn( "c,b,a" );
view.valueListWidget = valueList;
view.initializeView();
verify( valueList ).addChangeHandler( changeHandlerCaptor.capture() );
changeHandlerCaptor.getValue().onChange( changeEvent );
verify( presenter ).setValueList( "c,b,a" );
verify( valueList ).addBlurHandler( blurHandlerCaptor.capture() );
blurHandlerCaptor.getValue().onBlur( blurEvent );
verify( presenter ).assertDefaultValue();
verify( presenter ).makeDefaultValueWidget();
}
@Test
public void testInitializeViewBinding() throws Exception {
when( binding.getText() ).thenReturn( "NewBinding" );
when( presenter.getBinding() ).thenReturn( "$b" );
view.binding = binding;
view.initializeView();
verify( binding ).setText( "$b" );
verify( binding ).addChangeHandler( changeHandlerCaptor.capture() );
changeHandlerCaptor.getValue().onChange( changeEvent );
verify( presenter ).setBinding( "NewBinding" );
}
@Test
public void testAddDefaultValueIfNoPresent() throws Exception {
verify( view, never() ).addAttribute( anyString(), any( IsWidget.class ) );
view.addDefaultValueIfNoPresent();
verify( view ).addAttribute( eq( GuidedDecisionTableConstants.INSTANCE.DefaultValue() + ":" ), any( SimplePanel.class ) );
view.addDefaultValueIfNoPresent();
verify( view ).addAttribute( eq( GuidedDecisionTableConstants.INSTANCE.DefaultValue() + ":" ), any( SimplePanel.class ) );
}
}