1.1 --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/Knockout.java Mon Jan 21 07:00:56 2013 +0100
1.2 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/Knockout.java Mon Jan 21 10:06:42 2013 +0100
1.3 @@ -25,14 +25,21 @@
1.4 * @author Jaroslav Tulach <jtulach@netbeans.org>
1.5 */
1.6 @ExtraJavaScript(resource = "org/apidesign/bck2brwsr/htmlpage/knockout-2.2.1.js")
1.7 -public final class Knockout {
1.8 - private Knockout() {
1.9 +public class Knockout {
1.10 + /** used by tests */
1.11 + static Knockout next;
1.12 +
1.13 + Knockout() {
1.14 }
1.15
1.16 public static <M> Knockout applyBindings(
1.17 Class<M> modelClass, M model, String[] propsGettersAndSetters
1.18 ) {
1.19 - Knockout bindings = new Knockout();
1.20 + Knockout bindings = next;
1.21 + next = null;
1.22 + if (bindings == null) {
1.23 + bindings = new Knockout();
1.24 + }
1.25 for (int i = 0; i < propsGettersAndSetters.length; i += 3) {
1.26 bind(bindings, model, propsGettersAndSetters[i],
1.27 propsGettersAndSetters[i + 1],
2.1 --- a/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/ModelTest.java Mon Jan 21 07:00:56 2013 +0100
2.2 +++ b/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/ModelTest.java Mon Jan 21 10:06:42 2013 +0100
2.3 @@ -17,6 +17,8 @@
2.4 */
2.5 package org.apidesign.bck2brwsr.htmlpage;
2.6
2.7 +import java.util.ArrayList;
2.8 +import java.util.List;
2.9 import org.apidesign.bck2brwsr.htmlpage.api.ComputedProperty;
2.10 import org.apidesign.bck2brwsr.htmlpage.api.Page;
2.11 import org.apidesign.bck2brwsr.htmlpage.api.Property;
2.12 @@ -28,7 +30,8 @@
2.13 * @author Jaroslav Tulach <jtulach@netbeans.org>
2.14 */
2.15 @Page(xhtml = "Empty.html", className = "Model", properties = {
2.16 - @Property(name = "value", type = int.class)
2.17 + @Property(name = "value", type = int.class),
2.18 + @Property(name = "unrelated", type = long.class)
2.19 })
2.20 public class ModelTest {
2.21 @Test public void classGeneratedWithSetterGetter() {
2.22 @@ -43,8 +46,36 @@
2.23 assertEquals(16, Model.getPowerValue());
2.24 }
2.25
2.26 + @Test public void derivedPropertiesAreNotified() {
2.27 + MockKnockout my = new MockKnockout();
2.28 + MockKnockout.next = my;
2.29 +
2.30 + Model.applyBindings();
2.31 +
2.32 + Model.setValue(33);
2.33 +
2.34 + assertEquals(my.mutated.size(), 2, "Two properties changed: " + my.mutated);
2.35 + assertTrue(my.mutated.contains("powerValue"), "Power value is in there: " + my.mutated);
2.36 + assertTrue(my.mutated.contains("value"), "Simple value is in there: " + my.mutated);
2.37 +
2.38 + my.mutated.clear();
2.39 +
2.40 + Model.setUnrelated(44);
2.41 + assertEquals(my.mutated.size(), 1, "One property changed");
2.42 + assertTrue(my.mutated.contains("unrelated"), "Its name is unrelated");
2.43 + }
2.44 +
2.45 @ComputedProperty
2.46 static int powerValue(int value) {
2.47 return value * value;
2.48 }
2.49 +
2.50 + static class MockKnockout extends Knockout {
2.51 + List<String> mutated = new ArrayList<String>();
2.52 +
2.53 + @Override
2.54 + public void valueHasMutated(String prop) {
2.55 + mutated.add(prop);
2.56 + }
2.57 + }
2.58 }