/** * Copyright 2010 Marko Lavikainen * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * * See the License for the specific language governing permissions and * limitations under the License. */ package net.contextfw.web.application.component; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import java.util.ArrayList; import java.util.Collection; import java.util.List; import net.contextfw.web.application.lifecycle.AfterBuild; import net.contextfw.web.application.lifecycle.BeforeBuild; import org.junit.Test; public class ComponentBuilderTest extends BaseComponentTest { public static class Aa extends Component { public String order = ""; @Attribute public String foo = "bar"; @Element public String bar="foo"; @Element(wrap=false) public FieldEmbed fieldEmbedded = new FieldEmbed(); @Element(wrap=false) public MethodEmbed methodEmbedded() { return new MethodEmbed(); } @Element public List<MethodEmbed> listOfEmbeddeds() { List<MethodEmbed> embeds = new ArrayList<MethodEmbed>(); embeds.add(new MethodEmbed()); embeds.add(new MethodEmbed()); return embeds; } @Element public MethodEmbed[] arrayOfEmbeddeds() { return new MethodEmbed[] { new MethodEmbed(), new MethodEmbed() }; } @CustomBuild public void custom(DOMBuilder b) { order = order + ".custom"; b.descend("barFoo").attr("fooBar", true); } @CustomBuild(wrap=false) public void custom2(DOMBuilder b) { b.descend("barFoo1").attr("fooBar1", true); } @BeforeBuild public void before() { order = order + "before"; } @AfterBuild public void after() { order = order + ".after"; } @ScriptElement public Script init() { return new FunctionCall("init", "a"); } @ScriptElement public Collection<Script> listOfInits() { List<Script> inits = new ArrayList<Script>(); inits.add(new FunctionCall("init", "a")); inits.add(new FunctionCall("init", "a")); return inits; } @ScriptElement public Script[] arrayOfInits() { return new Script[] { new FunctionCall("init", "a", "b"), new FunctionCall("init", "a") }; } @ScriptElement public Script init2 = new FunctionCall("init2", "a"); } public static class Bee extends Component { @Element private Aa comp1; @Element private Aa hidden; public Bee(Aa comp1) { this.comp1 = this.registerChild(comp1); this.hidden = this.registerChild(new Aa()); this.hidden.setEnabled(false); } @CustomBuild public void custom(DOMBuilder b) { b.descend("anotherInner").child(comp1); } } public static class Cee extends Component { @Element public Aa aa1; @Element public Aa aa2; @Element public Ee ee = new Ee(); @Attribute public String nullAttribute = null; @Element public Dee dee = new Dee(); @Element public Faa faa = new Faa(); } @Buildable public static class Dee { @Attribute public String foo = "bar"; @Element public Aa aa; } @Buildable public static class FieldEmbed { } @Buildable public static class MethodEmbed { } public static class Ee { public String toString() { return "Ee.toString()"; } } @Buildable(wrap=false) public static class Faa { @Attribute public String foo = "bar"; } @Buildable(name="Eeg") public static class Gee extends Component { @Attribute public String foo = "bar"; } @Test public void testName() { Gee comp = new Gee(); webApplicationComponent.registerChild(comp); assertEquals("c1", comp.getId()); webApplicationComponent.buildChild(domBuilder); logXML(domBuilder); assertDom("//WebApplication/Eeg").exists(); } @Test public void testId() { Aa comp = new Aa(); assertNull(comp.getId()); webApplicationComponent.registerChild(comp); assertEquals("c1", comp.getId()); webApplicationComponent.buildChild(domBuilder); logXML(domBuilder); assertDom("//WebApplication/Aa/FieldEmbed").exists(); assertDom("//WebApplication/Aa/MethodEmbed").exists(); assertDom("//WebApplication/Aa/Script[1]").hasText("init2(\"a\");\n"); assertDom("//WebApplication/Aa/Script[2]").hasText("init(\"a\");\n"); assertDom("//WebApplication/Aa").hasAttribute("id", "c1"); assertDom("//WebApplication/Aa/custom/barFoo").hasAttribute("fooBar", "true"); assertDom("//WebApplication/Aa/barFoo1").hasAttribute("fooBar1", "true"); assertDom("//WebApplication/Aa/listOfEmbeddeds//MethodEmbed").exists(); assertDom("//WebApplication/Aa/arrayOfEmbeddeds//MethodEmbed").exists(); assertEquals("before.custom.after", comp.order); } @Test public void testInnerComp() { Bee comp = new Bee(new Aa()); webApplicationComponent.registerChild(comp); webApplicationComponent.buildChild(domBuilder); logXML(domBuilder); assertDom("//WebApplication/Bee/comp1/Aa").attributeStartsWith("id", "c"); assertDom("//WebApplication/Bee/hidden/Aa").notExists(); } @Test public void testEmptyUpdate() { Aa comp = new Aa(); assertNull(comp.getId()); webApplicationComponent.registerChild(comp); webApplicationComponent.buildChildUpdate(domBuilder, componentBuilder); logXML(domBuilder); assertDom("//WebApplication/Aa").notExists(); } @Test public void testAaUpdate() { Aa comp = new Aa(); webApplicationComponent.registerChild(comp); comp.refresh(); webApplicationComponent.buildChildUpdate(domBuilder, componentBuilder); logXML(domBuilder); assertDom("//WebApplication/Aa.update").exists(); assertDom("//WebApplication/Aa.update/Script[1]").hasText("init2(\"a\");\n"); assertDom("//WebApplication/Aa.update/Script[2]").hasText("init(\"a\");\n"); } @Test public void testPartialAaUpdate() { Aa comp = new Aa(); webApplicationComponent.registerChild(comp); comp.partialRefresh("scriptUpdate", "init"); webApplicationComponent.buildChildUpdate(domBuilder, componentBuilder); logXML(domBuilder); assertDom("//WebApplication/Aa.scriptUpdate").exists(); assertDom("//WebApplication/Aa.scriptUpdate/Script[1]").hasText("init(\"a\");\n"); } @Test public void testBeeUpdate() { Bee comp = new Bee(new Aa()); webApplicationComponent.registerChild(comp); logXML(domBuilder); comp.refresh(); webApplicationComponent.buildChildUpdate(domBuilder, componentBuilder); logXML(domBuilder); assertDom("//WebApplication/Bee.update").exists(); assertDom("//WebApplication/Bee.update/comp1/Aa").exists(); } @Test public void testBee_Aa_Update() { Aa aa = new Aa(); Bee comp = new Bee(aa); webApplicationComponent.registerChild(comp); aa.refresh(); webApplicationComponent.buildChildUpdate(domBuilder, componentBuilder); logXML(domBuilder); assertDom("//WebApplication/Bee").notExists(); assertDom("//WebApplication/Bee.update").notExists(); assertDom("//WebApplication//Aa.update").exists(); } @Test public void testCee() { Cee cee = new Cee(); Aa aa = new Aa(); cee.dee.aa = aa; webApplicationComponent.registerChild(cee); webApplicationComponent.buildChild(domBuilder); logXML(domBuilder); assertDom("//WebApplication/Cee/ee/text()").hasText("Ee.toString()"); assertDom("//WebApplication/Cee").hasNoAttribute("nullAttribute"); assertDom("//WebApplication/Cee/dee/Dee").exists(); assertDom("//WebApplication/Cee/dee/Dee/aa/Aa/bar/text()").hasText("foo"); assertDom("//WebApplication/Cee/faa").hasAttribute("foo", "bar"); } @Test public void testCeeUpdate() { Cee cee = new Cee(); cee.aa1 = cee.registerChild(new Aa()); cee.aa2 = cee.registerChild(new Aa()); webApplicationComponent.registerChild(cee); cee.aa1.refresh(); cee.aa2.refresh(); webApplicationComponent.buildChildUpdate(domBuilder, componentBuilder); logXML(domBuilder); assertDom("//WebApplication//Aa.update[1]").exists(); assertDom("//WebApplication//Aa.update[2]").exists(); } @Test public void testCeePartialUpdate() { Cee cee = new Cee(); cee.aa1 = cee.registerChild(new Aa()); cee.aa2 = cee.registerChild(new Aa()); webApplicationComponent.registerChild(cee); cee.partialRefresh("aa1Update", "aa1"); webApplicationComponent.buildChildUpdate(domBuilder, componentBuilder); logXML(domBuilder); assertDom("//WebApplication/Cee.aa1Update").hasAttribute("id", "c1"); assertDom("//WebApplication/Cee.aa1Update/aa1/Aa").exists(); assertDom("//WebApplication/Cee.aa1Update/aa2/Aa").notExists(); } @Test public void testCeePartialUpdate2() { Cee cee = new Cee(); cee.aa1 = cee.registerChild(new Aa()); cee.aa2 = cee.registerChild(new Aa()); webApplicationComponent.registerChild(cee); cee.partialRefresh("aa1Update", "aa1"); cee.aa2.refresh(); webApplicationComponent.buildChildUpdate(domBuilder, componentBuilder); logXML(domBuilder); assertDom("//WebApplication/Cee.aa1Update").hasAttribute("id", "c1"); assertDom("//WebApplication/Cee.aa1Update/aa1/Aa").exists(); assertDom("//WebApplication/Cee.aa1Update/aa2/Aa").notExists(); assertDom("//WebApplication/Aa.update").exists(); } }