/* * Copyright 2012 Google Inc. * * 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.google.gwt.validation.example.client; import com.google.gwt.core.client.GWT; import com.google.gwt.editor.client.Editor; import com.google.gwt.editor.client.EditorError; import com.google.gwt.editor.client.SimpleBeanEditorDriver; import com.google.gwt.editor.ui.client.ValueBoxEditorDecorator; import com.google.gwt.junit.client.GWTTestCase; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.TextBox; import java.util.List; import java.util.Set; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; /** * Tests for {@link Book}. */ public class BookTest extends GWTTestCase { private Author author; private Book book; private BookWidget bookWidget; private Driver driver; private Validator validator; @Override public String getModuleName() { return "com.google.gwt.validation.example.ValidationExample"; } public void testValidate_emptyAuthorLastName() { initValidBook(); author.setLastName(""); Set<ConstraintViolation<Book>> violations = validator.validate(book); assertEquals(1, violations.size()); ConstraintViolation<Book> violation = violations.iterator().next(); assertEquals(author, violation.getLeafBean()); assertEquals(book, violation.getRootBean()); assertEquals("author.lastName", violation.getPropertyPath().toString()); } public void testValidate_valid() { initValidBook(); Set<ConstraintViolation<Book>> violations = validator.validate(book); assertTrue(violations.isEmpty()); } public void testErrorDisplay_noErrors() { initValidBook(); driver.initialize(bookWidget); driver.edit(book); assertEquals("Smith", bookWidget.author.lastName.asEditor().getValue()); Set<ConstraintViolation<Book>> violations = validator.validate(book); assertTrue(violations.isEmpty()); driver.setConstraintViolations(doHorribleCast(violations)); } public void testErrorDisplay_lastNameError() { initValidBook(); driver.initialize(bookWidget); driver.edit(book); bookWidget.author.lastName.asEditor().setValue(""); driver.flush(); assertEquals(null, author.getLastName()); Set<ConstraintViolation<Book>> violations = validator.validate(book); assertEquals(1, violations.size()); driver.setConstraintViolations(doHorribleCast(violations)); List<EditorError> errors = bookWidget.author.errors; // Note: Is the fact that there are 2 errors here (rather than just one) also a bug? assertEquals(2, errors.size()); EditorError error = errors.get(0); assertEquals(bookWidget.author.lastName.asEditor(), error.getEditor()); // There is a bug here - error.getPath() throws a StringIndexOutOfBoundsException. // The pathPrefixLength is set in ErrorCollector line 63. It breaks the toString() method // of SimpleError as well. assertEquals("author.lastName", error.getAbsolutePath()); } @Override protected final void gwtSetUp() throws Exception { super.gwtSetUp(); author = new Author(); book = new Book(); validator = Validation.buildDefaultValidatorFactory().getValidator(); bookWidget = new BookWidget(); driver = GWT.create(Driver.class); } protected void initValidBook() { author.setFirstName("John"); author.setLastName("Smith"); author.setCompany("Google"); book.setAuthor(author); book.setTitle("JSR-303 Validation in GWT"); } @SuppressWarnings("unchecked") private Iterable<ConstraintViolation<?>> doHorribleCast(Object o) { return (Iterable<ConstraintViolation<?>>) o; } interface Driver extends SimpleBeanEditorDriver<Book, BookWidget> { } class BookWidget extends Composite implements Editor<Book> { AuthorWidget author = new AuthorWidget(); } class AuthorWidget extends Composite implements Editor<Author> { ValueBoxEditorDecorator<String> lastName; List<EditorError> errors; AuthorWidget() { lastName = new ValueBoxEditorDecorator<String>() { @Override public void showErrors(List<EditorError> errors) { super.showErrors(errors); AuthorWidget.this.errors = errors; } }; lastName.setValueBox(new TextBox()); } } }