Ensuring deep changes work OK with arrays DeepWatch
authorJaroslav Tulach <jtulach@netbeans.org>
Fri, 01 Aug 2014 14:16:19 +0200
branchDeepWatch
changeset 777c865a31c848d
parent 776 7e25ba02d9ce
child 778 942545f35be7
Ensuring deep changes work OK with arrays
json/src/test/java/net/java/html/json/DeepChangeTest.java
     1.1 --- a/json/src/test/java/net/java/html/json/DeepChangeTest.java	Fri Aug 01 14:08:55 2014 +0200
     1.2 +++ b/json/src/test/java/net/java/html/json/DeepChangeTest.java	Fri Aug 01 14:16:19 2014 +0200
     1.3 @@ -42,6 +42,7 @@
     1.4   */
     1.5  package net.java.html.json;
     1.6  
     1.7 +import java.util.List;
     1.8  import java.util.Map;
     1.9  import net.java.html.BrwsrCtx;
    1.10  import net.java.html.json.MapModelTest.MapTechnology;
    1.11 @@ -88,6 +89,23 @@
    1.12          static String thrdName(MyY one) {
    1.13              return "X" + one.getCount();
    1.14          }
    1.15 +        
    1.16 +        @ComputedProperty(deep = true)
    1.17 +        static String allNames(List<MyY> all) {
    1.18 +            StringBuilder sb = new StringBuilder();
    1.19 +            for (MyY y : all) {
    1.20 +                sb.append(y.getValue());
    1.21 +            }
    1.22 +            return sb.toString();
    1.23 +        }
    1.24 +
    1.25 +        @ComputedProperty(deep = true)
    1.26 +        static String firstFromNames(List<MyY> all) {
    1.27 +            if (all.size() > 0) {
    1.28 +                return all.get(0).getValue();
    1.29 +            }
    1.30 +            return null;
    1.31 +        }
    1.32      }
    1.33      @Model(className = "MyY", properties = {
    1.34          @Property(name = "value", type = String.class),
    1.35 @@ -116,6 +134,85 @@
    1.36          assertEquals(o.changes, 1, "One change so far");
    1.37      }
    1.38      
    1.39 +    @Test public void isTransitiveChangeInArrayNotifiedProperly() throws Exception {
    1.40 +        MyX p = Models.bind(
    1.41 +            new MyX(new MyY("Ahoj", 0), new MyY("Hi", 333), new MyY("Hello", 999)
    1.42 +        ), c).applyBindings();
    1.43 +        
    1.44 +        Map m = (Map)Models.toRaw(p);
    1.45 +        Object v = m.get("allNames");
    1.46 +        assertNotNull(v, "Value should be in the map");
    1.47 +        assertEquals(v.getClass(), One.class, "It is instance of One");
    1.48 +        One o = (One)v;
    1.49 +        assertEquals(o.changes, 0, "No changes so far");
    1.50 +        assertTrue(o.pb.isReadOnly(), "Derived property");
    1.51 +        assertEquals(o.get(), "HiHello");
    1.52 +
    1.53 +        p.getAll().get(0).setValue("Nazdar");
    1.54 +        
    1.55 +        assertEquals(o.get(), "NazdarHello");
    1.56 +        assertEquals(o.changes, 1, "One change so far");
    1.57 +    }
    1.58 +    
    1.59 +    @Test public void firstChangeInArrayNotifiedProperly() throws Exception {
    1.60 +        MyX p = Models.bind(
    1.61 +            new MyX(new MyY("Ahoj", 0), new MyY("Hi", 333), new MyY("Hello", 999)
    1.62 +        ), c).applyBindings();
    1.63 +        
    1.64 +        Map m = (Map)Models.toRaw(p);
    1.65 +        Object v = m.get("firstFromNames");
    1.66 +        assertNotNull(v, "Value should be in the map");
    1.67 +        assertEquals(v.getClass(), One.class, "It is instance of One");
    1.68 +        One o = (One)v;
    1.69 +        assertEquals(o.changes, 0, "No changes so far");
    1.70 +        assertTrue(o.pb.isReadOnly(), "Derived property");
    1.71 +        assertEquals(o.get(), "Hi");
    1.72 +
    1.73 +        p.getAll().get(0).setValue("Nazdar");
    1.74 +        
    1.75 +        assertEquals(o.get(), "Nazdar");
    1.76 +        assertEquals(o.changes, 1, "One change so far");
    1.77 +    }
    1.78 +    @Test public void secondChangeInArrayIgnored() throws Exception {
    1.79 +        MyX p = Models.bind(
    1.80 +            new MyX(new MyY("Ahoj", 0), new MyY("Hi", 333), new MyY("Hello", 999)
    1.81 +        ), c).applyBindings();
    1.82 +        
    1.83 +        Map m = (Map)Models.toRaw(p);
    1.84 +        Object v = m.get("firstFromNames");
    1.85 +        assertNotNull(v, "Value should be in the map");
    1.86 +        assertEquals(v.getClass(), One.class, "It is instance of One");
    1.87 +        One o = (One)v;
    1.88 +        assertEquals(o.changes, 0, "No changes so far");
    1.89 +        assertTrue(o.pb.isReadOnly(), "Derived property");
    1.90 +        assertEquals(o.get(), "Hi");
    1.91 +
    1.92 +        p.getAll().get(1).setValue("Nazdar");
    1.93 +        
    1.94 +        assertEquals(o.get(), "Hi");
    1.95 +        assertEquals(o.changes, 0, "No change so far");
    1.96 +    }
    1.97 +    
    1.98 +    @Test public void changeInArraySizeNeedsToBeRecomputed() throws Exception {
    1.99 +        MyX p = Models.bind(
   1.100 +            new MyX(new MyY("Ahoj", 0), new MyY("Hi", 333), new MyY("Hello", 999)
   1.101 +        ), c).applyBindings();
   1.102 +        
   1.103 +        Map m = (Map)Models.toRaw(p);
   1.104 +        Object v = m.get("firstFromNames");
   1.105 +        assertNotNull(v, "Value should be in the map");
   1.106 +        assertEquals(v.getClass(), One.class, "It is instance of One");
   1.107 +        One o = (One)v;
   1.108 +        assertEquals(o.changes, 0, "No changes so far");
   1.109 +        assertTrue(o.pb.isReadOnly(), "Derived property");
   1.110 +        assertEquals(o.get(), "Hi");
   1.111 +
   1.112 +        p.getAll().remove(1);
   1.113 +        
   1.114 +        assertEquals(o.get(), "Hi");
   1.115 +        assertEquals(o.changes, 1, "This required a change");
   1.116 +    }
   1.117 +    
   1.118      @Test public void doublePropertyChangeNotified() throws Exception {
   1.119          MyX p = Models.bind(
   1.120              new MyX(new MyY("Ahoj", 0), new MyY("Hi", 333), new MyY("Hello", 999)