001: // Copyright (C) 2003,2004,2005 by Object Mentor, Inc. All rights reserved.
002: // Released under the terms of the GNU General Public License version 2 or later.
003: package fitnesse.wikitext;
004:
005: import fitnesse.wiki.*;
006: import fitnesse.wikitext.widgets.*;
007: import junit.framework.TestCase;
008:
009: import java.util.concurrent.atomic.AtomicBoolean;
010:
011: public class WidgetBuilderTest extends TestCase {
012: private WikiPage mockSource;
013:
014: public void setUp() throws Exception {
015: mockSource = new WikiPageDummy();
016: }
017:
018: public void tearDown() throws Exception {
019: }
020:
021: public void testEmptyPage() throws Exception {
022: ParentWidget widget = new WidgetRoot(null, mockSource);
023: assertNotNull(widget);
024: assertEquals(0, widget.numberOfChildren());
025: }
026:
027: public void testSimpleText() throws Exception {
028: ParentWidget page = new WidgetRoot("Hello, World!", mockSource);
029: assertNotNull(page);
030: assertEquals(1, page.numberOfChildren());
031: WikiWidget widget = page.nextChild();
032: testWidgetClassAndText(widget, TextWidget.class,
033: "Hello, World!");
034: }
035:
036: public void testSimpleWikiWord() throws Exception {
037: ParentWidget page = new WidgetRoot("WikiWord", mockSource);
038: WikiWidget widget = page.nextChild();
039: testWidgetClassAndText(widget, WikiWordWidget.class, "WikiWord");
040: }
041:
042: public void testTextThenWikiWord() throws Exception {
043: ParentWidget page = new WidgetRoot("text WikiWord more Text",
044: mockSource);
045: assertEquals(3, page.numberOfChildren());
046: WikiWidget widget1 = page.nextChild();
047: WikiWidget widget2 = page.nextChild();
048: WikiWidget widget3 = page.nextChild();
049: testWidgetClassAndText(widget1, TextWidget.class, "text ");
050: testWidgetClassAndText(widget2, WikiWordWidget.class,
051: "WikiWord");
052: testWidgetClassAndText(widget3, TextWidget.class, " more Text");
053: }
054:
055: public void testWikiWord_Text_WikiWord() throws Exception {
056: ParentWidget page = new WidgetRoot("WikiWord more WordWiki",
057: mockSource);
058: assertEquals(3, page.numberOfChildren());
059: WikiWidget widget1 = page.nextChild();
060: WikiWidget widget2 = page.nextChild();
061: WikiWidget widget3 = page.nextChild();
062: testWidgetClassAndText(widget1, WikiWordWidget.class,
063: "WikiWord");
064: testWidgetClassAndText(widget2, TextWidget.class, " more ");
065: testWidgetClassAndText(widget3, WikiWordWidget.class,
066: "WordWiki");
067: }
068:
069: public void testItalic_text_WikiWord() throws Exception {
070: ParentWidget page = new WidgetRoot("''italic'' text WikiWord",
071: mockSource);
072: assertEquals(3, page.numberOfChildren());
073: WikiWidget widget1 = page.nextChild();
074: WikiWidget widget2 = page.nextChild();
075: WikiWidget widget3 = page.nextChild();
076: assertEquals(ItalicWidget.class, widget1.getClass());
077: testWidgetClassAndText(widget2, TextWidget.class, " text ");
078: testWidgetClassAndText(widget3, WikiWordWidget.class,
079: "WikiWord");
080: }
081:
082: public void testWikiWordInsideItalic() throws Exception {
083: testWikiWordInParentWidget("''WikiWord''", ItalicWidget.class,
084: "WikiWord", 1);
085: }
086:
087: public void testWikiWordInsideBold() throws Exception {
088: testWikiWordInParentWidget("'''WikiWord'''", BoldWidget.class,
089: "WikiWord", 1);
090: }
091:
092: public void testMultiLineWidget() throws Exception {
093: ParentWidget page = new WidgetRoot("{{{\npreformatted\n}}}",
094: mockSource);
095: assertEquals(1, page.numberOfChildren());
096: assertEquals(PreformattedWidget.class, page.nextChild()
097: .getClass());
098: }
099:
100: public void testEmailWidget() throws Exception {
101: ParentWidget page = new WidgetRoot("someone@somewhere.com",
102: mockSource);
103: assertEquals(1, page.numberOfChildren());
104: assertEquals(EmailWidget.class, page.nextChild().getClass());
105: }
106:
107: public void testHrule() throws Exception {
108: ParentWidget page = new WidgetRoot("-----", mockSource);
109: WikiWidget widget = page.nextChild();
110: assertEquals(HruleWidget.class, widget.getClass());
111: }
112:
113: public void testAnchorsMarker() throws Exception {
114: ParentWidget page = new WidgetRoot(".#name ", mockSource);
115: WikiWidget widget = page.nextChild();
116: assertEquals(AnchorMarkerWidget.class, widget.getClass());
117: }
118:
119: public void testAnchorsDeclaration() throws Exception {
120: ParentWidget page = new WidgetRoot("!anchor name ", mockSource);
121: WikiWidget widget = page.nextChild();
122: assertEquals(AnchorDeclarationWidget.class, widget.getClass());
123:
124: }
125:
126: public void testWikiWordInsideHeader() throws Exception {
127: testWikiWordInParentWidget("!1 WikiWord\n", HeaderWidget.class,
128: "WikiWord", 1);
129: }
130:
131: public void testWikiWordInsideCenter() throws Exception {
132: testWikiWordInParentWidget("!c WikiWord\n", CenterWidget.class,
133: "WikiWord", 1);
134: }
135:
136: public void testTable() throws Exception {
137: ParentWidget page = new WidgetRoot("|a|b|\n|c|d|\n", mockSource);
138: assertEquals(1, page.numberOfChildren());
139: WikiWidget widget = page.nextChild();
140: assertEquals(TableWidget.class, widget.getClass());
141: }
142:
143: public void testLineBreak() throws Exception {
144: ParentWidget page = new WidgetRoot("\n\r\n\r", mockSource);
145: assertEquals(3, page.numberOfChildren());
146: while (page.hasNextChild())
147: assertEquals(LineBreakWidget.class, page.nextChild()
148: .getClass());
149: }
150:
151: public void testList() throws Exception {
152: ParentWidget page = new WidgetRoot(" *Item1\n", mockSource);
153: assertEquals(1, page.numberOfChildren());
154: assertEquals(ListWidget.class, page.nextChild().getClass());
155: }
156:
157: public void testClasspath() throws Exception {
158: ParentWidget page = new WidgetRoot("!path something",
159: mockSource);
160: assertEquals(1, page.numberOfChildren());
161: assertEquals(ClasspathWidget.class, page.nextChild().getClass());
162: }
163:
164: public void testStrike() throws Exception {
165: testWikiWordInParentWidget("--WikiWord--", StrikeWidget.class,
166: "WikiWord", 1);
167: }
168:
169: public void testNoteWidget() throws Exception {
170: ParentWidget page = new WidgetRoot("!note something",
171: mockSource);
172: assertEquals(1, page.numberOfChildren());
173: assertEquals(NoteWidget.class, page.nextChild().getClass());
174: }
175:
176: public void testCollapsableWidget() throws Exception {
177: ParentWidget page = new WidgetRoot("!* title\ncontent\n*!\n",
178: mockSource);
179: assertEquals(1, page.numberOfChildren());
180: assertEquals(CollapsableWidget.class, page.nextChild()
181: .getClass());
182: }
183:
184: public void testNullPointerError() throws Exception {
185: String wikiText = "''\nsome text that should be in italics\n''";
186: WidgetRoot root = new WidgetRoot(wikiText, new WikiPageDummy());
187:
188: try {
189: root.render();
190: } catch (Exception e) {
191: fail("should be no exception\n" + e);
192: }
193: }
194:
195: public void testVirtualWikiWidget() throws Exception {
196: ParentWidget page = new WidgetRoot(
197: "!virtualwiki http://localhost/FrontPage", mockSource);
198: assertEquals(1, page.numberOfChildren());
199: assertEquals(VirtualWikiWidget.class, page.nextChild()
200: .getClass());
201: }
202:
203: // TODO MdM A Test that reveals FitNesse's weakness for parsing large wiki documents.
204: //
205: // public void testLargeTable() throws Exception
206: // {
207: // StringBuffer buffer = new StringBuffer();
208: // for(int i = 0; i < 1000; i++)
209: // buffer.append("|'''bold'''|''italic''|!c centered|\n");
210: //
211: // try
212: // {
213: // WidgetRoot root = new WidgetRoot(buffer.toString(), new MockWikiPage());
214: // root.render();
215: // }
216: // catch(StackOverflowError e)
217: // {
218: // fail("Got error with big table: " + e);
219: // }
220: // }
221:
222: private void testWikiWordInParentWidget(String input,
223: Class expectedClass, String wikiWordText, int subChildren)
224: throws Exception {
225: ParentWidget page = new WidgetRoot(input, mockSource);
226: assertEquals(1, page.numberOfChildren());
227: WikiWidget widget = page.nextChild();
228: assertEquals(expectedClass, widget.getClass());
229:
230: ParentWidget iWidget = (ParentWidget) widget;
231: assertEquals(subChildren, iWidget.numberOfChildren());
232: WikiWidget childWidget = iWidget.nextChild();
233: testWidgetClassAndText(childWidget, WikiWordWidget.class,
234: wikiWordText);
235: }
236:
237: private void testWidgetClassAndText(WikiWidget widget,
238: Class expectedClass, String expectedText) {
239: assertEquals(expectedClass, widget.getClass());
240: if (widget instanceof TextWidget)
241: assertEquals(expectedText, ((TextWidget) widget).getText());
242: }
243:
244: public void testConcurrentAddWidgets() throws Exception {
245: WidgetBuilder widgetBuilder = new WidgetBuilder(
246: new Class[] { BoldWidget.class });
247: String text = "'''bold text'''";
248: ParentWidget parent = new BoldWidget(new MockWidgetRoot(),
249: "'''bold text'''");
250: AtomicBoolean failFlag = new AtomicBoolean();
251: failFlag.set(false);
252: //This is our best attempt to get a race condition by creating large number of threads.
253: for (int i = 0; i < 25000; i++) {
254: new Thread(new WidgetBuilderThread(widgetBuilder, text,
255: parent, failFlag)).start();
256: }
257: assertEquals(false, failFlag.get());
258: }
259:
260: class WidgetBuilderThread implements Runnable {
261: WidgetBuilder widjetBuilder = null;
262: String text = null;
263: ParentWidget parent = null;
264: AtomicBoolean failFlag = null;
265:
266: public WidgetBuilderThread(WidgetBuilder widjetBuilder,
267: String text, ParentWidget parent, AtomicBoolean failFlag) {
268: this .widjetBuilder = widjetBuilder;
269: this .text = text;
270: this .parent = parent;
271: this .failFlag = failFlag;
272: }
273:
274: public void run() {
275: try {
276: this .widjetBuilder.addChildWidgets(this .text,
277: this .parent);
278: } catch (Exception e) {
279: this .failFlag.set(true);
280: }
281: }
282: }
283: }
|