From 9d806370356523536fc85b1bdb0c28934edf8ccd Mon Sep 17 00:00:00 2001 From: Dimitry Ivanov Date: Sat, 25 Aug 2018 12:21:18 +0300 Subject: [PATCH] Working with tests --- .../markwon/UrlProcessorAndroidAssets.java | 8 +- .../renderer/ImageSizeResolverDef.java | 2 +- .../renderer/SpannableMarkdownVisitor.java | 2 +- .../UrlProcessorAndroidAssetsTest.java | 49 +++++++ .../UrlProcessorRelativeToAbsoluteTest.java | 61 ++++++++ .../renderer/ImageSizeResolverDefTest.java | 132 ++++++++++++++++++ .../visitor/SpannableMarkdownVisitorTest.java | 10 +- .../renderer/visitor/TestDataReader.java | 20 ++- markwon/src/test/resources/tests/html.yaml | 4 + .../src/test/resources/tests/single-hr.yaml | 2 +- .../src/test/resources/tests/single-tr.yaml | 13 +- markwon/src/test/resources/tests/table.yaml | 51 +++++++ 12 files changed, 342 insertions(+), 12 deletions(-) create mode 100644 markwon/src/test/java/ru/noties/markwon/UrlProcessorAndroidAssetsTest.java create mode 100644 markwon/src/test/java/ru/noties/markwon/UrlProcessorRelativeToAbsoluteTest.java create mode 100644 markwon/src/test/java/ru/noties/markwon/renderer/ImageSizeResolverDefTest.java create mode 100644 markwon/src/test/resources/tests/table.yaml diff --git a/markwon/src/main/java/ru/noties/markwon/UrlProcessorAndroidAssets.java b/markwon/src/main/java/ru/noties/markwon/UrlProcessorAndroidAssets.java index b2b09006..2a1544a9 100644 --- a/markwon/src/main/java/ru/noties/markwon/UrlProcessorAndroidAssets.java +++ b/markwon/src/main/java/ru/noties/markwon/UrlProcessorAndroidAssets.java @@ -8,8 +8,12 @@ import android.text.TextUtils; @SuppressWarnings({"unused", "WeakerAccess"}) public class UrlProcessorAndroidAssets implements UrlProcessor { + + static final String MOCK = "https://android.asset/"; + static final String BASE = "file:///android_asset/"; + private final UrlProcessorRelativeToAbsolute assetsProcessor - = new UrlProcessorRelativeToAbsolute("file:///android_asset/"); + = new UrlProcessorRelativeToAbsolute(MOCK); private final UrlProcessor processor; @@ -27,7 +31,7 @@ public class UrlProcessorAndroidAssets implements UrlProcessor { final String out; final Uri uri = Uri.parse(destination); if (TextUtils.isEmpty(uri.getScheme())) { - out = assetsProcessor.process(destination); + out = assetsProcessor.process(destination).replace(MOCK, BASE); } else { if (processor != null) { out = processor.process(destination); diff --git a/markwon/src/main/java/ru/noties/markwon/renderer/ImageSizeResolverDef.java b/markwon/src/main/java/ru/noties/markwon/renderer/ImageSizeResolverDef.java index 60710f71..ee843fb7 100644 --- a/markwon/src/main/java/ru/noties/markwon/renderer/ImageSizeResolverDef.java +++ b/markwon/src/main/java/ru/noties/markwon/renderer/ImageSizeResolverDef.java @@ -78,7 +78,7 @@ public class ImageSizeResolverDef extends ImageSizeResolver { if (UNIT_EM.equals(dimension.unit)) { out = (int) (dimension.value * textSize + .5F); } else { - out = original; + out = (int) (dimension.value + .5F); } return out; } diff --git a/markwon/src/main/java/ru/noties/markwon/renderer/SpannableMarkdownVisitor.java b/markwon/src/main/java/ru/noties/markwon/renderer/SpannableMarkdownVisitor.java index 38d283ac..3ce3db87 100644 --- a/markwon/src/main/java/ru/noties/markwon/renderer/SpannableMarkdownVisitor.java +++ b/markwon/src/main/java/ru/noties/markwon/renderer/SpannableMarkdownVisitor.java @@ -239,7 +239,7 @@ public class SpannableMarkdownVisitor extends AbstractVisitor { newLine(); final int length = builder.length(); - builder.append(' '); // without space it won't render + builder.append('\u00a0'); // without space it won't render setSpan(length, factory.thematicBreak(theme)); diff --git a/markwon/src/test/java/ru/noties/markwon/UrlProcessorAndroidAssetsTest.java b/markwon/src/test/java/ru/noties/markwon/UrlProcessorAndroidAssetsTest.java new file mode 100644 index 00000000..ecf31fd2 --- /dev/null +++ b/markwon/src/test/java/ru/noties/markwon/UrlProcessorAndroidAssetsTest.java @@ -0,0 +1,49 @@ +package ru.noties.markwon; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; + +import static org.junit.Assert.assertEquals; +import static ru.noties.markwon.UrlProcessorAndroidAssets.BASE; + +@RunWith(RobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class UrlProcessorAndroidAssetsTest { + + private UrlProcessorAndroidAssets processor; + + @Before + public void before() { + processor = new UrlProcessorAndroidAssets(); + } + + @Test + public void access_root() { + final String path = "/whoam.i"; + assertEquals( + BASE.substring(0, BASE.length() - 1) + path, + processor.process(path) + ); + } + + @Test + public void access_folder_without_modifier() { + final String path = "first/second/thi.rd"; + assertEquals( + BASE + path, + processor.process(path) + ); + } + + @Test + public void change_directory_inside_path() { + final String path = "first/../second/./thi.rd"; + assertEquals( + BASE + "second/thi.rd", + processor.process(path) + ); + } +} \ No newline at end of file diff --git a/markwon/src/test/java/ru/noties/markwon/UrlProcessorRelativeToAbsoluteTest.java b/markwon/src/test/java/ru/noties/markwon/UrlProcessorRelativeToAbsoluteTest.java new file mode 100644 index 00000000..05956f3b --- /dev/null +++ b/markwon/src/test/java/ru/noties/markwon/UrlProcessorRelativeToAbsoluteTest.java @@ -0,0 +1,61 @@ +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.*; + +@RunWith(RobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class UrlProcessorRelativeToAbsoluteTest { + + @Test + public void malformed_base_do_not_process() { + final UrlProcessorRelativeToAbsolute processor = new UrlProcessorRelativeToAbsolute("!@#$%^&*("); + final String destination = "../hey.there.html"; + assertEquals(destination, processor.process(destination)); + } + + @Test + public void access_root() { + final UrlProcessorRelativeToAbsolute processor = new UrlProcessorRelativeToAbsolute("https://ro.ot/hello/"); + final String url = "/index.html"; + assertEquals("https://ro.ot/index.html", processor.process(url)); + } + + @Test + public void access_same_directory() { + final UrlProcessorRelativeToAbsolute processor = new UrlProcessorRelativeToAbsolute("https://ro.ot/hello/"); + final String url = "./.htaccess"; + assertEquals("https://ro.ot/hello/.htaccess", processor.process(url)); + } + + @Test + public void asset_directory_up() { + final UrlProcessorRelativeToAbsolute processor = new UrlProcessorRelativeToAbsolute("http://ro.ot/first/second/"); + final String url = "../cat.JPG"; + assertEquals("http://ro.ot/first/cat.JPG", processor.process(url)); + } + + @Test + public void change_directory_inside_destination() { + final UrlProcessorRelativeToAbsolute processor = new UrlProcessorRelativeToAbsolute("http://ro.ot/first/"); + final String url = "../first/../second/./thi.rd"; + assertEquals( + "http://ro.ot/second/thi.rd", + processor.process(url) + ); + } + + @Test + public void with_query_arguments() { + final UrlProcessorRelativeToAbsolute processor = new UrlProcessorRelativeToAbsolute("http://ro.ot/first/"); + final String url = "../index.php?ROOT=1"; + assertEquals( + "http://ro.ot/index.php?ROOT=1", + processor.process(url) + ); + } +} \ No newline at end of file diff --git a/markwon/src/test/java/ru/noties/markwon/renderer/ImageSizeResolverDefTest.java b/markwon/src/test/java/ru/noties/markwon/renderer/ImageSizeResolverDefTest.java new file mode 100644 index 00000000..f1a00900 --- /dev/null +++ b/markwon/src/test/java/ru/noties/markwon/renderer/ImageSizeResolverDefTest.java @@ -0,0 +1,132 @@ +package ru.noties.markwon.renderer; + +import android.graphics.Rect; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; + +import ru.noties.markwon.renderer.ImageSize.Dimension; + +import static org.junit.Assert.*; +import static ru.noties.markwon.renderer.ImageSizeResolverDef.UNIT_EM; +import static ru.noties.markwon.renderer.ImageSizeResolverDef.UNIT_PERCENT; + +@RunWith(RobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class ImageSizeResolverDefTest { + + private ImageSizeResolverDef def; + + @Before + public void before() { + def = new ImageSizeResolverDef(); + } + + @Test + public void no_image_size() { + // no image size returns image original bounds + final Rect rect = new Rect(0, 0, 15, 43); + assertEquals(rect, def.resolveImageSize(null, rect, -1, Float.NaN)); + } + + @Test + public void height_percent_not_used() { + final Rect rect = new Rect(1, 2, 3, 4); + assertEquals( + rect, + def.resolveImageSize( + new ImageSize(null, new Dimension(100.F, UNIT_PERCENT)), + rect, + -1, + Float.NaN + ) + ); + } + + @Test + public void width_percent_scales_keeps_ratio() { + final Rect rect = new Rect(0, 0, 10, 20); + assertEquals( + new Rect(0, 0, 50, 100), + def.resolveImageSize( + new ImageSize(new Dimension(50.F, UNIT_PERCENT), null), + rect, + 100, + Float.NaN + ) + ); + } + + @Test + public void unknown_dimension_considered_absolute() { + final Rect rect = new Rect(0, 0, 22, 33); + assertEquals( + new Rect(0,0,7,9), + def.resolveImageSize( + new ImageSize(new Dimension(7, "width"), new Dimension(9, "height")), + rect, + -1, + Float.NaN + ) + ); + } + + @Test + public void width_height_text_size_relative() { + final Rect rect = new Rect(0, 0, 100, 200); + assertEquals( + new Rect(0, 0, 20, 40), + def.resolveImageSize( + new ImageSize(new Dimension(2.f, UNIT_EM), new Dimension(4.F, UNIT_EM)), + rect, + -1, + 10.F + ) + ); + } + + @Test + public void width_text_size_relative_height_keeps_ratio() { + final Rect rect = new Rect(0, 0, 15, 30); + assertEquals( + new Rect(0, 0, 10, 20), + def.resolveImageSize( + new ImageSize(new Dimension(1.F, UNIT_EM), null), + rect, + -1, + 10.F + ) + ); + } + + @Test + public void absolute_height_keeps_width_ratio() { + final Rect rect = new Rect(0, 0, 50, 25); + assertEquals( + new Rect(0, 0, 100, 50), + def.resolveImageSize( + new ImageSize(null, new Dimension(50, "px")), + rect, + -1, + Float.NaN + ) + ); + } + + @Test + public void relative_text_size_height_keeps_width_ratio() { + final Rect rect = new Rect(0, 0, 4, 12); + assertEquals( + new Rect(0, 0, 10, 30), + def.resolveImageSize( + new ImageSize(null, new Dimension(3.F, UNIT_EM)), + rect, + -1, + 10.F + ) + ); + } +} \ No newline at end of file diff --git a/markwon/src/test/java/ru/noties/markwon/renderer/visitor/SpannableMarkdownVisitorTest.java b/markwon/src/test/java/ru/noties/markwon/renderer/visitor/SpannableMarkdownVisitorTest.java index 2d3e12a4..1d2f7e73 100644 --- a/markwon/src/test/java/ru/noties/markwon/renderer/visitor/SpannableMarkdownVisitorTest.java +++ b/markwon/src/test/java/ru/noties/markwon/renderer/visitor/SpannableMarkdownVisitorTest.java @@ -60,7 +60,7 @@ public class SpannableMarkdownVisitorTest { final SpannableStringBuilder stringBuilder = builder.spannableStringBuilder(); - System.out.printf("%s: %s%n", file, Arrays.toString(stringBuilder.getSpans(0, stringBuilder.length(), Object.class))); +// System.out.printf("%s: %s%n", file, Arrays.toString(stringBuilder.getSpans(0, stringBuilder.length(), Object.class))); int index = 0; @@ -113,7 +113,7 @@ public class SpannableMarkdownVisitorTest { final String info = node.toString(); - System.out.printf("%s: %s%n", file, builder.subSequence(index, out)); +// System.out.printf("%s: %s%n", file, builder.subSequence(index, out)); // we can possibly have parent spans here, should filter them final Object[] spans = builder.getSpans(index, out, Object.class); @@ -148,6 +148,8 @@ public class SpannableMarkdownVisitorTest { assertEquals(info, index, builder.getSpanStart(testSpan)); assertEquals(info, out, builder.getSpanEnd(testSpan)); + System.out.printf("%s: expected: %s, actual: %s%n", file, span.attributes(), testSpan.attributes()); + assertMapEquals(info, span.attributes(), testSpan.attributes()); return out; @@ -175,8 +177,8 @@ public class SpannableMarkdownVisitorTest { @NonNull String message, @NonNull Map expected, @NonNull Map actual) { - boolean result = true; - if (expected.size() == actual.size()) { + boolean result = expected.size() == actual.size(); + if (result) { for (Map.Entry entry : expected.entrySet()) { if (!actual.containsKey(entry.getKey()) || !equals(entry.getValue(), actual.get(entry.getKey()))) { diff --git a/markwon/src/test/java/ru/noties/markwon/renderer/visitor/TestDataReader.java b/markwon/src/test/java/ru/noties/markwon/renderer/visitor/TestDataReader.java index c994e592..5d84e7c7 100644 --- a/markwon/src/test/java/ru/noties/markwon/renderer/visitor/TestDataReader.java +++ b/markwon/src/test/java/ru/noties/markwon/renderer/visitor/TestDataReader.java @@ -30,6 +30,7 @@ import java.util.Set; import ix.Ix; import ix.IxFunction; import ix.IxPredicate; +import ru.noties.markwon.spans.TableRowSpan; import static ru.noties.markwon.renderer.visitor.TestSpan.BLOCK_QUOTE; import static ru.noties.markwon.renderer.visitor.TestSpan.BULLET_LIST; @@ -102,6 +103,7 @@ abstract class TestDataReader { static class Reader { private static final String TEXT = "text"; + private static final String CELLS = "cells"; private static final Set TAGS; @@ -240,7 +242,23 @@ abstract class TestDataReader { if (valueElement.isJsonNull()) { value = null; } else { - value = valueElement.getAsString(); + // another special case: table cell + // this is not so good + if (CELLS.equals(key)) { + final JsonArray cells = valueElement.getAsJsonArray(); + final int length = cells.size(); + final List list = new ArrayList<>(length); + for (int k = 0; k < length; k++) { + final JsonObject cell = cells.get(k).getAsJsonObject(); + list.add(new TableRowSpan.Cell( + cell.get("alignment").getAsInt(), + cell.get("text").getAsString() + )); + } + value = list.toString(); + } else { + value = valueElement.getAsString(); + } } attributes.put(key, value); } diff --git a/markwon/src/test/resources/tests/html.yaml b/markwon/src/test/resources/tests/html.yaml index a1eb063e..7db7243f 100644 --- a/markwon/src/test/resources/tests/html.yaml +++ b/markwon/src/test/resources/tests/html.yaml @@ -71,8 +71,10 @@ output: - h2: "unordered-list" - text: "\n" - ul: "ul1" + level: 0 - text: "\n" - ul: "ul2" + level: 0 - text: "\n" - h2: "ordered-list" - text: "\n" @@ -86,6 +88,8 @@ output: - text: "\n" - img: "img" src: "img://src" + imageSize: null + replacementTextIsLink: false - text: "\n" - h2: "blockquote" - text: "\n" diff --git a/markwon/src/test/resources/tests/single-hr.yaml b/markwon/src/test/resources/tests/single-hr.yaml index 7d457b51..86bb106a 100644 --- a/markwon/src/test/resources/tests/single-hr.yaml +++ b/markwon/src/test/resources/tests/single-hr.yaml @@ -4,4 +4,4 @@ input: "---" output: - - hr: " " \ No newline at end of file + - hr: "\u00a0" \ No newline at end of file diff --git a/markwon/src/test/resources/tests/single-tr.yaml b/markwon/src/test/resources/tests/single-tr.yaml index aafcd2ac..6ca92909 100644 --- a/markwon/src/test/resources/tests/single-tr.yaml +++ b/markwon/src/test/resources/tests/single-tr.yaml @@ -1,4 +1,13 @@ -input: "table-table-table" +input: "col1|col2|col3\n---|---|---|" output: - - text: "should fail as we are to decide how to pass info here" \ No newline at end of file + - tr: "\u00a0" + header: true + odd: false + cells: + - alignment: 0 + text: "col1" + - alignment: 0 + text: "col2" + - alignment: 0 + text: "col3" \ No newline at end of file diff --git a/markwon/src/test/resources/tests/table.yaml b/markwon/src/test/resources/tests/table.yaml new file mode 100644 index 00000000..96d8236f --- /dev/null +++ b/markwon/src/test/resources/tests/table.yaml @@ -0,0 +1,51 @@ +input: |- + head1|head2|head3 + ---|:---:|---: + row1-col1|row1-col2|row1-col3 + row2-col1|row2-col2|row2-col3 + row3-col1|row3-col2|row3-col3 + +output: + - tr: "\u00a0" + header: true + odd: false + cells: + - alignment: 0 + text: "head1" + - alignment: 1 + text: "head2" + - alignment: 2 + text: "head3" + - text: "\n" + - tr: "\u00a0" + header: false + odd: false + cells: + - alignment: 0 + text: "row1-col1" + - alignment: 1 + text: "row1-col2" + - alignment: 2 + text: "row1-col3" + - text: "\n" + - tr: "\u00a0" + header: false + odd: true + cells: + - alignment: 0 + text: "row2-col1" + - alignment: 1 + text: "row2-col2" + - alignment: 2 + text: "row2-col3" + - text: "\n" + - tr: "\u00a0" + header: false + odd: false + cells: + - alignment: 0 + text: "row3-col1" + - alignment: 1 + text: "row3-col2" + - alignment: 2 + text: "row3-col3" \ No newline at end of file