Package org.apache.tapestry.valid

Source Code of org.apache.tapestry.valid.TestValidField

// Copyright 2005 The Apache Software Foundation
//
// 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 org.apache.tapestry.valid;

import org.apache.hivemind.Location;
import org.apache.tapestry.BindingException;
import org.apache.tapestry.IBinding;
import org.apache.tapestry.IForm;
import org.apache.tapestry.IMarkupWriter;
import org.apache.tapestry.IPage;
import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.PageRenderSupport;
import org.apache.tapestry.TapestryUtils;
import org.apache.tapestry.form.BaseFormComponentTest;
import org.apache.tapestry.form.IFormComponent;
import org.apache.tapestry.form.MockDelegate;
import org.apache.tapestry.html.BasePage;
import org.easymock.MockControl;

/**
* Tests for {@link org.apache.tapestry.valid.ValidField}.
*
* @author Howard M. Lewis Ship
* @since 4.0
*/
public class TestValidField extends BaseFormComponentTest
{

    public void testWasPrerendered()
    {
        MockControl cyclec = newControl(IRequestCycle.class);
        IRequestCycle cycle = (IRequestCycle) cyclec.getMock();

        MockControl formc = newControl(IForm.class);
        IForm form = (IForm) formc.getMock();

        IMarkupWriter writer = newWriter();

        trainGetForm(cyclec, cycle, form);

        ValidField component = (ValidField) newInstance(ValidField.class);

        trainWasPrerendered(formc, form, writer, component, true);

        replayControls();

        component.render(writer, cycle);

        verifyControls();
    }

    /**
     * Check when the form is not rewinding, but the cycle is rewinding (a whole page rewind care of
     * the action service).
     */

    public void testFormNotRewinding()
    {
        ValidField component = (ValidField) newInstance(ValidField.class);

        MockControl cyclec = newControl(IRequestCycle.class);
        IRequestCycle cycle = (IRequestCycle) cyclec.getMock();

        MockControl formc = newControl(IForm.class);
        IForm form = (IForm) formc.getMock();

        IMarkupWriter writer = newWriter();

        MockControl delegatec = newControl(IValidationDelegate.class);
        IValidationDelegate delegate = (IValidationDelegate) delegatec.getMock();

        trainGetForm(cyclec, cycle, form);
        trainWasPrerendered(formc, form, writer, component, false);
        trainGetDelegate(formc, form, delegate);

        delegate.setFormComponent(component);

        trainGetElementId(formc, form, component, "fred");
        trainIsRewinding(formc, form, false);
        trainIsRewinding(cyclec, cycle, true);

        replayControls();

        component.render(writer, cycle);

        verifyControls();
    }

    private void trainToObject(MockControl control, IValidator validator, IFormComponent component,
            String fieldValue, Object translatedValue) throws ValidatorException
    {
        validator.toObject(component, fieldValue);

        control.setReturnValue(translatedValue);
    }

    public void testRewind() throws Exception
    {
        Object translatedValue = new Object();

        MockControl validatorc = newControl(IValidator.class);
        IValidator validator = (IValidator) validatorc.getMock();

        ValidField component = (ValidField) newInstance(ValidField.class, "validator", validator);

        MockControl cyclec = newControl(IRequestCycle.class);
        IRequestCycle cycle = (IRequestCycle) cyclec.getMock();

        MockControl formc = newControl(IForm.class);
        IForm form = (IForm) formc.getMock();

        IMarkupWriter writer = newWriter();

        MockControl delegatec = newControl(IValidationDelegate.class);
        IValidationDelegate delegate = (IValidationDelegate) delegatec.getMock();

        trainGetForm(cyclec, cycle, form);
        trainWasPrerendered(formc, form, writer, component, false);
        trainGetDelegate(formc, form, delegate);

        delegate.setFormComponent(component);

        trainGetElementId(formc, form, component, "fred");
        trainIsRewinding(formc, form, true);

        trainGetParameter(cyclec, cycle, "fred", "fred-value");

        trainGetDelegate(formc, form, delegate);

        delegate.recordFieldInputValue("fred-value");

        trainToObject(validatorc, validator, component, "fred-value", translatedValue);

        replayControls();

        component.render(writer, cycle);

        verifyControls();

        assertSame(translatedValue, component.getProperty("value"));
    }

