Making the Knockout behavior testable model
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Mon, 21 Jan 2013 10:06:42 +0100
branchmodel
changeset 499af027874f93e
parent 498 607f062485cc
child 500 f9e80d48e9b4
Making the Knockout behavior testable
javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/Knockout.java
javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/ModelTest.java
     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  }