blob: f6f4116392263c81e2010988ee55b1cf4e39853a [file] [log] [blame]
/*=============================================================================#
# Copyright (c) 2015, 2019 David Green and others.
#
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License 2.0 which is available at
# https://www.eclipse.org/legal/epl-2.0.
#
# SPDX-License-Identifier: EPL-2.0
#
# Contributors:
# David Green - org.eclipse.mylyn.docs: initial API and implementation
# Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
#=============================================================================*/
package org.eclipse.statet.internal.docmlet.wikitext.commonmark.core.inlines;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullAssert;
import org.junit.Test;
import org.eclipse.statet.jcommons.collections.ImCollections;
import org.eclipse.statet.jcommons.lang.NonNullByDefault;
import org.eclipse.statet.internal.docmlet.wikitext.commonmark.core.CommonmarkAsserts;
import org.eclipse.statet.internal.docmlet.wikitext.commonmark.core.Cursor;
import org.eclipse.statet.internal.docmlet.wikitext.commonmark.core.Line;
import org.eclipse.statet.internal.docmlet.wikitext.commonmark.core.ProcessingContext;
import org.eclipse.statet.internal.docmlet.wikitext.commonmark.core.TextSegment;
@NonNullByDefault
public class PotentialEmphasisSpanTest extends AbstractSourceSpanTest {
public PotentialEmphasisSpanTest() {
super(new PotentialStyleSpan());
}
@Test
public void parse_Emphasis_Asterisk() {
assertParseToHtml("* one*", "* one*");
assertParseToHtml("*one *", "*one *");
assertParseToHtml("*one", "*one");
assertParseToHtml("<em>some text</em>", "*some text*");
assertParseToHtml("<em>some text</em> and more", "*some text* and more");
assertParseToHtml("<em>some\ntext</em>d", "*some\ntext*d");
assertParseToHtml("*<em>one</em>", "**one*");
}
@Test
public void parse_StrongEmphasis_Asterisk() {
assertParseToHtml("** one**", "** one**");
assertParseToHtml("**one **", "**one **");
assertParseToHtml("**one", "**one");
assertParseToHtml("<strong>some text</strong>", "**some text**");
assertParseToHtml("<strong>some text</strong> and more", "**some text** and more");
assertParseToHtml("<strong>some\ntext</strong>d", "**some\ntext**d");
}
@Test
public void parse_MultiEmphasis_Asterisk() {
assertParseToHtml("*<strong>some text</strong>", "***some text**");
assertParseToHtml("<strong>some text</strong>*", "**some text***");
assertParseToHtml("<em><strong>some text</strong></em>", "***some text***");
assertParseToHtml("*<em><strong>some text</strong></em>", "****some text***");
assertParseToHtml("<em><strong>some text</strong></em>*", "***some text****");
assertParseToHtml("<strong><strong>some text</strong></strong>", "****some text****");
assertParseToHtml("*<strong><strong>some text</strong></strong>", "*****some text****");
assertParseToHtml("<strong><strong>some text</strong></strong>*", "****some text*****");
assertParseToHtml("<em><strong><strong>some text</strong></strong></em>", "*****some text*****");
}
@Test
public void underscoreEmphasis() {
assertParseToHtml("_ one_", "_ one_");
assertParseToHtml("_one _", "_one _");
assertParseToHtml("_one", "_one");
assertParseToHtml("a_one_", "a_one_");
assertParseToHtml("_one_a", "_one_a");
assertParseToHtml("<em>s</em>", "_s_");
assertParseToHtml("<em>some text</em>", "_some text_");
assertParseToHtml("<em>some text</em> and more", "_some text_ and more");
assertParseToHtml("<em>some\ntext</em>", "_some\ntext_");
assertParseToHtml("<em>some text_a b</em> a", "_some text_a b_ a");
assertParseToHtml("<em>some text\\_a b</em> a", "_some text\\_a b_ a");
assertParseToHtml("_<em>one</em>", "__one_");
}
@Test
public void underscoreStrongEmphasis() {
assertParseToHtml("__ one__", "__ one__");
assertParseToHtml("__one __", "__one __");
assertParseToHtml("__one", "__one");
assertParseToHtml("a__one__", "a__one__");
assertParseToHtml("__one__a", "__one__a");
assertParseToHtml("<strong>s</strong>", "__s__");
assertParseToHtml("<strong>some text</strong>", "__some text__");
assertParseToHtml("<strong>some text</strong> and more", "__some text__ and more");
assertParseToHtml("<strong>some\ntext</strong>", "__some\ntext__");
assertParseToHtml("<strong>some text__a b</strong> a", "__some text__a b__ a");
}
@Test
public void isLeftFlanking() {
assertLeftFlanking(true, "**a", 0, 2);
assertLeftFlanking(false, "** a", 0, 2);
assertLeftFlanking(true, " **a", 1, 2);
assertLeftFlanking(true, ".**a", 1, 2);
assertLeftFlanking(false, "**", 0, 2);
assertLeftFlanking(true, "***abc", 0, 3);
assertLeftFlanking(true, " _abc", 2, 1);
assertLeftFlanking(true, "**\"abc\"", 0, 2);
assertLeftFlanking(true, " _\"abc\"", 1, 1);
assertLeftFlanking(false, "abc***", 3, 3);
assertLeftFlanking(false, " abc_", 5, 1);
assertLeftFlanking(false, "\"abc\"**", 5, 2);
assertLeftFlanking(false, "\"abc\"_", 5, 1);
assertLeftFlanking(true, "abc**def", 3, 2);
assertLeftFlanking(true, "\"abc\"_\"def\"", 5, 1);
assertLeftFlanking(false, "abc *** def", 4, 3);
assertLeftFlanking(false, "a _ b", 2, 1);
}
@Test
public void isRightFlanking() {
assertRightFlanking(false, "**", 0, 2);
assertRightFlanking(true, "a** ", 1, 2);
assertRightFlanking(true, "a**a", 1, 2);
assertRightFlanking(true, "a**.", 1, 2);
assertRightFlanking(true, "a**", 1, 2);
assertRightFlanking(false, "***abc", 0, 3);
assertRightFlanking(false, " _abc", 2, 1);
assertRightFlanking(false, "**\"abc\"", 0, 2);
assertRightFlanking(false, " _\"abc\"", 1, 1);
assertRightFlanking(true, "abc***", 3, 3);
assertRightFlanking(true, " abc_", 5, 1);
assertRightFlanking(true, "\"abc\"**", 5, 2);
assertRightFlanking(true, "\"abc\"_", 5, 1);
assertRightFlanking(true, "abc**def", 3, 2);
assertRightFlanking(true, "\"abc\"_\"def\"", 5, 1);
assertRightFlanking(false, "abc *** def", 4, 3);
assertRightFlanking(false, "a _ b", 2, 1);
}
private void assertLeftFlanking(final boolean expected, final String markup, final int offset, final int length) {
final ProcessingContext context= CommonmarkAsserts.newContext();
final Cursor cursor= createCursor(markup, offset);
final char delimiter= markup.charAt(offset);
assertTrue(delimiter == '*' || delimiter == '_');
assertEquals(expected, getSpan().isLeftFlanking(cursor, length, context) );
}
private void assertRightFlanking(final boolean expected, final String markup, final int offset, final int length) {
final ProcessingContext context= CommonmarkAsserts.newContext();
final Cursor cursor= createCursor(markup, offset);
final char delimiter= markup.charAt(offset);
assertTrue(delimiter == '*' || delimiter == '_');
assertEquals(expected, getSpan().isRightFlanking(cursor, length, context));
}
private Cursor createCursor(final String markup, final int offset) {
final TextSegment segment= new TextSegment(ImCollections.newList(new Line(1, 0, 0, markup, "\n")));
final Cursor cursor= new Cursor(segment);
cursor.advance(segment.toTextOffset(offset));
return cursor;
}
private PotentialStyleSpan getSpan() {
return (PotentialStyleSpan) nonNullAssert(this.span);
}
}