    public void testRewindNoValidator()
    {
        Location l = newLocation();

        IBinding binding = newBinding(l);

        IPage page = (IPage) newInstance(BasePage.class);
        page.setPageName("Barney");

        ValidField component = (ValidField) newInstance(ValidField.class, new Object[]
        { "page", page, "id", "inputFred", "container", page });

        component.setBinding("validator", binding);

        MockControl cyclec = newControl(IRequestCycle.class);
        IRequestCycle cycle = (IRequestCycle) cyclec.getMock();

        MockControl formc = newControl(IForm.class);
        IForm form = (IForm) formc.getMock();

        IMarkupWriter writer = newWriter();

        MockControl delegatec = newControl(IValidationDelegate.class);
        IValidationDelegate delegate = (IValidationDelegate) delegatec.getMock();

        trainGetForm(cyclec, cycle, form);
        trainWasPrerendered(formc, form, writer, component, false);
        trainGetDelegate(formc, form, delegate);

        delegate.setFormComponent(component);

        trainGetElementId(formc, form, component, "fred");
        trainIsRewinding(formc, form, true);

        trainGetParameter(cyclec, cycle, "fred", "fred-value");

        replayControls();

        try
        {
            component.render(writer, cycle);
            unreachable();
        }
        catch (BindingException ex)
        {
            assertEquals(
                    "Value for parameter 'validator' in component Barney/inputFred is null, and a non-null value is required.",
                    ex.getMessage());
            assertSame(l, ex.getLocation());
            assertSame(binding, ex.getBinding());
        }

        verifyControls();
    }

    public void testRender()
    {
        Object value = new Object();
        MockControl validatorc = newControl(IValidator.class);
        IValidator validator = (IValidator) validatorc.getMock();

        ValidField component = (ValidField) newInstance(ValidField.class, new Object[]
        { "value", value, "validator", validator });

        MockControl cyclec = newControl(IRequestCycle.class);
        IRequestCycle cycle = (IRequestCycle) cyclec.getMock();

        MockControl formc = newControl(IForm.class);
        IForm form = (IForm) formc.getMock();

        IMarkupWriter writer = newBufferWriter();

        MockDelegate delegate = new MockDelegate();

        trainGetForm(cyclec, cycle, form);
        trainWasPrerendered(formc, form, writer, component, false);
        trainGetDelegate(formc, form, delegate);

        trainGetElementId(formc, form, component, "fred");
        trainIsRewinding(formc, form, false);
        trainIsRewinding(cyclec, cycle, false);

        trainGetDelegate(formc, form, delegate);
        trainGetDelegate(formc, form, delegate);

        trainToString(validatorc, validator, component, value, "fred value");

        // Would be nice to have this do something so we could check the timing, but ...

        validator.renderValidatorContribution(component, writer, cycle);

        replayControls();

        component.render(writer, cycle);

        verifyControls();

        assertSame(component, delegate.getFormComponent());
        assertBuffer("<span class=\"prefix\"><input type=\"text\" name=\"fred\" value=\"fred value\" class=\"validation-delegate\"/></span>");
    }

    private void trainToString(MockControl validatorc, IValidator validator,
            IFormComponent component, Object value, String string)
    {
        validator.toString(component, value);
        validatorc.setReturnValue(string);
    }

    public void testRenderNull()
    {
        IPage page = (IPage) newInstance(BasePage.class);

        MockControl validatorc = newControl(IValidator.class);
        IValidator validator = (IValidator) validatorc.getMock();

        ValidField component = (ValidField) newInstance(ValidField.class, new Object[]
        { "validator", validator, "page", page, "container", page });

        MockControl cyclec = newControl(IRequestCycle.class);
        IRequestCycle cycle = (IRequestCycle) cyclec.getMock();

        page.attach(null, cycle);

        MockControl formc = newControl(IForm.class);
        IForm form = (IForm) formc.getMock();

        IMarkupWriter writer = newBufferWriter();

        MockDelegate delegate = new MockDelegate();

        trainGetForm(cyclec, cycle, form);
        trainWasPrerendered(formc, form, writer, component, false);
        trainGetDelegate(formc, form, delegate);

        trainGetElementId(formc, form, component, "fred");
        trainIsRewinding(formc, form, false);
        trainIsRewinding(cyclec, cycle, false);

        trainGetDelegate(formc, form, delegate);
        trainGetDelegate(formc, form, delegate);

        trainToString(validatorc, validator, component, null, null);

        // Would be nice to have this do something so we could check the timing, but ...

        validator.renderValidatorContribution(component, writer, cycle);

        // Short cut this here, so that it appears some other field is
        // taking the honors ...

        replayControls();

        component.render(writer, cycle);

        verifyControls();

        assertSame(component, delegate.getFormComponent());
        assertBuffer("<span class=\"prefix\"><input type=\"text\" name=\"fred\" class=\"validation-delegate\"/></span>");
    }

