diff --git a/stemlib/Latin/stemsrc/irreg.nom.src b/stemlib/Latin/stemsrc/irreg.nom.src index 13f6e7d2..a3031f81 100755 --- a/stemlib/Latin/stemsrc/irreg.nom.src +++ b/stemlib/Latin/stemsrc/irreg.nom.src @@ -776,6 +776,10 @@ se_ pron3 masc fem abl pl se_se_ pron3 masc fem abl pl se_cum pron3 masc fem abl pl +:le:sed#3 +:wd:se_d pron3 masc fem acc sg +:wd:se_d pron3 masc fem abl sg + :le:lac lac irreg_nom3 neut nom voc acc sg lact@decl3 irreg_nom3 neut diff --git a/stemlib/Latin/stemsrc/ls.nom b/stemlib/Latin/stemsrc/ls.nom index dd8d0bc7..b81d5603 100755 --- a/stemlib/Latin/stemsrc/ls.nom +++ b/stemlib/Latin/stemsrc/ls.nom @@ -30181,9 +30181,8 @@ ca_ni^pa :no:ca_ni^p a_ae fem -ca^nis#1 ca^nes comm. Ca^nis#2 -:le:Canis +:le:Canis#2 :no:Ca^n is_is masc @@ -32885,9 +32884,8 @@ ca_sus#1 cassus -casu adverbially Ca_sus#2 -:le:Casus +:le:Casus#2 :no:Ca_s us_i masc @@ -34256,10 +34254,8 @@ Ce^lende^ri_-tis :no:Ce^lende^ri_-ti s_dis fem -ce^ler#1 e^ris, e -ce^leris ce^le^re^ ce^le^ri^ter Ce^ler#2 -:le:Celer +:le:Celer#2 :no:Ce^l er_eris masc @@ -34273,9 +34269,8 @@ ce^le^ra_tim :wd:ce^le^ra_tim adverb -Ce^le^res um -Ce^ler -:le:Celer +Ce^le^res +:le:Celer#3 :no:Ce^l er_eris masc @@ -34401,9 +34396,8 @@ celsi^tu_do :no:celsi^tu_d o_inis fem -celse_ Celsus#2 -:le:Celsus +:le:Celsus#2 :no:Cels us_i masc @@ -41212,6 +41206,10 @@ co^i^ti^o :no:co^i^ti^ o_oLnis fem +co^i^tus#1 +:le:coitus#1 +:aj:co^i^t us_a_um + co^i^tus#2 coetus :le:coitus#2 :no:co^i^t us_us masc @@ -61773,18 +61771,19 @@ di_versi^tas di_-verse di_vorse + di_ves :le:dives :aj:di_v es_itis -:aj:di_ s_tis_adj orth -:aj:di_t ior_ius_comp :aj:di_vi^t ior_ius_comp -:aj:di_tissi^m us_a_um irreg_superl :aj:di_vi^tissi^m us_a_um irreg_superl -di_s di_te adj. -di_ves -di_s#II di_vi^-tior di_tior di_vi^tissi-mus di_tissimus di_ti^us +di_s +:le:dis#1 +:aj:di_ s_tis_adj no_comp +:aj:di_t ior_ius_comp +:aj:di_tissi^m us_a_um irreg_superl + di_vexus :le:divexus :aj:di_vex us_a_um @@ -77814,13 +77813,8 @@ Fo^ru^li#2 :no:Fo^ru^l us_i masc pl -fo^rum#1 -:le:forum#1 -:no:fo^r us_i neut - - fo^rus -:le:forus +:le:forus#1 :no:fo^r us_i masc n. @@ -77830,7 +77824,7 @@ Forum A^lie_ni Forum Appii Forum Aure_lium Foru Forum Gallo_rum Forum Ju_lii Forojulien-sis e adj. Forojulien-ses Forum Vo^co_nii fo^rus#1 -:le:forus#1 +:le:forus#2 :no:fo^r us_i masc @@ -78142,8 +78136,10 @@ fraudu^lo_sus :aj:fraudu^lo_s us_a_um -fraus fraudis f. -Fraus#III personified +Fraus +:le:Fraus#2 +:no:Frau s_dis fem + fraxa_re vigiliam circuire fraxi^ne^us :le:fraxineus @@ -89257,11 +89253,6 @@ Hortensi^a :no:Hortensi^ a_ae fem -Hortensi^us -:le:Hortensius -:aj:Hortens ius_ia_ium - - Hortensi^a_nus :le:Hortensianus :aj:Hortensi^a_n us_a_um @@ -118501,7 +118492,7 @@ maxi^me_ maxu^me_ magi^s ma^ge^ Magnus#2 -:le:Magnus +:le:Magnus#2 :no:Magn us_i masc @@ -134288,14 +134279,17 @@ Ni^gellus#2 Ni^gella -ni^ger#1 gra, grum -ni^grum -:le:nigrum -:no:ni^gr us_i neut -Ni^ger#2 gri m. -Ni^ger#3 gris m. +Ni^ger#2 +:le:Niger#2 +:no:Ni^g er_ri masc + +Ni^ger#3 +:le:Niger#3 +:no:Ni^g er_ris masc + + Ni^gi^di^us :le:Nigidius :no:Ni^gi^d ius_i masc @@ -140298,8 +140292,8 @@ olla :no:o_ll a_ae fem -aula -:le:aula +aula#2 +:le:aula#2 :no:aul a_ae fem @@ -148443,12 +148437,12 @@ paulus#1 paull- pau-lum :le:paulum -:no:pau-l us_i neut +:wd:paulu^m adverb paulo paulum Paulus#2 Paull- -:le:Paulus +:le:Paulus#2 :no:Paul us_i masc :no:Paull us_i masc orth @@ -148694,8 +148688,11 @@ pa^vor Pa^vor personified -pax#1 pa_cis f. -Pax#2 Pa_cis m. + +Pax#2 +:le:Pax#2 +:no:Pa_ x_cis masc + paxillus :le:paxillus :no:paxill us_i masc @@ -148958,10 +148955,6 @@ pe^cu_ni^o_sus :aj:pe^cu_ni^o_s us_a_um -pe^cus#1 peco^ris n. -pe^cus#1 pecus f. -pe^cus#1 pecus n. -pe^cus#2 u^dis f. pe^cus#3 :le:pecus#3 :no:pe^c us_us masc @@ -159878,7 +159871,7 @@ po^lus#1 Po^lus#2 -:le:Polus +:le:Polus#2 :no:Po^l us_i masc pers_name @@ -165186,14 +165179,12 @@ pri_mo_ pri_mum pri-mumdum pri_me_ pri_mi^ter -princeps#1 ci^pis adj. -princeps ci^pis m. -princi^pes -:le:principes -:no:pri_nci^p 0_is masc pl -Princeps#2 ci^pis m. +:le:Princeps#2 +:no:Pri_nc eps_ipis masc + + princi^pa_lis :le:principalis :aj:pri_nci^pa_l is_e @@ -172312,12 +172303,10 @@ qui^dem :wd:qui^dem adverb -qui^es#1 -:le:quies#1 -:no:qui^ es_eLtis fem +:le:quies#2 +:aj:qui^e_ s_tis_adj -qui^es#2 e_tis adj. qui^escenti^a :le:quiescentia :no:qui^escenti^ a_ae fem @@ -172777,14 +172766,6 @@ quintus#1 quinctus num. adj. quintum quinto_ -Quintus#2 -:le:Quintus -:no:Qui_nt us_i masc pers_name - - -Quinta -:le:Quinta -:no:Qui_nt a_ae fem quintus-de^ci^mus @@ -176883,6 +176864,8 @@ re^vulsi^o re^vols- rex#1 re_gis m. adj. Rex#2 re_gis m. + + Rha indecl. rhabdo^s :le:rhabdos @@ -184748,8 +184731,13 @@ se_-cu_rus :aj:se_-cu_r us_a_um +:le:secus#2 +:aj:se^qui^ or_us_comp irreg_comp +:wd:se^cus adverb +:wd:se^cus prep + + se_-cu_re_ se_cu_ri^ter -se^cus#2 Adj. se^qui^or us, o_ris se^qui^us but with negatives or quo, eo, nihilo se_ti^us se_-ci^us secti^us @@ -198668,6 +198656,9 @@ su^pellex :no:suppellectil is_is fem orth :no:suppellectil 0_is fem abl orth + +:le:super#1 +:wd:su^per irreg_adj1 su^per#2 :le:super#2 @@ -206620,7 +206611,7 @@ ti_^gri_nus ti_^gris#1 is or i^dis Ti_^gris#2 -:le:Tigris +:le:Tigris#2 :no:Ti_^gr is_idis masc diff --git a/stemlib/Latin/stemsrc/nom.01 b/stemlib/Latin/stemsrc/nom.01 index 22eb76ff..7345dd26 100755 --- a/stemlib/Latin/stemsrc/nom.01 +++ b/stemlib/Latin/stemsrc/nom.01 @@ -10,8 +10,8 @@ :le:pulcher#1 :no:pulch er_ra_rum -:le:rex -:no:re_ x_gis masc +:le:rex#1 +:no:re_ x_gis masc :le:corpus :no:corp or_oris neut diff --git a/stemlib/Latin/stemsrc/nom.latin.bas b/stemlib/Latin/stemsrc/nom.latin.bas index b2f2b9be..01922b69 100755 --- a/stemlib/Latin/stemsrc/nom.latin.bas +++ b/stemlib/Latin/stemsrc/nom.latin.bas @@ -211,7 +211,7 @@ :le:compes1 :no:compe s_dis fem -:le:conge^ri^es +:le:congeries :no:conge^ri^ es_eLi fem :no:conge^ri^ a_ae fem @@ -271,7 +271,7 @@ :le:amens :aj:a_m ens_adj -:le:an +:le:an#1 :wd:an conj :le:ante @@ -311,7 +311,7 @@ :le:assiduus#1 :no:ad-sidu us_i masc -:le:assiduus#1 +:le:assiduus#2 :aj:assidu us_a_um :aj:ad-sidu us_a_um @@ -360,13 +360,13 @@ :le:Calidius :aj:Calid ius_ia_ium -:le:canis -:no:can is_is_C masc fem +:le:canis#1 +:no:ca^n is_is_C masc fem :le:celeber :aj:celeb er_ris_re -:le:celer +:le:celer#1 :aj:cel er_era_erum superl @ comp :aj:celer 0_adj3 @@ -377,7 +377,7 @@ :le:celere :wd:celere adverb -:le:celsus +:le:celsus#1 :aj:cels us_a_um :le:centum @@ -497,7 +497,7 @@ :le:dibaphus :aj:dibaph us_a_um -:le:Dido +:le:Dido#2 :no:Di_d o_oLnis fem :no:Di_d o_us fem @@ -510,7 +510,7 @@ :le:dioecesis :no:dioece_s is_eos fem -:le:Dis +:le:Dis#2 :no:Di_ s_tis masc sg :le:disjunctio @@ -614,6 +614,9 @@ :no:fid es_ei fem :no:fid is_is fem poetic +:le:fides#2 +:no:fid is_is fem + :le:fors :no:for s_tis fem @@ -623,7 +626,7 @@ :le:frater :no:fra_t er_ris masc -:le:fraus +:le:fraus#1 :no:frau s_dis fem :le:Frugi @@ -681,7 +684,7 @@ :no:ho^n or_oLris masc :wd:hono_s irreg_nom3 masc nom sg -:le:Hortensius +:le:Hortensius#2 :no:Hortens ius_i masc :no:Horte_s ius_i masc @@ -700,7 +703,7 @@ :wd:imbri er_ris masc abl sg :wd:imbrium er_ris masc gen pl -:le:in +:le:in#1 :wd:in prep :le:iners @@ -760,7 +763,7 @@ :le:Laevus :no:Laev us_i masc pers_name -:le:laus +:le:laus#1 :no:lau s_dis fem :le:lex @@ -773,7 +776,7 @@ :le:Libya :no:Liby a_es fem -:le:Lupus +:le:Lupus#2 :no:Lup us_i masc :le:Luscius @@ -882,8 +885,8 @@ :le:necdum :wd:necdum conj -:le:niger -:aj:nig er_ra_rum +:le:niger#1 +:aj:ni^g er_ra_rum :le:nihil :wd:nihil irreg_decl3 neut sg indecl @@ -970,17 +973,17 @@ :no:Paul a_ae fem pers_name :no:Paull a_ae fem pers_name -:le:pax +:le:pax#1 :no:pa_ x_cis fem :le:pater :no:pa^t er_ris masc :le:pecus#1 -:no:pec or_oris neut +:no:pe^c us_oris neut :le:pecus#2 -:no:pecu s_dis masc fem +:no:pe^cu s_dis masc fem :le:Penates :no:pena_t is_is masc pl @@ -1058,8 +1061,9 @@ :le:prex :no:pre^ x_cis fem -:le:princeps -:no:pri_nc eps_ipis masc +:le:princeps#1 +:no:pri_nc eps_ipis masc fem +:aj:pri_nc eps_ipis :le:prior :wd:priusquam adverb @@ -1099,6 +1103,7 @@ :wd:quia conj :le:quies#1 +:no:qui^e_ s_tis fem :wd:quie irreg_nom3 abl fem sg early :le:quin @@ -1110,12 +1115,12 @@ :le:quinquaginta :wd:qui_nqua_ginta_ numeral -:le:quinque +:le:quinque#1 :wd:qui_nque numeral -:le:quintus#2 -:no:Qui_nt us_i masc -:no:Qui_nt a_ae fem +:le:Quintus#2 +:no:Qui_nt us_i masc pers_name +:no:Qui_nt a_ae fem pers_name :le:quodsi :wd:quodsi_ conj @@ -1135,7 +1140,7 @@ :le:res :no:r es_ei fem -:le:Rex +:le:Rex#2 :no:Re_ x_gis masc pers_name :le:robur @@ -1161,16 +1166,18 @@ :wd:sexa_gie_s numeral :wd:sexa_giens numeral -:le:secus -:wd:secus adverb -:aj:sequi or_us_comp irreg_comp +:le:secus#1 +:wd:se^cus indecl neut :le:setius :wd:se_tius adverb comp -:le:sed -:wd:sed conj -:wd:set conj +:le:sed#1 +:wd:se^d conj +:wd:se^t conj + +:le:sed#2 +:wd:se_d prep :le:semel :wd:semel adverb @@ -1204,6 +1211,7 @@ :le:si :wd:si_ conj +:wd:sei_ conj orth :le:sive :wd:si_ve conj @@ -1273,7 +1281,7 @@ :no:Tiber is_idis masc :no:Tibr is_idis masc -:le:tigris +:le:tigris#1 :no:tigr is_idos masc fem :no:tigr is_is masc fem diff --git a/stemlib/Latin/stemsrc/nom.smithgeo b/stemlib/Latin/stemsrc/nom.smithgeo index 02167d59..d457e941 100755 --- a/stemlib/Latin/stemsrc/nom.smithgeo +++ b/stemlib/Latin/stemsrc/nom.smithgeo @@ -8895,7 +8895,7 @@ :le:Laurium :no:Laur ius_i neut -:le:Laus +:le:Laus#2 :no:La us_i masc :le:Lausonius diff --git a/stemlib/Latin/stemsrc/vbs.latin b/stemlib/Latin/stemsrc/vbs.latin index 229271ba..868e1db1 100755 --- a/stemlib/Latin/stemsrc/vbs.latin +++ b/stemlib/Latin/stemsrc/vbs.latin @@ -2365,6 +2365,10 @@ :de:co^ax are_vb :le:cocionor :de:co_ci^o_n are_vb dep +:le:coeo +:vs:co^- conj4 +:vs:co^-i^ perfstem +:vs:co^-i^t pp4 :le:coemo :vs:co^-e^m conj3 :vs:co^-e_m perfstem @@ -4959,6 +4963,13 @@ :de:dict are_vb :le:dicturio :de:dictu^r ire_vb +:le:dido#1 +:vs:di_-d conj3 +:vs:dis-d conj3 orth +:vs:di_-di^d perfstem +:vs:dis-di^d perfstem orth +:vs:di_-di^t pp4 +:vs:dis-di^t pp4 orth :le:diduco :vs:di_-du_c conj3 :vs:di_-du_x perfstem diff --git a/tests/README_ASSERTIONS.md b/tests/README_ASSERTIONS.md new file mode 100644 index 00000000..12fb27ed --- /dev/null +++ b/tests/README_ASSERTIONS.md @@ -0,0 +1,22 @@ +## Lemma assertion tests (latin_assertions_*.txt) + +Format: `form lemma1 lemma2 ...`, optional trailing +`(commentary)` ignored by the harness. Multiple lines for the +same form are unioned into one expected set. + +File names reflect which stemsrc file was under investigation +when the regression was found and NOT which file the underlying +fix lives in. A single word's analysis is often split across +several stemsrc files (nom.latin.bas, ls.nom, vbs.latin, ...), +so there is no clean one-file-per-source mapping. + +Before adding a new assertion, grep all existing +latin_assertions_*.txt for the headword -- it may already be +tracked under a different file's name. Occasionally run: +```bash + awk '/^#|^$/{next} { sub(/\(.*/,""); if (NF<2) next; if (!seen[$1 SUBSEP FILENAME]++) filecount[$1]++ } END { for (w in filecount) if (filecount[w]>1) print w }' tests/latin_assertions*.txt +``` +to catch a form asserted in more than one file. + +New investigative work gets its own new latin_assertions_.txt +-- the run_tests.sh loop picks up any matching file automatically. \ No newline at end of file diff --git a/tests/latin_assertions_nom_lat_bas.txt b/tests/latin_assertions_nom_lat_bas.txt new file mode 100644 index 00000000..f8dfa016 --- /dev/null +++ b/tests/latin_assertions_nom_lat_bas.txt @@ -0,0 +1,149 @@ +# form required lemma + +acer acer#1 (maple-tree) +acer acer#2 (m. acris, Enn.) + +an an#1 + +assiduus assiduus#1 (from as-do) +assiduus assiduus#2 (from assideo) + +aula aula#1 (front court of a Grecian house) +aula aula#2 (old form for 'olla', 'pot') + +canibus canis#1 +Canibus Canis#2 (a small river tributary to the Po) +Canis Canis#2 Cana Canae + +casuum casus#1 +Casus Casus#2 (a river of Albania) + +celer celo (to hide) +celer celer#1 +Celer Celer#2 (Roman cognomen) +Celer Celer#3 (v. Celeres) + +celsus celsus#1 (of old cello "to rise high") +Celsus Celsus#2 (Roman cognomen) + +coitus coeo (to assemble/meet) +coitus coitus#1 (assembled) +coitus coitus#2 (a meeting) + +congeries congeries + +disdo dido#1 (to give out, spread abroad) +dido dido#1 (to give out, spread abroad) +Dido Dido#2 (foundress of Carthage) + +#dis#3, the inseparable particule is not analyzed on its own +Dis Dis#2 (name) +dis deus (god) +dis dis#1 (rich, alternate of 'dives') +ditior dis#1 +ditissimus dis#1 +dives dives +divitior dives +divitissimus dives + +fides fido +fides fides#1 +fides fides#2 (instrument) + +foris forio (to defecate/shit) +foris foris#1 (door) +foris foris#2 (outdoors) +foris forum (open space) +foris forus#2 (old form for 'forum') +foris fori (another form for 'forus') +foris forus#1 (nautical gangway) + +fraudis fraus#1 (fraud) +Fraus Fraus#2 (goddess mentioned once in Cicero) + +hortensius hortensis (belonging to a garden) +hortensius hortensius#1 (belonging to a garden) +Hortensius Hortensius#2 (Roman gens) + +in in#1 (preposition; in#2 the negation prefix is not analyzed copying the -ne behavior and others) + +inter inter#1 (there is no inter2 in the L&S dictionary, it's a source file error) + +laus laus#1 (praise) +Laus Laus#2 (name of a few cities) + +lupus lupus#1 +Lupus Lupus#2 (surname in gens Rutilia) + +magnus magnus#1 +Magnus Magnus#2 (Roman surname) + +ne ne#1 (adv.; interrogative/enclitic particle not analyzed) +ne ne#3 (incorrect for 'nae') +ne neo#1 (to spin) + +nigrum niger#1 (black) +Niger Niger#2 (Roman surname) +Niger Niger#3 (African river) + +parens pareo +parens parens#1 (appearing) +parens parens#2 (parent) + +paulum paulum (adverb 'a little') +paulum paulus#1 (small) +Paulum Paulus#2 (Roman surname) + +pacis pax#1 (peace) +Pax Pax#2 (a slave in Plautus' Trinummus) + +pecus pecus#1 (cattle) +pecus pecus#2 (herd animal) +pecus pecus#3 (= pecus#1, rare masc. u-stem variant) + +per per#1 (there is no per2 in the L&S dictionary, it's a source file error) + +polus polus#1 +Polus Polus#2 (Greek tragic actor) + +princeps princeps#1 (foremost) +Princeps Princeps#2 (flute player in Phaedr.) + +pro pro#1 (for) +pro pro#2 (alas!) + +promptus promptus#1 (manifest) +promptus promptus#2 (readiness) + +pubes pubes#1 (adult) +pubes pubes#2 (adulthood) + +quies quies#1 (quietness) +quies quies#2 (quiet, alternative of 'quietus') + +quinque quinque#1 (L&S quinque#2 for Plautus' Casina meaning 'et quin', probably better NOT added as analysis) + +quintus quintus#1 +Quintus Quintus#2 (Roman praenomen) +Quinta Quintus#2 + +rex rex#1 (king) +Rex Rex#2 (Roman surname) + +secus secus#1 (indeclinable for 'sexus') +secus secus#2 (adverb and prep) + +sed sed#1 (conj) +sed sed#2 (prep. 'without') +sed sed#3 (alternative form of pronoun 'sē') + +super supo (to throw/scatter) +super super#1 (L&S refers to superus) +super super#2 (on top) + +tigridis tigris#1 (tiger) +tigris tigris#1 (tiger) +Tigridis Tigris#2 (the Asian river) + +uber uber#1 (lactating breast) +uber uber#2 (fruitful) \ No newline at end of file diff --git a/tests/run_tests.sh b/tests/run_tests.sh index 548e9d3a..aa39acc8 100755 --- a/tests/run_tests.sh +++ b/tests/run_tests.sh @@ -69,6 +69,70 @@ run_cruncher_test() { rm -f /tmp/morpheus_test_$$.txt } +run_assert_test() { + local flags="$1" file="$2" + [ -f "$file" ] || return + + local filename + filename=$(basename "$file") + echo "=== Assertions: $filename ===" + + # AWK: Group lemmas, skip comments, chop '(', and handle "" for empty sets + local aggregated + aggregated=$(awk '/^#|^$/ {next} { + + # 1. Ignore everything from "(" to the end of the line + sub(/\(.*/, "") + + if (NF < 2) next + + word = $1 + if (!(word in map)) { + order[++count] = word + map[word] = "" # Initialize empty in case it is just "" + } + for(i=2; i<=NF; i++) { + # Skip arrow and our empty set marker + if ($i == "->") continue + if ($i == "\"\"") continue + + map[word] = map[word] " " $i + } + } END { + for(i=1; i<=count; i++) { + print order[i] map[order[i]] + } + }' "$file") + + # Loop through the grouped data + while read -r form expected_str; do + [ -z "$form" ] && continue + + # Get actual output, remove 'form:', sort alphabetically, format as one line + actual=$(echo "$form" | "$CRUNCHER" $flags 2>/dev/null | grep -v '^form:' | sort | tr '\n' ' ' | sed 's/ *$//') + + # Format the expected string (sort alphabetically and remove duplicates) + expected=$(echo "$expected_str" | tr ' ' '\n' | sort | uniq | tr '\n' ' ' | sed 's/ *$//') + + # Format for display so empty strings show up as "" in the terminal logs + disp_expected=${expected:-\"\"} + disp_actual=${actual:-\"\"} + + if [ "$actual" = "$expected" ]; then + echo "PASS: '$form' -> $disp_expected" + else + echo "FAIL: $form" + echo " expected: [$disp_expected]" + echo " got: [$disp_actual]" + FAILURES=$((FAILURES + 1)) + fi + done <<< "$aggregated" + echo "" +} + +for assert_file in "$SCRIPT_DIR"/latin_assertions*.txt; do + run_assert_test "-Ll" "$assert_file" +done GP="$SCRIPT_DIR/greek_probe.txt" LP="$SCRIPT_DIR/latin_probe.txt"