001// Copyright 2006, 2007, 2008, 2009, 2010, 2011 The Apache Software Foundation
002//
003// Licensed under the Apache License, Version 2.0 (the "License");
004// you may not use this file except in compliance with the License.
005// You may obtain a copy of the License at
006//
007// http://www.apache.org/licenses/LICENSE-2.0
008//
009// Unless required by applicable law or agreed to in writing, software
010// distributed under the License is distributed on an "AS IS" BASIS,
011// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012// See the License for the specific language governing permissions and
013// limitations under the License.
014
015package org.apache.tapestry5.test;
016
017import java.io.IOException;
018import java.io.InputStream;
019import java.lang.annotation.Annotation;
020import java.net.URL;
021import java.util.Arrays;
022import java.util.Locale;
023import java.util.Map;
024import java.util.Properties;
025
026import javax.servlet.ServletOutputStream;
027import javax.servlet.http.HttpServletRequest;
028import javax.servlet.http.HttpServletResponse;
029import javax.servlet.http.HttpSession;
030
031import org.apache.tapestry5.Asset;
032import org.apache.tapestry5.Asset2;
033import org.apache.tapestry5.Binding;
034import org.apache.tapestry5.Block;
035import org.apache.tapestry5.ClientElement;
036import org.apache.tapestry5.ComponentEventCallback;
037import org.apache.tapestry5.ComponentResources;
038import org.apache.tapestry5.ComponentResourcesCommon;
039import org.apache.tapestry5.Field;
040import org.apache.tapestry5.FieldTranslator;
041import org.apache.tapestry5.FieldValidationSupport;
042import org.apache.tapestry5.FieldValidator;
043import org.apache.tapestry5.Link;
044import org.apache.tapestry5.MarkupWriter;
045import org.apache.tapestry5.NullFieldStrategy;
046import org.apache.tapestry5.PropertyConduit;
047import org.apache.tapestry5.PropertyOverrides;
048import org.apache.tapestry5.Translator;
049import org.apache.tapestry5.ValidationDecorator;
050import org.apache.tapestry5.ValidationTracker;
051import org.apache.tapestry5.Validator;
052import org.apache.tapestry5.ValueEncoder;
053import org.apache.tapestry5.annotations.Id;
054import org.apache.tapestry5.annotations.Parameter;
055import org.apache.tapestry5.annotations.Path;
056import org.apache.tapestry5.beaneditor.BeanModel;
057import org.apache.tapestry5.beaneditor.PropertyModel;
058import org.apache.tapestry5.func.Predicate;
059import org.apache.tapestry5.internal.services.MapMessages;
060import org.apache.tapestry5.internal.services.MarkupWriterImpl;
061import org.apache.tapestry5.ioc.AnnotationProvider;
062import org.apache.tapestry5.ioc.Locatable;
063import org.apache.tapestry5.ioc.Location;
064import org.apache.tapestry5.ioc.Messages;
065import org.apache.tapestry5.ioc.ObjectLocator;
066import org.apache.tapestry5.ioc.Resource;
067import org.apache.tapestry5.ioc.annotations.Inject;
068import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
069import org.apache.tapestry5.ioc.internal.util.InternalUtils;
070import org.apache.tapestry5.ioc.test.IOCTestCase;
071import org.apache.tapestry5.model.ComponentModel;
072import org.apache.tapestry5.model.EmbeddedComponentModel;
073import org.apache.tapestry5.model.MutableComponentModel;
074import org.apache.tapestry5.model.ParameterModel;
075import org.apache.tapestry5.runtime.Component;
076import org.apache.tapestry5.services.ApplicationStateCreator;
077import org.apache.tapestry5.services.ApplicationStateManager;
078import org.apache.tapestry5.services.ApplicationStatePersistenceStrategy;
079import org.apache.tapestry5.services.ApplicationStatePersistenceStrategySource;
080import org.apache.tapestry5.services.AssetFactory;
081import org.apache.tapestry5.services.AssetSource;
082import org.apache.tapestry5.services.BaseURLSource;
083import org.apache.tapestry5.services.BeanModelSource;
084import org.apache.tapestry5.services.BindingFactory;
085import org.apache.tapestry5.services.BindingSource;
086import org.apache.tapestry5.services.ClassTransformation;
087import org.apache.tapestry5.services.ClasspathAssetAliasManager;
088import org.apache.tapestry5.services.ComponentClassResolver;
089import org.apache.tapestry5.services.ComponentEventRequestHandler;
090import org.apache.tapestry5.services.ComponentEventResultProcessor;
091import org.apache.tapestry5.services.ComponentRequestHandler;
092import org.apache.tapestry5.services.Context;
093import org.apache.tapestry5.services.Environment;
094import org.apache.tapestry5.services.FieldTranslatorSource;
095import org.apache.tapestry5.services.FieldValidatorSource;
096import org.apache.tapestry5.services.FormSupport;
097import org.apache.tapestry5.services.Heartbeat;
098import org.apache.tapestry5.services.HttpServletRequestHandler;
099import org.apache.tapestry5.services.InjectionProvider;
100import org.apache.tapestry5.services.MetaDataLocator;
101import org.apache.tapestry5.services.PageRenderLinkSource;
102import org.apache.tapestry5.services.Request;
103import org.apache.tapestry5.services.RequestGlobals;
104import org.apache.tapestry5.services.RequestHandler;
105import org.apache.tapestry5.services.ResourceDigestGenerator;
106import org.apache.tapestry5.services.Response;
107import org.apache.tapestry5.services.Session;
108import org.apache.tapestry5.services.TransformField;
109import org.apache.tapestry5.services.TransformMethodSignature;
110import org.apache.tapestry5.services.TranslatorSource;
111import org.apache.tapestry5.services.ValidationConstraintGenerator;
112import org.apache.tapestry5.services.ValueEncoderSource;
113import org.apache.tapestry5.services.javascript.JavaScriptSupport;
114import org.easymock.EasyMock;
115import org.easymock.IAnswer;
116
117/**
118 * Base test case that adds a number of convenience factory and training methods for the public
119 * interfaces of
120 * Tapestry.
121 */
122@SuppressWarnings("all")
123public abstract class TapestryTestCase extends IOCTestCase
124{
125
126    /**
127     * Creates a new markup writer instance (not a markup writer mock). Output can be directed at
128     * the writer, which uses
129     * the default (HTML) markup model. The writer's toString() value represents all the collected
130     * markup in the
131     * writer.
132     */
133    protected final MarkupWriter createMarkupWriter()
134    {
135        return new MarkupWriterImpl();
136    }
137
138    protected final ApplicationStateCreator mockApplicationStateCreator()
139    {
140        return newMock(ApplicationStateCreator.class);
141    }
142
143    protected final ApplicationStatePersistenceStrategy mockApplicationStatePersistenceStrategy()
144    {
145        return newMock(ApplicationStatePersistenceStrategy.class);
146    }
147
148    protected final ApplicationStatePersistenceStrategySource mockApplicationStatePersistenceStrategySource()
149    {
150        return newMock(ApplicationStatePersistenceStrategySource.class);
151    }
152
153    protected final Asset mockAsset()
154    {
155        return newMock(Asset.class);
156    }
157
158    protected final AssetFactory mockAssetFactory()
159    {
160        return newMock(AssetFactory.class);
161    }
162
163    protected final AssetSource mockAssetSource()
164    {
165        return newMock(AssetSource.class);
166    }
167
168    protected final Binding mockBinding()
169    {
170        return newMock(Binding.class);
171    }
172
173    protected final BindingFactory mockBindingFactory()
174    {
175        return newMock(BindingFactory.class);
176    }
177
178    protected final BindingSource mockBindingSource()
179    {
180        return newMock(BindingSource.class);
181    }
182
183    protected final Block mockBlock()
184    {
185        return newMock(Block.class);
186    }
187
188    protected final ClasspathAssetAliasManager mockClasspathAssetAliasManager()
189    {
190        return newMock(ClasspathAssetAliasManager.class);
191    }
192
193    protected final ClassTransformation mockClassTransformation()
194    {
195        return newMock(ClassTransformation.class);
196    }
197
198    protected final Component mockComponent()
199    {
200        return newMock(Component.class);
201    }
202
203    protected final ComponentClassResolver mockComponentClassResolver()
204    {
205        return newMock(ComponentClassResolver.class);
206    }
207
208    protected final ComponentEventCallback mockComponentEventHandler()
209    {
210        return newMock(ComponentEventCallback.class);
211    }
212
213    protected final ComponentModel mockComponentModel()
214    {
215        return newMock(ComponentModel.class);
216    }
217
218    protected final ComponentResources mockComponentResources()
219    {
220        return newMock(ComponentResources.class);
221    }
222
223    protected final Context mockContext()
224    {
225        return newMock(Context.class);
226    }
227
228    protected final Environment mockEnvironment()
229    {
230        return newMock(Environment.class);
231    }
232
233    protected final Field mockField()
234    {
235        return newMock(Field.class);
236    }
237
238    protected final FieldValidator mockFieldValidator()
239    {
240        return newMock(FieldValidator.class);
241    }
242
243    protected FieldValidatorSource mockFieldValidatorSource()
244    {
245        return newMock(FieldValidatorSource.class);
246    }
247
248    protected final Field mockFieldWithLabel(String label)
249    {
250        Field field = mockField();
251
252        train_getLabel(field, label);
253
254        return field;
255    }
256
257    protected final Heartbeat mockHeartbeat()
258    {
259        return newMock(Heartbeat.class);
260    }
261
262    protected final HttpServletRequest mockHttpServletRequest()
263    {
264        return newMock(HttpServletRequest.class);
265    }
266
267    protected final HttpServletResponse mockHttpServletResponse()
268    {
269        return newMock(HttpServletResponse.class);
270    }
271
272    protected final HttpSession mockHttpSession()
273    {
274        return newMock(HttpSession.class);
275    }
276
277    protected final Inject mockInject()
278    {
279        return newMock(Inject.class);
280    }
281
282    protected final Link mockLink()
283    {
284        return newMock(Link.class);
285    }
286
287    protected final MarkupWriter mockMarkupWriter()
288    {
289        return newMock(MarkupWriter.class);
290    }
291
292    protected final MutableComponentModel mockMutableComponentModel()
293    {
294        return newMock(MutableComponentModel.class);
295    }
296
297    protected final ParameterModel mockParameterModel()
298    {
299        return newMock(ParameterModel.class);
300    }
301
302    protected final Path mockPath()
303    {
304        return newMock(Path.class);
305    }
306
307    protected final PropertyConduit mockPropertyConduit()
308    {
309        return newMock(PropertyConduit.class);
310    }
311
312    protected final PropertyModel mockPropertyModel()
313    {
314        return newMock(PropertyModel.class);
315    }
316
317    protected final Request mockRequest()
318    {
319        return newMock(Request.class);
320    }
321
322    protected final RequestHandler mockRequestHandler()
323    {
324        return newMock(RequestHandler.class);
325    }
326
327    protected final ResourceDigestGenerator mockResourceDigestGenerator()
328    {
329        return newMock(ResourceDigestGenerator.class);
330    }
331
332    protected final Response mockResponse()
333    {
334        return newMock(Response.class);
335    }
336
337    protected final Session mockSession()
338    {
339        return newMock(Session.class);
340    }
341
342    protected final Translator mockTranslator()
343    {
344        return newMock(Translator.class);
345    }
346
347    protected final ValidationConstraintGenerator mockValidationConstraintGenerator()
348    {
349        return newMock(ValidationConstraintGenerator.class);
350    }
351
352    protected final ValidationTracker mockValidationTracker()
353    {
354        return newMock(ValidationTracker.class);
355    }
356
357    protected final Validator mockValidator()
358    {
359        return newMock(Validator.class);
360    }
361
362    protected final void train_buildConstraints(ValidationConstraintGenerator generator, Class propertyType,
363            AnnotationProvider provider, String... constraints)
364    {
365        expect(generator.buildConstraints(propertyType, provider)).andReturn(Arrays.asList(constraints));
366    }
367
368    protected final <T> void train_create(ApplicationStateCreator<T> creator, T aso)
369    {
370        expect(creator.create()).andReturn(aso);
371    }
372
373    protected final void train_createAsset(AssetFactory factory, Resource resource, Asset asset)
374    {
375        expect(factory.createAsset(resource)).andReturn(asset);
376    }
377
378    protected final void train_createValidator(FieldValidatorSource source, Field field, String validatorType,
379            String constraintValue, String overrideId, Messages overrideMessages, Locale locale, FieldValidator result)
380    {
381        expect(source.createValidator(field, validatorType, constraintValue, overrideId, overrideMessages, locale))
382                .andReturn(result);
383    }
384
385    protected final void train_encodeRedirectURL(Response response, String URI, String encoded)
386    {
387        expect(response.encodeRedirectURL(URI)).andReturn(encoded);
388    }
389
390    protected final void train_encodeURL(Response response, String inputURL, String outputURL)
391    {
392        expect(response.encodeURL(inputURL)).andReturn(outputURL);
393    }
394
395    protected final <T> void train_exists(ApplicationStatePersistenceStrategy strategy, Class<T> asoClass,
396            boolean exists)
397    {
398        expect(strategy.exists(asoClass)).andReturn(exists);
399    }
400
401    protected final void train_getAsset(AssetSource source, Resource root, String path, Locale locale, Asset asset)
402    {
403        expect(source.getAsset(root, path, locale)).andReturn(asset);
404    }
405
406    protected final void train_matchFields(ClassTransformation transformation, TransformField field)
407    {
408        expect(transformation.matchFields(EasyMock.isA(Predicate.class))).andReturn(Arrays.asList(field));
409    }
410
411    protected final void train_getName(TransformField field, String name)
412    {
413        expect(field.getName()).andReturn(name);
414    }
415
416    protected final <T extends Annotation> void train_getAnnotation(TransformField field, Class<T> annotationClass,
417            T anotation)
418    {
419        expect(field.getAnnotation(annotationClass)).andReturn(anotation);
420    }
421
422    protected final void train_generateChecksum(ResourceDigestGenerator generator, URL url, String digest)
423    {
424        expect(generator.generateDigest(url)).andReturn(digest);
425    }
426
427    protected final <T> void train_get(ApplicationStatePersistenceStrategy strategy, Class<T> asoClass,
428            ApplicationStateCreator<T> creator, T aso)
429    {
430        expect(strategy.get(asoClass, creator)).andReturn(aso);
431    }
432
433    protected final void train_get(ApplicationStatePersistenceStrategySource source, String strategyName,
434            ApplicationStatePersistenceStrategy strategy)
435    {
436        expect(source.get(strategyName)).andReturn(strategy).atLeastOnce();
437    }
438
439    protected final void train_get(Binding binding, Object value)
440    {
441        expect(binding.get()).andReturn(value);
442    }
443
444    protected void train_getAttribute(HttpSession session, String attributeName, Object value)
445    {
446        expect(session.getAttribute(attributeName)).andReturn(value);
447    }
448
449    protected final void train_getAttribute(Session session, String name, Object attribute)
450    {
451        expect(session.getAttribute(name)).andReturn(attribute);
452    }
453
454    protected final void train_getAttributeNames(Session session, String prefix, String... names)
455    {
456        expect(session.getAttributeNames(prefix)).andReturn(Arrays.asList(names));
457    }
458
459    protected final void train_getBaseResource(ComponentModel model, Resource resource)
460    {
461        expect(model.getBaseResource()).andReturn(resource).atLeastOnce();
462    }
463
464    protected final void train_getClassName(ClassTransformation transformation, String className)
465    {
466        expect(transformation.getClassName()).andReturn(className).atLeastOnce();
467    }
468
469    protected final void train_getClasspathAsset(AssetSource source, String path, Asset asset)
470    {
471        expect(source.getClasspathAsset(path)).andReturn(asset);
472    }
473
474    protected final void train_getClasspathAsset(AssetSource source, String path, Locale locale, Asset asset)
475    {
476        expect(source.getClasspathAsset(path, locale)).andReturn(asset);
477    }
478
479    protected final void train_getCompleteId(ComponentResourcesCommon resources, String completeId)
480    {
481        expect(resources.getCompleteId()).andReturn(completeId).atLeastOnce();
482    }
483
484    protected final void train_getComponent(ComponentResources resources, Component component)
485    {
486        expect(resources.getComponent()).andReturn(component).atLeastOnce();
487    }
488
489    protected final void train_getComponentClassName(ComponentModel model, String className)
490    {
491        expect(model.getComponentClassName()).andReturn(className).atLeastOnce();
492    }
493
494    protected final void train_getComponentResources(Component component, ComponentResources resources)
495    {
496        expect(component.getComponentResources()).andReturn(resources).atLeastOnce();
497    }
498
499    protected final void train_getConduit(PropertyModel model, PropertyConduit conduit)
500    {
501        expect(model.getConduit()).andReturn(conduit).atLeastOnce();
502    }
503
504    protected <C, T> void train_getConstraintType(Validator<C, T> validator, Class<C> constraintType)
505    {
506        expect(validator.getConstraintType()).andReturn(constraintType).atLeastOnce();
507    }
508
509    protected final void train_getContainer(ComponentResources resources, Component container)
510    {
511        expect(resources.getContainer()).andReturn(container).atLeastOnce();
512    }
513
514    protected final void train_getContainerMessages(ComponentResources resources, Messages containerMessages)
515    {
516        expect(resources.getContainerMessages()).andReturn(containerMessages).atLeastOnce();
517    }
518
519    protected final void train_getContainerResources(ComponentResources resources, ComponentResources containerResources)
520    {
521        expect(resources.getContainerResources()).andReturn(containerResources).atLeastOnce();
522    }
523
524    protected final void train_getDateHeader(Request request, String name, long value)
525    {
526        expect(request.getDateHeader(name)).andReturn(value).atLeastOnce();
527    }
528
529    protected final void train_getFieldPersistenceStrategy(ComponentModel model, String fieldName, String fieldStrategy)
530    {
531        expect(model.getFieldPersistenceStrategy(fieldName)).andReturn(fieldStrategy).atLeastOnce();
532    }
533
534    protected final void train_getId(ComponentResources resources, String id)
535    {
536        expect(resources.getId()).andReturn(id).atLeastOnce();
537    }
538
539    protected final void train_getLabel(Field field, String label)
540    {
541        expect(field.getLabel()).andReturn(label).atLeastOnce();
542    }
543
544    protected final void train_getLocale(ComponentResourcesCommon resources, Locale locale)
545    {
546        expect(resources.getLocale()).andReturn(locale).atLeastOnce();
547    }
548
549    protected final void train_getLocale(Request request, Locale locale)
550    {
551        expect(request.getLocale()).andReturn(locale).atLeastOnce();
552    }
553
554    protected void train_getMessageKey(Validator validator, String messageKey)
555    {
556        expect(validator.getMessageKey()).andReturn(messageKey).atLeastOnce();
557    }
558
559    protected final void train_getMessages(ComponentResources resources, Messages messages)
560    {
561        expect(resources.getMessages()).andReturn(messages).atLeastOnce();
562    }
563
564    protected final void train_getMeta(ComponentModel model, String key, String value)
565    {
566        expect(model.getMeta(key)).andReturn(value).atLeastOnce();
567    }
568
569    protected final void train_getOutputStream(HttpServletResponse response, ServletOutputStream stream)
570    {
571        try
572        {
573            expect(response.getOutputStream()).andReturn(stream);
574        }
575        catch (IOException e)
576        {
577            fail(e.getMessage(), e);
578        }
579    }
580
581    protected final void train_getPage(ComponentResources resources, Component page)
582    {
583        expect(resources.getPage()).andReturn(page).atLeastOnce();
584    }
585
586    protected final void train_getParameterModel(ComponentModel model, String parameterName,
587            ParameterModel parameterModel)
588    {
589        expect(model.getParameterModel(parameterName)).andReturn(parameterModel).atLeastOnce();
590    }
591
592    protected final void train_getParameterNames(ComponentModel model, String... names)
593    {
594        expect(model.getParameterNames()).andReturn(Arrays.asList(names));
595    }
596
597    protected final void train_getParentModel(ComponentModel model, ComponentModel parentModel)
598    {
599        expect(model.getParentModel()).andReturn(parentModel).atLeastOnce();
600    }
601
602    protected final void train_getPath(Request request, String path)
603    {
604        expect(request.getPath()).andReturn(path).atLeastOnce();
605    }
606
607    protected final void train_getPersistentFieldNames(ComponentModel model, String... names)
608    {
609        expect(model.getPersistentFieldNames()).andReturn(Arrays.asList(names)).atLeastOnce();
610    }
611
612    protected final void train_getRootResource(AssetFactory factory, Resource rootResource)
613    {
614        expect(factory.getRootResource()).andReturn(rootResource);
615    }
616
617    protected final void train_getSession(HttpServletRequest request, boolean create, HttpSession session)
618    {
619        expect(request.getSession(create)).andReturn(session);
620    }
621
622    protected void train_getSession(Request request, boolean create, Session session)
623    {
624        expect(request.getSession(create)).andReturn(session);
625    }
626
627    protected final void train_getSupportsInformalParameters(ComponentModel model, boolean supports)
628    {
629        expect(model.getSupportsInformalParameters()).andReturn(supports).atLeastOnce();
630    }
631
632    protected final void train_getValueType(Validator validator, Class valueType)
633    {
634        expect(validator.getValueType()).andReturn(valueType).atLeastOnce();
635    }
636
637    @SuppressWarnings("unchecked")
638    protected final void train_handleResult(ComponentEventCallback handler, Object result, boolean abort)
639    {
640        expect(handler.handleResult(result)).andReturn(abort);
641    }
642
643    protected final void train_inError(ValidationTracker tracker, Field field, boolean inError)
644    {
645        expect(tracker.inError(field)).andReturn(inError);
646    }
647
648    protected final void train_isRequired(Validator validator, boolean isRequired)
649    {
650        expect(validator.isRequired()).andReturn(isRequired).atLeastOnce();
651    }
652
653    protected final void train_isInvariant(Binding binding, boolean isInvariant)
654    {
655        expect(binding.isInvariant()).andReturn(isInvariant);
656    }
657
658    protected final void train_isRequired(ParameterModel model, boolean isRequired)
659    {
660        expect(model.isRequired()).andReturn(isRequired);
661    }
662
663    protected final void train_isRootClass(MutableComponentModel model, boolean isRootClass)
664    {
665        expect(model.isRootClass()).andReturn(isRootClass);
666    }
667
668    protected final void train_name(Parameter parameter, String name)
669    {
670        expect(parameter.name()).andReturn(name).atLeastOnce();
671    }
672
673    protected final void train_newBinding(BindingFactory factory, String description, ComponentResources container,
674            ComponentResources component, String expression, Location l, Binding binding)
675    {
676        expect(factory.newBinding(description, container, component, expression, l)).andReturn(binding);
677    }
678
679    protected void train_newBinding(BindingSource bindingSource, String description,
680            ComponentResources componentResources, String defaultBindingPrefix, String expression, Binding binding)
681    {
682        expect(bindingSource.newBinding(description, componentResources, defaultBindingPrefix, expression)).andReturn(
683                binding);
684    }
685
686    protected final void train_newMemberName(ClassTransformation transformation, String suggested, String name)
687    {
688        expect(transformation.newMemberName(suggested)).andReturn(name);
689    }
690
691    protected final void train_newMemberName(ClassTransformation transformation, String prefix, String baseName,
692            String name)
693    {
694        expect(transformation.newMemberName(prefix, baseName)).andReturn(name);
695    }
696
697    protected final <T> void train_peek(Environment env, Class<T> type, T value)
698    {
699        expect(env.peek(type)).andReturn(value);
700    }
701
702    protected final <T> void train_peekRequired(Environment env, Class<T> type, T value)
703    {
704        expect(env.peekRequired(type)).andReturn(value);
705    }
706
707    protected final void train_provideInjection(InjectionProvider provider, String fieldName, Class fieldType,
708            ObjectLocator locator, ClassTransformation transformation, MutableComponentModel model, boolean result)
709    {
710        expect(provider.provideInjection(fieldName, fieldType, locator, transformation, model)).andReturn(result);
711    }
712
713    @SuppressWarnings("unchecked")
714    protected final void train_renderInformalParameters(ComponentResources resources, final MarkupWriter writer,
715            final Object... informals)
716    {
717        resources.renderInformalParameters(writer);
718        IAnswer answer = new IAnswer()
719        {
720            public Object answer() throws Throwable
721            {
722                writer.attributes(informals);
723
724                return null;
725            }
726        };
727
728        setAnswer(answer);
729    }
730
731    protected final void train_requiresDigest(ResourceDigestGenerator generator, String path, boolean requiresDigest)
732    {
733        expect(generator.requiresDigest(path)).andReturn(requiresDigest);
734    }
735
736    protected final void train_service(RequestHandler handler, Request request, Response response, boolean result)
737            throws IOException
738    {
739        expect(handler.service(request, response)).andReturn(result);
740    }
741
742    protected final void train_setContentLength(HttpServletResponse response, int length)
743    {
744        response.setContentLength(length);
745    }
746
747    protected final void train_setContentType(HttpServletResponse response, String contentType)
748    {
749        response.setContentType(contentType);
750    }
751
752    protected final void train_setDateHeader(HttpServletResponse response, String headerName, long date)
753    {
754        response.setDateHeader(headerName, date);
755    }
756
757    protected final void train_toClass(ClassTransformation transformation, String type, Class classForType)
758    {
759        expect(transformation.toClass(type)).andReturn(classForType);
760    }
761
762    protected final void train_toClientURL(Asset asset, String URL)
763    {
764        expect(asset.toClientURL()).andReturn(URL).atLeastOnce();
765    }
766
767    protected final void train_toClientURL(ClasspathAssetAliasManager manager, String resourcePath, String clientURL)
768    {
769        expect(manager.toClientURL(resourcePath)).andReturn(clientURL);
770    }
771
772    protected final void train_toRedirectURI(Link link, String URI)
773    {
774        expect(link.toRedirectURI()).andReturn(URI).atLeastOnce();
775    }
776
777    protected final void train_value(Id annotation, String value)
778    {
779        expect(annotation.value()).andReturn(value).atLeastOnce();
780    }
781
782    protected final void train_value(Path annotation, String value)
783    {
784        expect(annotation.value()).andReturn(value).atLeastOnce();
785    }
786
787    protected final void train_getBoundType(ComponentResources resources, String parameterName, Class type)
788    {
789        expect(resources.getBoundType(parameterName)).andReturn(type);
790    }
791
792    protected final BeanModel mockBeanModel()
793    {
794        return newMock(BeanModel.class);
795    }
796
797    protected final BeanModelSource mockBeanModelSource()
798    {
799        return newMock(BeanModelSource.class);
800    }
801
802    public final void train_getLocation(Locatable locatable, Location location)
803    {
804        expect(locatable.getLocation()).andReturn(location).atLeastOnce();
805    }
806
807    public final void train_getResource(Location location, Resource resource)
808    {
809        expect(location.getResource()).andReturn(resource).atLeastOnce();
810    }
811
812    public final void train_getLine(Location location, int line)
813    {
814        expect(location.getLine()).andReturn(line).atLeastOnce();
815    }
816
817    protected final void train_getParameter(Request request, String elementName, String value)
818    {
819        expect(request.getParameter(elementName)).andReturn(value).atLeastOnce();
820    }
821
822    protected final void train_getPageName(ComponentResourcesCommon resources, String pageName)
823    {
824        expect(resources.getPageName()).andReturn(pageName).atLeastOnce();
825    }
826
827    protected final FormSupport mockFormSupport()
828    {
829        return newMock(FormSupport.class);
830    }
831
832    /**
833     * Provides access to component messages, suitable for testing. Reads the associated .properties
834     * file for the class
835     * (NOT any localization of it). Only the messages directly in the .properties file is
836     * available.
837     * 
838     * @param componentClass
839     *            component class whose messages are needed *
840     * @return the Messages instance
841     */
842    protected final Messages messagesFor(Class componentClass) throws IOException
843    {
844        String file = componentClass.getSimpleName() + ".properties";
845
846        Properties properties = new Properties();
847
848        InputStream is = null;
849
850        try
851        {
852            is = componentClass.getResourceAsStream(file);
853
854            if (is == null)
855                throw new RuntimeException(String.format("Class %s does not have a message catalog.",
856                        componentClass.getName()));
857
858            properties.load(is);
859        }
860        finally
861        {
862            InternalUtils.close(is);
863        }
864
865        Map<String, String> map = CollectionFactory.newCaseInsensitiveMap();
866
867        for (Object key : properties.keySet())
868        {
869
870            String skey = (String) key;
871
872            map.put(skey, properties.getProperty(skey));
873        }
874
875        return new MapMessages(Locale.ENGLISH, map);
876    }
877
878    protected final FieldValidationSupport mockFieldValidationSupport()
879    {
880        return newMock(FieldValidationSupport.class);
881    }
882
883    protected final void train_getInheritInformalParameters(EmbeddedComponentModel model, boolean inherits)
884    {
885        expect(model.getInheritInformalParameters()).andReturn(inherits).atLeastOnce();
886    }
887
888    protected final ApplicationStateManager mockApplicationStateManager()
889    {
890        return newMock(ApplicationStateManager.class);
891    }
892
893    protected final <T> void train_get(ApplicationStateManager manager, Class<T> asoClass, T aso)
894    {
895        expect(manager.get(asoClass)).andReturn(aso);
896    }
897
898    protected final void train_getInput(ValidationTracker tracker, Field field, String input)
899    {
900        expect(tracker.getInput(field)).andReturn(input);
901    }
902
903    protected final void train_isXHR(Request request, boolean isXHR)
904    {
905        expect(request.isXHR()).andReturn(isXHR).atLeastOnce();
906    }
907
908    protected void train_getPathInfo(HttpServletRequest request, String pathInfo)
909    {
910        expect(request.getPathInfo()).andReturn(pathInfo).atLeastOnce();
911    }
912
913    protected final void train_service(HttpServletRequestHandler handler, HttpServletRequest request,
914            HttpServletResponse response, boolean result) throws IOException
915    {
916        expect(handler.service(request, response)).andReturn(result);
917    }
918
919    protected final void train_getServletPath(HttpServletRequest request, String path)
920    {
921        expect(request.getServletPath()).andReturn(path).atLeastOnce();
922    }
923
924    protected final HttpServletRequestHandler mockHttpServletRequestHandler()
925    {
926        return newMock(HttpServletRequestHandler.class);
927    }
928
929    protected final NullFieldStrategy mockNullFieldStrategy()
930    {
931        return newMock(NullFieldStrategy.class);
932    }
933
934    protected final ValueEncoderSource mockValueEncoderSource()
935    {
936        return newMock(ValueEncoderSource.class);
937    }
938
939    protected final ValueEncoder mockValueEncoder()
940    {
941        return newMock(ValueEncoder.class);
942    }
943
944    protected final void train_toClient(ValueEncoder valueEncoder, Object value, String encoded)
945    {
946        expect(valueEncoder.toClient(value)).andReturn(encoded);
947    }
948
949    protected final void train_getValueEncoder(ValueEncoderSource source, Class type, ValueEncoder valueEncoder)
950    {
951        expect(source.getValueEncoder(type)).andReturn(valueEncoder).atLeastOnce();
952    }
953
954    protected final void train_toValue(ValueEncoder valueEncoder, String clientValue, Object value)
955    {
956        expect(valueEncoder.toValue(clientValue)).andReturn(value);
957    }
958
959    protected <T> void train_findMeta(MetaDataLocator locator, String key, ComponentResources resources,
960            Class<T> expectedType, T value)
961    {
962        expect(locator.findMeta(key, resources, expectedType)).andReturn(value).atLeastOnce();
963    }
964
965    protected MetaDataLocator mockMetaDataLocator()
966    {
967        return newMock(MetaDataLocator.class);
968    }
969
970    protected final void train_isSecure(Request request, boolean isSecure)
971    {
972        expect(request.isSecure()).andReturn(isSecure).atLeastOnce();
973    }
974
975    protected final void train_getBaseURL(BaseURLSource baseURLSource, boolean secure, String baseURL)
976    {
977        expect(baseURLSource.getBaseURL(secure)).andReturn(baseURL);
978    }
979
980    protected final BaseURLSource mockBaseURLSource()
981    {
982        return newMock(BaseURLSource.class);
983    }
984
985    protected final void train_getAttribute(Request request, String attibuteName, Object value)
986    {
987        expect(request.getAttribute(attibuteName)).andReturn(value);
988    }
989
990    protected final void train_getBlockParameter(ComponentResources resources, String name, Block block)
991    {
992        expect(resources.getBlockParameter(name)).andReturn(block).atLeastOnce();
993    }
994
995    protected final PropertyOverrides mockPropertyOverrides()
996    {
997        return newMock(PropertyOverrides.class);
998    }
999
1000    protected void train_getOverrideBlock(PropertyOverrides overrides, String name, Block block)
1001    {
1002        expect(overrides.getOverrideBlock(name)).andReturn(block).atLeastOnce();
1003    }
1004
1005    protected final void train_getOverrideMessages(PropertyOverrides overrides, Messages messages)
1006    {
1007        expect(overrides.getOverrideMessages()).andReturn(messages);
1008    }
1009
1010    protected final void train_isDisabled(Field field, boolean disabled)
1011    {
1012        expect(field.isDisabled()).andReturn(disabled);
1013    }
1014
1015    protected final ValidationDecorator mockValidationDecorator()
1016    {
1017        return newMock(ValidationDecorator.class);
1018    }
1019
1020    protected final void train_isRequired(Field field, boolean required)
1021    {
1022        expect(field.isRequired()).andReturn(required);
1023    }
1024
1025    protected final void train_getClientId(ClientElement element, String clientId)
1026    {
1027        expect(element.getClientId()).andReturn(clientId);
1028    }
1029
1030    protected final FieldTranslator mockFieldTranslator()
1031    {
1032        return newMock(FieldTranslator.class);
1033    }
1034
1035    protected final Translator mockTranslator(String name, Class type)
1036    {
1037        Translator translator = mockTranslator();
1038
1039        train_getName(translator, name);
1040        train_getType(translator, type);
1041
1042        return translator;
1043    }
1044
1045    protected final void train_getName(Translator translator, String name)
1046    {
1047        expect(translator.getName()).andReturn(name).atLeastOnce();
1048    }
1049
1050    protected final void train_getType(Translator translator, Class type)
1051    {
1052        expect(translator.getType()).andReturn(type).atLeastOnce();
1053    }
1054
1055    protected final void train_getType(TransformField field, String type)
1056    {
1057        expect(field.getType()).andReturn(type).atLeastOnce();
1058    }
1059
1060    protected final void train_createDefaultTranslator(FieldTranslatorSource source, ComponentResources resources,
1061            String parameterName, FieldTranslator translator)
1062    {
1063        expect(source.createDefaultTranslator(resources, parameterName)).andReturn(translator);
1064    }
1065
1066    protected final TranslatorSource mockTranslatorSource()
1067    {
1068        return newMock(TranslatorSource.class);
1069    }
1070
1071    protected final void train_get(TranslatorSource translatorSource, String name, Translator translator)
1072    {
1073        expect(translatorSource.get(name)).andReturn(translator).atLeastOnce();
1074    }
1075
1076    protected final void train_getMessageKey(Translator translator, String messageKey)
1077    {
1078        expect(translator.getMessageKey()).andReturn(messageKey).atLeastOnce();
1079    }
1080
1081    protected final void train_findByType(TranslatorSource ts, Class propertyType, Translator translator)
1082    {
1083        expect(ts.findByType(propertyType)).andReturn(translator);
1084    }
1085
1086    protected final void train_toURI(Link link, String URI)
1087    {
1088        expect(link.toURI()).andReturn(URI);
1089    }
1090
1091    protected final void train_createEditModel(BeanModelSource source, Class beanClass, Messages messages,
1092            BeanModel model)
1093    {
1094        expect(source.createEditModel(beanClass, messages)).andReturn(model);
1095    }
1096
1097    protected final ComponentEventResultProcessor mockComponentEventResultProcessor()
1098    {
1099        return newMock(ComponentEventResultProcessor.class);
1100    }
1101
1102    protected final void train_getFormComponentId(FormSupport formSupport, String componentId)
1103    {
1104        expect(formSupport.getFormComponentId()).andReturn(componentId).atLeastOnce();
1105    }
1106
1107    protected final void train_getFormValidationId(FormSupport formSupport, String validationId)
1108    {
1109        expect(formSupport.getFormValidationId()).andReturn(validationId).atLeastOnce();
1110    }
1111
1112    protected final void train_isAllowNull(ParameterModel model, boolean allowNull)
1113    {
1114        expect(model.isAllowNull()).andReturn(allowNull).atLeastOnce();
1115    }
1116
1117    protected final void train_isInvalidated(Session session, boolean invalidated)
1118    {
1119        expect(session.isInvalidated()).andReturn(invalidated);
1120    }
1121
1122    protected final ComponentEventRequestHandler mockComponentEventRequestHandler()
1123    {
1124        return newMock(ComponentEventRequestHandler.class);
1125    }
1126
1127    protected final ComponentRequestHandler mockComponentRequestHandler()
1128    {
1129        return newMock(ComponentRequestHandler.class);
1130    }
1131
1132    protected final Asset2 mockAsset2()
1133    {
1134        return newMock(Asset2.class);
1135    }
1136
1137    /** @since 5.2.0 */
1138    protected final RequestGlobals mockRequestGlobals()
1139    {
1140        return newMock(RequestGlobals.class);
1141    }
1142
1143    protected final PageRenderLinkSource mockPageRenderLinkSource()
1144    {
1145        return newMock(PageRenderLinkSource.class);
1146    }
1147
1148    protected final JavaScriptSupport mockJavaScriptSupport()
1149    {
1150        return newMock(JavaScriptSupport.class);
1151    }
1152
1153    protected final Asset mockAsset(String assetURL)
1154    {
1155        Asset asset = mockAsset();
1156
1157        train_toClientURL(asset, assetURL);
1158
1159        return asset;
1160    }
1161
1162    protected final Link mockLink(String absoluteURI)
1163    {
1164        Link link = mockLink();
1165
1166        expect(link.toURI()).andReturn(absoluteURI).atLeastOnce();
1167
1168        return link;
1169    }
1170}