    protected void trainGetAttribute(MockControl control, IRequestCycle cycle, String name,
            Object object)
    {
        cycle.getAttribute(name);
        control.setReturnValue(object);
    }

    private void trainIsRequired(MockControl control, IValidator validator, boolean isRequired)
    {
        validator.isRequired();
        control.setReturnValue(isRequired);
    }

    public void testRenderWithError()
    {

        Object value = new Object();
        MockControl validatorc = newControl(IValidator.class);
        IValidator validator = (IValidator) validatorc.getMock();

        PageRenderSupport support = (PageRenderSupport) newMock(PageRenderSupport.class);

        MockControl cyclec = newControl(IRequestCycle.class);
        IRequestCycle cycle = (IRequestCycle) cyclec.getMock();

        MockControl formc = newControl(IForm.class);
        IForm form = (IForm) formc.getMock();

        ValidField component = (ValidField) newInstance(ValidField.class, new Object[]
        { "value", value, "validator", validator, "form", form, "name", "fred" });

        IMarkupWriter writer = newBufferWriter();

        MockDelegate delegate = new MockDelegate(true);
        delegate.recordFieldInputValue("recorded field value");

        trainGetForm(cyclec, cycle, form);
        trainWasPrerendered(formc, form, writer, component, false);
        trainGetDelegate(formc, form, delegate);

        trainGetElementId(formc, form, component, "fred");
        trainIsRewinding(formc, form, false);
        trainIsRewinding(cyclec, cycle, false);

        trainGetDelegate(formc, form, delegate);
        trainGetDelegate(formc, form, delegate);

        // Would be nice to have this do something so we could check the timing, but ...

        validator.renderValidatorContribution(component, writer, cycle);

        trainGetAttribute(cyclec, cycle, "org.apache.tapestry.form.SelectedField", null);

        trainGetAttribute(cyclec, cycle, TapestryUtils.PAGE_RENDER_SUPPORT_ATTRIBUTE, support);

        trainGetName(formc, form, "zeform");

        support.addInitializationScript("focus(document.zeform.fred)");

        cycle.setAttribute("org.apache.tapestry.form.SelectedField", Boolean.TRUE);

        replayControls();

        component.render(writer, cycle);

        verifyControls();

        assertSame(component, delegate.getFormComponent());
        assertBuffer("<span class=\"prefix\"><input type=\"text\" name=\"fred\" value=\"recorded field value\" class=\"validation-delegate\"/></span>");
    }

    public void testRenderWithErrorNoPageSupport()
    {
        Object value = new Object();
        MockControl validatorc = newControl(IValidator.class);
        IValidator validator = (IValidator) validatorc.getMock();

        MockControl formc = newControl(IForm.class);
        IForm form = (IForm) formc.getMock();

        // Set form and name properties here because the delegate won't.

        ValidField component = (ValidField) newInstance(ValidField.class, new Object[]
        { "value", value, "validator", validator, "form", form, "name", "fred" });

        MockControl cyclec = newControl(IRequestCycle.class);
        IRequestCycle cycle = (IRequestCycle) cyclec.getMock();

        IMarkupWriter writer = newBufferWriter();

        MockDelegate delegate = new MockDelegate(true);
        delegate.recordFieldInputValue("recorded field value");

        trainGetForm(cyclec, cycle, form);
        trainWasPrerendered(formc, form, writer, component, false);
        trainGetDelegate(formc, form, delegate);

        trainGetElementId(formc, form, component, "fred");
        trainIsRewinding(formc, form, false);
        trainIsRewinding(cyclec, cycle, false);

        trainGetDelegate(formc, form, delegate);
        trainGetDelegate(formc, form, delegate);

        // Would be nice to have this do something so we could check the timing, but ...

        validator.renderValidatorContribution(component, writer, cycle);

        trainGetAttribute(cyclec, cycle, "org.apache.tapestry.form.SelectedField", null);

        trainGetAttribute(cyclec, cycle, TapestryUtils.PAGE_RENDER_SUPPORT_ATTRIBUTE, null);

        replayControls();

        component.render(writer, cycle);

        verifyControls();

        assertSame(component, delegate.getFormComponent());
        assertBuffer("<span class=\"prefix\"><input type=\"text\" name=\"fred\" value=\"recorded field value\" class=\"validation-delegate\"/></span>");
    }

    private void trainGetName(MockControl control, IForm form, String name)
    {
        form.getName();

        control.setReturnValue(name);
    }
}
TOP

Related Classes of org.apache.tapestry.valid.TestValidField

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.