from __future__ import annotations from evaluation.rag_metrics import ( evaluate_answer, expected_phrase_matches, ) def test_exact_phrase_still_matches() -> None: assert expected_phrase_matches( "slovenský internet", "Téma je slovenský internet.", ) def test_slovak_adjective_and_noun_inflection_matches() -> None: assert expected_phrase_matches( "slovenský internet", "Vyhľadávač na slovenskom internete.", ) def test_graph_neural_network_inflection_matches() -> None: assert expected_phrase_matches( "grafové neurónové siete", ( "Prehľad metód grafových " "neurónových sietí." ), ) def test_person_name_inflection_matches() -> None: assert expected_phrase_matches( "Ján Holp", "Dokument patrí Jánovi Holpovi.", ) def test_numeric_expected_value_requires_exact_numeric_token() -> None: assert expected_phrase_matches( "2021", "Diplomová práca bola v roku 2021.", ) assert not expected_phrase_matches( "2021", "Identifikátor je 20210.", ) def test_unrelated_methods_do_not_match_gnn() -> None: assert not expected_phrase_matches( "grafové neurónové siete", ( "Použili sa transformery, " "autoenkódery a SVM." ), ) def test_word_order_is_not_ignored() -> None: assert not expected_phrase_matches( "slovenský internet", ( "Internetový projekt analyzuje " "slovenský text." ), ) def test_evaluate_answer_uses_morphology_aware_matcher() -> None: question = { "expected_answer_contains": [ "grafové neurónové siete", ], "expected_source_urls": [ ( "https://zp.kemt.fei.tuke.sk/" "students/2016/maros_harahus" ), ], "should_answer": True, } answer = ( "Maroš mal pripraviť prehľad " "grafových neurónových sietí.\n\n" "Zdroj: " "https://zp.kemt.fei.tuke.sk/" "students/2016/maros_harahus" ) metrics = evaluate_answer( question, answer, tool_called=True, ) assert ( metrics[ "answer_matches" ] == [ True ] ) assert ( metrics[ "strict_pass" ] is True )