blob: 1b5df32a0a3d76af6aab2a8368443186532ca694 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.netbeans.spi.knockout;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import org.netbeans.api.scripting.Scripting;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import static org.testng.Assert.*;
/**
*
* @author Jaroslav Tulach <jtulach@netbeans.org>
*/
public class BindingsNGTest {
private ScriptEngine eng;
public BindingsNGTest() {
}
@BeforeMethod public void initEngine() {
ScriptEngineManager sem = Scripting.createManager();
eng = sem.getEngineByMimeType("text/javascript");
}
@Test public void generateTwitterModel() throws Exception {
Bindings tweet = Bindings.create("Tweet").
stringProperty("from_user", false).
intProperty("from_user_id", false);
Bindings tweeters = Bindings.create("Tweeters").
stringProperty("name", false).
stringProperty("userNames", true);
Bindings twitterClient = Bindings.create("TwitterClient");
twitterClient.
stringProperty("activeTweetersName", false).
stringProperty("activeTweeters", true).
stringProperty("userNameToAdd", false).
booleanProperty("loading", false).
modelProperty("currentTweets", tweet, true).
modelProperty("savedLists", tweeters, true);
String txt = twitterClient.generate();
assertValidJS(txt);
assertNotNull(eng.eval("ko"));
assertNotNull(eng.eval("ko.value"));
assertEquals(eng.eval("ko.value.loading"), true, "Boolean values are set to true");
assertNumber(eng.eval("ko.value.currentTweets[0].from_user_id"), 0d, "Boolean values are set to true");
}
@Test
public void generateRecursiveModel() throws Exception {
Bindings m1 = Bindings.create("Hello");
Bindings m2 = Bindings.create("Multi");
m1.modelProperty("multi", m2, false);
m2.modelProperty("hello", m1, false);
m2.intProperty("int", false);
String txt = m2.generate();
assertValidJS(txt);
assertNotNull(eng.eval("ko"), txt);
assertNotNull(eng.eval("Hello.multi"), txt);
assertEquals(eng.eval("Hello.multi.hello === Hello"), Boolean.TRUE, txt);
}
public void generateModelWithFunctions() throws Exception {
Bindings myModel = Bindings.create("MyModel")
.function("myFunc1")
.function("func2");
String txt = myModel.generate();
assertNotNull(eng.eval("ko"), txt);
assertNotNull(eng.eval("Hello.multi"), txt);
assertEquals(eng.eval("Hello.multi.hello === Hello"), Boolean.TRUE, txt);
assertNotNull(eng.eval("ko"));
assertNotNull(eng.eval("ko.value"));
assertNotNull(eng.eval("ko.value.myFunc1"));
assertNotNull(eng.eval("ko.value.func2"));
assertEquals("function", eng.eval("typeof ko.value.myFunc1"));
assertEquals("function", eng.eval("typeof ko.value.func2"));
}
@Test
public void generateRecursiveModel2() throws Exception {
Bindings one = Bindings.create("One");
Bindings two = Bindings.create("Two");
Bindings three = Bindings.create("Three");
one.modelProperty("three", three, false);
two.modelProperty("one", one, false);
three.modelProperty("two",two , false);
String txt = two.generate();
assertValidJS(txt);
assertNotNull(eng.eval("ko"), txt);
assertNotNull(eng.eval("One.three"), txt);
assertNotNull(eng.eval("One.three.two"), txt);
assertEquals(eng.eval("One.three.two.one === One"), Boolean.TRUE, txt);
}
private void assertValidJS(String txt) {
assertNotNull(txt, "We have some script");
try {
eng.eval("ko = {}; ko.applyBindings = function(val) { ko.value = val; }");
eng.eval(txt);
} catch (ScriptException ex) {
throw new AssertionError(txt, ex);
}
}
private void assertNumber(Object real, double exp, String msg) {
if (real instanceof Number) {
assertEquals(((Number) real).doubleValue(), exp, 0.1, msg);
} else {
fail("Expecting number: " + real);
}
}
}