From 81c1c16a86aadfb56e26c9fce84aa0ac6b6e3c43 Mon Sep 17 00:00:00 2001 From: Dimitry Ivanov Date: Thu, 3 Jan 2019 16:22:29 +0300 Subject: [PATCH] Adding more tests --- .../ru/noties/markwon/MarkwonVisitorImpl.java | 9 +- .../{ => movement}/MovementMethodPlugin.java | 4 +- .../markwon/AbstractMarkwonPluginTest.java | 27 +++ .../markwon/AbstractMarkwonVisitorImpl.java | 3 +- .../markwon/MarkwonSpansFactoryImplTest.java | 18 ++ .../markwon/MarkwonVisitorImplTest.java | 195 ++++++++++++++++++ .../test/java/ru/noties/markwon/PropTest.java | 18 ++ .../noties/markwon/RenderPropsImplTest.java | 18 ++ .../markwon/syntax/SyntaxHighlightTest.java | 1 + .../basicplugins/BasicPluginsActivity.java | 2 +- 10 files changed, 289 insertions(+), 6 deletions(-) rename markwon/src/main/java/ru/noties/markwon/{ => movement}/MovementMethodPlugin.java (93%) create mode 100644 markwon/src/test/java/ru/noties/markwon/AbstractMarkwonPluginTest.java create mode 100644 markwon/src/test/java/ru/noties/markwon/MarkwonSpansFactoryImplTest.java create mode 100644 markwon/src/test/java/ru/noties/markwon/MarkwonVisitorImplTest.java create mode 100644 markwon/src/test/java/ru/noties/markwon/PropTest.java create mode 100644 markwon/src/test/java/ru/noties/markwon/RenderPropsImplTest.java diff --git a/markwon/src/main/java/ru/noties/markwon/MarkwonVisitorImpl.java b/markwon/src/main/java/ru/noties/markwon/MarkwonVisitorImpl.java index 4c4caff8..33a22bc8 100644 --- a/markwon/src/main/java/ru/noties/markwon/MarkwonVisitorImpl.java +++ b/markwon/src/main/java/ru/noties/markwon/MarkwonVisitorImpl.java @@ -36,20 +36,22 @@ import java.util.Map; */ class MarkwonVisitorImpl implements MarkwonVisitor { - private final Map, NodeVisitor> nodes; - private final MarkwonConfiguration configuration; private final RenderProps renderProps; - private final SpannableBuilder builder = new SpannableBuilder(); + private final SpannableBuilder builder; + + private final Map, NodeVisitor> nodes; MarkwonVisitorImpl( @NonNull MarkwonConfiguration configuration, @NonNull RenderProps renderProps, + @NonNull SpannableBuilder builder, @NonNull Map, NodeVisitor> nodes) { this.configuration = configuration; this.renderProps = renderProps; + this.builder = builder; this.nodes = nodes; } @@ -286,6 +288,7 @@ class MarkwonVisitorImpl implements MarkwonVisitor { return new MarkwonVisitorImpl( configuration, renderProps, + new SpannableBuilder(), Collections.unmodifiableMap(nodes)); } } diff --git a/markwon/src/main/java/ru/noties/markwon/MovementMethodPlugin.java b/markwon/src/main/java/ru/noties/markwon/movement/MovementMethodPlugin.java similarity index 93% rename from markwon/src/main/java/ru/noties/markwon/MovementMethodPlugin.java rename to markwon/src/main/java/ru/noties/markwon/movement/MovementMethodPlugin.java index 332015e5..59dd04ab 100644 --- a/markwon/src/main/java/ru/noties/markwon/MovementMethodPlugin.java +++ b/markwon/src/main/java/ru/noties/markwon/movement/MovementMethodPlugin.java @@ -1,4 +1,4 @@ -package ru.noties.markwon; +package ru.noties.markwon.movement; import android.support.annotation.NonNull; import android.text.Spanned; @@ -6,6 +6,8 @@ import android.text.method.LinkMovementMethod; import android.text.method.MovementMethod; import android.widget.TextView; +import ru.noties.markwon.AbstractMarkwonPlugin; + /** * @since 3.0.0 */ diff --git a/markwon/src/test/java/ru/noties/markwon/AbstractMarkwonPluginTest.java b/markwon/src/test/java/ru/noties/markwon/AbstractMarkwonPluginTest.java new file mode 100644 index 00000000..b5b8884f --- /dev/null +++ b/markwon/src/test/java/ru/noties/markwon/AbstractMarkwonPluginTest.java @@ -0,0 +1,27 @@ +package ru.noties.markwon; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; + +import static org.junit.Assert.fail; + +@RunWith(RobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class AbstractMarkwonPluginTest { + + @Test + public void priority() { + // returns CorePlugin dependency + + fail(); + } + + @Test + public void process_markdown() { + // returns supplied argument (no-op) + + fail(); + } +} \ No newline at end of file diff --git a/markwon/src/test/java/ru/noties/markwon/AbstractMarkwonVisitorImpl.java b/markwon/src/test/java/ru/noties/markwon/AbstractMarkwonVisitorImpl.java index f3ad18b3..ea099248 100644 --- a/markwon/src/test/java/ru/noties/markwon/AbstractMarkwonVisitorImpl.java +++ b/markwon/src/test/java/ru/noties/markwon/AbstractMarkwonVisitorImpl.java @@ -11,7 +11,8 @@ public class AbstractMarkwonVisitorImpl extends MarkwonVisitorImpl { public AbstractMarkwonVisitorImpl( @NonNull MarkwonConfiguration configuration, @NonNull RenderProps renderProps, + @NonNull SpannableBuilder spannableBuilder, @NonNull Map, NodeVisitor> nodes) { - super(configuration, renderProps, nodes); + super(configuration, renderProps, spannableBuilder, nodes); } } diff --git a/markwon/src/test/java/ru/noties/markwon/MarkwonSpansFactoryImplTest.java b/markwon/src/test/java/ru/noties/markwon/MarkwonSpansFactoryImplTest.java new file mode 100644 index 00000000..ae4fbe64 --- /dev/null +++ b/markwon/src/test/java/ru/noties/markwon/MarkwonSpansFactoryImplTest.java @@ -0,0 +1,18 @@ +package ru.noties.markwon; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; + +import static org.junit.Assert.fail; + +@RunWith(RobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class MarkwonSpansFactoryImplTest { + + @Test + public void test() { + fail(); + } +} \ No newline at end of file diff --git a/markwon/src/test/java/ru/noties/markwon/MarkwonVisitorImplTest.java b/markwon/src/test/java/ru/noties/markwon/MarkwonVisitorImplTest.java new file mode 100644 index 00000000..ee8da824 --- /dev/null +++ b/markwon/src/test/java/ru/noties/markwon/MarkwonVisitorImplTest.java @@ -0,0 +1,195 @@ +package ru.noties.markwon; + +import org.commonmark.node.Node; +import org.commonmark.node.Visitor; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; + +import java.lang.reflect.Method; +import java.util.Collections; +import java.util.List; + +import ix.Ix; +import ix.IxPredicate; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import static org.mockito.Mockito.RETURNS_MOCKS; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +@RunWith(RobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class MarkwonVisitorImplTest { + + @Test + public void clear() { + // clear method will clear renderProps and spannableBuilder + + final RenderProps renderProps = mock(RenderProps.class); + final SpannableBuilder spannableBuilder = mock(SpannableBuilder.class); + + final MarkwonVisitorImpl impl = new MarkwonVisitorImpl( + mock(MarkwonConfiguration.class), + renderProps, + spannableBuilder, + Collections., MarkwonVisitor.NodeVisitor>emptyMap()); + + impl.clear(); + + verify(renderProps, times(1)).clearAll(); + verify(spannableBuilder, times(1)).clear(); + } + + @Test + public void ensure_new_line() { + // new line will be inserted if length > 0 && last character is not a new line + + final SpannableBuilder builder = new SpannableBuilder(); + + final MarkwonVisitorImpl impl = new MarkwonVisitorImpl( + mock(MarkwonConfiguration.class), + mock(RenderProps.class), + builder, + Collections., MarkwonVisitor.NodeVisitor>emptyMap()); + + // at the start - won't add anything + impl.ensureNewLine(); + assertEquals(0, builder.length()); + + // last char is new line -> won't add anything + builder.append('\n'); + assertEquals(1, builder.length()); + impl.ensureNewLine(); + assertEquals(1, builder.length()); + + // not-empty and last char is not new-line -> add new line + builder.clear(); + assertEquals(0, builder.length()); + builder.append('a'); + assertEquals(1, builder.length()); + impl.ensureNewLine(); + assertEquals(2, builder.length()); + assertEquals('\n', builder.lastChar()); + } + + @Test + public void force_new_line() { + // force new line always add new-line + + final SpannableBuilder builder = new SpannableBuilder(); + final MarkwonVisitorImpl impl = new MarkwonVisitorImpl( + mock(MarkwonConfiguration.class), + mock(RenderProps.class), + builder, + Collections., MarkwonVisitor.NodeVisitor>emptyMap()); + + assertEquals(0, builder.length()); + + for (int i = 0; i < 9; i++) { + impl.forceNewLine(); + } + + assertEquals(9, builder.length()); + + // all characters are new lines + for (int i = 0; i < builder.length(); i++) { + assertEquals('\n', builder.charAt(i)); + } + } + + @Test + public void all_known_nodes_visit_methods_are_overridden() { + // checks that all methods from Visitor (commonmark-java) interface are implemented + + final List methods = Ix.fromArray(Visitor.class.getDeclaredMethods()) + .filter(new IxPredicate() { + + @Override + public boolean test(Method method) { + + // if it's present in our impl -> remove + // else keep (to report) + + try { + MarkwonVisitorImpl.class + .getDeclaredMethod(method.getName(), method.getParameterTypes()); + return false; + } catch (NoSuchMethodException e) { + return true; + } + } + }) + .toList(); + + assertEquals(methods.toString(), 0, methods.size()); + } + + @Test + public void non_registered_nodes_children_visited() { + fail(); + } + + @Test + public void has_next() { + + final MarkwonVisitorImpl impl = new MarkwonVisitorImpl( + mock(MarkwonConfiguration.class), + mock(RenderProps.class), + mock(SpannableBuilder.class), + Collections., MarkwonVisitor.NodeVisitor>emptyMap()); + + final Node noNext = mock(Node.class); + assertFalse(impl.hasNext(noNext)); + + final Node hasNext = mock(Node.class, RETURNS_MOCKS); + assertTrue(impl.hasNext(hasNext)); + } + + @Test + public void length() { + // redirects call to SpannableBuilder (no internal caching) + + final class BuilderImpl extends SpannableBuilder { + + private int length; + + private void setLength(int length) { + this.length = length; + } + + @Override + public int length() { + return length; + } + } + final BuilderImpl builder = new BuilderImpl(); + + final MarkwonVisitorImpl impl = new MarkwonVisitorImpl( + mock(MarkwonConfiguration.class), + mock(RenderProps.class), + builder, + Collections., MarkwonVisitor.NodeVisitor>emptyMap()); + + for (int i = 0; i < 13; i++) { + builder.setLength(i); + assertEquals(i, builder.length()); + assertEquals(builder.length(), impl.length()); + } + } + + @Test + public void set_spans_for_node() { + fail(); + } + + @Test + public void set_spans_for_node_optional() { + fail(); + } +} \ No newline at end of file diff --git a/markwon/src/test/java/ru/noties/markwon/PropTest.java b/markwon/src/test/java/ru/noties/markwon/PropTest.java new file mode 100644 index 00000000..bbb98a17 --- /dev/null +++ b/markwon/src/test/java/ru/noties/markwon/PropTest.java @@ -0,0 +1,18 @@ +package ru.noties.markwon; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; + +import static org.junit.Assert.fail; + +@RunWith(RobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class PropTest { + + @Test + public void require() { + fail(); + } +} \ No newline at end of file diff --git a/markwon/src/test/java/ru/noties/markwon/RenderPropsImplTest.java b/markwon/src/test/java/ru/noties/markwon/RenderPropsImplTest.java new file mode 100644 index 00000000..a40ba0c4 --- /dev/null +++ b/markwon/src/test/java/ru/noties/markwon/RenderPropsImplTest.java @@ -0,0 +1,18 @@ +package ru.noties.markwon; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; + +import static org.junit.Assert.fail; + +@RunWith(RobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class RenderPropsImplTest { + + @Test + public void test() { + fail(); + } +} \ No newline at end of file diff --git a/markwon/src/test/java/ru/noties/markwon/syntax/SyntaxHighlightTest.java b/markwon/src/test/java/ru/noties/markwon/syntax/SyntaxHighlightTest.java index 38d36720..440fe488 100644 --- a/markwon/src/test/java/ru/noties/markwon/syntax/SyntaxHighlightTest.java +++ b/markwon/src/test/java/ru/noties/markwon/syntax/SyntaxHighlightTest.java @@ -90,6 +90,7 @@ public class SyntaxHighlightTest { final MarkwonVisitor visitor = new AbstractMarkwonVisitorImpl( configuration, mock(RenderProps.class), + new SpannableBuilder(), visitorMap); final SpannableBuilder builder = visitor.builder(); diff --git a/sample/src/main/java/ru/noties/markwon/sample/basicplugins/BasicPluginsActivity.java b/sample/src/main/java/ru/noties/markwon/sample/basicplugins/BasicPluginsActivity.java index 51723d7e..0728be6c 100644 --- a/sample/src/main/java/ru/noties/markwon/sample/basicplugins/BasicPluginsActivity.java +++ b/sample/src/main/java/ru/noties/markwon/sample/basicplugins/BasicPluginsActivity.java @@ -19,7 +19,7 @@ import ru.noties.markwon.MarkwonConfiguration; import ru.noties.markwon.MarkwonPlugin; import ru.noties.markwon.MarkwonSpansFactory; import ru.noties.markwon.MarkwonVisitor; -import ru.noties.markwon.MovementMethodPlugin; +import ru.noties.markwon.movement.MovementMethodPlugin; import ru.noties.markwon.core.MarkwonTheme; import ru.noties.markwon.image.AsyncDrawableLoader; import ru.noties.markwon.image.ImageItem;