/*
* 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.v7.tests.server.renderer;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import java.util.Date;
import java.util.Locale;
import org.junit.Before;
import org.junit.Test;
import com.vaadin.server.VaadinSession;
import com.vaadin.tests.util.AlwaysLockedVaadinSession;
import com.vaadin.v7.data.Item;
import com.vaadin.v7.data.util.IndexedContainer;
import com.vaadin.v7.data.util.converter.Converter;
import com.vaadin.v7.data.util.converter.StringToIntegerConverter;
import com.vaadin.v7.tests.server.component.grid.TestGrid;
import com.vaadin.v7.ui.Grid;
import com.vaadin.v7.ui.Grid.AbstractRenderer;
import com.vaadin.v7.ui.Grid.Column;
import com.vaadin.v7.ui.renderers.ButtonRenderer;
import com.vaadin.v7.ui.renderers.DateRenderer;
import com.vaadin.v7.ui.renderers.HtmlRenderer;
import com.vaadin.v7.ui.renderers.NumberRenderer;
import com.vaadin.v7.ui.renderers.TextRenderer;
import elemental.json.JsonValue;
public class RendererTest {
private static class TestBean {
int i = 42;
@Override
public String toString() {
return "TestBean [" + i + "]";
}
}
private static class ExtendedBean extends TestBean {
float f = 3.14f;
}
private static class TestRenderer extends TextRenderer {
@Override
public JsonValue encode(String value) {
return super.encode("renderer(" + value + ")");
}
}
private static class TestConverter implements Converter<String, TestBean> {
@Override
public TestBean convertToModel(String value,
Class<? extends TestBean> targetType, Locale locale)
throws ConversionException {
return null;
}
@Override
public String convertToPresentation(TestBean value,
Class<? extends String> targetType, Locale locale)
throws ConversionException {
if (value instanceof ExtendedBean) {
return "ExtendedBean(" + value.i + ", "
+ ((ExtendedBean) value).f + ")";
} else {
return "TestBean(" + value.i + ")";
}
}
@Override
public Class<TestBean> getModelType() {
return TestBean.class;
}
@Override
public Class<String> getPresentationType() {
return String.class;
}
}
private Grid grid;
private Column intColumn;
private Column textColumn;
private Column beanColumn;
private Column htmlColumn;
private Column numberColumn;
private Column dateColumn;
private Column extendedBeanColumn;
private Column buttonColumn;
@Before
@SuppressWarnings("unchecked")
public void setUp() {
VaadinSession.setCurrent(new AlwaysLockedVaadinSession(null));
IndexedContainer c = new IndexedContainer();
c.addContainerProperty("int", Integer.class, 0);
c.addContainerProperty("text", String.class, "");
c.addContainerProperty("html", String.class, "");
c.addContainerProperty("number", Number.class, null);
c.addContainerProperty("date", Date.class, null);
c.addContainerProperty("bean", TestBean.class, null);
c.addContainerProperty("button", String.class, null);
c.addContainerProperty("extendedBean", ExtendedBean.class, null);
Object id = c.addItem();
Item item = c.getItem(id);
item.getItemProperty("int").setValue(123);
item.getItemProperty("text").setValue("321");
item.getItemProperty("html").setValue("<b>html</b>");
item.getItemProperty("number").setValue(3.14);
item.getItemProperty("date").setValue(new Date(123456789));
item.getItemProperty("bean").setValue(new TestBean());
item.getItemProperty("extendedBean").setValue(new ExtendedBean());
grid = new TestGrid(c);
intColumn = grid.getColumn("int");
textColumn = grid.getColumn("text");
htmlColumn = grid.getColumn("html");
numberColumn = grid.getColumn("number");
dateColumn = grid.getColumn("date");
beanColumn = grid.getColumn("bean");
extendedBeanColumn = grid.getColumn("extendedBean");
buttonColumn = grid.getColumn("button");
}
@Test
public void testDefaultRendererAndConverter() throws Exception {
assertSame(TextRenderer.class, intColumn.getRenderer().getClass());
assertSame(StringToIntegerConverter.class,
intColumn.getConverter().getClass());
assertSame(TextRenderer.class, textColumn.getRenderer().getClass());
// String->String; converter not needed
assertNull(textColumn.getConverter());
assertSame(TextRenderer.class, beanColumn.getRenderer().getClass());
// MyBean->String; converter not found
assertNull(beanColumn.getConverter());
}
@Test
public void testFindCompatibleConverter() throws Exception {
intColumn.setRenderer(renderer());
assertSame(StringToIntegerConverter.class,
intColumn.getConverter().getClass());
textColumn.setRenderer(renderer());
assertNull(textColumn.getConverter());
}
@Test(expected = IllegalArgumentException.class)
public void testCannotFindConverter() {
beanColumn.setRenderer(renderer());
}
@Test
public void testExplicitConverter() throws Exception {
beanColumn.setRenderer(renderer(), converter());
extendedBeanColumn.setRenderer(renderer(), converter());
}
@Test
public void testEncoding() throws Exception {
assertEquals("42", render(intColumn, 42).asString());
intColumn.setRenderer(renderer());
assertEquals("renderer(42)", render(intColumn, 42).asString());
assertEquals("2.72", render(textColumn, "2.72").asString());
textColumn.setRenderer(new TestRenderer());
assertEquals("renderer(2.72)", render(textColumn, "2.72").asString());
}
@Test
public void testEncodingWithoutConverter() throws Exception {
assertEquals("TestBean [42]",
render(beanColumn, new TestBean()).asString());
}
@Test
public void testBeanEncoding() throws Exception {
beanColumn.setRenderer(renderer(), converter());
extendedBeanColumn.setRenderer(renderer(), converter());
assertEquals("renderer(TestBean(42))",
render(beanColumn, new TestBean()).asString());
assertEquals("renderer(ExtendedBean(42, 3.14))",
render(beanColumn, new ExtendedBean()).asString());
assertEquals("renderer(ExtendedBean(42, 3.14))",
render(extendedBeanColumn, new ExtendedBean()).asString());
}
@Test
public void testNullEncoding() {
textColumn.setRenderer(new TextRenderer());
htmlColumn.setRenderer(new HtmlRenderer());
numberColumn.setRenderer(new NumberRenderer());
dateColumn.setRenderer(new DateRenderer());
buttonColumn.setRenderer(new ButtonRenderer());
assertEquals("", textColumn.getRenderer().encode(null).asString());
assertEquals("", htmlColumn.getRenderer().encode(null).asString());
assertEquals("", numberColumn.getRenderer().encode(null).asString());
assertEquals("", dateColumn.getRenderer().encode(null).asString());
assertEquals("", buttonColumn.getRenderer().encode(null).asString());
}
@Test
public void testNullEncodingWithDefault() {
textColumn.setRenderer(new TextRenderer("default value"));
htmlColumn.setRenderer(new HtmlRenderer("default value"));
numberColumn.setRenderer(
new NumberRenderer("%s", Locale.getDefault(), "default value"));
dateColumn.setRenderer(new DateRenderer("%s", "default value"));
buttonColumn.setRenderer(new ButtonRenderer("default value"));
assertEquals("default value",
textColumn.getRenderer().encode(null).asString());
assertEquals("default value",
htmlColumn.getRenderer().encode(null).asString());
assertEquals("default value",
numberColumn.getRenderer().encode(null).asString());
assertEquals("default value",
dateColumn.getRenderer().encode(null).asString());
assertEquals("default value",
buttonColumn.getRenderer().encode(null).asString());
}
private TestConverter converter() {
return new TestConverter();
}
private TestRenderer renderer() {
return new TestRenderer();
}
private JsonValue render(Column column, Object value) {
return AbstractRenderer.encodeValue(value, column.getRenderer(),
column.getConverter(), grid.getLocale());
}
}