/*
* RConsoleInteraction.java
*
* Copyright (C) 2009-13 by RStudio, Inc.
*
* Unless you have received this program directly from RStudio pursuant
* to the terms of a commercial license agreement with RStudio, then
* this program is licensed to you under the terms of version 3 of the
* GNU Affero General Public License. This program is distributed WITHOUT
* ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
* AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
*
*/
package org.rstudio.studio.selenium;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.Keys;
import org.rstudio.core.client.ElementIds;
import static org.junit.Assert.*;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import java.util.List;
import junit.framework.Assert;
public class RConsoleInteraction {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
driver_ = RStudioWebAppDriver.start();
ConsoleTestUtils.beginConsoleInteraction(driver_);
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
RStudioWebAppDriver.stop();
}
@Test
public void testBasicRInteraction() {
Actions do42 = new Actions(driver_);
do42.sendKeys(Keys.chord(Keys.CONTROL, "l"));
do42.sendKeys(Keys.ESCAPE);
do42.sendKeys("41 + 1");
do42.sendKeys(Keys.ENTER);
do42.perform();
ConsoleTestUtils.waitForConsoleContainsText(driver_, "42");
}
@Test
public void testPopupCompletion() {
// Test invoking autocomplete
List<WebElement>elements = driver_.findElements(By.id(
ElementIds.getElementId(ElementIds.POPUP_COMPLETIONS)));
assertEquals(elements.size(), 0);
Actions popup = new Actions(driver_);
popup.sendKeys(Keys.ESCAPE);
popup.sendKeys("print");
popup.sendKeys(Keys.TAB);
popup.perform();
(new WebDriverWait(driver_, 5)).until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver d) {
List<WebElement>elements = driver_.findElements(By.id(
ElementIds.getElementId(ElementIds.POPUP_COMPLETIONS)));
return elements.size() > 0;
}
});
// Test cancelling autocomplete once invoked
Actions close = new Actions(driver_);
close.sendKeys(Keys.ESCAPE).perform();
(new WebDriverWait(driver_, 5)).until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver d) {
List<WebElement>elements = driver_.findElements(By.id(
ElementIds.getElementId(ElementIds.POPUP_COMPLETIONS)));
return elements.size() == 0;
}
});
}
@Test
public void testPlotGeneration() {
ConsoleTestUtils.resumeConsoleInteraction(driver_);
Actions plotCars = new Actions(driver_);
plotCars.sendKeys(Keys.ESCAPE + "plot(cars)" + Keys.ENTER);
plotCars.perform();
// Wait for the Plot window to activate
final WebElement plotWindow = (new WebDriverWait(driver_, 5))
.until(ExpectedConditions.presenceOfElementLocated(
By.id(ElementIds.getElementId(ElementIds.PLOT_IMAGE_FRAME))));
// Wait for a plot to appear in the window
Assert.assertEquals(plotWindow.getTagName(), "iframe");
driver_.switchTo().frame(plotWindow);
(new WebDriverWait(driver_, 5))
.until(ExpectedConditions.presenceOfElementLocated(By.tagName("img")));
// Switch back to document context
driver_.switchTo().defaultContent();
}
@Test
public void testInvokeHelp() {
ConsoleTestUtils.resumeConsoleInteraction(driver_);
Actions help = new Actions(driver_);
help.sendKeys(Keys.ESCAPE + "?lapply" + Keys.ENTER);
help.perform();
// Wait for the Help window to activate
final WebElement helpWindow = (new WebDriverWait(driver_, 5))
.until(ExpectedConditions.presenceOfElementLocated(
By.id(ElementIds.getElementId(ElementIds.HELP_FRAME))));
// Wait for help to appear in the window
Assert.assertEquals(helpWindow.getTagName(), "iframe");
driver_.switchTo().frame(helpWindow);
(new WebDriverWait(driver_, 5))
.until(ExpectedConditions.textToBePresentInElement(
By.tagName("body"), "lapply"));
// Switch back to document context
driver_.switchTo().defaultContent();
}
private static WebDriver driver_;
}