add solutions for hw7 (markup) and tests
Some checks failed
Fast Reverse Tests / test (push) Failing after 17s
Markup Tests / test (push) Failing after 13s
Reverse Tests / test (push) Failing after 13s
Sum Tests / test (push) Failing after 13s
Word Stat Tests / test (push) Failing after 13s
Word Stat++ Tests / test (push) Failing after 13s
Some checks failed
Fast Reverse Tests / test (push) Failing after 17s
Markup Tests / test (push) Failing after 13s
Reverse Tests / test (push) Failing after 13s
Sum Tests / test (push) Failing after 13s
Word Stat Tests / test (push) Failing after 13s
Word Stat++ Tests / test (push) Failing after 13s
This commit is contained in:
22
.gitea/workflows/markup.yml
Normal file
22
.gitea/workflows/markup.yml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
name: Markup Tests
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Compile Java
|
||||||
|
run: |
|
||||||
|
mkdir -p out
|
||||||
|
javac -d out $(find java -name "*.java")
|
||||||
|
|
||||||
|
- name: Run Markup tests
|
||||||
|
run: |
|
||||||
|
java -ea -cp out markup.MarkupTest Base 3233 3435 3637 3839 4142 4749
|
||||||
35
java/markup/AbstractMarkup.java
Normal file
35
java/markup/AbstractMarkup.java
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
package markup;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public abstract class AbstractMarkup implements MarkupElement {
|
||||||
|
protected final List<MarkupElement> elements;
|
||||||
|
|
||||||
|
public AbstractMarkup(List<MarkupElement> elements) {
|
||||||
|
this.elements = elements;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void toMarkdown(StringBuilder sb, String delimiter) {
|
||||||
|
sb.append(delimiter);
|
||||||
|
for (MarkupElement element : elements) {
|
||||||
|
element.toMarkdown(sb);
|
||||||
|
}
|
||||||
|
sb.append(delimiter);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void toHtml(StringBuilder sb, String tag) {
|
||||||
|
sb.append("<").append(tag).append(">");
|
||||||
|
for (MarkupElement element : elements) {
|
||||||
|
element.toHtml(sb);
|
||||||
|
}
|
||||||
|
sb.append("</").append(tag).append(">");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void toTex(StringBuilder sb, String command) {
|
||||||
|
sb.append(command).append("{");
|
||||||
|
for (MarkupElement element : elements) {
|
||||||
|
element.toTex(sb);
|
||||||
|
}
|
||||||
|
sb.append("}");
|
||||||
|
}
|
||||||
|
}
|
||||||
24
java/markup/Emphasis.java
Normal file
24
java/markup/Emphasis.java
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
package markup;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class Emphasis extends AbstractMarkup {
|
||||||
|
public Emphasis(List<MarkupElement> elements) {
|
||||||
|
super(elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void toMarkdown(StringBuilder sb) {
|
||||||
|
toMarkdown(sb, "*");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void toHtml(StringBuilder sb) {
|
||||||
|
toHtml(sb, "em");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void toTex(StringBuilder sb) {
|
||||||
|
toTex(sb, "\\emph");
|
||||||
|
}
|
||||||
|
}
|
||||||
6
java/markup/ListElement.java
Normal file
6
java/markup/ListElement.java
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
package markup;
|
||||||
|
|
||||||
|
public interface ListElement {
|
||||||
|
void toHtml(StringBuilder sb);
|
||||||
|
void toTex(StringBuilder sb);
|
||||||
|
}
|
||||||
26
java/markup/ListItem.java
Normal file
26
java/markup/ListItem.java
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
package markup;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class ListItem {
|
||||||
|
private final List<ListItemContent> elements;
|
||||||
|
|
||||||
|
public ListItem(List<ListItemContent> elements) {
|
||||||
|
this.elements = elements;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void toHtml(StringBuilder sb) {
|
||||||
|
sb.append("<li>");
|
||||||
|
for (ListItemContent element : elements) {
|
||||||
|
element.toHtml(sb);
|
||||||
|
}
|
||||||
|
sb.append("</li>");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void toTex(StringBuilder sb) {
|
||||||
|
sb.append("\\item ");
|
||||||
|
for (ListItemContent element : elements) {
|
||||||
|
element.toTex(sb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
6
java/markup/ListItemContent.java
Normal file
6
java/markup/ListItemContent.java
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
package markup;
|
||||||
|
|
||||||
|
public interface ListItemContent {
|
||||||
|
void toHtml(StringBuilder sb);
|
||||||
|
void toTex(StringBuilder sb);
|
||||||
|
}
|
||||||
7
java/markup/MarkupElement.java
Normal file
7
java/markup/MarkupElement.java
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
package markup;
|
||||||
|
|
||||||
|
public interface MarkupElement {
|
||||||
|
void toMarkdown(StringBuilder sb);
|
||||||
|
void toHtml(StringBuilder sb);
|
||||||
|
void toTex(StringBuilder sb);
|
||||||
|
}
|
||||||
248
java/markup/MarkupListTest.java
Normal file
248
java/markup/MarkupListTest.java
Normal file
File diff suppressed because one or more lines are too long
97
java/markup/MarkupTest.java
Normal file
97
java/markup/MarkupTest.java
Normal file
File diff suppressed because one or more lines are too long
71
java/markup/MarkupTester.java
Normal file
71
java/markup/MarkupTester.java
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
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());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
29
java/markup/OrderedList.java
Normal file
29
java/markup/OrderedList.java
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
package markup;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class OrderedList implements ListItemContent {
|
||||||
|
private final List<ListItem> items;
|
||||||
|
|
||||||
|
public OrderedList(List<ListItem> items) {
|
||||||
|
this.items = items;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void toHtml(StringBuilder sb) {
|
||||||
|
sb.append("<ol>");
|
||||||
|
for (ListItem item : items) {
|
||||||
|
item.toHtml(sb);
|
||||||
|
}
|
||||||
|
sb.append("</ol>");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void toTex(StringBuilder sb) {
|
||||||
|
sb.append("\\begin{enumerate}");
|
||||||
|
for (ListItem item : items) {
|
||||||
|
item.toTex(sb);
|
||||||
|
}
|
||||||
|
sb.append("\\end{enumerate}");
|
||||||
|
}
|
||||||
|
}
|
||||||
29
java/markup/Paragraph.java
Normal file
29
java/markup/Paragraph.java
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
package markup;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class Paragraph extends AbstractMarkup implements ListItemContent {
|
||||||
|
public Paragraph(List<MarkupElement> elements) {
|
||||||
|
super(elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void toMarkdown(StringBuilder sb) {
|
||||||
|
for (MarkupElement element : elements) {
|
||||||
|
element.toMarkdown(sb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void toHtml(StringBuilder sb) {
|
||||||
|
toHtml(sb, "p");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void toTex(StringBuilder sb) {
|
||||||
|
sb.append("\\par{}");
|
||||||
|
for (MarkupElement element : elements) {
|
||||||
|
element.toTex(sb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
24
java/markup/Strong.java
Normal file
24
java/markup/Strong.java
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
package markup;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class Strong extends AbstractMarkup {
|
||||||
|
public Strong(List<MarkupElement> elements) {
|
||||||
|
super(elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void toMarkdown(StringBuilder sb) {
|
||||||
|
toMarkdown(sb, "__");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void toHtml(StringBuilder sb) {
|
||||||
|
toHtml(sb, "strong");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void toTex(StringBuilder sb) {
|
||||||
|
toTex(sb, "\\textbf");
|
||||||
|
}
|
||||||
|
}
|
||||||
24
java/markup/Text.java
Normal file
24
java/markup/Text.java
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
package markup;
|
||||||
|
|
||||||
|
public class Text implements MarkupElement {
|
||||||
|
private final String text;
|
||||||
|
|
||||||
|
public Text(String text) {
|
||||||
|
this.text = text;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void toMarkdown(StringBuilder sb) {
|
||||||
|
sb.append(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void toHtml(StringBuilder sb) {
|
||||||
|
sb.append(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void toTex(StringBuilder sb) {
|
||||||
|
sb.append(text);
|
||||||
|
}
|
||||||
|
}
|
||||||
29
java/markup/UnorderedList.java
Normal file
29
java/markup/UnorderedList.java
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
package markup;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class UnorderedList implements ListItemContent {
|
||||||
|
private final List<ListItem> items;
|
||||||
|
|
||||||
|
public UnorderedList(List<ListItem> items) {
|
||||||
|
this.items = items;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void toHtml(StringBuilder sb) {
|
||||||
|
sb.append("<ul>");
|
||||||
|
for (ListItem item : items) {
|
||||||
|
item.toHtml(sb);
|
||||||
|
}
|
||||||
|
sb.append("</ul>");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void toTex(StringBuilder sb) {
|
||||||
|
sb.append("\\begin{itemize}");
|
||||||
|
for (ListItem item : items) {
|
||||||
|
item.toTex(sb);
|
||||||
|
}
|
||||||
|
sb.append("\\end{itemize}");
|
||||||
|
}
|
||||||
|
}
|
||||||
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