Прејди на содржината

Модул:el-c-conj-test

Од Викиречник

Документацијата за овој модул можете да ја создадете на Модул:el-c-conj-test/док

local p = {}

-- Απαιτούμε το κύριο module κλίσης επιθέτων
local main_module = require('Module:el-c-conj')

-- Συνάρτηση για την ανάλυση της συμβολοσειράς εξόδου του module
local function parse_module_output(output_str)
    -- Αφαιρούμε την αρχή της γραμμής του πίνακα και το όνομα της πτώσης (π.χ., "|-\n |'''Номинатив''' ||")
    -- Πрво отстрануваме сè додека не започне вистинскиот излез со [[
    local cleaned_str = output_str:gsub("^%|%-%-%n %|'''[^']-''' %|%|", "")
    cleaned_str = mw.text.trim(cleaned_str) -- Trim the result after gsub

    -- mw.log("TEST_MODULE_DEBUG: cleaned_str after initial processing: [" .. cleaned_str .. "]") -- Only for privileged users

    -- Χωρίζουμε με '||'
    local parts = mw.text.split(cleaned_str, "||")
    local forms = {}
    for i, part in ipairs(parts) do
        local trimmed_part = mw.text.trim(part) -- Trim each individual part
        -- mw.log("TEST_MODULE_DEBUG: Processing part: [" .. trimmed_part .. "]") -- Only for privileged users

        -- Εξάγουμε το περιεχόμενο μεταξύ [[ και ]]
        local form = trimmed_part:match("^%[%[(.*)%]%]$")
        if form then
            forms[i] = form
            -- mw.log("TEST_MODULE_DEBUG: Extracted form: [" .. form .. "]") -- Only for privileged users
        else
            forms[i] = trimmed_part -- Εφεδρική λύση αν δεν είναι σε [[ ]] (не би требало да се случи со правилен излез)
            -- mw.log("TEST_MODULE_DEBUG: Fallback form (no [[ ]]): [" .. trimmed_part .. "]") -- Only for privileged users
        end
    end
    return forms
end

-- Εικονικό αντικείμενο frame για την απευθείας κλήση των συναρτήσεων του module
local mock_frame = {
    getParent = function()
        return {
            args = {
                [1] = nil, -- Ќе се постави динамички
                [2] = nil  -- Ќе се постави динамички
            }
        }
    end
}

-- Опис на податоците за тестирање со очекувани излези
-- Секоја очекувана форма е едноставен грчки збор, како што е извлечен од parse_module_output
local test_data = {
    {
        input_word = "έγγραφος",
        fem_type = "η",
        expected_forms = {
            Nominativ = {
                sg_m = "έγγραφος", sg_f = "έγγραφη", sg_n = "έγγραφο",
                pl_m = "έγγραφοι", pl_f = "έγγραφες", pl_n = "έγγραφα"
            },
            Genitiv = {
                sg_m = "εγγράφου", sg_f = "έγγραφης", sg_n = "εγγράφου",
                pl_m = "εγγράφων", pl_f = "εγγράφων", pl_n = "εγγράφων"
            },
            Acusativ = {
                sg_m = "έγγραφο", sg_f = "έγγραφη", sg_n = "έγγραφο",
                pl_m = "έγγραφους", pl_f = "έγγραφες", pl_n = "έγγραφα"
            },
            Vocativ = {
                sg_m = "έγγραφε", sg_f = "έγγραφη", sg_n = "έγγραφο",
                pl_m = "έγγραφοι", pl_f = "έγγραφες", pl_n = "έγγραφα"
            },
        }
    },
    {
        input_word = "ίδιος",
        fem_type = "α", -- За ίδιος, женскиот род е -ια, што спаѓа во правилото 'α'
        expected_forms = {
            Nominativ = {
                sg_m = "ίδιος", sg_f = "ίδια", sg_n = "ίδιο",
                pl_m = "ίδιοι", pl_f = "ίδιες", pl_n = "ίδια"
            },
            Genitiv = {
                sg_m = "ίδιου", sg_f = "ίδιας", sg_n = "ίδιου",
                pl_m = "ίδιων", pl_f = "ίδιων", pl_n = "ίδιων"
            },
            Acusativ = {
                sg_m = "ίδιο", sg_f = "ίδια", sg_n = "ίδιο",
                pl_m = "ίδιους", pl_f = "ίδιες", pl_n = "ίδια"
            },
            Vocativ = {
                sg_m = "ίδιε", sg_f = "ίδια", sg_n = "ίδιο",
                pl_m = "ίδιοι", pl_f = "ίδιες", pl_n = "ίδια"
            },
        }
    },
    {
        input_word = "ανεξάρτητος",
        fem_type = "η",
        expected_forms = {
            Nominativ = {
                sg_m = "ανεξάρτητος", sg_f = "ανεξάρτητη", sg_n = "ανεξάρτητο",
                pl_m = "ανεξάρτητοι", pl_f = "ανεξάρτητες", pl_n = "ανεξάρτητα"
            },
            Genitiv = {
                sg_m = "ανεξάρτητου", sg_f = "ανεξάρτητης", sg_n = "ανεξάρτητου",
                pl_m = "ανεξάρτητων", pl_f = "ανεξάρτητων", pl_n = "ανεξάρτητων"
            },
            Acusativ = {
                sg_m = "ανεξάρτητο", sg_f = "ανεξάρτητη", sg_n = "ανεξάρτητο",
                pl_m = "ανεξάρτητους", pl_f = "ανεξάρτητες", pl_n = "ανεξάρτητα"
            },
            Vocativ = {
                sg_m = "ανεξάρτητε", sg_f = "ανεξάρτητη", sg_n = "ανεξάρτητο",
                pl_m = "ανεξάρτητοι", pl_f = "ανεξάρτητες", pl_n = "ανεξάρτητα"
            },
        }
    },
    {
        input_word = "αποδοτικός",
        fem_type = "η", -- Ова е игнорирано од модулот за типот -ικός, но е вклучено за комплетност
        expected_forms = {
            Nominativ = {
                sg_m = "αποδοτικός", sg_f = "αποδοτική", sg_n = "αποδοτικό",
                pl_m = "αποδοτικοί", pl_f = "αποδοτικές", pl_n = "αποδοτικά"
            },
            Genitiv = {
                sg_m = "αποδοτικού", sg_f = "αποδοτικής", sg_n = "αποδοτικού",
                pl_m = "αποδοτικών", pl_f = "αποδοτικών", pl_n = "αποδοτικών"
            },
            Acusativ = {
                sg_m = "αποδοτικό", sg_f = "αποδοτική", sg_n = "αποδοτικό",
                pl_m = "αποδοτικούς", pl_f = "αποδοτικές", pl_n = "αποδοτικά"
            },
            Vocativ = {
                sg_m = "αποδοτικέ", sg_f = "αποδοτική", sg_n = "αποδοτικό",
                pl_m = "αποδοτικοί", pl_f = "αποδοτικές", pl_n = "αποδοτικά"
            },
        }
    },
    {
        input_word = "αστικός",
        fem_type = "η",
        expected_forms = {
            Nominativ = {
                sg_m = "αστικός", sg_f = "αστική", sg_n = "αστικό",
                pl_m = "αστικοί", pl_f = "αστικές", pl_n = "αστικά"
            },
            Genitiv = {
                sg_m = "αστικού", sg_f = "αστικής", sg_n = "αστικού",
                pl_m = "αστικών", pl_f = "αστικών", pl_n = "αστικών"
            },
            Acusativ = {
                sg_m = "αστικό", sg_f = "αστική", sg_n = "αστικό",
                pl_m = "αστικούς", pl_f = "αστικές", pl_n = "αστικά"
            },
            Vocativ = {
                sg_m = "αστικέ", sg_f = "αστική", sg_n = "αστικό",
                pl_m = "αστικοί", pl_f = "αστικές", pl_n = "αστικά"
            },
        }
    },
    {
        input_word = "βαρετός",
        fem_type = "η", -- женскиот род е βαρετή, значи 'η'
        expected_forms = {
            Nominativ = {
                sg_m = "βαρετός", sg_f = "βαρετή", sg_n = "βαρετό",
                pl_m = "βαρετοί", pl_f = "βαρετές", pl_n = "βαρετά"
            },
            Genitiv = {
                sg_m = "βαρετού", sg_f = "βαρετής", sg_n = "βαρετού",
                pl_m = "βαρετών", pl_f = "βαρετών", pl_n = "βαρετών"
            },
            Acusativ = {
                sg_m = "βαρετό", sg_f = "βαρετή", sg_n = "βαρετό",
                pl_m = "βαρετούς", pl_f = "βαρετές", pl_n = "βαρετά"
            },
            Vocativ = {
                sg_m = "βαρετέ", sg_f = "βαρετή", sg_n = "βαρετό",
                pl_m = "βαρετοί", pl_f = "βαρετές", pl_n = "βαρετά"
            },
        }
    },
    {
        input_word = "δημοφιλής",
        fem_type = "η", -- Женскиот род е исто така -ής, но аргументот svr не се користи за овој тип
        expected_forms = {
            Nominativ = {
                sg_m = "δημοφιλής", sg_f = "δημοφιλής", sg_n = "δημοφιλές",
                pl_m = "δημοφιλείς", pl_f = "δημοφιλείς", pl_n = "δημοφιλή"
            },
            Genitiv = {
                sg_m = "δημοφιλούς", sg_f = "δημοφιλούς", sg_n = "δημοφιλούς",
                pl_m = "δημοφιλών", pl_f = "δημοφιλών", pl_n = "δημοφιλών"
            },
            Acusativ = {
                sg_m = "δημοφιλή", sg_f = "δημοφιλή", sg_n = "δημοφιλές",
                pl_m = "δημοφιλείς", pl_f = "δημοφιλείς", pl_n = "δημοφιλή"
            },
            Vocativ = {
                sg_m = "δημοφιλή", sg_f = "δημοφιλή", sg_n = "δημοφιλές",
                pl_m = "δημοφιλείς", pl_f = "δημοφιλείς", pl_n = "δημοφιλή"
            },
        }
    },
    {
        input_word = "επείγων",
        fem_type = "", -- Нема специфичен женски тип како 'α' или 'η' за овој придавка што личи на партицип
        expected_forms = {
            Nominativ = {
                sg_m = "επείγων", sg_f = "επείγουσα", sg_n = "επείγον",
                pl_m = "επείγοντες", pl_f = "επείγουσες", pl_n = "επείγοντα"
            },
            Genitiv = {
                sg_m = "επείγοντος", sg_f = "επείγουσας", sg_n = "επείγοντος",
                pl_m = "επείγοντων", pl_f = "επείγουσων", pl_n = "επείγοντων"
            },
            Acusativ = {
                sg_m = "επείγοντα", sg_f = "επείγουσα", sg_n = "επείγον",
                pl_m = "επείγοντες", pl_f = "επείγουσες", pl_n = "επείγοντα"
            },
            Vocativ = {
                sg_m = "επείγων", sg_f = "επείγουσα", sg_n = "επείγον",
                pl_m = "επείγοντες", pl_f = "επείγουσες", pl_n = "επείγοντα"
            },
        }
    },
    {
        input_word = "ντροπαλός",
        fem_type = "η",
        expected_forms = {
            Nominativ = {
                sg_m = "ντροπαλός", sg_f = "ντροπαλή", sg_n = "ντροπαλό",
                pl_m = "ντροπαλοί", pl_f = "ντροπαλές", pl_n = "ντροπαλά"
            },
            Genitiv = {
                sg_m = "ντροπαλού", sg_f = "ντροπαλής", sg_n = "ντροπαλού",
                pl_m = "ντροπαλών", pl_f = "ντροπαλών", pl_n = "ντροπαλών"
            },
            Acusativ = {
                sg_m = "ντροπαλό", sg_f = "ντροπαλή", sg_n = "ντροπαλό",
                pl_m = "ντροπαλούς", pl_f = "ντροπαλές", pl_n = "ντροπαλά"
            },
            Vocativ = {
                sg_m = "ντροπαλέ", sg_f = "ντροπαλή", sg_n = "ντροπαλό",
                pl_m = "ντροπαλοί", pl_f = "ντροπαλές", pl_n = "ντροπαλά"
            },
        }
    },
    {
        input_word = "ολόκληρος",
        fem_type = "η",
        expected_forms = {
            Nominativ = {
                sg_m = "ολόκληρος", sg_f = "ολόκληρη", sg_n = "ολόκληρο",
                pl_m = "ολόκληροι", pl_f = "ολόκληρες", pl_n = "ολόκληρα"
            },
            Genitiv = {
                sg_m = "ολόκληρου", sg_f = "ολόκληρης", sg_n = "ολόκληρου",
                pl_m = "ολόκληρων", pl_f = "ολόκληρων", pl_n = "ολόκληρων"
            },
            Acusativ = {
                sg_m = "ολόκληρο", sg_f = "ολόκληρη", sg_n = "ολόκληρο",
                pl_m = "ολόκληρους", pl_f = "ολόκληρες", pl_n = "ολόκληρα"
            },
            Vocativ = {
                sg_m = "ολόκληρε", sg_f = "ολόκληρη", sg_n = "ολόκληρο",
                pl_m = "ολόκληροι", pl_f = "ολόκληρες", pl_n = "ολόκληρα"
            },
        }
    },
    {
        input_word = "πονηρός",
        fem_type = "η",
        expected_forms = {
            Nominativ = {
                sg_m = "πονηρός", sg_f = "πονηρή", sg_n = "πονηρό",
                pl_m = "πονηροί", pl_f = "πονηρές", pl_n = "πονηρά"
            },
            Genitiv = {
                sg_m = "πονηρού", sg_f = "πονηρής", sg_n = "πονηρού",
                pl_m = "πονηρών", pl_f = "πονηρών", pl_n = "πονηρών"
            },
            Acusativ = {
                sg_m = "πονηρό", sg_f = "πονηρή", sg_n = "πονηρό",
                pl_m = "πονηρούς", pl_f = "πονηρές", pl_n = "πονηρά"
            },
            Vocativ = {
                sg_m = "πονηρέ", sg_f = "πονηρή", sg_n = "πονηρό",
                pl_m = "πονηροί", pl_f = "πονηρές", pl_n = "πονηρά"
            },
        }
    },
    {
        input_word = "πρόσφατος",
        fem_type = "η",
        expected_forms = {
            Nominativ = {
                sg_m = "πρόσφατος", sg_f = "πρόσφατη", sg_n = "πρόσφατο",
                pl_m = "πρόσφατοι", pl_f = "πρόσφατες", pl_n = "πρόσφατα"
            },
            Genitiv = {
                sg_m = "πρόσφατου", sg_f = "πρόσφατης", sg_n = "πρόσφατου",
                pl_m = "πρόσφατων", pl_f = "πρόσφατων", pl_n = "πρόσφατων"
            },
            Acusativ = {
                sg_m = "πρόσφατο", sg_f = "πρόσφατη", sg_n = "πρόσφατο",
                pl_m = "πρόσφατους", pl_f = "πρόσφατες", pl_n = "πρόσφατα"
            },
            Vocativ = {
                sg_m = "πρόσφατε", sg_f = "πρόσφατη", sg_n = "πρόσφατο",
                pl_m = "πρόσφατοι", pl_f = "πρόσφατες", pl_n = "πρόσφατα"
            },
        }
    },
    {
        input_word = "ταχυδρομικός",
        fem_type = "η",
        expected_forms = {
            Nominativ = {
                sg_m = "ταχυδρομικός", sg_f = "ταχυδρομική", sg_n = "ταχυδρομικό",
                pl_m = "ταχυδρομικοί", pl_f = "ταχυδρομικές", pl_n = "ταχυδρομικά"
            },
            Genitiv = {
                sg_m = "ταχυδρομικού", sg_f = "ταχυδρομικής", sg_n = "ταχυδρομικού",
                pl_m = "ταχυδρομικών", pl_f = "ταχυδρομικών", pl_n = "ταχυδρομικών"
            },
            Acusativ = {
                sg_m = "ταχυδρομικό", sg_f = "ταχυδρομική", sg_n = "ταχυδρομικό",
                pl_m = "ταχυδρομικούς", pl_f = "ταχυδρομικές", pl_n = "ταχυδρομικά"
            },
            Vocativ = {
                sg_m = "ταχυδρομικέ", sg_f = "ταχυδρομική", sg_n = "ταχυδρομικό",
                pl_m = "ταχυδρομικοί", pl_f = "ταχυδρομικές", pl_n = "ταχυδρομικά"
            },
        }
    },
    {
        input_word = "τοπικός",
        fem_type = "η",
        expected_forms = {
            Nominativ = {
                sg_m = "τοπικός", sg_f = "τοπική", sg_n = "τοπικό",
                pl_m = "τοπικοί", pl_f = "τοπικές", pl_n = "τοπικά"
            },
            Genitiv = {
                sg_m = "τοπικού", sg_f = "τοπικής", sg_n = "τοπικού",
                pl_m = "τοπικών", pl_f = "τοπικών", pl_n = "τοπικών"
            },
            Acusativ = {
                sg_m = "τοπικό", sg_f = "τοπική", sg_n = "τοπικό",
                pl_m = "τοπικούς", pl_f = "τοπικές", pl_n = "τοπικά"
            },
            Vocativ = {
                sg_m = "τοπικέ", sg_f = "τοπική", sg_n = "τοπικό",
                pl_m = "τοπικοί", pl_f = "τοπικές", pl_n = "τοπικά"
            },
        }
    },
    {
        input_word = "υδραυλικός",
        fem_type = "η",
        expected_forms = {
            Nominativ = {
                sg_m = "υδραυλικός", sg_f = "υδραυλική", sg_n = "υδραυλικό",
                pl_m = "υδραυλικοί", pl_f = "υδραυλικές", pl_n = "υδραυλικά"
            },
            Genitiv = {
                sg_m = "υδραυλικού", sg_f = "υδραυλικής", sg_n = "υδραυλικού",
                pl_m = "υδραυλικών", pl_f = "υδραυλικών", pl_n = "υδραυλικών"
            },
            Acusativ = {
                sg_m = "υδραυλικό", sg_f = "υδραυλική", sg_n = "υδραυλικό",
                pl_m = "υδραυλικούς", pl_f = "υδραυλικές", pl_n = "υδραυλικά"
            },
            Vocativ = {
                sg_m = "υδραυλικέ", sg_f = "υδραυλική", sg_n = "υδραυλικό",
                pl_m = "υδραυλικοί", pl_f = "υδραυλικές", pl_n = "υδραυλικά"
            },
        }
    },
    {
        input_word = "υπεύθυνος",
        fem_type = "η",
        expected_forms = {
            Nominativ = {
                sg_m = "υπεύθυνος", sg_f = "υπεύθυνη", sg_n = "υπεύθυνο",
                pl_m = "υπεύθυνοι", pl_f = "υπεύθυνες", pl_n = "υπεύθυνα"
            },
            Genitiv = {
                sg_m = "υπεύθυνου", sg_f = "υπεύθυνης", sg_n = "υπεύθυνου",
                pl_m = "υπεύθυνων", pl_f = "υπεύθυνων", pl_n = "υπεύθυνων"
            },
            Acusativ = {
                sg_m = "υπεύθυνο", sg_f = "υπεύθυνη", sg_n = "υπεύθυνο",
                pl_m = "υπεύθυνους", pl_f = "υπεύθυνες", pl_n = "υπεύθυνα"
            },
            Vocativ = {
                sg_m = "υπεύθυνε", sg_f = "υπεύθυνη", sg_n = "υπεύθυνο",
                pl_m = "υπεύθυνοι", pl_f = "υπεύθυνες", pl_n = "υπεύθυνα"
            },
        }
    },
    {
        input_word = "χαλαρός",
        fem_type = "η",
        expected_forms = {
            Nominativ = {
                sg_m = "χαλαρός", sg_f = "χαλαρή", sg_n = "χαλαρό",
                pl_m = "χαλαροί", pl_f = "χαλαρές", pl_n = "χαλαρά"
            },
            Genitiv = {
                sg_m = "χαλαρού", sg_f = "χαλαρής", sg_n = "χαλαρού",
                pl_m = "χαλαρών", pl_f = "χαλαρών", pl_n = "χαλαρών"
            },
            Acusativ = {
                sg_m = "χαλαρό", sg_f = "χαλαρή", sg_n = "χαλαρό",
                pl_m = "χαλαρούς", pl_f = "χαλαρές", pl_n = "χαλαρά"
            },
            Vocativ = {
                sg_m = "χαλαρέ", sg_f = "χαλαρή", sg_n = "χαλαρό",
                pl_m = "χαλαροί", pl_f = "χαλαρές", pl_n = "χαλαρά"
            },
        }
    },
}

-- Главна функција за тестирање
function p.run_tests(frame)
    local errors = {}
    local test_count = 0
    local debug_raw_output = {} -- За чување на суровиот излез од главниот модул и парсираните форми

    local case_functions = {
        Nominativ = "Nominativ_case",
        Genitiv = "Genitiv_case",
        Acusativ = "Acusativ_case",
        Vocativ = "Vocativ_case",
    }

    -- Редослед на формите во излезот на модулот
    local form_keys = {"sg_m", "sg_f", "sg_n", "pl_m", "pl_f", "pl_n"}
    local form_labels = {
        sg_m = "Еднина Машки род",
        sg_f = "Еднина Женски род",
        sg_n = "Еднина Среден род",
        pl_m = "Множина Машки род",
        pl_f = "Множина Женски род",
        pl_n = "Множина Среден род"
    }

    for _, test_case in ipairs(test_data) do
        local adjective = test_case.input_word
        local fem_type = test_case.fem_type
        local expected_forms_adj = test_case.expected_forms

        for case_name, func_name in pairs(case_functions) do
            test_count = test_count + 1
            -- Поставување на аргументите на фиктивната рамка
            mock_frame.getParent().args[1] = adjective
            mock_frame.getParent().args[2] = fem_type

            -- Повикување на вистинската функција од главниот модул
            local func = main_module[func_name]
            local received_output_str = func(mock_frame)
            local received_forms = parse_module_output(received_output_str)

            -- Зачувај информации за дебагирање за суров излез и парсирани форми
            table.insert(debug_raw_output, {
                adjective = adjective,
                case_name = case_name,
                raw_output = received_output_str,
                parsed_forms = received_forms
            })

            -- Споредување на формите
            for i, key in ipairs(form_keys) do
                local expected_form = expected_forms_adj[case_name][key]
                local received_form = received_forms[i]

                if expected_form ~= received_form then
                    table.insert(errors, {
                        adjective = adjective,
                        case_name = case_name,
                        form_label = form_labels[key],
                        expected = expected_form,
                        received = received_form
                    })
                end
            end
        end
    end

    -- Креирање на табелата со резултати
    local output_table = "{| class='wikitable sortable'\n"
    output_table = output_table .. "|- \n! Придавка !! Падеж !! Форма !! Очекувано !! Добиено \n"

    if #errors == 0 then
        output_table = output_table .. "|- \n| colspan='5' | '''Сите " .. test_count .. " тестови поминаа успешно!''' \n"
    else
        for _, err in ipairs(errors) do
            output_table = output_table .. "|- \n"
            output_table = output_table .. "| " .. err.adjective .. " \n"
            output_table = output_table .. "| " .. err.case_name .. " \n"
            output_table = output_table .. "| " .. err.form_label .. " \n"
            output_table = output_table .. "| " .. err.expected .. " \n"
            output_table = output_table .. "| " .. err.received .. " \n"
        end
    end

    -- Додајте го дебаг делот на крајот
    output_table = output_table .. "\n|-\n| colspan='5' | '''ДЕБАГ: Суров излез од модулот и парсирани форми'''\n"
    output_table = output_table .. "|- \n! Придавка !! Падеж !! Суров Излез !! Парсирани Форми \n"
    for _, debug_entry in ipairs(debug_raw_output) do
        output_table = output_table .. "|- \n"
        output_table = output_table .. "| " .. debug_entry.adjective .. " \n"
        output_table = output_table .. "| " .. debug_entry.case_name .. " \n"
        output_table = output_table .. "| <nowiki>" .. debug_entry.raw_output .. "</nowiki> \n"
        output_table = output_table .. "| <nowiki>" .. table.concat(debug_entry.parsed_forms, ", ") .. "</nowiki> \n"
    end

    output_table = output_table .. "|}"
    return output_table
end

return p