/*******************************************************************************
* Copyright (c) 2016 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.vpe.bot.test.html5.jquery;
import static org.junit.Assert.*;
import org.jboss.reddeer.common.condition.AbstractWaitCondition;
import org.jboss.reddeer.common.wait.AbstractWait;
import org.jboss.reddeer.common.wait.TimePeriod;
import org.jboss.reddeer.common.wait.WaitUntil;
import org.jboss.reddeer.common.wait.WaitWhile;
import org.jboss.reddeer.swt.api.Shell;
import org.jboss.reddeer.swt.condition.ShellIsAvailable;
import org.jboss.reddeer.swt.impl.button.FinishButton;
import org.jboss.reddeer.swt.impl.shell.DefaultShell;
import org.jboss.reddeer.swt.impl.text.DefaultText;
import org.jboss.reddeer.swt.impl.text.LabeledText;
import org.jboss.tools.jst.reddeer.palette.JQueryMobilePalette;
import org.jboss.tools.vpe.bot.test.VPETestBase;
import org.jboss.tools.vpe.reddeer.condition.VPVBackIsEnabled;
import org.jboss.tools.vpe.reddeer.condition.VPVForwardIsEnabled;
import org.jboss.tools.vpe.reddeer.matcher.TextTooltipMatcher;
import org.jboss.tools.vpe.reddeer.preview.editor.VPVEditor;
import org.junit.BeforeClass;
import org.junit.Test;
public class MultiPageNavigation extends VPETestBase{
//TODO should not depend on palette
//TODO should have different tests for palette
@BeforeClass
public static void prepareWorkspace(){
createWebProject();
createHTMLPage("HTML5 jQuery Mobile Page (1.4)");
}
@Test
public void testMultiPageNavigation(){
createMultiPage();
VPVEditor vpvEditor = new VPVEditor();
new WaitUntil(new JQueryIsReady(vpvEditor));
assertFalse(vpvEditor.isBackEnabled());
assertFalse(vpvEditor.isForwardEnabled());
String page0 = "page-1";
String page1 = "page1";
new WaitUntil(new SiteHasTitle(vpvEditor, page0, page1), TimePeriod.LONG);
new WaitUntil(new ElementIsFound(vpvEditor, "pageButton"));
//we still have to wait because Windows browser sucks
AbstractWait.sleep(TimePeriod.NORMAL);
boolean executed = vpvEditor.executeScript("$(\"#pageButton\").click()");
assertTrue(executed);
new WaitUntil(new JQueryIsReady(vpvEditor));
new WaitUntil(new VPVBackIsEnabled(vpvEditor));
new WaitWhile(new VPVForwardIsEnabled(vpvEditor));
assertTrue(vpvEditor.isBackEnabled());
assertFalse(vpvEditor.isForwardEnabled());
new WaitUntil(new SiteHasTitle(vpvEditor, page1, page0), TimePeriod.LONG);
vpvEditor.back();
new WaitUntil(new JQueryIsReady(vpvEditor));
new WaitUntil(new SiteHasTitle(vpvEditor, page0, page1), TimePeriod.LONG);
new WaitWhile(new VPVBackIsEnabled(vpvEditor));
new WaitUntil(new VPVForwardIsEnabled(vpvEditor));
assertTrue(vpvEditor.isForwardEnabled());
assertFalse(vpvEditor.isBackEnabled());
vpvEditor.forward();
new WaitUntil(new JQueryIsReady(vpvEditor));
new WaitUntil(new SiteHasTitle(vpvEditor, page1, page0), TimePeriod.LONG);
}
private void createMultiPage(){
VPVEditor vpvEditor = new VPVEditor();
JQueryMobilePalette jqp = vpvEditor.getPalette();
jqp.activateTool("Page", "jQuery Mobile");
//TODO implement this wizard for o.j.t.common.reddeer
Shell s = new DefaultShell("Insert Tag");
new FinishButton().click();
new WaitWhile(new ShellIsAvailable(s));
jqp.activateTool("Button", "jQuery Mobile");
s = new DefaultShell("Insert Tag");
new LabeledText("URL (href):").setText("#page1");
new DefaultText(new TextTooltipMatcher("Generate")).setText("pageButton");
new FinishButton().click();
new WaitWhile(new ShellIsAvailable(s));
}
private class ElementIsFound extends AbstractWaitCondition {
private VPVEditor editor;
private String script;
public ElementIsFound(VPVEditor editor, String elementId) {
this.editor = editor;
this.script = "return !!document.getElementById('" +elementId+ "')";
}
@Override
public boolean test() {
return (Boolean) editor.evaluateScript(script);
}
}
private class SiteHasTitle extends AbstractWaitCondition {
private VPVEditor editor;
private String visiblePage;
private String hiddenPage;
public SiteHasTitle(VPVEditor editor, String visiblePage, String hiddenPage) {
this.editor = editor;
this.visiblePage = visiblePage;
this.hiddenPage = hiddenPage;
}
@Override
public boolean test(){
Boolean visible = (Boolean)editor.evaluateScript("return $(\"#"+visiblePage+"\").is(\":visible\")");
Boolean hidden = (Boolean)editor.evaluateScript("return $(\"#"+hiddenPage+"\").is(\":visible\")");
return visible && !hidden;
}
}
private class JQueryIsReady extends AbstractWaitCondition {
private VPVEditor editor;
public JQueryIsReady(VPVEditor editor) {
this.editor = editor;
}
@Override
public boolean test(){
return (Boolean)editor.evaluateScript("return jQuery.isReady");
}
}
}