jaroslav@489: /** jaroslav@489: * Back 2 Browser Bytecode Translator jaroslav@489: * Copyright (C) 2012 Jaroslav Tulach jaroslav@489: * jaroslav@489: * This program is free software: you can redistribute it and/or modify jaroslav@489: * it under the terms of the GNU General Public License as published by jaroslav@489: * the Free Software Foundation, version 2 of the License. jaroslav@489: * jaroslav@489: * This program is distributed in the hope that it will be useful, jaroslav@489: * but WITHOUT ANY WARRANTY; without even the implied warranty of jaroslav@489: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the jaroslav@489: * GNU General Public License for more details. jaroslav@489: * jaroslav@489: * You should have received a copy of the GNU General Public License jaroslav@489: * along with this program. Look for COPYING file in the top folder. jaroslav@489: * If not, see http://opensource.org/licenses/GPL-2.0. jaroslav@489: */ jaroslav@489: package org.apidesign.bck2brwsr.htmlpage; jaroslav@489: jaroslav@499: import java.util.ArrayList; jaroslav@499: import java.util.List; jaroslav@491: import org.apidesign.bck2brwsr.htmlpage.api.ComputedProperty; jaroslav@489: import org.apidesign.bck2brwsr.htmlpage.api.Page; jaroslav@490: import org.apidesign.bck2brwsr.htmlpage.api.Property; jaroslav@489: import static org.testng.Assert.*; jaroslav@489: import org.testng.annotations.Test; jaroslav@489: jaroslav@489: /** jaroslav@489: * jaroslav@489: * @author Jaroslav Tulach jaroslav@489: */ jaroslav@490: @Page(xhtml = "Empty.html", className = "Model", properties = { jaroslav@499: @Property(name = "value", type = int.class), jaroslav@499: @Property(name = "unrelated", type = long.class) jaroslav@490: }) jaroslav@489: public class ModelTest { jaroslav@490: @Test public void classGeneratedWithSetterGetter() { jaroslav@489: Class c = Model.class; jaroslav@489: assertNotNull(c, "Class for empty page generated"); jaroslav@490: Model.setValue(10); jaroslav@490: assertEquals(10, Model.getValue(), "Value changed"); jaroslav@489: } jaroslav@491: jaroslav@491: @Test public void computedMethod() { jaroslav@491: Model.setValue(4); jaroslav@491: assertEquals(16, Model.getPowerValue()); jaroslav@491: } jaroslav@491: jaroslav@499: @Test public void derivedPropertiesAreNotified() { jaroslav@499: MockKnockout my = new MockKnockout(); jaroslav@499: MockKnockout.next = my; jaroslav@499: jaroslav@499: Model.applyBindings(); jaroslav@499: jaroslav@499: Model.setValue(33); jaroslav@499: jaroslav@499: assertEquals(my.mutated.size(), 2, "Two properties changed: " + my.mutated); jaroslav@499: assertTrue(my.mutated.contains("powerValue"), "Power value is in there: " + my.mutated); jaroslav@499: assertTrue(my.mutated.contains("value"), "Simple value is in there: " + my.mutated); jaroslav@499: jaroslav@499: my.mutated.clear(); jaroslav@499: jaroslav@499: Model.setUnrelated(44); jaroslav@499: assertEquals(my.mutated.size(), 1, "One property changed"); jaroslav@499: assertTrue(my.mutated.contains("unrelated"), "Its name is unrelated"); jaroslav@499: } jaroslav@499: jaroslav@500: @Test public void computedPropertyCannotWriteToModel() { jaroslav@500: try { jaroslav@500: String res = Model.getNotAllowedWrite(); jaroslav@500: fail("We should not be allowed to write to the model: " + res); jaroslav@500: } catch (IllegalStateException ex) { jaroslav@500: // OK, we can't read jaroslav@500: } jaroslav@500: } jaroslav@500: jaroslav@500: @Test public void computedPropertyCannotReadToModel() { jaroslav@500: try { jaroslav@500: String res = Model.getNotAllowedRead(); jaroslav@500: fail("We should not be allowed to read from the model: " + res); jaroslav@500: } catch (IllegalStateException ex) { jaroslav@500: // OK, we can't read jaroslav@500: } jaroslav@500: } jaroslav@500: jaroslav@491: @ComputedProperty jaroslav@491: static int powerValue(int value) { jaroslav@491: return value * value; jaroslav@491: } jaroslav@499: jaroslav@500: @ComputedProperty jaroslav@500: static String notAllowedRead() { jaroslav@500: return "Not allowed callback: " + Model.getUnrelated(); jaroslav@500: } jaroslav@500: jaroslav@500: @ComputedProperty jaroslav@500: static String notAllowedWrite() { jaroslav@500: Model.setUnrelated(11); jaroslav@500: return "Not allowed callback!"; jaroslav@500: } jaroslav@500: jaroslav@499: static class MockKnockout extends Knockout { jaroslav@499: List mutated = new ArrayList(); jaroslav@499: jaroslav@499: @Override jaroslav@499: public void valueHasMutated(String prop) { jaroslav@499: mutated.add(prop); jaroslav@499: } jaroslav@499: } jaroslav@489: }