import json
import tempfile
import unittest
import xml.etree.ElementTree as ET
from pathlib import Path
from paper_atlas.collectors.acl import paper_id,volume_scope,collect_xml
class AnthologyTests(unittest.TestCase):
def test_documented_identifier_formats_and_exceptions(self):
for args,expected in [(('P17','1','1'),'P17-1001'),(('2025.acl','long','1'),'2025.acl-long.1'),(('C69','1','1'),'C69-0101'),(('D19','50','1'),'D19-5001'),(('W17','1','1'),'W17-0101')]:
self.assertEqual(paper_id(*args),expected)
def test_findings_uses_associated_conference_and_separate_track(self):
meta=ET.fromstring('findingsFindings of ACL: EMNLP 2025')
self.assertEqual(volume_scope(meta,'emnlp'),('EMNLP',['EMNLP'],'findings'))
def test_joint_event_has_one_identity_and_two_aliases(self):
meta=ET.fromstring('lreccolingLREC-COLING 2024')
self.assertEqual(volume_scope(meta,'main'),('COLING+LREC',['COLING','LREC'],'main'))
def test_xml_mixed_text_frontmatter_and_missing_abstract(self):
xml='2017aclACLFront matterA Mixed TitleJaneDoe10.18653/v1/P17-1001'
with tempfile.TemporaryDirectory() as tmp:
path=Path(tmp)/'P17.xml';path.write_text(xml)
result=collect_xml(path,tmp,'a'*40)[0]
row=json.loads(Path(result['file']).read_text())
self.assertEqual(result['count'],1)
self.assertEqual(result['excluded_frontmatter'],1)
self.assertEqual(result['status'],'partial')
self.assertEqual(row['external_id'],'P17-1001')
self.assertEqual(row['title'],'A Mixed Title')
def test_non_target_workshop_is_not_main_conference(self):
meta=ET.fromstring('some-workshopwsWorkshop at ACL')
self.assertIsNone(volume_scope(meta,'1'))
if __name__=='__main__':unittest.main()