javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/ModelTest.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Mon, 21 Jan 2013 11:55:27 +0100
branchmodel
changeset 500 f9e80d48e9b4
parent 499 af027874f93e
child 505 4198be34b516
permissions -rw-r--r--
@ComputedProperty methods can't access the model
jaroslav@489
     1
/**
jaroslav@489
     2
 * Back 2 Browser Bytecode Translator
jaroslav@489
     3
 * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
jaroslav@489
     4
 *
jaroslav@489
     5
 * This program is free software: you can redistribute it and/or modify
jaroslav@489
     6
 * it under the terms of the GNU General Public License as published by
jaroslav@489
     7
 * the Free Software Foundation, version 2 of the License.
jaroslav@489
     8
 *
jaroslav@489
     9
 * This program is distributed in the hope that it will be useful,
jaroslav@489
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
jaroslav@489
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
jaroslav@489
    12
 * GNU General Public License for more details.
jaroslav@489
    13
 *
jaroslav@489
    14
 * You should have received a copy of the GNU General Public License
jaroslav@489
    15
 * along with this program. Look for COPYING file in the top folder.
jaroslav@489
    16
 * If not, see http://opensource.org/licenses/GPL-2.0.
jaroslav@489
    17
 */
jaroslav@489
    18
package org.apidesign.bck2brwsr.htmlpage;
jaroslav@489
    19
jaroslav@499
    20
import java.util.ArrayList;
jaroslav@499
    21
import java.util.List;
jaroslav@491
    22
import org.apidesign.bck2brwsr.htmlpage.api.ComputedProperty;
jaroslav@489
    23
import org.apidesign.bck2brwsr.htmlpage.api.Page;
jaroslav@490
    24
import org.apidesign.bck2brwsr.htmlpage.api.Property;
jaroslav@489
    25
import static org.testng.Assert.*;
jaroslav@489
    26
import org.testng.annotations.Test;
jaroslav@489
    27
jaroslav@489
    28
/**
jaroslav@489
    29
 *
jaroslav@489
    30
 * @author Jaroslav Tulach <jtulach@netbeans.org>
jaroslav@489
    31
 */
jaroslav@490
    32
@Page(xhtml = "Empty.html", className = "Model", properties = {
jaroslav@499
    33
    @Property(name = "value", type = int.class),
jaroslav@499
    34
    @Property(name = "unrelated", type = long.class)
jaroslav@490
    35
})
jaroslav@489
    36
public class ModelTest {
jaroslav@490
    37
    @Test public void classGeneratedWithSetterGetter() {
jaroslav@489
    38
        Class<?> c = Model.class;
jaroslav@489
    39
        assertNotNull(c, "Class for empty page generated");
jaroslav@490
    40
        Model.setValue(10);
jaroslav@490
    41
        assertEquals(10, Model.getValue(), "Value changed");
jaroslav@489
    42
    }
jaroslav@491
    43
    
jaroslav@491
    44
    @Test public void computedMethod() {
jaroslav@491
    45
        Model.setValue(4);
jaroslav@491
    46
        assertEquals(16, Model.getPowerValue());
jaroslav@491
    47
    }
jaroslav@491
    48
    
jaroslav@499
    49
    @Test public void derivedPropertiesAreNotified() {
jaroslav@499
    50
        MockKnockout my = new MockKnockout();
jaroslav@499
    51
        MockKnockout.next = my;
jaroslav@499
    52
        
jaroslav@499
    53
        Model.applyBindings();
jaroslav@499
    54
        
jaroslav@499
    55
        Model.setValue(33);
jaroslav@499
    56
        
jaroslav@499
    57
        assertEquals(my.mutated.size(), 2, "Two properties changed: " + my.mutated);
jaroslav@499
    58
        assertTrue(my.mutated.contains("powerValue"), "Power value is in there: " + my.mutated);
jaroslav@499
    59
        assertTrue(my.mutated.contains("value"), "Simple value is in there: " + my.mutated);
jaroslav@499
    60
        
jaroslav@499
    61
        my.mutated.clear();
jaroslav@499
    62
        
jaroslav@499
    63
        Model.setUnrelated(44);
jaroslav@499
    64
        assertEquals(my.mutated.size(), 1, "One property changed");
jaroslav@499
    65
        assertTrue(my.mutated.contains("unrelated"), "Its name is unrelated");
jaroslav@499
    66
    }
jaroslav@499
    67
    
jaroslav@500
    68
    @Test public void computedPropertyCannotWriteToModel() {
jaroslav@500
    69
        try {
jaroslav@500
    70
            String res = Model.getNotAllowedWrite();
jaroslav@500
    71
            fail("We should not be allowed to write to the model: " + res);
jaroslav@500
    72
        } catch (IllegalStateException ex) {
jaroslav@500
    73
            // OK, we can't read
jaroslav@500
    74
        }
jaroslav@500
    75
    }
jaroslav@500
    76
jaroslav@500
    77
    @Test public void computedPropertyCannotReadToModel() {
jaroslav@500
    78
        try {
jaroslav@500
    79
            String res = Model.getNotAllowedRead();
jaroslav@500
    80
            fail("We should not be allowed to read from the model: " + res);
jaroslav@500
    81
        } catch (IllegalStateException ex) {
jaroslav@500
    82
            // OK, we can't read
jaroslav@500
    83
        }
jaroslav@500
    84
    }
jaroslav@500
    85
    
jaroslav@491
    86
    @ComputedProperty
jaroslav@491
    87
    static int powerValue(int value) {
jaroslav@491
    88
        return value * value;
jaroslav@491
    89
    }
jaroslav@499
    90
    
jaroslav@500
    91
    @ComputedProperty
jaroslav@500
    92
    static String notAllowedRead() {
jaroslav@500
    93
        return "Not allowed callback: " + Model.getUnrelated();
jaroslav@500
    94
    }
jaroslav@500
    95
jaroslav@500
    96
    @ComputedProperty
jaroslav@500
    97
    static String notAllowedWrite() {
jaroslav@500
    98
        Model.setUnrelated(11);
jaroslav@500
    99
        return "Not allowed callback!";
jaroslav@500
   100
    }
jaroslav@500
   101
    
jaroslav@499
   102
    static class MockKnockout extends Knockout {
jaroslav@499
   103
        List<String> mutated = new ArrayList<String>();
jaroslav@499
   104
        
jaroslav@499
   105
        @Override
jaroslav@499
   106
        public void valueHasMutated(String prop) {
jaroslav@499
   107
            mutated.add(prop);
jaroslav@499
   108
        }
jaroslav@499
   109
    }
jaroslav@489
   110
}