From d5c3e10e2947e66a5da563cce6377a563b8002af Mon Sep 17 00:00:00 2001 From: codejava Date: Mon, 13 Apr 2026 10:47:55 +0300 Subject: [PATCH] Upload files to "java/markup" --- java/markup/MarkupTester.java | 102 +++++++++++++++++++++++++++++++ java/markup/OrderedList.java | 13 ++++ java/markup/Paragraph.java | 16 +++++ java/markup/PartOfParagraph.java | 6 ++ java/markup/package-info.java | 7 +++ 5 files changed, 144 insertions(+) create mode 100644 java/markup/MarkupTester.java create mode 100644 java/markup/OrderedList.java create mode 100644 java/markup/Paragraph.java create mode 100644 java/markup/PartOfParagraph.java create mode 100644 java/markup/package-info.java diff --git a/java/markup/MarkupTester.java b/java/markup/MarkupTester.java new file mode 100644 index 0000000..344e4cf --- /dev/null +++ b/java/markup/MarkupTester.java @@ -0,0 +1,102 @@ +package markup; + +import base.Asserts; +import base.BaseChecker; +import base.TestCounter; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.util.Map; +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +/** + * @author Georgiy Korneev (kgeorgiy@kgeorgiy.info) + */ +public final class MarkupTester { + + private final Map mapping; + private final String toString; + + private MarkupTester( + final Map mapping, + final String toString + ) { + this.mapping = mapping; + this.toString = toString; + } + + public static Consumer variant( + final Consumer checker, + final String name, + final Map mapping + ) { + return counter -> + test(checker).accept( + new MarkupTester(mapping, "to" + name), + counter + ); + } + + public static BiConsumer test( + final Consumer tester + ) { + return (checker, counter) -> + tester.accept(checker.new Checker(counter)); + } + + @Override + public String toString() { + return toString; + } + + public class Checker extends BaseChecker { + + public Checker(final TestCounter counter) { + super(counter); + } + + private MethodHandle findMethod(final T value) { + try { + return MethodHandles.publicLookup().findVirtual( + value.getClass(), + toString, + MethodType.methodType(void.class, StringBuilder.class) + ); + } catch (final NoSuchMethodException | IllegalAccessException e) { + throw Asserts.error( + "Cannot find method 'void %s(StringBuilder)' for %s", + toString, + value.getClass() + ); + } + } + + public void test(final T value, String expectedTemplate) { + final MethodHandle method = findMethod(value); + for (final Map.Entry entry : mapping.entrySet()) { + expectedTemplate = expectedTemplate.replace( + entry.getKey(), + entry.getValue() + ); + } + + final String expected = expectedTemplate; + counter.println("Test " + counter.getTestNo()); + counter.test(() -> { + final StringBuilder sb = new StringBuilder(); + try { + method.invoke(value, sb); + } catch (final Throwable e) { + throw Asserts.error( + "%s(StringBuilder) for %s thrown exception: %s", + toString, + value.getClass(), + e + ); + } + Asserts.assertEquals("Result", expected, sb.toString()); + }); + } + } +} diff --git a/java/markup/OrderedList.java b/java/markup/OrderedList.java new file mode 100644 index 0000000..1c170ca --- /dev/null +++ b/java/markup/OrderedList.java @@ -0,0 +1,13 @@ +package markup; + +import java.util.List; + +/** + * @author Nikita Doschennikov (me@fymio.us) + */ +public class OrderedList extends AbstractList { + + public OrderedList(List items) { + super(items, "ol", "\\begin{enumerate}", "\\end{enumerate}"); + } +} diff --git a/java/markup/Paragraph.java b/java/markup/Paragraph.java new file mode 100644 index 0000000..f5a0d33 --- /dev/null +++ b/java/markup/Paragraph.java @@ -0,0 +1,16 @@ +package markup; + +import java.util.List; + +/** + * @author Nikita Doschennikov (me@fymio.us) + */ +public class Paragraph + extends AbstractMarkup + implements ContainsInListItem, PrimePart +{ + + public Paragraph(List items) { + super(items, "", "p", "\\par{}", ""); + } +} diff --git a/java/markup/PartOfParagraph.java b/java/markup/PartOfParagraph.java new file mode 100644 index 0000000..fdcbfa0 --- /dev/null +++ b/java/markup/PartOfParagraph.java @@ -0,0 +1,6 @@ +package markup; + +/** + * @author Nikita Doschennikov (me@fymio.us) + */ +public interface PartOfParagraph extends Markup {} diff --git a/java/markup/package-info.java b/java/markup/package-info.java new file mode 100644 index 0000000..b997b83 --- /dev/null +++ b/java/markup/package-info.java @@ -0,0 +1,7 @@ +/** + * Tests for Markup homework + * of Introduction to Programming course. + * + * @author Georgiy Korneev (kgeorgiy@kgeorgiy.info) + */ +package markup;