55 lines
2.2 KiB
Python
55 lines
2.2 KiB
Python
import unittest
|
|
from dataclasses import replace
|
|
from graphlib import CycleError
|
|
|
|
from syntax_dag import Decoder, Edge, Encoder, Proposal
|
|
|
|
|
|
class SyntaxDAGTest(unittest.TestCase):
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
cls.encoder = Encoder()
|
|
cls.decoder = Decoder()
|
|
|
|
def test_round_trip(self):
|
|
for text in ("", " \t", " It rained.\n\nThe road flooded. "):
|
|
with self.subTest(text=text):
|
|
graph = self.encoder.encode(text)
|
|
self.assertEqual(self.decoder.decode(graph), text)
|
|
self.assertFalse(graph.proposals)
|
|
|
|
def test_causal_commit(self):
|
|
text = "The road flooded because it rained. They waited."
|
|
graph = self.encoder.encode(text)
|
|
proposal, = graph.proposals
|
|
self.assertTrue(any(
|
|
len({edge.source for edge in graph.edges if edge.target == node}) > 1
|
|
for node in range(len(graph.tokens))
|
|
))
|
|
committed = graph.commit(proposal)
|
|
self.assertEqual(self.decoder.decode(graph), text)
|
|
self.assertEqual(
|
|
self.decoder.decode(committed),
|
|
"Cause: it rained. Effect: The road flooded. They waited.",
|
|
)
|
|
self.assertEqual(committed.history, (proposal,))
|
|
self.assertIs(committed.commit(proposal), committed)
|
|
self.assertNotIn(proposal.edge, graph.edges)
|
|
|
|
def test_cycle_rejects_entire_commit(self):
|
|
graph = self.encoder.encode("The road flooded because it rained.")
|
|
original, = graph.proposals
|
|
reverse = Proposal(Edge(original.edge.target, original.edge.source, "causes"),
|
|
original.marker, "test")
|
|
committed = replace(graph.commit(original), proposals=(original, reverse))
|
|
with self.assertRaises(CycleError):
|
|
committed.commit(reverse)
|
|
self.assertEqual(committed.history, (original,))
|
|
self.assertNotIn(reverse.edge, committed.edges)
|
|
|
|
def test_negation_and_questions_are_left_alone(self):
|
|
for text in ("The road did not flood because it rained.",
|
|
"Did the road flood because it rained?"):
|
|
with self.subTest(text=text):
|
|
self.assertFalse(self.encoder.encode(text).proposals)
|