package wikokit.base.wikt.multi.ru;
import wikokit.base.wikt.multi.ru.WMeaningRu;
import wikokit.base.wikt.constant.POS;
import wikokit.base.wikt.util.WikiWord;
import wikokit.base.wikt.word.WQuote;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;
import wikokit.base.wikipedia.language.LanguageType;
import wikokit.base.wikt.constant.Label;
import wikokit.base.wikt.multi.en.name.LabelEn;
import wikokit.base.wikt.multi.ru.name.LabelRu;
import wikokit.base.wikt.util.POSText;
import wikokit.base.wikt.word.WMeaning;
public class WMeaningRuTest {
public WMeaningRuTest() {
}
@BeforeClass
public static void setUpClass() throws Exception {
}
@AfterClass
public static void tearDownClass() throws Exception {
}
@Before
public void setUp() {
}
@After
public void tearDown() {
}
@Test
public void testParseOneDefinition_ru() {
System.out.println("parseOneDefinition_ru");
LanguageType lang_section;
String page_title;
String line;
page_title = "самолёт";
lang_section = LanguageType.ru; // Russian word
Label[] _labels = new Label[0]; //_labels[0] = LabelRu.p;
String _definition_wiki = "летательный [[аппарат]] тяжелее [[воздух]]а с жёстким [[крыло]]м и собственным [[мотор]]ом";
String _definition = "летательный аппарат тяжелее воздуха с жёстким крылом и собственным мотором";
WikiWord[] ww = new WikiWord[4];
//WikiWord(String _word_visible, String _word_link, ContextLabel[] _labels) {
// [[аппарат]] тяжелее [[воздух]]а с жёстким [[крыло]]м и собственным [[мотор]]ом
ww[0] = new WikiWord("аппарат", "аппарат", null);
ww[1] = new WikiWord("воздух", "воздуха", null);
ww[2] = new WikiWord("крыло", "крылом", null);
ww[3] = new WikiWord("мотор", "мотором", null);
WQuote[] _quote = null;
//WMeaning expResult = new WMeaning(page_title, _labels, _definition_wiki, _quote, false); // expResult[0] = new WMeaning();
line = "# летательный [[аппарат]] тяжелее [[воздух]]а с жёстким [[крыло]]м и собственным [[мотор]]ом {{пример|Самолёт-истребитель.}} {{пример|Военный cамолёт.}} {{пример|Эскадрилья самолётов.}}";
WMeaning result = WMeaningRu.parseOneDefinition(page_title, lang_section, line);
assertTrue(null != result);
assertTrue(result.getDefinition().equalsIgnoreCase(_definition));
assertTrue(result.getWikifiedText().equalsIgnoreCase(_definition_wiki));
// labels == null
Label[] labels_result = result.getLabels();
assertEquals(0, labels_result.length);
// wikiword.size = 4;
WikiWord[] ww_result = result.getWikiWords();
assertEquals(4, ww_result.length);
}
@Test
public void testParseOneDefinition_ru_meaning_emtpy() {
System.out.println("parse_OneDefinition_ru_meaning_emtpy");
System.out.println("parseOneDefinition_ru");
LanguageType lang_section;
String page_title;
String line;
page_title = "самолёт";
lang_section = LanguageType.ru; // Russian word
Label[] _labels = new Label[0]; //_labels[0] = LabelRu.p;
WikiWord[] ww = new WikiWord[4];
WQuote[] _quote = null;
// empty definition:
line = "# ";
WMeaning result = WMeaningRu.parseOneDefinition(page_title, lang_section, line);
assertTrue(null == result);
// test 2
// empty definition with empty example:
line = "# {{пример|}}";
result = WMeaningRu.parseOneDefinition(page_title, lang_section, line);
assertTrue(null == result);
// test 3
// empty definition with very empty example:
line = "# {{пример}}";
result = WMeaningRu.parseOneDefinition(page_title, lang_section, line);
assertTrue(null == result);
}
@Test
public void testParseOneDefinition_morpheme_template() {
System.out.println("parseOneDefinition_morpheme_template_ru");
LanguageType lang_section;
String page_title;
String line;
page_title = "-ейш-";
lang_section = LanguageType.ru; // Russian word
// test 1
line = "# {{морфема|удар=|часть=основе прилагательного в [[положительная степень|положительной степени]]|образует=его [[превосходная степень|превосходную степень]]|знач=наивысшей степени качества}} {{пример|[[храбрый]] → [[храбрейший|храбр{{выдел|ейш}}ий]]}} {{пример|[[важный]] → [[важнейший|важн{{выдел|ейш}}ий]]}} ‖ иногда суффикс присоединяется вместе с приставкой [[наи-]] {{пример|[[красивый]] → [[наикрасивейший|{{выдел|наи}}красив{{выдел|ейш}}ий]]}}";
WMeaning result = WMeaningRu.parseOneDefinition(page_title, lang_section, line);
// skip now, todo (parse) in future
assertTrue(null == result);
// test 2
lang_section = LanguageType.tt; // Tatar word
line = "# {{морфема tt|часть=существительному, прилагательному, числительному|ряд=зад|образует=существительные|знач=«абстракции, множества, группы объектов»}}";
result = WMeaningRu.parseOneDefinition(page_title, lang_section, line);
assertTrue(null == result);
}
// Remove a temporary empty label {{помета?|XX}}, where XX - language code
@Test
public void testParse_skip_temporary_empty_label_pometa_question() {
System.out.println("parseOneDefinition__skip_temporary_empty_label_pometa_question");
LanguageType lang_section;
String page_title;
String line;
page_title = "наробляти";
lang_section = LanguageType.uk; // Ukrainian word
// test 1
line = "# {{помета?|uk}} {{пример|}}";
WMeaning result = WMeaningRu.parseOneDefinition(page_title, lang_section, line);
assertTrue(null == result);
// test 2
// todo remove empty "{{помета?|sq}}" -> [[шелковица]], [[тутовое дерево]]
page_title = "man";
lang_section = LanguageType.sq; // Albanian word
line = "#{{помета?|sq}} [[шелковица]], [[тутовое дерево]] {{пример|}}";
//String _line = "[[шелковица]], [[тутовое дерево]]";
String _line = "шелковица, тутовое дерево";
result = WMeaningRu.parseOneDefinition(page_title, lang_section, line);
assertTrue(result.getDefinition().equalsIgnoreCase(_line));
}
@Test
public void testParseOneDefinition_ru_labels() {
System.out.println("parseOneDefinition_ru_labels");
LanguageType lang_section;
String page_title;
String line;
// 1. simple: 1 label
// # {{сельск.}} имеющий [[волокно]], пригодное для выработки пряжи {{пример|Увязочные и прошивочные материалы в виде кручёных шнуров, изготовленных из льнопеньковой пряжи, отбойки (кручёный шпагат), шпагатов увязочных (из {{выдел|лубяных}} волокон), ниток льняных и хлопчатобумажных применяют при выполнении работ по переплетению пружин, прошивке заготовок, стёжке бортов, зашиванию покровных и облицовочных тканей.|Татьяна Матвеева|Реставрация столярно-мебельных изделий|1988|источник=НКРЯ}}
page_title = "лубяной";
lang_section = LanguageType.ru; // Russian word
Label[] _labels = new Label[0]; //_labels[0] = LabelRu.p;
String _wikified_text = "имеющий [[волокно]], пригодное для выработки пряжи";
String _definition = "имеющий волокно, пригодное для выработки пряжи";
WikiWord[] ww = new WikiWord[4];
WQuote[] _quote = null;
// WMeaning expResult = new WMeaning(_labels, _definition, ww, _quote); // expResult[0] = new WMeaning();
line = "# {{зоол.}} имеющий [[волокно]], пригодное для выработки пряжи {{пример|Увязочные и прошивочные материалы в виде кручёных шнуров, изготовленных из льнопеньковой пряжи, отбойки (кручёный шпагат), шпагатов увязочных (из {{выдел|лубяных}} волокон), ниток льняных и хлопчатобумажных применяют при выполнении работ по переплетению пружин, прошивке заготовок, стёжке бортов, зашиванию покровных и облицовочных тканей.|Татьяна Матвеева|Реставрация столярно-мебельных изделий|1988|источник=НКРЯ}}";
WMeaning result = WMeaningRu.parseOneDefinition(page_title, lang_section, line);
assertTrue(null != result);
assertTrue(result.getWikifiedText().equalsIgnoreCase(_wikified_text));
assertTrue(result.getDefinition().equalsIgnoreCase(_definition));
// labels = {сельск.}
Label[] labels_result = result.getLabels();
assertEquals(1, labels_result.length);
assertTrue( Label.equals( LabelEn.zoology, labels_result[0]) ); // зоол. == LabelEn.zoology
// 2. complex: 4 label
line = "# {{п.}}, {{неодобр.}}, {{вульг.}}, {{помета|что|что-то}} извлекать хитростью, насильно {{пример|Сосать деньги.}}";
page_title = "сосать";
lang_section = LanguageType.ru; // Russian word
result = WMeaningRu.parseOneDefinition(page_title, lang_section, line);
assertTrue(null != result);
_definition = "извлекать хитростью, насильно";
assertTrue(result.getDefinition().equalsIgnoreCase(_definition));
// labels = {{п.}}, {{прост.}}, {{вульг.}}, {{помета|что}}
labels_result = result.getLabels();
assertEquals(4, labels_result.length);
assertTrue( Label.equals( LabelEn.figuratively, labels_result[0]) ); // п. перен.
assertTrue( Label.equals( LabelEn.pejorative, labels_result[1]) ); // неодобр.
assertTrue( Label.equals( LabelEn.vulgar, labels_result[2]) ); // вульг.
assertEquals( "что", labels_result[3].getShortName());
}
@Test
public void testParseOneDefinition_ru_empty_quote() {
System.out.println("parseOneDefinition_ru_empty_quote");
LanguageType lang_section;
String page_title;
String line;
// 1. simple: 1 empty quote
line = "# {{хим-элем|5}} {{пример}}"; // only 2, 3, or 4 parameters of {{хим-элем|}} should be recognized and transformed to text
page_title = "бор";
lang_section = LanguageType.ru; // Russian word
WMeaning result = WMeaningRu.parseOneDefinition(page_title, lang_section, line);
assertTrue(null != result);
assertTrue(result.getDefinition().length() == 0);
assertNotNull(result.getLabels());
Label[] labels = result.getLabels();
assertEquals(1, labels.length);
assertTrue(Label.equals(LabelRu.chemistry, labels[0]));
}
@Test
public void testParse_empty_definition_and_empty_quoation_with_empty_translation() {
System.out.println("parse_empty_definition_and_empty_quoation_with_empty_translation");
LanguageType lang_section;
String page_title;
String line;
// # {{Нужен перевод}} {{пример||перевод=}}
line = "# {{Нужен перевод}} {{пример||перевод=}}";
page_title = "лубяной";
lang_section = LanguageType.ru; // Russian word
WMeaning result = WMeaningRu.parseOneDefinition(page_title, lang_section, line);
assertNull(result);
}
@Test
public void testParseOneDefinition_ru_quote() {
System.out.println("parseOneDefinition_ru_quote");
LanguageType lang_section;
String page_title;
String line;
// 1. simple: 1 quote (источник=НКРЯ)
line = "# {{сельск.}} имеющий [[волокно]], пригодное для выработки пряжи {{пример|Увязочные ... {{выдел|лубяных}} волокон), ... .|Татьяна Матвеева|Реставрация столярно-мебельных изделий|1988|источник=НКРЯ}}";
page_title = "лубяной";
lang_section = LanguageType.ru; // Russian word
WMeaning result = WMeaningRu.parseOneDefinition(page_title, lang_section, line);
assertTrue(null != result);
// Увязочные ... {{выдел|лубяных}} волокон), ... .|Татьяна Матвеева|Реставрация столярно-мебельных изделий|1988|источник=НКРЯ
WQuote[] quote_result = result.getQuotes();
assertTrue(null != quote_result);
assertEquals(1, quote_result.length);
assertTrue(quote_result[0].getText().equalsIgnoreCase( "Увязочные ... {{выдел|лубяных}} волокон), ... ." ) );
// "# {{хим-элем|5|B}} {{пример}}"
// 3. complex: several quotes (sentences)
// todo
// ...
}
// out of date quote template: {{пример перевод|
@Test
public void testParseOneDefinition_quote_translation_out_of_date() {
System.out.println("parseOneDefinition_quote_translation_out_of_date");
LanguageType lang_section;
String page_title;
String line, definition;
// 1. simple: 1 quote with translation
line = "# (''замечание'') [[это]] {{пример перевод|cum {{выдел|his}} legatus|с {{выдел|этими}} легионами.}}";
definition = "(''замечание'') это";
page_title = "hic";
lang_section = LanguageType.la; // Russian word
WMeaning result = WMeaningRu.parseOneDefinition(page_title, lang_section, line);
assertTrue(null != result);
assertTrue(result.getDefinition().equalsIgnoreCase(definition));
}
@Test
public void testParse_2_meaning_parse_labels() {
System.out.println("parse_2_meaning_parse_labels");
LanguageType lang_section;
String page_title;
POSText pt;
String str;
page_title = "алкоголь";
lang_section = LanguageType.ru; // Russian word
Label[] _labels = new Label[0]; //_labels[0] = LabelRu.p;
String _definition1 = "алкогольные, спиртные напитки, вино; винный спирт";
String _definition2 = "то же, что спирт, бесцветная летучая жидкость, получаемая при ферментации сахара";
String _definition3 = "химический элемент с атомным номером 5, обозначается химическим символом B";
String _definition3_wikified = "[[химический элемент]] с [[атомный номер|атомным номером]] 5, обозначается [[химический символ|химическим символом]] B";
WikiWord[] ww = new WikiWord[4];
str = "Before \n" +
"{{-ru-}}\n" +
"=== Семантические свойства ===\n" +
"{{илл|CachacaDivininha.jpg|Алкоголь [1]}}\n" +
"==== Значение ====\n" +
"# {{разг.}} [[алкогольный|алкогольные]], [[спиртной|спиртные]] напитки, [[вино]]; [[винный]] [[спирт]] {{пример|Изгнать {{выдел|алкоголь}} из быта рабочих.}}\n" +
"# {{хим.|}} {{=|спирт}}, бесцветная летучая жидкость, получаемая при ферментации сахара {{пример|}}\n" +
"# {{хим-элем|5|B}} {{пример}}";
pt = new POSText(POS.noun, str);
WMeaning[] result = WMeaningRu.parse(page_title, lang_section, pt);
assertEquals(3, result.length);
assertTrue(result[0].getDefinition().equalsIgnoreCase(_definition1));
assertTrue(result[1].getDefinition().equalsIgnoreCase(_definition2));
assertTrue(result[2].getDefinition().equalsIgnoreCase(_definition3));
assertTrue(result[2].getWikifiedText().equalsIgnoreCase(_definition3_wikified));
// todo
// test wikiwords
// todo
// test quotation
}
// tests that old-wrong-format do not crush the parser
@Test
public void testParse_AlmostEmptyDefinition_complex() {
System.out.println("parse_AlmostEmptyDefinition_complex");
LanguageType lang_section;
String page_title;
POSText pt;
String str;
page_title = "some hieroglyph";
lang_section = LanguageType.ja; // Russian word
str = "Before \n" +
"{{-ja-}}\n" +
"==Глагол==\n" +
"\n" +
"===Значение===\n" +
"\n";
pt = new POSText(POS.noun, str);
WMeaning[] result = WMeaningRu.parse(page_title, lang_section, pt);
assertEquals(0, result.length);
}
// parse 1 meaning without Number sign #
// pomme
// ====Значение====
//[[яблоко]]
@Test
public void testParse_1_meaning_without_Number_sign() {
System.out.println("parse_1_meaning_without_Number_sign");
LanguageType lang_section;
String page_title;
POSText pt;
String str;
page_title = "pomme";
lang_section = LanguageType.fr; // French word
String _definition1 = "яблоко";
str = "Before \n" +
"{{-ru-}}\n" +
"=== Семантические свойства ===\n" +
"==== Значение ====\n" +
"[[яблоко]]\n" +
"\n" +
"====Синонимы====";
pt = new POSText(POS.noun, str);
WMeaning[] result = WMeaningRu.parse(page_title, lang_section, pt);
assertTrue(null != result);
assertEquals(1, result.length);
assertTrue(result[0].getDefinition().equalsIgnoreCase(_definition1));
// labels == null
Label[] labels_result = result[0].getLabels();
assertEquals(0, labels_result.length);
// wikiword.size = 1;
WikiWord[] ww_result = result[0].getWikiWords();
assertEquals(1, ww_result.length);
ww_result[0].getWordLink().equalsIgnoreCase("яблоко");
}
// parse 1 meaning without Number sign # and with redirect to another meaning
// сервер
// ====Значение====
// {{техн.|os}} [[#Русский|сервер]]
@Test
public void testParse_1_meaning_without_Number_sign_with_Redirect() {
System.out.println("parse_1_meaning_without_Number_sign_with_Redirect");
LanguageType lang_section;
String page_title;
POSText pt;
String str;
page_title = "сервер";
lang_section = LanguageType.os; // Ossetic word
String _definition1 = "сервер";
str = "Before \n" +
"{{-os-}}\n" +
"=== Семантические свойства ===\n" +
"==== Значение ====\n" +
"[[#Русский|сервер]]\n" +
"\n" +
"====Синонимы====";
pt = new POSText(POS.noun, str);
WMeaning[] result = WMeaningRu.parse(page_title, lang_section, pt);
assertTrue(null != result);
assertEquals(1, result.length);
assertTrue(result[0].getDefinition().equalsIgnoreCase(_definition1));
// labels == null
Label[] labels_result = result[0].getLabels();
assertEquals(0, labels_result.length);
// wikiword.size = 1;
WikiWord[] ww_result = result[0].getWikiWords();
assertEquals(1, ww_result.length);
ww_result[0].getWordLink().equalsIgnoreCase("сервер");
}
// parse text without meaning
// ====Значение====
//
// ====Синонимы====
// ====Антонимы====
@Test
public void testParse_text_without_meaning() {
System.out.println("parse_text_without_meaning");
LanguageType lang_section;
String page_title;
POSText pt;
String str;
page_title = "mzda";
lang_section = LanguageType.ru; // Russian word
str = "{{-ru-}}\n" +
"=== Семантические свойства ===\n" +
"==== Значение ====\n" +
"\n" +
"====Синонимы====\n" +
"\n" +
"====Антонимы====";
pt = new POSText(POS.noun, str);
WMeaning[] result = WMeaningRu.parse(page_title, lang_section, pt);
assertTrue(null != result);
assertEquals(0, result.length);
}
@Test
public void testParse_1_meaning() {
System.out.println("parse_1_meaning");
LanguageType lang_section;
String page_title;
POSText pt;
String str;
page_title = "самолёт";
lang_section = LanguageType.ru; // Russian word
Label[] _labels = new Label[0]; //_labels[0] = LabelRu.p;
String _definition = "летательный аппарат тяжелее воздуха с жёстким крылом и собственным мотором";
WikiWord[] ww = new WikiWord[4];
str = "Before \n" +
"{{-ru-}}\n" +
"=== Семантические свойства ===\n" +
"{{илл|Britannia.plan.arp.750pix.jpg|Самолёт}}\n" +
"==== Значение ====\n" +
"# летательный [[аппарат]] тяжелее [[воздух]]а с жёстким [[крыло]]м и собственным [[мотор]]ом {{пример|Самолёт-истребитель.}} {{пример|Военный cамолёт.}} {{пример|Эскадрилья самолётов.}}\n" +
"\n";
pt = new POSText(POS.noun, str);
WMeaning[] result = WMeaningRu.parse(page_title, lang_section, pt);
assertEquals(1, result.length);
assertTrue(result[0].getDefinition().equalsIgnoreCase(_definition));
// todo
// test wikiwords
// todo
// test quotation
}
// skip one-line with proto meaning
@Test
public void testParse_skip_proto() {
System.out.println("parse_skip_proto");
LanguageType lang_section;
String page_title;
POSText pt;
String str;
page_title = "история";
lang_section = LanguageType.ru; // Russian word
Label[] _labels = new Label[0]; //_labels[0] = LabelRu.p;
String _definition1 = "наука, изучающая факты, тенденции и закономерности развития общества";
String _definition2 = "эпическое повествование";
str = "Before \n" +
"{{-ru-}}\n" +
"=== Семантические свойства ===\n" +
"==== Значение ====\n" +
"{{прото|знание о ходе развития чего-либо во времени}}\n" +
"# [[наука]], изучающая [[факт]]ы, тенденции и закономерности развития общества {{пример|}}\n" +
"# эпическое [[повествование]] {{пример}}";
pt = new POSText(POS.noun, str);
WMeaning[] result = WMeaningRu.parse(page_title, lang_section, pt);
assertEquals(2, result.length);
assertTrue(result[0].getDefinition().equalsIgnoreCase(_definition1));
assertTrue(result[1].getDefinition().equalsIgnoreCase(_definition2));
}
}