Markwon.hasPlugin method

This commit is contained in:
Dimitry Ivanov 2019-01-12 16:13:15 +03:00
parent 7a598829a9
commit 705dec0571
3 changed files with 53 additions and 0 deletions

View File

@ -88,6 +88,19 @@ public abstract class Markwon {
public abstract void setParsedMarkdown(@NonNull TextView textView, @NonNull Spanned markdown);
/**
* Requests information if certain plugin has been registered. Please note that this
* method will check for super classes also, so if supplied with {@code markwon.hasPlugin(MarkwonPlugin.class)}
* this method (if has at least one plugin) will return true. If for example a custom
* (subclassed) version of a {@link CorePlugin} has been registered and given name
* {@code CorePlugin2}, then both {@code markwon.hasPlugin(CorePlugin2.class)} and
* {@code markwon.hasPlugin(CorePlugin.class)} will return true.
*
* @param plugin type to query
* @return true if a plugin is used when configuring this {@link Markwon} instance
*/
public abstract boolean hasPlugin(@NonNull Class<? extends MarkwonPlugin> plugin);
/**
* Builder for {@link Markwon}.
* <p>

View File

@ -95,4 +95,16 @@ class MarkwonImpl extends Markwon {
plugin.afterSetText(textView);
}
}
@Override
public boolean hasPlugin(@NonNull Class<? extends MarkwonPlugin> type) {
boolean result = false;
for (MarkwonPlugin plugin : plugins) {
if (type.isAssignableFrom(plugin.getClass())) {
result = true;
break;
}
}
return result;
}
}

View File

@ -16,9 +16,11 @@ import org.robolectric.annotation.Config;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
@ -229,4 +231,30 @@ public class MarkwonImplTest {
verify(plugin, times(1)).afterSetText(eq(textView));
}
@Test
public void has_plugin() {
final class First extends AbstractMarkwonPlugin {
}
final class Second extends AbstractMarkwonPlugin {
}
final List<MarkwonPlugin> plugins = Collections.singletonList((MarkwonPlugin) new First());
final MarkwonImpl impl = new MarkwonImpl(
TextView.BufferType.SPANNABLE,
mock(Parser.class),
mock(MarkwonVisitor.class),
plugins);
assertTrue("First", impl.hasPlugin(First.class));
assertFalse("Second", impl.hasPlugin(Second.class));
// can use super types. So if we ask if CorePlugin is registered,
// but it was subclassed, we would still have true returned from this method
assertTrue("AbstractMarkwonPlugin", impl.hasPlugin(AbstractMarkwonPlugin.class));
assertTrue("MarkwonPlugin", impl.hasPlugin(MarkwonPlugin.class));
}
}