import unittest from core.annotate import annotate_text, merge_conllu, resolve_model PART = """# generator = UDPipe 2, https://lindat.mff.cuni.cz/services/udpipe # udpipe_model = german-hdt-ud-2.17-251125 # newdoc # newpar # sent_id = 1 # text = {text} 1\t{text}\t_\tNOUN\t_\t_\t0\troot\t_\t_ """ class FakeClient: def __init__(self, error=None): self.calls = [] self.error = error def parse_sentence(self, text, model, strip_morphology=True, cache=None): self.calls.append((text, model, strip_morphology)) if self.error: return {"conllu": "", "model": model, "error": self.error} return {"conllu": PART.format(text=text), "model": model, "error": None} class AnnotateTests(unittest.TestCase): def test_resolve_model_accepts_label_and_id(self): self.assertEqual(resolve_model("UDPipe ยท german-gsd-ud-2.17-251125"), "german-gsd-ud-2.17-251125") self.assertEqual(resolve_model("german-gsd-ud-2.17-251125"), "german-gsd-ud-2.17-251125") with self.assertRaises(ValueError): resolve_model("german") def test_lines_are_parsed_separately_and_renumbered(self): client = FakeClient() result = annotate_text("Eins\n\n Zwei \n", "german-hdt-ud-2.17-251125", client=client) self.assertEqual([call[0] for call in client.calls], ["Eins", "Zwei"]) self.assertTrue(client.calls[0][2]) conllu = result["conllu"] self.assertEqual(result["sentences"], 2) self.assertEqual(conllu.count("# generator"), 1) self.assertNotIn("# newdoc", conllu) self.assertIn("# sent_id = 1\n# text = Eins", conllu) self.assertIn("# sent_id = 2\n# text = Zwei", conllu) self.assertTrue(conllu.endswith("\n\n")) def test_morphology_flag_is_passed(self): client = FakeClient() annotate_text("Eins", "german-hdt-ud-2.17-251125", include_morphology=True, client=client) self.assertFalse(client.calls[0][2]) def test_one_line_may_yield_several_sentences(self): merged = merge_conllu([PART.format(text="A") + PART.format(text="B")], "m") self.assertIn("# sent_id = 2\n# text = B", merged) def test_errors(self): with self.assertRaises(ValueError): annotate_text(" \n ", "german-hdt-ud-2.17-251125", client=FakeClient()) with self.assertRaises(RuntimeError): annotate_text("Eins", "german-hdt-ud-2.17-251125", client=FakeClient(error="down")) if __name__ == "__main__": unittest.main()