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

This commit is contained in:
2026-02-04 20:26:02 +05:00
parent 238f8048e0
commit a1807aa84b
16 changed files with 684 additions and 0 deletions

View 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
View 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");
}
}

View 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
View 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);
}
}
}

View File

@@ -0,0 +1,6 @@
package markup;
public interface ListItemContent {
void toHtml(StringBuilder sb);
void toTex(StringBuilder sb);
}

View File

@@ -0,0 +1,7 @@
package markup;
public interface MarkupElement {
void toMarkdown(StringBuilder sb);
void toHtml(StringBuilder sb);
void toTex(StringBuilder sb);
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View 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());
});
}
}
}

View 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}");
}
}

View 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
View 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
View 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);
}
}

View 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}");
}
}

View 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;