Skip to content

Commit

Permalink
Add tests for markwon-image module
Browse files Browse the repository at this point in the history
  • Loading branch information
noties committed Jun 3, 2019
1 parent cedb397 commit 6bf04e3
Show file tree
Hide file tree
Showing 10 changed files with 425 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -165,14 +165,17 @@ private void text(@NonNull MarkwonVisitor.Builder builder) {
@Override
public void visit(@NonNull MarkwonVisitor visitor, @NonNull Text text) {

final int length = visitor.length();
final String literal = text.getLiteral();

visitor.builder().append(literal);

// @since 4.0.0-SNAPSHOT
for (OnTextAddedListener onTextAddedListener : onTextAddedListeners) {
onTextAddedListener.onTextAdded(visitor, literal, length);
if (!onTextAddedListeners.isEmpty()) {
// calculate the start position
final int length = visitor.length() - literal.length();
for (OnTextAddedListener onTextAddedListener : onTextAddedListeners) {
onTextAddedListener.onTextAdded(visitor, literal, length);
}
}
}
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,4 @@ public static AsyncDrawableLoader noOp() {
@Nullable
public abstract Drawable placeholder(@NonNull AsyncDrawable drawable);



}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;

public class AsyncDrawableLoaderNoOp extends AsyncDrawableLoader {
class AsyncDrawableLoaderNoOp extends AsyncDrawableLoader {
@Override
public void load(@NonNull AsyncDrawable drawable) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ public static class Config {

private final JLatextAsyncDrawableLoader jLatextAsyncDrawableLoader;

@SuppressWarnings("WeakerAccess")
JLatexMathPlugin(@NonNull Config config) {
this.jLatextAsyncDrawableLoader = new JLatextAsyncDrawableLoader(config);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import ru.noties.markwon.image.data.DataUriSchemeHandler;
import ru.noties.markwon.image.network.NetworkSchemeHandler;

class AsyncDrawableLoaderBuilder {

ExecutorService executorService;
Expand All @@ -19,6 +22,15 @@ class AsyncDrawableLoaderBuilder {

boolean isBuilt;

AsyncDrawableLoaderBuilder() {

// @since 4.0.0-SNAPSHOT
// okay, let's add supported schemes at the start, this would be : data-uri and default network
// we should not use file-scheme as it's a bit complicated to assume file usage (lack of permissions)
addSchemeHandler(DataUriSchemeHandler.create());
addSchemeHandler(NetworkSchemeHandler.create());
}

void executorService(@NonNull ExecutorService executorService) {
this.executorService = executorService;
}
Expand Down Expand Up @@ -66,12 +78,6 @@ AsyncDrawableLoader build() {

isBuilt = true;

// we must have schemeHandlers registered (we will provide
// default media decoder if it's absent)
if (schemeHandlers.size() == 0) {
return new AsyncDrawableLoaderNoOp();
}

// @since 4.0.0-SNAPSHOT
if (defaultMediaDecoder == null) {
defaultMediaDecoder = DefaultImageMediaDecoder.create();
Expand All @@ -83,5 +89,4 @@ AsyncDrawableLoader build() {

return new AsyncDrawableLoaderImpl(this);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import ru.noties.markwon.MarkwonConfiguration;
import ru.noties.markwon.MarkwonSpansFactory;

@SuppressWarnings({"UnusedReturnValue", "WeakerAccess"})
public class ImagesPlugin extends AbstractMarkwonPlugin {

/**
Expand Down Expand Up @@ -91,41 +92,67 @@ public ImagesPlugin addSchemeHandler(@NonNull SchemeHandler schemeHandler) {
return this;
}

/**
* @see DefaultImageMediaDecoder
* @see ru.noties.markwon.image.svg.SvgMediaDecoder
* @see ru.noties.markwon.image.gif.GifMediaDecoder
* @since 4.0.0-SNAPSHOT
*/
@NonNull
public ImagesPlugin addMediaDecoder(@NonNull MediaDecoder mediaDecoder) {
checkBuilderState();
builder.addMediaDecoder(mediaDecoder);
return this;
}

/**
* Please note that if not specified a {@link DefaultImageMediaDecoder} will be used. So
* if you need to disable default-image-media-decoder specify here own no-op implementation.
*
* @see DefaultImageMediaDecoder
* @since 4.0.0-SNAPSHOT
*/
@NonNull
public ImagesPlugin defaultMediaDecoder(@Nullable MediaDecoder mediaDecoder) {
public ImagesPlugin defaultMediaDecoder(@NonNull MediaDecoder mediaDecoder) {
checkBuilderState();
builder.defaultMediaDecoder(mediaDecoder);
return this;
}

/**
* @since 4.0.0-SNAPSHOT
*/
@NonNull
public ImagesPlugin removeSchemeHandler(@NonNull String scheme) {
checkBuilderState();
builder.removeSchemeHandler(scheme);
return this;
}

/**
* @since 4.0.0-SNAPSHOT
*/
@NonNull
public ImagesPlugin removeMediaDecoder(@NonNull String contentType) {
checkBuilderState();
builder.removeMediaDecoder(contentType);
return this;
}

/**
* @since 4.0.0-SNAPSHOT
*/
@NonNull
public ImagesPlugin placeholderProvider(@NonNull PlaceholderProvider placeholderProvider) {
checkBuilderState();
builder.placeholderProvider(placeholderProvider);
return this;
}

/**
* @see ErrorHandler
* @since 4.0.0-SNAPSHOT
*/
@NonNull
public ImagesPlugin errorHandler(@NonNull ErrorHandler errorHandler) {
checkBuilderState();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,194 @@
package ru.noties.markwon.image;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;

import java.util.Arrays;
import java.util.Collections;
import java.util.concurrent.ExecutorService;

import ru.noties.markwon.image.data.DataUriSchemeHandler;
import ru.noties.markwon.image.network.NetworkSchemeHandler;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

@RunWith(RobolectricTestRunner.class)
@Config(manifest = Config.NONE)
public class AsyncDrawableLoaderBuilderTest {

private AsyncDrawableLoaderBuilder builder;

@Before
public void before() {
builder = new AsyncDrawableLoaderBuilder();
}

@Test
public void default_scheme_handlers() {
// builder adds default data-uri and network scheme-handlers

final String[] registered = {
DataUriSchemeHandler.SCHEME,
NetworkSchemeHandler.SCHEME_HTTP,
NetworkSchemeHandler.SCHEME_HTTPS
};

for (String scheme : registered) {
assertNotNull(scheme, builder.schemeHandlers.get(scheme));
}
}

@Test
public void built_flag() {
// isBuilt flag must be set after `build` method call

assertFalse(builder.isBuilt);

builder.build();

assertTrue(builder.isBuilt);
}

@Test
public void defaults_initialized() {
// default-media-decoder and executor-service must be initialized

assertNull(builder.defaultMediaDecoder);
assertNull(builder.executorService);

builder.build();

assertNotNull(builder.defaultMediaDecoder);
assertNotNull(builder.executorService);
}

@Test
public void executor() {
// supplied executor-service must be used

assertNull(builder.executorService);

final ExecutorService service = mock(ExecutorService.class);
builder.executorService(service);

builder.build();

assertEquals(service, builder.executorService);
}

@Test
public void add_scheme_handler() {

final String scheme = "mock";
assertNull(builder.schemeHandlers.get(scheme));

final SchemeHandler schemeHandler = mock(SchemeHandler.class);
when(schemeHandler.supportedSchemes()).thenReturn(Collections.singleton(scheme));

builder.addSchemeHandler(schemeHandler);
builder.build();

assertEquals(schemeHandler, builder.schemeHandlers.get(scheme));
}

@Test
public void add_scheme_handler_multiple_types() {
// all supported types are registered

final String[] schemes = {
"mock-1",
"mock-2"
};

final SchemeHandler schemeHandler = mock(SchemeHandler.class);
when(schemeHandler.supportedSchemes()).thenReturn(Arrays.asList(schemes));

builder.addSchemeHandler(schemeHandler);

for (String scheme : schemes) {
assertEquals(scheme, schemeHandler, builder.schemeHandlers.get(scheme));
}
}

@Test
public void add_media_decoder() {

final String media = "mocked/type";
assertNull(builder.mediaDecoders.get(media));

final MediaDecoder mediaDecoder = mock(MediaDecoder.class);
when(mediaDecoder.supportedTypes()).thenReturn(Collections.singleton(media));

builder.addMediaDecoder(mediaDecoder);
builder.build();

assertEquals(mediaDecoder, builder.mediaDecoders.get(media));
}

@Test
public void add_media_decoder_multiple_types() {

final String[] types = {
"mock/type1",
"mock/type2"
};

final MediaDecoder mediaDecoder = mock(MediaDecoder.class);
when(mediaDecoder.supportedTypes()).thenReturn(Arrays.asList(types));

builder.addMediaDecoder(mediaDecoder);

for (String type : types) {
assertEquals(type, mediaDecoder, builder.mediaDecoders.get(type));
}
}

@Test
public void default_media_decoder() {

assertNull(builder.defaultMediaDecoder);

final MediaDecoder mediaDecoder = mock(MediaDecoder.class);
builder.defaultMediaDecoder(mediaDecoder);
builder.build();

assertEquals(mediaDecoder, builder.defaultMediaDecoder);
}

@Test
public void remove_scheme_handler() {

final String scheme = "mock";
final SchemeHandler schemeHandler = mock(SchemeHandler.class);
when(schemeHandler.supportedSchemes()).thenReturn(Collections.singleton(scheme));

assertNull(builder.schemeHandlers.get(scheme));
builder.addSchemeHandler(schemeHandler);
assertNotNull(builder.schemeHandlers.get(scheme));
builder.removeSchemeHandler(scheme);
assertNull(builder.schemeHandlers.get(scheme));
}

@Test
public void remove_media_decoder() {

final String media = "mock/type";
final MediaDecoder mediaDecoder = mock(MediaDecoder.class);
when(mediaDecoder.supportedTypes()).thenReturn(Collections.singleton(media));

assertNull(builder.mediaDecoders.get(media));
builder.addMediaDecoder(mediaDecoder);
assertNotNull(builder.mediaDecoders.get(media));
builder.removeMediaDecoder(media);
assertNull(builder.mediaDecoders.get(media));
}
}
Loading

0 comments on commit 6bf04e3

Please sign in to comment.