| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You 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.cocoon.forms.formmodel; |
| |
| import java.util.Locale; |
| |
| import javax.xml.parsers.DocumentBuilder; |
| import javax.xml.parsers.DocumentBuilderFactory; |
| |
| import junit.framework.Assert; |
| |
| import org.apache.avalon.framework.service.ServiceManager; |
| import org.apache.cocoon.forms.FormsConstants; |
| import org.apache.cocoon.forms.FormManager; |
| import org.apache.cocoon.xml.AttributesImpl; |
| import org.apache.cocoon.xml.dom.DOMBuilder; |
| import org.apache.commons.jxpath.JXPathContext; |
| import org.apache.commons.jxpath.Pointer; |
| import org.w3c.dom.Document; |
| import org.xml.sax.SAXException; |
| import org.xml.sax.helpers.NamespaceSupport; |
| |
| /** |
| * Helper class to build Widget test cases. |
| * |
| * @version $Id$ |
| */ |
| public class WidgetTestHelper { |
| |
| // Private constructor as we only have static methods |
| private WidgetTestHelper() {} |
| |
| /** |
| * Get the result of a widget's generateSaxFragment() method as a Document. |
| * <p> |
| * The widget's fragment is encapsulated in a root <fi:fragment> element, |
| * since there's no guarantee that a widget outputs a single top-level element |
| * (there can be several elements, or even none if the widget is invisible) |
| * |
| * @param widget the widget of which we want the fragment |
| * @param locale the locale to be used to generate the fragment |
| * @return the document containing the fragment |
| */ |
| public static Document getWidgetFragment(Widget widget, Locale locale) throws SAXException { |
| |
| DOMBuilder domBuilder = new DOMBuilder(); |
| // Start document and "fi:fragment" root element |
| domBuilder.startDocument(); |
| domBuilder.startPrefixMapping(FormsConstants.INSTANCE_PREFIX, FormsConstants.INSTANCE_NS); |
| // FIXME: why simply declaring the prefix isn't enough? |
| AttributesImpl attr = new AttributesImpl(); |
| attr.addCDATAAttribute(NamespaceSupport.XMLNS, "fi:", "xmlns:fi", FormsConstants.INSTANCE_NS); |
| domBuilder.startElement(FormsConstants.INSTANCE_NS, "fragment", FormsConstants.INSTANCE_PREFIX_COLON + "fragment", attr); |
| |
| widget.generateSaxFragment(domBuilder, locale); |
| |
| // End "fi:fragment" element and document |
| domBuilder.endElement(FormsConstants.INSTANCE_NS, "fragment", FormsConstants.INSTANCE_PREFIX_COLON + "fragment"); |
| domBuilder.endPrefixMapping(FormsConstants.INSTANCE_PREFIX); |
| domBuilder.endDocument(); |
| |
| // Return the document |
| return domBuilder.getDocument(); |
| } |
| |
| public static void assertXPathEquals(String expected, String xpath, Document doc) { |
| // use xpath as the message |
| assertXPathEquals(xpath, expected, xpath, doc); |
| } |
| |
| public static void assertXPathEquals(String message, String expected, String xpath, Document doc) { |
| JXPathContext ctx = JXPathContext.newContext(doc); |
| ctx.setLenient(true); |
| Assert.assertEquals(message, expected, ctx.getValue(xpath)); |
| } |
| |
| public static void assertXPathExists(String xpath, Document doc) { |
| // use xpath as message |
| assertXPathExists(xpath, xpath, doc); |
| } |
| |
| public static void assertXPathExists(String message, String xpath, Document doc) { |
| JXPathContext ctx = JXPathContext.newContext(doc); |
| ctx.setLenient(true); |
| Pointer pointer = ctx.getPointer(xpath); |
| Assert.assertNotNull(message, pointer.getNode()); |
| } |
| |
| public static void assertXPathNotExists(String xpath, Document doc) { |
| // use xpath as message |
| assertXPathNotExists(xpath, xpath, doc); |
| } |
| |
| public static void assertXPathNotExists(String message, String xpath, Document doc) { |
| JXPathContext ctx = JXPathContext.newContext(doc); |
| ctx.setLenient(true); |
| Pointer pointer = ctx.getPointer(xpath); |
| Assert.assertNull(message, pointer.getNode()); |
| } |
| |
| /** |
| * Load a Form whose definition relative to a given object (typically, the TestCase class). |
| * |
| * @param manager the ServiceManager that will be used to create the form |
| * @param obj the object relative to which the resource will be read |
| * @param resource the relative resource name for the form definition |
| * @return the Form |
| * @throws Exception |
| */ |
| public static Form loadForm(ServiceManager manager, Object obj, String resource) throws Exception { |
| // Load the document |
| DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); |
| // Grmbl... why isn't this true by default? |
| factory.setNamespaceAware(true); |
| DocumentBuilder parser = factory.newDocumentBuilder(); |
| Document doc = parser.parse(obj.getClass().getResource(resource).toExternalForm()); |
| |
| // Create the form |
| FormManager formManager = (FormManager)manager.lookup(FormManager.ROLE); |
| try { |
| return formManager.createForm(doc.getDocumentElement()); |
| } finally { |
| manager.release(formManager); |
| } |
| } |
| } |