001 package com.mockrunner.base; 002 003 import java.io.BufferedReader; 004 import java.io.StringReader; 005 006 import com.mockrunner.mock.web.WebMockObjectFactory; 007 import com.mockrunner.util.common.StringUtil; 008 import com.mockrunner.util.web.XmlUtil; 009 010 /** 011 * Base class for modules which produce HTML 012 * code as output. These modules have to implement 013 * {@link #getOutput}. The HTML code is provided 014 * in different formats, e.g. as parsed XML 015 * documents. 016 */ 017 public abstract class HTMLOutputModule extends WebTestModule 018 { 019 private boolean caseSensitive; 020 021 public HTMLOutputModule(WebMockObjectFactory mockFactory) 022 { 023 super(mockFactory); 024 caseSensitive = true; 025 } 026 027 /** 028 * Returns the output as a string. Concrete modules implement 029 * this method. 030 * @return the output 031 */ 032 public abstract String getOutput(); 033 034 /** 035 * Returns the output as a <code>BufferedReader</code>. 036 * @return the output 037 */ 038 public BufferedReader getOutputAsBufferedReader() 039 { 040 return new BufferedReader(new StringReader(getOutput())); 041 } 042 043 /** 044 * Parses the output with the NekoHTML parser and returns it 045 * as a W3C XML document. Throws a {@link NestedApplicationException} 046 * if the output is not parsable. NekoHTML is quite good in fixing sloppy 047 * HTML code. If you want to use a different parser configuration, 048 * you can use the method {@link com.mockrunner.util.web.XmlUtil#parse} 049 * to parse the string output yourself. Please note that 050 * HTML parsing is not very fast and may slow down 051 * your test suite. 052 * @return the output as <code>org.w3c.dom.Document</code> 053 * @throws RuntimeException if a parsing error occurs 054 */ 055 public org.w3c.dom.Document getOutputAsW3CDocument() 056 { 057 return XmlUtil.parseHTML(getOutput()); 058 } 059 060 /** 061 * Parses the output with the NekoHTML parser and returns it 062 * as a JDOM XML document. Throws a {@link NestedApplicationException} 063 * if the output is not parsable. NekoHTML is quite good in fixing sloppy 064 * HTML code. If you want to use a different parser configuration, 065 * you can use the method {@link com.mockrunner.util.web.XmlUtil#parse} 066 * to parse the string output yourself. Please note that 067 * HTML parsing is not very fast and may slow down 068 * your test suite. 069 * @return the output as <code>org.jdom.Document</code> 070 * @throws RuntimeException if a parsing error occurs 071 */ 072 public org.jdom.Document getOutputAsJDOMDocument() 073 { 074 return XmlUtil.createJDOMDocument(getOutputAsW3CDocument()); 075 } 076 077 /** 078 * Parses the output with the NekoHTML parser and returns it 079 * as fixed, wellformed XML. Throws a {@link NestedApplicationException} 080 * if the output is not parsable. NekoHTML is quite good in fixing sloppy 081 * HTML code. If you want to use a different parser configuration, 082 * you can use the method {@link com.mockrunner.util.web.XmlUtil#parse} 083 * to parse the string output yourself. Please note that 084 * HTML parsing is not very fast and may slow down 085 * your test suite. 086 * @return the output as wellformed XML 087 * @throws RuntimeException if a parsing error occurs 088 */ 089 public String getOutputAsWellformedXML() 090 { 091 return XmlUtil.createStringFromJDOMDocument(getOutputAsJDOMDocument()); 092 } 093 094 /** 095 * Set if {@link #verifyOutput}, {@link #verifyOutputContains} 096 * and {@link #verifyOutputRegularExpression}. 097 * should compare case sensitive. Default is <code>true</code>. 098 * @param caseSensitive enable or disable case sensitivity 099 */ 100 public void setCaseSensitive(boolean caseSensitive) 101 { 102 this.caseSensitive = caseSensitive; 103 } 104 105 /** 106 * Verifies the tag output. 107 * @param expectedOutput the expected output. 108 * @throws VerifyFailedException if verification fails 109 */ 110 public void verifyOutput(String expectedOutput) 111 { 112 String actualOutput = getOutput(); 113 if(!StringUtil.matchesExact(actualOutput, expectedOutput, caseSensitive)) 114 { 115 throw new VerifyFailedException("actual output: " + actualOutput + " does not match expected output"); 116 } 117 } 118 119 /** 120 * Verifies if the output contains the specified data. 121 * @param expectedOutput the data 122 * @throws VerifyFailedException if verification fails 123 */ 124 public void verifyOutputContains(String expectedOutput) 125 { 126 String actualOutput = getOutput(); 127 if(!StringUtil.matchesContains(actualOutput, expectedOutput, caseSensitive)) 128 { 129 throw new VerifyFailedException("actual output: " + actualOutput + " does not match expected output"); 130 } 131 } 132 133 /** 134 * Verifies if the output matches the specified regular expression. 135 * @param expression the data 136 * @throws VerifyFailedException if verification fails 137 */ 138 public void verifyOutputRegularExpression(String expression) 139 { 140 String actualOutput = getOutput(); 141 if(!StringUtil.matchesPerl5(actualOutput, expression, caseSensitive)) 142 { 143 throw new VerifyFailedException("actual output: " + actualOutput + " does not match expected output"); 144 } 145 } 146 }