/* * Copyright 2000-2016 Vaadin Ltd. * * 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 com.vaadin.tests.server.component.gridlayout; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import org.junit.Assert; import org.junit.Test; import com.vaadin.shared.ui.ContentMode; import com.vaadin.shared.ui.MarginInfo; import com.vaadin.tests.server.component.DeclarativeMarginTestBase; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.Component; import com.vaadin.ui.GridLayout; import com.vaadin.ui.Label; import com.vaadin.ui.declarative.Design; import com.vaadin.ui.declarative.DesignContext; public class GridLayoutDeclarativeTest extends DeclarativeMarginTestBase<GridLayout> { @Test public void testMargins() { testMargins("vaadin-grid-layout", new MarginInfo(false)); } @Test public void testSimpleGridLayout() { Button b1 = new Button("Button 0,0"); Button b2 = new Button("Button 0,1"); Button b3 = new Button("Button 1,0"); Button b4 = new Button("Button 1,1"); b1.setCaptionAsHtml(true); b2.setCaptionAsHtml(true); b3.setCaptionAsHtml(true); b4.setCaptionAsHtml(true); String design = "<vaadin-grid-layout><row>" // + "<column expand=1.0>" + writeChild(b1) + "</column>" // + "<column expand=3.3>" + writeChild(b2) + "</column>" // + "</row><row>" // + "<column>" + writeChild(b3) + "</column>" // + "<column>" + writeChild(b4) + "</column>" // + "</row></vaadin-grid-layout>"; GridLayout gl = new GridLayout(2, 2); gl.addComponent(b1); gl.addComponent(b2); gl.addComponent(b3); gl.addComponent(b4); gl.setColumnExpandRatio(0, 1f); gl.setColumnExpandRatio(1, 3.3f); testWrite(design, gl); testRead(design, gl); } @Test public void testReadIntegerExpandRatioGridLayout() { // To make sure that it can read from old declarative which use // integer expand ratio Button b1 = new Button("Button 0,0"); b1.setCaptionAsHtml(true); String design = "<vaadin-grid-layout><row expand=3>" // + "<column expand=1>" + writeChild(b1) + "</column>" // + "</row>"// + "</vaadin-grid-layout>"; GridLayout gl = new GridLayout(1, 1); gl.addComponent(b1); gl.setColumnExpandRatio(0, 1.0f); gl.setRowExpandRatio(0, 3.0f); testRead(design, gl); } @Test public void testOneBigComponentGridLayout() { Button b1 = new Button("Button 0,0 -> 1,1"); b1.setCaptionAsHtml(true); String design = "<vaadin-grid-layout><row>" // + "<column colspan=2 rowspan=2>" + writeChild(b1) + "</column>" // + "</row><row expand=2>" // + "</row></vaadin-grid-layout>"; GridLayout gl = new GridLayout(2, 2); gl.addComponent(b1, 0, 0, 1, 1); gl.setRowExpandRatio(1, 2); testWrite(design, gl); testRead(design, gl); } @Test public void testMultipleSpannedComponentsGridLayout() { GridLayout gl = new GridLayout(5, 5); Button b1 = new Button("Button 0,0 -> 0,2"); b1.setCaptionAsHtml(true); gl.addComponent(b1, 0, 0, 2, 0); Button b2 = new Button("Button 0,3 -> 3,3"); b2.setCaptionAsHtml(true); gl.addComponent(b2, 3, 0, 3, 3); Button b3 = new Button("Button 0,4 -> 1,4"); b3.setCaptionAsHtml(true); gl.addComponent(b3, 4, 0, 4, 1); Button b4 = new Button("Button 1,0 -> 3,1"); b4.setCaptionAsHtml(true); gl.addComponent(b4, 0, 1, 1, 3); Button b5 = new Button("Button 2,2"); b5.setCaptionAsHtml(true); gl.addComponent(b5, 2, 2); Button b6 = new Button("Button 3,4 -> 4,4"); b6.setCaptionAsHtml(true); gl.addComponent(b6, 4, 3, 4, 4); Button b7 = new Button("Button 4,1 -> 4,2"); b7.setCaptionAsHtml(true); gl.addComponent(b7, 2, 4, 3, 4); /* * Buttons in the GridLayout */ // 1 1 1 2 3 // 4 4 - 2 3 // 4 4 5 2 - // 4 4 - 2 6 // - - 7 7 6 String design = "<vaadin-grid-layout><row>" // + "<column colspan=3>" + writeChild(b1) + "</column>" // + "<column rowspan=4>" + writeChild(b2) + "</column>" // + "<column rowspan=2>" + writeChild(b3) + "</column>" // + "</row><row>" // + "<column rowspan=3 colspan=2>" + writeChild(b4) + "</column>" // + "</row><row>" // + "<column>" + writeChild(b5) + "</column>" // + "</row><row>" // + "<column />" // Empty placeholder + "<column rowspan=2>" + writeChild(b6) + "</column>" // + "</row><row>" // + "<column colspan=2 />" // Empty placeholder + "<column colspan=2>" + writeChild(b7) + "</column>" // + "</row></vaadin-grid-layout>"; testWrite(design, gl); testRead(design, gl); } @Test public void testManyExtraGridLayoutSlots() { GridLayout gl = new GridLayout(5, 5); Button b1 = new Button("Button 0,4 -> 4,4"); b1.setCaptionAsHtml(true); gl.addComponent(b1, 4, 0, 4, 4); gl.setColumnExpandRatio(2, 2.0f); String design = "<vaadin-grid-layout><row>" // + "<column colspan=4 rowspan=5 expand='0.0,0.0,2.0,0.0' />" // + "<column rowspan=5>" + writeChild(b1) + "</column>" // + "</row><row>" // + "</row><row>" // + "</row><row>" // + "</row><row>" // + "</row></vaadin-grid-layout>"; testWrite(design, gl); testRead(design, gl); } @Test public void testManyEmptyColumnsWithOneExpand() { GridLayout gl = new GridLayout(5, 5); Button b1 = new Button("Button 0,4 -> 4,4"); b1.setCaptionAsHtml(true); gl.addComponent(b1, 0, 0, 0, 4); gl.setColumnExpandRatio(4, 2.0f); String design = "<vaadin-grid-layout><row>" // + "<column rowspan=5>" + writeChild(b1) + "</column>" // + "<column colspan=4 rowspan=5 expand='0.0,0.0,0.0,2.0' />" // + "</row><row>" // + "</row><row>" // + "</row><row>" // + "</row><row>" // + "</row></vaadin-grid-layout>"; testWrite(design, gl); testRead(design, gl); } @Test public void testEmptyGridLayout() { GridLayout gl = new GridLayout(); String design = "<vaadin-grid-layout />"; testWrite(design, gl); testRead(design, gl); } private String writeChild(Component childComponent) { return new DesignContext().createElement(childComponent).toString(); } @Override public GridLayout testRead(String design, GridLayout expected) { expected.setCursorX(0); expected.setCursorY(expected.getRows()); GridLayout result = super.testRead(design, expected); for (int row = 0; row < expected.getRows(); ++row) { Assert.assertEquals(expected.getRowExpandRatio(row), result.getRowExpandRatio(row), 0.00001); } for (int col = 0; col < expected.getColumns(); ++col) { Assert.assertEquals(expected.getColumnExpandRatio(col), result.getColumnExpandRatio(col), 0.00001); } for (int row = 0; row < expected.getRows(); ++row) { for (int col = 0; col < expected.getColumns(); ++col) { Component eC = expected.getComponent(col, row); Component rC = result.getComponent(col, row); assertEquals(eC, rC); if (eC == null) { continue; } Assert.assertEquals(expected.getComponentAlignment(eC), result.getComponentAlignment(rC)); } } return result; } @Test public void testNestedGridLayouts() { String design = "<!DOCTYPE html>" + // "<html>" + // " <body> " + // " <vaadin-grid-layout> " + // " <row> " + // " <column> " + // " <vaadin-grid-layout> " + // " <row> " + // " <column> " + // " <vaadin-button>" + // " Button " + // " </vaadin-button> " + // " </column> " + // " </row> " + // " </vaadin-grid-layout> " + // " </column> " + // " </row> " + // " </vaadin-grid-layout> " + // " </body>" + // "</html>"; GridLayout outer = new GridLayout(); GridLayout inner = new GridLayout(); Button b = new Button("Button"); b.setCaptionAsHtml(true); inner.addComponent(b); outer.addComponent(inner); testRead(design, outer); testWrite(design, outer); } @Test public void testEmptyGridLayoutWithColsAndRowsSet() throws IOException { GridLayout layout = new GridLayout(); layout.setRows(2); layout.setColumns(2); ByteArrayOutputStream out = new ByteArrayOutputStream(); DesignContext context = new DesignContext(); context.setRootComponent(layout); Design.write(context, out); ByteArrayInputStream input = new ByteArrayInputStream( out.toByteArray()); Component component = Design.read(input); GridLayout readLayout = (GridLayout) component; Assert.assertEquals(layout.getRows(), readLayout.getRows()); } @Test public void testGridLayoutAlignments() { String design = "<vaadin-grid-layout><row>" // + "<column><vaadin-label :middle>0</label></column>"// + "<column><vaadin-label :right>1</label>"// + "</row><row>" // + "<column><vaadin-label :bottom :center>2</label></column>"// + "<column><vaadin-label :middle :center>3</label>" // + "</row></vaadin-grid-layout>"; GridLayout gl = new GridLayout(2, 2); Alignment[] alignments = { Alignment.MIDDLE_LEFT, Alignment.TOP_RIGHT, Alignment.BOTTOM_CENTER, Alignment.MIDDLE_CENTER }; for (int i = 0; i < 4; i++) { Label child = new Label("" + i, ContentMode.HTML); gl.addComponent(child); gl.setComponentAlignment(child, alignments[i]); } testWrite(design, gl); testRead(design, gl); } @Test public void testGridLayoutMargins() throws IOException { String design = "<vaadin-grid-layout _id=\"marginComponent\"margin>" + "<row><column><vaadin-grid-layout _id=\"marginLeftComponent\" margin-left></vaadin-grid-layout></column></row>" + "<row><column><vaadin-grid-layout _id=\"marginRightComponent\" margin-right></vaadin-grid-layout></column></row>" + "<row><column><vaadin-grid-layout _id=\"marginTopComponent\" margin-top></vaadin-grid-layout></column></row>" + "<row><column><vaadin-grid-layout _id=\"marginBottomComponent\" margin-bottom></vaadin-grid-layout></column></row>" + "</vaadin-grid-layout>"; DesignContext context = Design .read(new ByteArrayInputStream(design.getBytes("UTF-8")), null); Assert.assertEquals(null, context.getCustomAttributes( context.getComponentByLocalId("marginComponent"))); Assert.assertEquals(null, context.getCustomAttributes( context.getComponentByLocalId("marginLeftComponent"))); Assert.assertEquals(null, context.getCustomAttributes( context.getComponentByLocalId("marginRightComponent"))); Assert.assertEquals(null, context.getCustomAttributes( context.getComponentByLocalId("marginTopComponent"))); Assert.assertEquals(null, context.getCustomAttributes( context.getComponentByLocalId("marginBottomComponent"))); } @Test public void designWithPreconfiguredGridLayout() throws Exception { String design = "<html>" // + "<head>" // + "<meta name='package-mapping' content='my:com.vaadin.tests.server.component.gridlayout'>" + "</meta>" + "</head>" + "<body>" + "<my-preconfigured-grid-layout></my-preconfigured-grid-layout>"; PreconfiguredGridLayout myLayout = (PreconfiguredGridLayout) Design .read(new ByteArrayInputStream(design.getBytes("UTF-8"))); Assert.assertEquals(2, myLayout.getRows()); Assert.assertEquals(2, myLayout.getColumns()); } }