001: /*
002: $Id: TestCaseRenderEngine.java 4032 2006-08-30 07:18:49Z mguillem $
003:
004: Copyright 2003 (C) James Strachan and Bob Mcwhirter. All Rights Reserved.
005:
006: Redistribution and use of this software and associated documentation
007: ("Software"), with or without modification, are permitted provided
008: that the following conditions are met:
009:
010: 1. Redistributions of source code must retain copyright
011: statements and notices. Redistributions must also contain a
012: copy of this document.
013:
014: 2. Redistributions in binary form must reproduce the
015: above copyright notice, this list of conditions and the
016: following disclaimer in the documentation and/or other
017: materials provided with the distribution.
018:
019: 3. The name "groovy" must not be used to endorse or promote
020: products derived from this Software without prior written
021: permission of The Codehaus. For written permission,
022: please contact info@codehaus.org.
023:
024: 4. Products derived from this Software may not be called "groovy"
025: nor may "groovy" appear in their names without prior written
026: permission of The Codehaus. "groovy" is a registered
027: trademark of The Codehaus.
028:
029: 5. Due credit should be given to The Codehaus -
030: http://groovy.codehaus.org/
031:
032: THIS SOFTWARE IS PROVIDED BY THE CODEHAUS AND CONTRIBUTORS
033: ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
034: NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
035: FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
036: THE CODEHAUS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
037: INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
038: (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
039: SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
040: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
041: STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
042: ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
043: OF THE POSSIBILITY OF SUCH DAMAGE.
044:
045: */
046: package org.codehaus.groovy.wiki;
047:
048: import java.io.IOException;
049: import java.io.Writer;
050: import java.util.regex.Pattern;
051:
052: import org.radeox.api.engine.RenderEngine;
053: import org.radeox.api.engine.context.RenderContext;
054:
055: /**
056: * @author James Strachan
057: * @version $Revision: 4032 $
058: */
059: public class TestCaseRenderEngine implements RenderEngine {
060: Pattern groovyCodePattern = Pattern.compile("\\{code:groovy\\}");
061: Pattern groovyShellPattern = Pattern.compile("\\{code:groovysh\\}");
062: Pattern codePattern = Pattern.compile("\\{code\\}");
063:
064: public TestCaseRenderEngine() {
065: }
066:
067: public String getName() {
068: return "TestCase";
069: }
070:
071: public String render(String content, RenderContext context) {
072: String name = (String) context.get("name");
073: if (name == null) {
074: name = "UknownName.wiki";
075: }
076: int idx = name.lastIndexOf('.');
077: if (idx > 0) {
078: name = name.substring(0, idx);
079: }
080: name = name + "Test";
081:
082: // lets replace {code:groovy} with a unit test case method name
083: StringBuffer buf = new StringBuffer();
084:
085: String[] parts = groovyCodePattern.split(content);
086:
087: buf.append("package wiki\nclass " + name
088: + " extends GroovyTestCase {\n\n");
089: buf.append("/*\n");
090: buf.append(processShellScripts(parts[0]));
091:
092: for (int count = 1; count < parts.length; count++) {
093: buf.append("*/ \n\n void testCase" + count + "() {\n");
094:
095: buf
096: .append(processShellScripts(removeCloseCode(parts[count])));
097: }
098:
099: buf.append("\n*/\n\n");
100: buf
101: .append("void testDummy() {\n// this is a dummy test case\n}\n\n}\n");
102:
103: return buf.toString();
104: }
105:
106: /**
107: * Splits the comment block extracting any scripts that need to be tested
108: * @param text
109: */
110: protected String processShellScripts(String text) {
111: StringBuffer buf = new StringBuffer();
112:
113: String[] parts = groovyShellPattern.split(text);
114:
115: buf.append(parts[0]);
116:
117: for (int count = 1; count < parts.length; count++) {
118: buf.append("*/ \n\n void testScript" + count + "() {\n");
119: buf
120: .append(" assertScript( <<<SCRIPT_EOF" + count
121: + "\n");
122:
123: String code = parts[count].replaceFirst("\\{code\\}",
124: "\nSCRIPT_EOF" + count + " )\n} \n\n /*");
125:
126: // lets escape ${foo} expressions
127: StringBuffer temp = new StringBuffer(code);
128: for (int idx = 0; true; idx++) {
129: idx = temp.indexOf("$", idx);
130: if (idx >= 0) {
131: String next = temp.substring(++idx, idx + 1);
132: if (next.equals("{")) {
133:
134: //
135: // It's a hack, but we aren't escaping all \, so
136: // we just let \${ stand...
137:
138: if (idx - 2 >= 0
139: && !temp.substring(idx - 2, idx - 1)
140: .equals("\\")) {
141: temp.insert(idx - 1, "\\");
142: idx++;
143: }
144: }
145: } else {
146: break;
147: }
148: }
149:
150: buf.append(temp.toString());
151: }
152: return buf.toString();
153: }
154:
155: protected String removeCloseCode(String text) {
156: return text.replaceFirst("\\{code\\}", "\n}\n\n /*");
157: }
158:
159: public void render(Writer out, String content, RenderContext context)
160: throws IOException {
161: out.write(render(content, context));
162: }
163: }
|