/* * Beanfabrics Framework Copyright (C) by Michael Karneim, beanfabrics.org * Use is subject to license terms. See license.txt. */ package org.beanfabrics.support; import static org.junit.Assert.assertEquals; import junit.framework.JUnit4TestAdapter; import org.beanfabrics.model.AbstractPM; import org.beanfabrics.model.IntegerPM; import org.beanfabrics.model.OperationPM; import org.beanfabrics.model.PMManager; import org.beanfabrics.model.TextPM; import org.junit.Test; /** * @author Michael Karneim */ public class ValidationSupportTest { public static junit.framework.Test suite() { return new JUnit4TestAdapter(ValidationSupportTest.class); } @Test public void singleValidation() { class MyTextPM extends TextPM { public MyTextPM() { setMandatory(true); PMManager.setup(this); } @Validation(message = "contains no x") boolean containsX() { return getText().indexOf('x') >= 0; } } MyTextPM pModel = new MyTextPM(); assertEquals("pModel.isValid()", false, pModel.isValid()); pModel.setText("x"); assertEquals("pModel.isValid()", true, pModel.isValid()); pModel.setText("bla"); assertEquals("pModel.isValid()", false, pModel.isValid()); } @Test public void multipleValidations() { class MyTextPM extends TextPM { public MyTextPM() { setMandatory(true); PMManager.setup(this); } @Validation(message = "contains no x") boolean containsX() { return getText().indexOf('x') >= 0; } @Validation(message = "contains no y") boolean containsY() { return getText().indexOf('y') >= 0; } } MyTextPM pModel = new MyTextPM(); assertEquals("pModel.isValid()", false, pModel.isValid()); pModel.setText("x"); assertEquals("pModel.isValid()", false, pModel.isValid()); pModel.setText("xy"); assertEquals("pModel.isValid()", true, pModel.isValid()); pModel.setText("bla"); assertEquals("pModel.isValid()", false, pModel.isValid()); } @Test public void multipleValidationsWithSortOrder() { class MyTextPM extends TextPM { public MyTextPM() { setMandatory(true); PMManager.setup(this); } Integer getInteger() { return Integer.parseInt(getText()); } @Validation(message = "not an integer") @SortOrder(1) boolean isInteger() { try { getInteger(); return true; } catch (NumberFormatException ex) { return false; } } @Validation(message = "number must be even") @SortOrder(2) boolean isEven() { return getInteger() % 2 == 0; } } MyTextPM pModel = new MyTextPM(); assertEquals("pModel.isValid()", false, pModel.isValid()); pModel.setText("13"); assertEquals("pModel.isValid()", false, pModel.isValid()); pModel.setText("12"); assertEquals("pModel.isValid()", true, pModel.isValid()); pModel.setText("bla"); assertEquals("pModel.isValid()", false, pModel.isValid()); } @Test public void compositeEditor() { class EmailModel extends AbstractPM { @Property TextPM to = new TextPM(); @Property TextPM from = new TextPM(); public EmailModel() { to.setMandatory(true); from.setMandatory(true); PMManager.setup(this); } @Validation(path = "to", message = "missing '@'") boolean toContainsAt() { return to.getText().indexOf('@') >= 0; } @Validation(path = "from", message = "missing '@'") boolean fromContainsAt() { return from.getText().indexOf('@') >= 0; } } EmailModel pModel = new EmailModel(); assertEquals("pModel.isValid()", false, pModel.isValid()); pModel.to.setText("hallo"); pModel.from.setText("hallo"); assertEquals("pModel.isValid()", false, pModel.isValid()); pModel.to.setText("tom@example.com"); assertEquals("pModel.to.isValid()", true, pModel.to.isValid()); assertEquals("pModel.isValid()", false, pModel.isValid()); pModel.from.setText("jerry@example.com"); assertEquals("pModel.from.isValid()", true, pModel.from.isValid()); assertEquals("pModel.isValid()", true, pModel.isValid()); } @Test public void pathWithMoreElements() { class SomeModel extends AbstractPM { @Property TextPM title = new TextPM(); public SomeModel() { title.setMandatory(true); PMManager.setup(this); } } class OwnerModel extends AbstractPM { @Property SomeModel some = new SomeModel(); public OwnerModel() { PMManager.setup(this); } @Validation(path = "some.title", message = "invalid title") public boolean titleContainsX() { return some.title.getText().indexOf('x') >= 0; } } OwnerModel pModel = new OwnerModel(); assertEquals("pModel.some.title.isValid()", false, pModel.some.title.isValid()); assertEquals("pModel.some.isValid()", false, pModel.some.isValid()); assertEquals("pModel.isValid()", false, pModel.isValid()); pModel.some.title.setText("text"); assertEquals("pModel.some.title.isValid()", true, pModel.some.title.isValid()); assertEquals("pModel.some.isValid()", true, pModel.some.isValid()); assertEquals("pModel.isValid()", true, pModel.isValid()); // now replace TextPM for 'title' TextPM oldTitlePM = pModel.some.title; pModel.some.title = new TextPM(); pModel.some.title.setMandatory(true); PropertySupport.get(pModel.some).refresh(); assertEquals("pModel.some.title.isValid()", false, pModel.some.title.isValid()); assertEquals("pModel.some.isValid()", false, pModel.some.isValid()); assertEquals("pModel.isValid()", false, pModel.isValid()); pModel.some.title.setText("text"); assertEquals("pModel.some.title.isValid()", true, pModel.some.title.isValid()); assertEquals("pModel.some.isValid()", true, pModel.some.isValid()); assertEquals("pModel.isValid()", true, pModel.isValid()); // check oldTitleEd oldTitlePM.setText("bla"); assertEquals("oldTitleCell.isValid()", true, oldTitlePM.isValid()); // 'x'-validation has been removed } @Test public void validateOperation() throws Throwable { class ArticleModel extends AbstractPM { @Property TextPM name = new TextPM(); @Property IntegerPM number = new IntegerPM(); @Property OperationPM addToCart = new OperationPM(); public ArticleModel() { number.setInteger(1); PMManager.setup(this); } @Operation public void addToCart() { number.setInteger(number.getInteger() - 1); } @Validation(path = "addToCart", message = "no items in stock") public boolean hasItemsInStock() { return number != null && number.getInteger() > 0; } } ArticleModel pModel = new ArticleModel(); assertEquals("pModel.addToCart.isEnabled()", true, pModel.addToCart.isEnabled()); pModel.addToCart.execute(); assertEquals("pModel.addToCart.isEnabled()", false, pModel.addToCart.isEnabled()); } }