/*
* Copyright 2011, The gwtquery team.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.query.client;
import static com.google.gwt.query.client.GQuery.$;
import static com.google.gwt.query.client.GQuery.$$;
import static com.google.gwt.query.client.GQuery.document;
import com.google.gwt.core.client.Duration;
import com.google.gwt.junit.client.GWTTestCase;
import com.google.gwt.query.client.plugins.ajax.Ajax;
import com.google.gwt.query.client.plugins.deferred.PromiseFunction;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.RootPanel;
/**
* Test class for testing deferred and callbacks stuff.
*/
public class GQueryDeferredTestGwt extends GWTTestCase {
static Element e = null;
static HTML testPanel = null;
public String getModuleName() {
return "com.google.gwt.query.QueryTest";
}
public void gwtTearDown() {
$(e).remove();
e = null;
}
public void gwtSetUp() {
if (e == null) {
testPanel = new HTML();
RootPanel.get().add(testPanel);
e = testPanel.getElement();
e.setId("core-tst");
} else {
e.setInnerHTML("");
}
}
public void testDeferredAjaxWhenDone() {
String url = "https://www.googleapis.com/blogger/v2/blogs/user_id/posts/post_id?callback=?&key=NO-KEY";
delayTestFinish(5000);
GQuery.when(Ajax.getJSONP(url, null, null, 1000))
.done(new Function() {
public void f() {
Properties p = getArgument(0, 0);
assertEquals(400, p.getProperties("error").getInt("code"));
finishTest();
}
});
}
public void testDeferredAjaxWhenFail() {
String url1 = "https://www.googleapis.com/blogger/v2/blogs/user_id/posts/post_id?callback=?&key=NO-KEY";
String url2 = "https://localhost:4569/foo";
delayTestFinish(5000);
GQuery.when(
Ajax.getJSONP(url1),
Ajax.getJSONP(url2, null, null, 1000))
.done(new Function() {
public void f() {
fail();
}
})
.fail(new Function(){
public void f() {
finishTest();
}
});
}
int progress = 0;
public void testPromiseFunction() {
delayTestFinish(3000);
final Promise doSomething = new PromiseFunction() {
@Override
public void f(final Deferred dfd) {
new Timer() {
int count = 0;
public void run() {
dfd.notify(count ++);
if (count > 3) {
cancel();
dfd.resolve("done");
}
}
}.scheduleRepeating(50);
}
};
doSomething.progress(new Function() {
public void f() {
progress = this.<Integer>getArgument(0);
}
}).done(new Function() {
public void f() {
assertEquals(3, progress);
assertEquals(Promise.RESOLVED, doSomething.state());
finishTest();
}
});
}
public void testNestedPromiseFunction() {
progress = 0;
delayTestFinish(3000);
Promise doingFoo = new PromiseFunction() {
public void f(final Deferred dfd) {
new Timer() {
int count = 0;
public void run() {
dfd.notify(count ++);
if (count > 3) {
cancel();
dfd.resolve("done");
}
}
}.scheduleRepeating(50);
}
};
Promise doingBar = new PromiseFunction() {
public void f(final Deferred dfd) {
new Timer() {
int count = 0;
public void run() {
dfd.notify(count ++);
if (count > 3) {
cancel();
dfd.resolve("done");
}
}
}.scheduleRepeating(50);
}
};
GQuery.when(doingFoo, doingBar).progress(new Function() {
public void f() {
int c = this.<Integer>getArgument(0);
progress += c;
}
}).done(new Function() {
public void f() {
assertEquals(12, progress);
finishTest();
}
});
}
public void testDeferredAjaxThenDone() {
final String url = "https://www.googleapis.com/blogger/v2/blogs/user_id/posts/post_id?callback=?&key=NO-KEY";
delayTestFinish(5000);
GQuery
.when(Ajax.getJSONP(url))
.then(new Function() {
public Object f(Object... args) {
Properties p = arguments(0, 0);
assertEquals(400, p.getProperties("error").getInt("code"));
return Ajax.getJSONP(url);
}
})
.done(new Function() {
public void f() {
Properties p = arguments(0, 0);
assertEquals(400, p.getProperties("error").getInt("code"));
finishTest();
}
});
}
public void testDeferredQueueDelay() {
final int delay = 300;
final double init = Duration.currentTimeMillis();
delayTestFinish(delay * 2);
Function doneFc = new Function() {
public void f() {
finishTest();
double ellapsed = Duration.currentTimeMillis() - init;
assertTrue(ellapsed >= delay);
}
};
$(document).delay(delay).promise().done(doneFc);
}
int deferredRun = 0;
public void testDeferredQueueMultipleDelay() {
final int delay = 300;
final double init = Duration.currentTimeMillis();
deferredRun = 0;
delayTestFinish(delay * 3);
$("<div>a1</div><div>a2</div>")
.delay(delay, new Function() {
public void f() {
double ellapsed = Duration.currentTimeMillis() - init;
assertTrue(ellapsed >= delay);
deferredRun ++;
}
})
.delay(delay, new Function() {
public void f() {
double ellapsed = Duration.currentTimeMillis() - init;
assertTrue(ellapsed >= (delay * 2));
deferredRun ++;
}
})
.promise().done(new Function() {
public void f() {
finishTest();
// Functions are run 4 times (2 functions * 2 elements)
assertEquals(4, deferredRun);
}
});
}
/**
* Example taken from the gquery.promise() documentation
*/
public void testDeferredEffect() {
$(e).html("<button>click</button><p>Ready...</p><br/><div></div>");
$("div", e).css($$("height: 50px; width: 50px;float: left; margin-right: 10px;display: none; background-color: #090;"));
final Function effect = new Function() {public Object f(Object... args) {
return $("div", e).fadeIn(800).delay(1200).fadeOut();
}};
final double init = Duration.currentTimeMillis();
delayTestFinish(10000);
$("button", e)
.click(new Function(){public void f() {
$("p", e).append(" Started... ");
GQuery.when( effect ).done(new Function(){public void f() {
$("p", e).append(" Finished! ");
assertEquals("Ready... Started... Finished! ", $("p", e).text());
double ellapsed = Duration.currentTimeMillis() - init;
assertTrue(ellapsed >= (800 + 1200 + 400));
finishTest();
}});
}})
.click();
}
/**
* Example taken from the gquery.promise() documentation
*/
public void testDeferredEffectEach() {
$(e).html("<button>click</button><p>Ready...</p><br/><div></div><div></div><div></div><div></div>");
$("div", e).css($$("height: 50px; width: 50px;float: left; margin-right: 10px;display: none; background-color: #090;"));
final double init = Duration.currentTimeMillis();
delayTestFinish(10000);
$("button", e)
.bind("click", new Function(){public void f() {
$("p", e).append(" Started... ");
$("div",e).each(new Function(){public Object f(Element e, int i) {
return $( this ).fadeIn().fadeOut( 1000 * (i+1) );
}});
$("div", e).promise().done(new Function(){ public void f() {
$("p", e).append( " Finished! " );
assertEquals("Ready... Started... Finished! ", $("p", e).text());
double ellapsed = Duration.currentTimeMillis() - init;
assertTrue(ellapsed >= (1000 * 4));
finishTest();
}});
}})
.click();
}
public void testWhenArgumentsWhithAnyObject() {
$(e).html("<div>a1</div><div>a2</div>");
final GQuery g = $("div", e);
assertEquals(2, g.length());
// We can pass to when any object.
GQuery.when(g, g.delay(100).delay(100), "Foo", $$("{bar: 'foo'}"))
.done(new Function(){public void f() {
GQuery g1 = arguments(1, 0);
GQuery g2 = arguments(1, 0);
String foo = arguments(2, 0);
Properties p = arguments(3, 0);
// We dont compare g and g1/g2 because they are different
// objects (GQuery vs QueuePlugin) but we can compare its content
assertEquals(g.toString(), g1.toString());
assertEquals(g.toString(), g2.toString());
assertEquals("Foo", foo);
assertEquals("foo", p.get("bar"));
}});
}
}