Upload files to "java/markup"
This commit is contained in:
102
java/markup/MarkupTester.java
Normal file
102
java/markup/MarkupTester.java
Normal file
@@ -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<String, String> mapping;
|
||||||
|
private final String toString;
|
||||||
|
|
||||||
|
private MarkupTester(
|
||||||
|
final Map<String, String> mapping,
|
||||||
|
final String toString
|
||||||
|
) {
|
||||||
|
this.mapping = mapping;
|
||||||
|
this.toString = toString;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Consumer<TestCounter> variant(
|
||||||
|
final Consumer<Checker> checker,
|
||||||
|
final String name,
|
||||||
|
final Map<String, String> mapping
|
||||||
|
) {
|
||||||
|
return counter ->
|
||||||
|
test(checker).accept(
|
||||||
|
new MarkupTester(mapping, "to" + name),
|
||||||
|
counter
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BiConsumer<MarkupTester, TestCounter> test(
|
||||||
|
final Consumer<Checker> 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 <T> 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 <T> void test(final T value, String expectedTemplate) {
|
||||||
|
final MethodHandle method = findMethod(value);
|
||||||
|
for (final Map.Entry<String, String> 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());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
13
java/markup/OrderedList.java
Normal file
13
java/markup/OrderedList.java
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
package markup;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Nikita Doschennikov (me@fymio.us)
|
||||||
|
*/
|
||||||
|
public class OrderedList extends AbstractList {
|
||||||
|
|
||||||
|
public OrderedList(List<ListItem> items) {
|
||||||
|
super(items, "ol", "\\begin{enumerate}", "\\end{enumerate}");
|
||||||
|
}
|
||||||
|
}
|
||||||
16
java/markup/Paragraph.java
Normal file
16
java/markup/Paragraph.java
Normal file
@@ -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<PartOfParagraph> items) {
|
||||||
|
super(items, "", "p", "\\par{}", "");
|
||||||
|
}
|
||||||
|
}
|
||||||
6
java/markup/PartOfParagraph.java
Normal file
6
java/markup/PartOfParagraph.java
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
package markup;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Nikita Doschennikov (me@fymio.us)
|
||||||
|
*/
|
||||||
|
public interface PartOfParagraph extends Markup {}
|
||||||
7
java/markup/package-info.java
Normal file
7
java/markup/package-info.java
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
/**
|
||||||
|
* Tests for <a href="https://www.kgeorgiy.info/courses/prog-intro/homeworks.html#markup">Markup</a> homework
|
||||||
|
* of <a href="https://www.kgeorgiy.info/courses/prog-intro/">Introduction to Programming</a> course.
|
||||||
|
*
|
||||||
|
* @author Georgiy Korneev (kgeorgiy@kgeorgiy.info)
|
||||||
|
*/
|
||||||
|
package markup;
|
||||||
Reference in New Issue
Block a user