/******************************************************************************* * Copyright (c) 2007, 2013 David Green and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * David Green - initial API and implementation *******************************************************************************/ package org.eclipse.mylyn.wikitext.textile; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import java.io.IOException; import java.io.StringWriter; import java.util.List; import org.eclipse.mylyn.wikitext.parser.DocumentBuilder.BlockType; import org.eclipse.mylyn.wikitext.parser.MarkupParser; import org.eclipse.mylyn.wikitext.parser.builder.HtmlDocumentBuilder; import org.eclipse.mylyn.wikitext.toolkit.RecordingDocumentBuilder; import org.eclipse.mylyn.wikitext.toolkit.RecordingDocumentBuilder.Event; import org.junit.Before; import org.junit.Test; public class TextileLanguageDefinitionListTest { private MarkupParser parser; private TextileLanguage markupLanguage; @Before public void initParser() throws IOException { parser = new MarkupParser(); markupLanguage = new TextileLanguage(); parser.setMarkupLanguage(markupLanguage); } private String parseToHtml(String markup) { StringWriter out = new StringWriter(); HtmlDocumentBuilder builder = new HtmlDocumentBuilder(out); builder.setEmitAsDocument(false); parser.setBuilder(builder); parser.parse(markup); return out.toString(); } @Test public void simple() { String html = parseToHtml("- one := two"); assertEquals("<dl><dt>one</dt><dd>two</dd></dl>", html); } @Test public void withSpans() { String html = parseToHtml("- one := *two* and _three_ %{color:red;}laskdf as d%"); assertEquals( "<dl><dt>one</dt><dd><strong>two</strong> and <em>three</em> <span style=\"color:red;\">laskdf as d</span></dd></dl>", html); } @Test public void multipleItems() { String html = parseToHtml("- one := two\n- three := four"); assertEquals("<dl><dt>one</dt><dd>two</dd><dt>three</dt><dd>four</dd></dl>", html); } @Test public void terminatedSameLine() { String html = parseToHtml("- one := two three =:"); assertEquals("<dl><dt>one</dt><dd>two three</dd></dl>", html); } @Test public void terminatedSameLineParaStartNoBlankLine() { String html = parseToHtml("- one := two three =:\npara start"); assertEquals("<dl><dt>one</dt><dd>two three</dd></dl><p>para start</p>", html); } @Test public void terminatedMultiLineNoTermination() { String html = parseToHtml("- one := two three\n\tfour\nfive six"); assertEquals("<dl><dt>one</dt><dd>two three<br/>\tfour<br/>five six</dd></dl>", html); } @Test public void terminatedMultiLineImproperTermination() { String html = parseToHtml("- one := two three\n\nfour"); assertEquals("<dl><dt>one</dt><dd>two three</dd></dl><p>four</p>", html); } @Test public void terminatedMultiLine() { String html = parseToHtml("- one := two three\n\tfour\nfive six =:"); assertEquals("<dl><dt>one</dt><dd>two three<br/>\tfour<br/>five six</dd></dl>", html); } @Test public void multiLineNotTerminatedWithBulletedList() { String html = parseToHtml("- one := two three\n* one =:"); assertEquals("<dl><dt>one</dt><dd>two three<br/>* one</dd></dl>", html); } @Test public void terminatedMultiLineTerminatorLineEmpty() { String html = parseToHtml("- one := two three\n\tfour\n =:\ntest"); assertEquals("<dl><dt>one</dt><dd>two three<br/>\tfour</dd></dl><p>test</p>", html); } @Test public void terminatedMultiLineTerminatorLineEmpty2() { String html = parseToHtml("- one := two three\n\tfour\n=:\ntest"); assertEquals("<dl><dt>one</dt><dd>two three<br/>\tfour</dd></dl><p>test</p>", html); } @Test public void semicolon() { String html = parseToHtml("; one"); assertEquals("<dl><dt>one</dt></dl>", html); } @Test public void semicolonWithDefinition() { String html = parseToHtml("; one\n: two"); assertEquals("<dl><dt>one</dt><dd>two</dd></dl>", html); } @Test public void semicolonWithMultipleDefinitions() { String html = parseToHtml("; one\n: two\n: three four"); assertEquals("<dl><dt>one</dt><dd>two</dd><dd>three four</dd></dl>", html); } @Test public void semicolonWithMultipleItemsAndDefinitions() { String html = parseToHtml("; one\n: two\n: three four\n; five\n: six"); assertEquals("<dl><dt>one</dt><dd>two</dd><dd>three four</dd><dt>five</dt><dd>six</dd></dl>", html); } @Test public void semicolonWithDefinitionAndSpans() { String html = parseToHtml("; one\n: *two* _three_ -four five-"); assertEquals("<dl><dt>one</dt><dd><strong>two</strong> <em>three</em> <del>four five</del></dd></dl>", html); } @Test public void definitionListInterruptsParagraph() { String html = parseToHtml("one\n- two := three four"); assertEquals("<p>one</p><dl><dt>two</dt><dd>three four</dd></dl>", html); } @Test public void offsets() { RecordingDocumentBuilder builder = new RecordingDocumentBuilder(); MarkupParser markupParser = new MarkupParser(markupLanguage); markupParser.setBuilder(builder); markupParser.parse("- one := two"); Event event = findEvent(builder.getEvents(), BlockType.DEFINITION_TERM); assertEquals(1, event.locator.getLineNumber()); assertEquals(0, event.locator.getLineCharacterOffset()); assertEquals(6, event.locator.getLineSegmentEndOffset()); Event itemEvent = findEvent(builder.getEvents(), BlockType.DEFINITION_ITEM); assertEquals(1, itemEvent.locator.getLineNumber()); assertEquals(6, itemEvent.locator.getLineCharacterOffset()); } private Event findEvent(List<Event> events, BlockType blockType) { for (Event event : events) { if (event.blockType == blockType) { return event; } } fail(String.format("Expected block %s but found %s", blockType, events)); throw new IllegalStateException(); } }