/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.plugin.debugger.ide;
import org.eclipse.che.api.promises.client.Operation;
import org.eclipse.che.api.promises.client.Promise;
import org.eclipse.che.api.promises.client.PromiseError;
import org.eclipse.che.ide.debug.Debugger;
import org.eclipse.che.ide.debug.DebuggerManager;
import org.eclipse.che.plugin.debugger.ide.debug.expression.EvaluateExpressionPresenter;
import org.eclipse.che.plugin.debugger.ide.debug.expression.EvaluateExpressionView;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.InjectMocks;
import org.mockito.Matchers;
import org.mockito.Mock;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
* Testing {@link EvaluateExpressionPresenter} functionality.
*
* @author Artem Zatsarynnyi
*/
public class EvaluateExpressionTest extends BaseTest {
private static final String EXPRESSION = "expression";
private static final String EMPTY_EXPRESSION = "";
private static final String EVALUATION_RESULT = "result";
private static final String FAIL_REASON = "reason";
@Mock
private EvaluateExpressionView view;
@Mock
private DebuggerManager debuggerManager;
@Mock
private Debugger debugger;
@Mock
private Promise<String> promise;
@Mock
private PromiseError promiseError;
@Captor
private ArgumentCaptor<Operation<PromiseError>> errorCaptor;
@InjectMocks
private EvaluateExpressionPresenter presenter;
@Test
public void shouldShowDialog() throws Exception {
presenter.showDialog();
verify(view).setResult(eq(EMPTY_EXPRESSION));
verify(view).setEnableEvaluateButton(eq(DISABLE_BUTTON));
verify(view).showDialog();
verify(view).focusInExpressionField();
}
@Test
public void shouldCloseDialog() throws Exception {
presenter.closeDialog();
verify(view).close();
}
@Test
public void shouldCloseDialogOnCloseClicked() throws Exception {
presenter.onCloseClicked();
verify(view).close();
}
@Test
public void shouldDisableEvaluateButtonIfNoExpression() throws Exception {
when(view.getExpression()).thenReturn(EMPTY_EXPRESSION);
presenter.onExpressionValueChanged();
verify(view).setEnableEvaluateButton(eq(DISABLE_BUTTON));
}
@Test
public void shouldEnableEvaluateButtonIfExpressionNotEmpty() throws Exception {
when(view.getExpression()).thenReturn(EXPRESSION);
presenter.onExpressionValueChanged();
verify(view).setEnableEvaluateButton(eq(!DISABLE_BUTTON));
}
@Test
public void testEvaluateExpressionRequestIsSuccessful() throws Exception {
when(debugger.evaluate(anyString())).thenReturn(promise);
when(view.getExpression()).thenReturn(EXPRESSION);
when(promise.then(any(Operation.class))).thenReturn(promise);
when(debuggerManager.getActiveDebugger()).thenReturn(debugger);
presenter.showDialog();
presenter.onEvaluateClicked();
verify(view, atLeastOnce()).setEnableEvaluateButton(eq(DISABLE_BUTTON));
verify(debugger).evaluate(eq(EXPRESSION));
}
@Test
public void testEvaluateExpressionRequestIsFailed() throws Exception {
when(view.getExpression()).thenReturn(EXPRESSION);
when(debugger.evaluate(view.getExpression())).thenReturn(promise);
when(promise.then((Operation)anyObject())).thenReturn(promise);
when(promise.catchError(Matchers.<Operation<PromiseError>>anyObject())).thenReturn(promise);
when(debuggerManager.getActiveDebugger()).thenReturn(debugger);
when(promiseError.getMessage()).thenReturn(FAIL_REASON);
presenter.showDialog();
presenter.onEvaluateClicked();
verify(view, atLeastOnce()).setEnableEvaluateButton(eq(DISABLE_BUTTON));
verify(debugger).evaluate(eq(EXPRESSION));
verify(promise).catchError(errorCaptor.capture());
errorCaptor.getValue().apply(promiseError);
verify(view).setEnableEvaluateButton(eq(!DISABLE_BUTTON));
verify(constants).evaluateExpressionFailed(FAIL_REASON);
}
}