You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

TestSynchronizeToDesign.java 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. /*
  2. * Copyright 2000-2014 Vaadin Ltd.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  5. * use this file except in compliance with the License. You may obtain a copy of
  6. * the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  12. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  13. * License for the specific language governing permissions and limitations under
  14. * the License.
  15. */
  16. package com.vaadin.tests.server.component.abstractcomponent;
  17. import java.io.File;
  18. import java.util.Locale;
  19. import junit.framework.TestCase;
  20. import org.jsoup.nodes.Attributes;
  21. import org.jsoup.nodes.Element;
  22. import org.jsoup.parser.Tag;
  23. import com.vaadin.server.AbstractErrorMessage.ContentMode;
  24. import com.vaadin.server.ErrorMessage.ErrorLevel;
  25. import com.vaadin.server.ExternalResource;
  26. import com.vaadin.server.FileResource;
  27. import com.vaadin.server.Responsive;
  28. import com.vaadin.server.ThemeResource;
  29. import com.vaadin.server.UserError;
  30. import com.vaadin.ui.AbstractComponent;
  31. import com.vaadin.ui.Button;
  32. import com.vaadin.ui.HorizontalSplitPanel;
  33. import com.vaadin.ui.declarative.DesignContext;
  34. /**
  35. * Test case for writing the attributes of the AbstractComponent to design
  36. *
  37. * @author Vaadin Ltd
  38. */
  39. public class TestSynchronizeToDesign extends TestCase {
  40. private DesignContext ctx;
  41. @Override
  42. protected void setUp() throws Exception {
  43. super.setUp();
  44. ctx = new DesignContext();
  45. }
  46. public void testSynchronizeId() {
  47. Element design = createDesign();
  48. AbstractComponent component = getComponent();
  49. component.setId("testId");
  50. component.synchronizeToDesign(design, ctx);
  51. // we only changed one of the attributes, others are at default values
  52. assertEquals(1, design.attributes().size());
  53. assertEquals("testId", design.attr("id"));
  54. }
  55. public void testSynchronizePrimaryStyleName() {
  56. Element design = createDesign();
  57. AbstractComponent component = getComponent();
  58. component.setPrimaryStyleName("test-style");
  59. component.synchronizeToDesign(design, ctx);
  60. // we only changed one of the attributes, others are at default values
  61. assertEquals(1, design.attributes().size());
  62. assertEquals("test-style", design.attr("primary-style-name"));
  63. }
  64. public void testSynchronizeCaption() {
  65. Element design = createDesign();
  66. AbstractComponent component = getComponent();
  67. component.setCaption("test-caption");
  68. component.synchronizeToDesign(design, ctx);
  69. // We only changed the caption, which is not
  70. // an attribute.
  71. assertEquals(0, design.attributes().size());
  72. assertEquals("test-caption", design.html());
  73. }
  74. public void testSynchronizeLocale() {
  75. Element design = createDesign();
  76. AbstractComponent component = getComponent();
  77. component.setLocale(new Locale("fi", "FI"));
  78. component.synchronizeToDesign(design, ctx);
  79. // we only changed one of the attributes, others are at default values
  80. assertEquals(1, design.attributes().size());
  81. assertEquals("fi_FI", design.attr("locale"));
  82. }
  83. public void testSynchronizeExternalIcon() {
  84. Element design = createDesign();
  85. AbstractComponent component = getComponent();
  86. component
  87. .setIcon(new ExternalResource("http://example.com/example.gif"));
  88. component.synchronizeToDesign(design, ctx);
  89. // we only changed one of the attributes, others are at default values
  90. assertEquals(1, design.attributes().size());
  91. assertEquals("http://example.com/example.gif", design.attr("icon"));
  92. }
  93. public void testSynchronizeThemeIcon() {
  94. Element design = createDesign();
  95. AbstractComponent component = getComponent();
  96. component.setIcon(new ThemeResource("example.gif"));
  97. component.synchronizeToDesign(design, ctx);
  98. // we only changed one of the attributes, others are at default values
  99. assertEquals(1, design.attributes().size());
  100. assertEquals("theme://example.gif", design.attr("icon"));
  101. }
  102. public void testSynchronizeFileResource() {
  103. Element design = createDesign();
  104. AbstractComponent component = getComponent();
  105. component.setIcon(new FileResource(new File("img/example.gif")));
  106. component.synchronizeToDesign(design, ctx);
  107. // we only changed one of the attributes, others are at default values
  108. assertEquals(1, design.attributes().size());
  109. assertEquals("img/example.gif", design.attr("icon"));
  110. }
  111. public void testSynchronizeImmediate() {
  112. Element design = createDesign();
  113. AbstractComponent component = getComponent();
  114. // no immediate attribute should be written before setting immediate to
  115. // some value
  116. component.synchronizeToDesign(design, ctx);
  117. assertFalse(design.hasAttr("immediate"));
  118. component.setImmediate(true);
  119. component.synchronizeToDesign(design, ctx);
  120. // we only changed one of the attributes, others are at default values
  121. assertEquals(1, design.attributes().size());
  122. assertEquals("true", design.attr("immediate"));
  123. }
  124. public void testSynchronizeDescription() {
  125. Element design = createDesign();
  126. AbstractComponent component = getComponent();
  127. component.setDescription("test-description");
  128. component.synchronizeToDesign(design, ctx);
  129. // we only changed one of the attributes, others are at default values
  130. assertEquals(1, design.attributes().size());
  131. assertEquals("test-description", design.attr("description"));
  132. }
  133. public void testSynchronizeComponentError() {
  134. Element design = createDesign();
  135. AbstractComponent component = getComponent();
  136. component.setComponentError(new UserError("<div>test-error</div>",
  137. ContentMode.HTML, ErrorLevel.ERROR));
  138. component.synchronizeToDesign(design, ctx);
  139. // we only changed one of the attributes, others are at default values
  140. assertEquals(1, design.attributes().size());
  141. assertEquals("<div>test-error</div>", design.attr("error"));
  142. }
  143. public void testSynchronizeSizeFull() {
  144. Element design = createDesign();
  145. AbstractComponent component = getComponent();
  146. component.setSizeFull();
  147. component.synchronizeToDesign(design, ctx);
  148. // there should be only size full
  149. assertEquals(1, design.attributes().size());
  150. assertEquals("true", design.attr("size-full"));
  151. }
  152. public void testSynchronizeSizeAuto() {
  153. Element design = createDesign();
  154. AbstractComponent component = getPanel();
  155. component.setSizeUndefined();
  156. component.synchronizeToDesign(design, ctx);
  157. // there should be only size auto
  158. assertEquals(1, design.attributes().size());
  159. assertEquals("true", design.attr("size-auto"));
  160. }
  161. public void testSynchronizeHeightFull() {
  162. Element design = createDesign();
  163. AbstractComponent component = getComponent();
  164. component.setHeight("100%");
  165. component.setWidth("20px");
  166. component.synchronizeToDesign(design, ctx);
  167. assertEquals("true", design.attr("height-full"));
  168. }
  169. public void testSynchronizeHeightAuto() {
  170. Element design = createDesign();
  171. // we need to have default height of 100% -> use split panel
  172. AbstractComponent component = getPanel();
  173. component.setHeight(null);
  174. component.setWidth("20px");
  175. component.synchronizeToDesign(design, ctx);
  176. assertEquals("true", design.attr("height-auto"));
  177. }
  178. public void testSynchronizeWidthFull() {
  179. Element design = createDesign();
  180. AbstractComponent component = getComponent();
  181. component.setHeight("20px");
  182. component.setWidth("100%");
  183. component.synchronizeToDesign(design, ctx);
  184. assertEquals("true", design.attr("width-full"));
  185. }
  186. public void testSynchronizeWidthAuto() {
  187. Element design = createDesign();
  188. // need to get label, otherwise the default would be auto
  189. AbstractComponent component = getPanel();
  190. component.setHeight("20px");
  191. component.setWidth(null);
  192. component.synchronizeToDesign(design, ctx);
  193. assertEquals("true", design.attr("width-auto"));
  194. }
  195. public void testSynchronizeWidth() {
  196. Element design = createDesign();
  197. AbstractComponent component = getComponent();
  198. component.setHeight("20px");
  199. component.setWidth("70%");
  200. component.synchronizeToDesign(design, ctx);
  201. assertEquals("70%", design.attr("width"));
  202. }
  203. public void testSynchronizeHeight() {
  204. Element design = createDesign();
  205. AbstractComponent component = getComponent();
  206. component.setHeight("20px");
  207. component.setWidth("70%");
  208. component.synchronizeToDesign(design, ctx);
  209. assertEquals("20px", design.attr("height"));
  210. }
  211. public void testSynchronizeResponsive() {
  212. Element design = createDesign();
  213. AbstractComponent component = getComponent();
  214. Responsive.makeResponsive(component);
  215. component.synchronizeToDesign(design, ctx);
  216. assertTrue("Design attributes should have key 'responsive'", design
  217. .attributes().hasKey("responsive"));
  218. assertFalse("Responsive attribute should not be 'false'",
  219. design.attr("responsive").equalsIgnoreCase("false"));
  220. }
  221. private AbstractComponent getComponent() {
  222. Button button = new Button();
  223. button.setHtmlContentAllowed(true);
  224. return button;
  225. }
  226. private AbstractComponent getPanel() {
  227. return new HorizontalSplitPanel();
  228. }
  229. private Element createDesign() {
  230. Attributes attr = new Attributes();
  231. attr.put("should_be_removed", "foo");
  232. Element node = new Element(Tag.valueOf("v-button"), "", attr);
  233. Element child = new Element(Tag.valueOf("to-be-removed"), "foo", attr);
  234. node.appendChild(child);
  235. return node;
  236. }
  237. }