File size: 5,292 Bytes
3315103
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# -*- coding: utf-8 -*-

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()):
            # print group_idx, records[0]['seqno'], len(records)
            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))