Upload files to "java/wordStat"
This commit is contained in:
249
java/wordStat/WordStatTester.java
Normal file
249
java/wordStat/WordStatTester.java
Normal file
@@ -0,0 +1,249 @@
|
|||||||
|
package wordStat;
|
||||||
|
|
||||||
|
import base.ExtendedRandom;
|
||||||
|
import base.Named;
|
||||||
|
import base.Pair;
|
||||||
|
import base.TestCounter;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.IntStream;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Georgiy Korneev (kgeorgiy@kgeorgiy.info)
|
||||||
|
*/
|
||||||
|
public final class WordStatTester {
|
||||||
|
|
||||||
|
public static final String PRE_LOWER = chars()
|
||||||
|
.filter(s -> s.toLowerCase(Locale.ROOT).length() == 1)
|
||||||
|
.collect(Collectors.joining());
|
||||||
|
public static final String POST_LOWER = chars()
|
||||||
|
.collect(Collectors.joining())
|
||||||
|
.toLowerCase();
|
||||||
|
|
||||||
|
private WordStatTester() {}
|
||||||
|
|
||||||
|
private static Stream<String> chars() {
|
||||||
|
return IntStream.range(' ', Character.MAX_VALUE)
|
||||||
|
.filter(ch -> !Character.isSurrogate((char) ch))
|
||||||
|
.filter(ch -> Character.getType(ch) != Character.NON_SPACING_MARK)
|
||||||
|
.filter(
|
||||||
|
ch ->
|
||||||
|
Character.getType(ch) !=
|
||||||
|
Character.DIRECTIONALITY_NONSPACING_MARK
|
||||||
|
)
|
||||||
|
.mapToObj(Character::toString);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* package-private */ record Variant(
|
||||||
|
String name,
|
||||||
|
boolean reverse,
|
||||||
|
Comparator<Pair<String, Integer>> c
|
||||||
|
) {
|
||||||
|
public Consumer<TestCounter> with(
|
||||||
|
final Named<Function<String, Stream<String>>> split
|
||||||
|
) {
|
||||||
|
return counter ->
|
||||||
|
WordStatChecker.test(
|
||||||
|
counter,
|
||||||
|
"WordStat" + name + split.name(),
|
||||||
|
text -> answer(split.value(), text),
|
||||||
|
checker -> {
|
||||||
|
checker.test(
|
||||||
|
"To be, or not to be, that is the question:"
|
||||||
|
);
|
||||||
|
checker.test(
|
||||||
|
"Monday's child is fair of face.",
|
||||||
|
"Tuesday's child is full of grace."
|
||||||
|
);
|
||||||
|
checker.test(
|
||||||
|
"Шалтай-Болтай",
|
||||||
|
"Сидел на стене.",
|
||||||
|
"Шалтай-Болтай",
|
||||||
|
"Свалился во сне."
|
||||||
|
);
|
||||||
|
checker.test(
|
||||||
|
"27 октября — 300-й день григорианскому календарю. До конца года остаётся 65 дней.",
|
||||||
|
"До 15 октября 1582 года — 27 октября по юлианскому календарю, с 15 октября 1582 года — 27 октября по григорианскому календарю.",
|
||||||
|
"В XX и XXI веках соответствует 14 октября по юлианскому календарю[1].",
|
||||||
|
"(c) Wikipedia"
|
||||||
|
);
|
||||||
|
checker.test(
|
||||||
|
"23 октября — Всемирный день психического здоровья",
|
||||||
|
"Тема 2025 года: Психическое здоровье на рабочем месте"
|
||||||
|
);
|
||||||
|
|
||||||
|
checker.randomTest(
|
||||||
|
3,
|
||||||
|
10,
|
||||||
|
10,
|
||||||
|
3,
|
||||||
|
ExtendedRandom.ENGLISH,
|
||||||
|
WordStatChecker.SIMPLE_DELIMITERS
|
||||||
|
);
|
||||||
|
checker.randomTest(
|
||||||
|
10,
|
||||||
|
3,
|
||||||
|
5,
|
||||||
|
5,
|
||||||
|
ExtendedRandom.RUSSIAN,
|
||||||
|
WordStatChecker.SIMPLE_DELIMITERS
|
||||||
|
);
|
||||||
|
checker.randomTest(
|
||||||
|
4,
|
||||||
|
10,
|
||||||
|
10,
|
||||||
|
3,
|
||||||
|
ExtendedRandom.GREEK,
|
||||||
|
WordStatChecker.SIMPLE_DELIMITERS
|
||||||
|
);
|
||||||
|
checker.randomTest(
|
||||||
|
4,
|
||||||
|
10,
|
||||||
|
10,
|
||||||
|
3,
|
||||||
|
WordStatChecker.DASH,
|
||||||
|
WordStatChecker.SIMPLE_DELIMITERS
|
||||||
|
);
|
||||||
|
checker.randomTest(
|
||||||
|
3,
|
||||||
|
10,
|
||||||
|
10,
|
||||||
|
3,
|
||||||
|
ExtendedRandom.ENGLISH,
|
||||||
|
WordStatChecker.ADVANCED_DELIMITERS
|
||||||
|
);
|
||||||
|
checker.randomTest(
|
||||||
|
10,
|
||||||
|
3,
|
||||||
|
5,
|
||||||
|
5,
|
||||||
|
ExtendedRandom.RUSSIAN,
|
||||||
|
WordStatChecker.ADVANCED_DELIMITERS
|
||||||
|
);
|
||||||
|
checker.randomTest(
|
||||||
|
3,
|
||||||
|
10,
|
||||||
|
10,
|
||||||
|
3,
|
||||||
|
ExtendedRandom.GREEK,
|
||||||
|
WordStatChecker.ADVANCED_DELIMITERS
|
||||||
|
);
|
||||||
|
checker.randomTest(
|
||||||
|
3,
|
||||||
|
10,
|
||||||
|
10,
|
||||||
|
3,
|
||||||
|
WordStatChecker.DASH,
|
||||||
|
WordStatChecker.ADVANCED_DELIMITERS
|
||||||
|
);
|
||||||
|
checker.randomTest(
|
||||||
|
3,
|
||||||
|
10,
|
||||||
|
10,
|
||||||
|
10,
|
||||||
|
WordStatChecker.ALL,
|
||||||
|
WordStatChecker.ADVANCED_DELIMITERS
|
||||||
|
);
|
||||||
|
|
||||||
|
final int d = TestCounter.DENOMINATOR;
|
||||||
|
final int d2 = TestCounter.DENOMINATOR;
|
||||||
|
checker.randomTest(
|
||||||
|
10,
|
||||||
|
10000 / d,
|
||||||
|
10,
|
||||||
|
10,
|
||||||
|
WordStatChecker.ALL,
|
||||||
|
WordStatChecker.ADVANCED_DELIMITERS
|
||||||
|
);
|
||||||
|
checker.randomTest(
|
||||||
|
10,
|
||||||
|
1,
|
||||||
|
10,
|
||||||
|
10,
|
||||||
|
WordStatChecker.ALL,
|
||||||
|
WordStatChecker.ADVANCED_DELIMITERS
|
||||||
|
);
|
||||||
|
checker.randomTest(
|
||||||
|
10,
|
||||||
|
1000 / d,
|
||||||
|
100 / d2,
|
||||||
|
100 / d2,
|
||||||
|
WordStatChecker.ALL,
|
||||||
|
WordStatChecker.ADVANCED_DELIMITERS
|
||||||
|
);
|
||||||
|
checker.randomTest(
|
||||||
|
4,
|
||||||
|
1000 / d,
|
||||||
|
10,
|
||||||
|
3000 / d,
|
||||||
|
WordStatChecker.ALL,
|
||||||
|
WordStatChecker.ADVANCED_DELIMITERS
|
||||||
|
);
|
||||||
|
checker.randomTest(
|
||||||
|
4,
|
||||||
|
1000 / d,
|
||||||
|
3000 / d,
|
||||||
|
10,
|
||||||
|
WordStatChecker.ALL,
|
||||||
|
WordStatChecker.ADVANCED_DELIMITERS
|
||||||
|
);
|
||||||
|
checker.randomTest(
|
||||||
|
10000 / d,
|
||||||
|
20,
|
||||||
|
10,
|
||||||
|
5,
|
||||||
|
WordStatChecker.ALL,
|
||||||
|
WordStatChecker.ADVANCED_DELIMITERS
|
||||||
|
);
|
||||||
|
checker.randomTest(
|
||||||
|
1000000 / d,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
WordStatChecker.ALL,
|
||||||
|
WordStatChecker.ADVANCED_DELIMITERS
|
||||||
|
);
|
||||||
|
|
||||||
|
checker.test(PRE_LOWER);
|
||||||
|
checker.test(POST_LOWER);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Pair<String, Integer>> answer(
|
||||||
|
final Function<String, Stream<String>> split,
|
||||||
|
final String[][] text
|
||||||
|
) {
|
||||||
|
final List<String> parts = Arrays.stream(text)
|
||||||
|
.flatMap(Arrays::stream)
|
||||||
|
.filter(Predicate.not(String::isEmpty))
|
||||||
|
.flatMap(split)
|
||||||
|
.peek(s -> {
|
||||||
|
assert !s.isBlank();
|
||||||
|
})
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
if (reverse()) {
|
||||||
|
Collections.reverse(parts);
|
||||||
|
}
|
||||||
|
return parts
|
||||||
|
.stream()
|
||||||
|
.collect(
|
||||||
|
Collectors.toMap(
|
||||||
|
String::toLowerCase,
|
||||||
|
v -> 1,
|
||||||
|
Integer::sum,
|
||||||
|
LinkedHashMap::new
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.entrySet()
|
||||||
|
.stream()
|
||||||
|
.map(Pair::of)
|
||||||
|
.sorted(c)
|
||||||
|
.toList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user