Adding more tests

This commit is contained in:
Dimitry Ivanov 2019-01-03 16:22:29 +03:00
parent 9958f34574
commit 81c1c16a86
10 changed files with 289 additions and 6 deletions

View File

@ -36,20 +36,22 @@ import java.util.Map;
*/ */
class MarkwonVisitorImpl implements MarkwonVisitor { class MarkwonVisitorImpl implements MarkwonVisitor {
private final Map<Class<? extends Node>, NodeVisitor<? extends Node>> nodes;
private final MarkwonConfiguration configuration; private final MarkwonConfiguration configuration;
private final RenderProps renderProps; private final RenderProps renderProps;
private final SpannableBuilder builder = new SpannableBuilder(); private final SpannableBuilder builder;
private final Map<Class<? extends Node>, NodeVisitor<? extends Node>> nodes;
MarkwonVisitorImpl( MarkwonVisitorImpl(
@NonNull MarkwonConfiguration configuration, @NonNull MarkwonConfiguration configuration,
@NonNull RenderProps renderProps, @NonNull RenderProps renderProps,
@NonNull SpannableBuilder builder,
@NonNull Map<Class<? extends Node>, NodeVisitor<? extends Node>> nodes) { @NonNull Map<Class<? extends Node>, NodeVisitor<? extends Node>> nodes) {
this.configuration = configuration; this.configuration = configuration;
this.renderProps = renderProps; this.renderProps = renderProps;
this.builder = builder;
this.nodes = nodes; this.nodes = nodes;
} }
@ -286,6 +288,7 @@ class MarkwonVisitorImpl implements MarkwonVisitor {
return new MarkwonVisitorImpl( return new MarkwonVisitorImpl(
configuration, configuration,
renderProps, renderProps,
new SpannableBuilder(),
Collections.unmodifiableMap(nodes)); Collections.unmodifiableMap(nodes));
} }
} }

View File

@ -1,4 +1,4 @@
package ru.noties.markwon; package ru.noties.markwon.movement;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.text.Spanned; import android.text.Spanned;
@ -6,6 +6,8 @@ import android.text.method.LinkMovementMethod;
import android.text.method.MovementMethod; import android.text.method.MovementMethod;
import android.widget.TextView; import android.widget.TextView;
import ru.noties.markwon.AbstractMarkwonPlugin;
/** /**
* @since 3.0.0 * @since 3.0.0
*/ */

View File

@ -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();
}
}

View File

@ -11,7 +11,8 @@ public class AbstractMarkwonVisitorImpl extends MarkwonVisitorImpl {
public AbstractMarkwonVisitorImpl( public AbstractMarkwonVisitorImpl(
@NonNull MarkwonConfiguration configuration, @NonNull MarkwonConfiguration configuration,
@NonNull RenderProps renderProps, @NonNull RenderProps renderProps,
@NonNull SpannableBuilder spannableBuilder,
@NonNull Map<Class<? extends Node>, NodeVisitor<? extends Node>> nodes) { @NonNull Map<Class<? extends Node>, NodeVisitor<? extends Node>> nodes) {
super(configuration, renderProps, nodes); super(configuration, renderProps, spannableBuilder, nodes);
} }
} }

View File

@ -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();
}
}

View File

@ -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.<Class<? extends Node>, MarkwonVisitor.NodeVisitor<? extends Node>>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.<Class<? extends Node>, MarkwonVisitor.NodeVisitor<? extends Node>>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.<Class<? extends Node>, MarkwonVisitor.NodeVisitor<? extends Node>>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<Method> methods = Ix.fromArray(Visitor.class.getDeclaredMethods())
.filter(new IxPredicate<Method>() {
@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.<Class<? extends Node>, MarkwonVisitor.NodeVisitor<? extends Node>>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.<Class<? extends Node>, MarkwonVisitor.NodeVisitor<? extends Node>>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();
}
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -90,6 +90,7 @@ public class SyntaxHighlightTest {
final MarkwonVisitor visitor = new AbstractMarkwonVisitorImpl( final MarkwonVisitor visitor = new AbstractMarkwonVisitorImpl(
configuration, configuration,
mock(RenderProps.class), mock(RenderProps.class),
new SpannableBuilder(),
visitorMap); visitorMap);
final SpannableBuilder builder = visitor.builder(); final SpannableBuilder builder = visitor.builder();

View File

@ -19,7 +19,7 @@ import ru.noties.markwon.MarkwonConfiguration;
import ru.noties.markwon.MarkwonPlugin; import ru.noties.markwon.MarkwonPlugin;
import ru.noties.markwon.MarkwonSpansFactory; import ru.noties.markwon.MarkwonSpansFactory;
import ru.noties.markwon.MarkwonVisitor; 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.core.MarkwonTheme;
import ru.noties.markwon.image.AsyncDrawableLoader; import ru.noties.markwon.image.AsyncDrawableLoader;
import ru.noties.markwon.image.ImageItem; import ru.noties.markwon.image.ImageItem;