package com.vaadin.tests.components; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Locale; import com.vaadin.data.HasValue; import com.vaadin.server.Resource; import com.vaadin.server.ThemeResource; import com.vaadin.server.UserError; import com.vaadin.server.VaadinRequest; import com.vaadin.ui.AbstractComponent; import com.vaadin.ui.Layout.SpacingHandler; import com.vaadin.v7.ui.AbstractLegacyComponent; import com.vaadin.v7.ui.Field; public abstract class AbstractComponentTestCase<T extends AbstractComponent> extends AbstractReindeerTestUI { protected static final ThemeResource ICON_16_HELP_PNG_CACHEABLE = cacheableThemeResource( "../runo/icons/16/help.png"); protected static final ThemeResource ICON_16_FOLDER_PNG_CACHEABLE = cacheableThemeResource( "../runo/icons/16/folder.png"); protected static final ThemeResource ICON_16_ERROR_PNG_CACHEABLE = cacheableThemeResource( "../runo/icons/16/error.png"); protected static final ThemeResource ICON_16_USER_PNG_CACHEABLE = cacheableThemeResource( "../runo/icons/16/user.png"); protected static final ThemeResource ICON_16_USER_PNG_UNCACHEABLE = uncacheableThemeResource( "../runo/icons/16/user.png"); protected static final ThemeResource ICON_32_ATTENTION_PNG_CACHEABLE = cacheableThemeResource( "../runo/icons/32/attention.png"); protected static final ThemeResource ICON_32_ATTENTION_PNG_UNCACHEABLE = uncacheableThemeResource( "../runo/icons/32/attention.png"); protected static final ThemeResource ICON_64_EMAIL_REPLY_PNG_CACHEABLE = cacheableThemeResource( "../runo/icons/64/email-reply.png"); protected static final ThemeResource ICON_64_EMAIL_REPLY_PNG_UNCACHEABLE = uncacheableThemeResource( "../runo/icons/64/email-reply.png"); private List<T> testComponents = new ArrayList<>(); abstract protected Class<T> getTestClass(); protected static ThemeResource uncacheableThemeResource( String resourceLocation) { return new ThemeResource(resourceLocation + "?" + new Date().getTime()); } protected static ThemeResource cacheableThemeResource( String resourceLocation) { return new ThemeResource(resourceLocation); } abstract protected void initializeComponents(); @Override protected void setup(VaadinRequest request) { ((SpacingHandler) getLayout()).setSpacing(true); // Create Components initializeComponents(); } @Override protected Integer getTicketNumber() { return null; } protected void addTestComponent(T c) { testComponents.add(c); addComponent(c); } protected List<T> getTestComponents() { return testComponents; } public interface Command<T, VALUETYPE extends Object> { public void execute(T c, VALUETYPE value, Object data); } private String errorMessage = null; /* COMMANDS */ protected Command<T, String> widthCommand = (t, value, data) -> t .setWidth(value); protected Command<T, String> heightCommand = (t, value, data) -> t .setHeight(value); protected Command<T, Boolean> enabledCommand = (c, enabled, data) -> c .setEnabled(enabled); protected Command<T, Boolean> errorIndicatorCommand = (c, enabled, data) -> { if (enabled) { c.setComponentError(new UserError(errorMessage)); } else { c.setComponentError(null); } }; protected Command<T, String> errorMessageCommand = (c, value, data) -> { errorMessage = value; if (c.getComponentError() != null) { errorIndicatorCommand.execute(c, true, null); } }; // TODO Move to AbstractFieldTestCase protected Command<T, Boolean> requiredCommand = (c, enabled, data) -> { if (c instanceof HasValue) { ((HasValue) c).setRequiredIndicatorVisible(enabled); } else if (c instanceof Field) { ((Field) c).setRequired(enabled); } else { throw new IllegalArgumentException(c.getClass().getName() + " is not a field and cannot be set to required"); } }; protected Command<T, String> requiredErrorMessageCommand = (c, value, data) -> ((Field<?>) c).setRequiredError(value); protected Command<T, String> descriptionCommand = (c, value, data) -> c .setDescription(value); protected Command<T, Boolean> readonlyCommand = (c, enabled, data) -> { if (c instanceof HasValue) { ((HasValue) c).setReadOnly(enabled); } else if (c instanceof AbstractLegacyComponent) { ((AbstractLegacyComponent) c).setReadOnly(enabled); } }; protected Command<T, Boolean> visibleCommand = (c, enabled, data) -> c .setVisible(enabled); protected Command<T, Resource> iconCommand = (c, value, data) -> c .setIcon(value); protected Command<T, String> captionCommand = (c, value, data) -> c .setCaption(value); protected Command<T, Locale> localeCommand = (c, value, data) -> c .setLocale(value); protected <VALUET> void doCommand(Command<T, VALUET> command, VALUET value) { doCommand(command, value, null); } protected <VALUET> void doCommand(Command<T, VALUET> command, VALUET value, Object data) { for (T c : getTestComponents()) { command.execute(c, value, data); } } protected <VALUET> void doCommand(String commandName, Command<T, VALUET> command, VALUET value) { doCommand(commandName, command, value, null); } protected <VALUET> void doCommand(String commandName, Command<T, VALUET> command, VALUET value, Object data) { doCommand(command, value, data); } protected Command<T, String> styleNameCommand = (c, value, data) -> c .setStyleName(value); protected Command<T, String> primaryStyleNameCommand = (c, value, data) -> c .setPrimaryStyleName(value); @Override protected String getTestDescription() { return "Generic test case for " + getTestClass().getSimpleName(); } }