|
|
|
|
|
|
|
|
from io import BytesIO |
|
|
import json |
|
|
|
|
|
from hwp5 import recordstream as RS |
|
|
from hwp5.recordstream import RecordStream |
|
|
from hwp5.recordstream import dump_record |
|
|
from hwp5.recordstream import read_record |
|
|
from hwp5.recordstream import record_to_json |
|
|
from hwp5.storage import ExtraItemStorage |
|
|
from hwp5.tagids import HWPTAG_DOCUMENT_PROPERTIES |
|
|
from hwp5.tagids import HWPTAG_ID_MAPPINGS |
|
|
from hwp5.tagids import HWPTAG_PARA_HEADER |
|
|
from hwp5.utils import cached_property |
|
|
|
|
|
from . import test_filestructure |
|
|
|
|
|
|
|
|
class TestBase(test_filestructure.TestBase): |
|
|
|
|
|
@property |
|
|
def hwp5file_rec(self): |
|
|
return RS.Hwp5File(self.olestg) |
|
|
|
|
|
hwp5file = hwp5file_rec |
|
|
|
|
|
|
|
|
class TestRecord(TestBase): |
|
|
|
|
|
def test_read_record(self): |
|
|
docinfo_stream = self.hwp5file['DocInfo'] |
|
|
|
|
|
record = read_record(docinfo_stream.open(), 0) |
|
|
self.assertEqual(HWPTAG_DOCUMENT_PROPERTIES, record['tagid']) |
|
|
|
|
|
def test_dump_record(self): |
|
|
docinfo_stream = self.hwp5file['DocInfo'] |
|
|
record = read_record(docinfo_stream.open(), 0) |
|
|
stream = BytesIO() |
|
|
dump_record(stream, record) |
|
|
stream.seek(0) |
|
|
record2 = read_record(stream, 0) |
|
|
self.assertEqual(record2, record) |
|
|
|
|
|
|
|
|
class TestRecordStream(TestBase): |
|
|
|
|
|
@cached_property |
|
|
def docinfo(self): |
|
|
return RecordStream(self.hwp5file_fs['DocInfo'], |
|
|
self.hwp5file_fs.header.version) |
|
|
|
|
|
def test_records(self): |
|
|
self.assertEqual(67, len(list(self.docinfo.records()))) |
|
|
|
|
|
def test_records_kwargs_treegroup(self): |
|
|
records = self.docinfo.records(treegroup=1) |
|
|
self.assertEqual(66, len(records)) |
|
|
self.assertEqual(HWPTAG_ID_MAPPINGS, records[0]['tagid']) |
|
|
|
|
|
records = self.docinfo.records(treegroup=0) |
|
|
self.assertEqual(1, len(records)) |
|
|
self.assertEqual(HWPTAG_DOCUMENT_PROPERTIES, records[0]['tagid']) |
|
|
|
|
|
records = self.bodytext.section(0).records(treegroup=5) |
|
|
self.assertEqual(26, records[0]['seqno']) |
|
|
self.assertEqual(37, len(records)) |
|
|
|
|
|
def test_record(self): |
|
|
record = self.docinfo.record(0) |
|
|
self.assertEqual(0, record['seqno']) |
|
|
|
|
|
record = self.docinfo.record(10) |
|
|
self.assertEqual(10, record['seqno']) |
|
|
|
|
|
def test_records_treegrouped(self): |
|
|
groups = self.docinfo.records_treegrouped() |
|
|
document_properties_treerecords = next(groups) |
|
|
self.assertEqual(1, len(document_properties_treerecords)) |
|
|
idmappings_treerecords = next(groups) |
|
|
self.assertEqual(66, len(idmappings_treerecords)) |
|
|
|
|
|
section = self.bodytext.section(0) |
|
|
for group_idx, records in enumerate(section.records_treegrouped()): |
|
|
|
|
|
self.assertEqual(HWPTAG_PARA_HEADER, records[0]['tagid']) |
|
|
|
|
|
def test_records_treegrouped_as_iterable(self): |
|
|
groups = self.docinfo.records_treegrouped(group_as_list=False) |
|
|
group = next(groups) |
|
|
self.assertFalse(isinstance(group, list)) |
|
|
|
|
|
def test_records_treegroped_as_list(self): |
|
|
groups = self.docinfo.records_treegrouped() |
|
|
group = next(groups) |
|
|
self.assertTrue(isinstance(group, list)) |
|
|
|
|
|
def test_records_treegroup(self): |
|
|
records = self.docinfo.records_treegroup(1) |
|
|
self.assertEqual(66, len(records)) |
|
|
self.assertEqual(HWPTAG_ID_MAPPINGS, records[0]['tagid']) |
|
|
|
|
|
records = self.docinfo.records_treegroup(0) |
|
|
self.assertEqual(1, len(records)) |
|
|
self.assertEqual(HWPTAG_DOCUMENT_PROPERTIES, records[0]['tagid']) |
|
|
|
|
|
records = self.bodytext.section(0).records_treegroup(5) |
|
|
self.assertEqual(26, records[0]['seqno']) |
|
|
self.assertEqual(37, len(records)) |
|
|
|
|
|
|
|
|
class TestHwp5File(TestBase): |
|
|
|
|
|
def test_if_hwp5file_contains_other_formats(self): |
|
|
stg = ExtraItemStorage(self.hwp5file) |
|
|
self.assertTrue('DocInfo.records' in list(stg)) |
|
|
|
|
|
def test_docinfo(self): |
|
|
docinfo = self.hwp5file.docinfo |
|
|
self.assertTrue(isinstance(docinfo, RS.RecordStream)) |
|
|
records = list(docinfo.records()) |
|
|
self.assertEqual(67, len(records)) |
|
|
|
|
|
def test_bodytext(self): |
|
|
bodytext = self.hwp5file.bodytext |
|
|
self.assertTrue(isinstance(bodytext, RS.Sections)) |
|
|
stg = ExtraItemStorage(bodytext) |
|
|
self.assertEqual(['Section0', 'Section0.records'], list(stg)) |
|
|
|
|
|
|
|
|
class TestJson(TestBase): |
|
|
def test_record_to_json(self): |
|
|
record = next(self.hwp5file.docinfo.records()) |
|
|
json_string = record_to_json(record) |
|
|
jsonobject = json.loads(json_string) |
|
|
self.assertEqual(16, jsonobject['tagid']) |
|
|
self.assertEqual(0, jsonobject['level']) |
|
|
self.assertEqual(26, jsonobject['size']) |
|
|
self.assertEqual(['01 00 01 00 01 00 01 00 01 00 01 00 01 00 00 00', |
|
|
'00 00 07 00 00 00 05 00 00 00'], |
|
|
jsonobject['payload']) |
|
|
self.assertEqual(0, jsonobject['seqno']) |
|
|
self.assertEqual('HWPTAG_DOCUMENT_PROPERTIES', jsonobject['tagname']) |
|
|
|
|
|
def test_generate_json(self): |
|
|
records_json = self.hwp5file.docinfo.records_json() |
|
|
json_string = ''.join(records_json.generate()) |
|
|
|
|
|
jsonobject = json.loads(json_string) |
|
|
self.assertEqual(67, len(jsonobject)) |
|
|
|