File: test_enum.py

package info (click to toggle)
python-docx 0.8.11%2Bdfsg1-5
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 6,640 kB
  • sloc: xml: 25,311; python: 21,911; makefile: 168
file content (101 lines) | stat: -rw-r--r-- 3,055 bytes parent folder | download
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
# encoding: utf-8

"""
Test suite for docx.enum module, focused on base classes. Configured a little
differently because of the meta-programming, the two enumeration classes at
the top constitute the entire fixture and the tests themselves just make
assertions on those.
"""

from __future__ import absolute_import, print_function

import pytest

from docx.enum.base import (
    alias, Enumeration, EnumMember, ReturnValueOnlyEnumMember,
    XmlEnumeration, XmlMappedEnumMember
)


@alias('BARFOO')
class FOOBAR(Enumeration):
    """
    Enumeration docstring
    """

    __ms_name__ = 'MsoFoobar'

    __url__ = 'http://msdn.microsoft.com/foobar.aspx'

    __members__ = (
        EnumMember(None, None, 'No setting/remove setting'),
        EnumMember('READ_WRITE', 1, 'Readable and settable'),
        ReturnValueOnlyEnumMember('READ_ONLY', -2, 'Return value only'),
    )


@alias('XML-FU')
class XMLFOO(XmlEnumeration):
    """
    XmlEnumeration docstring
    """

    __ms_name__ = 'MsoXmlFoobar'

    __url__ = 'http://msdn.microsoft.com/msoxmlfoobar.aspx'

    __members__ = (
        XmlMappedEnumMember(None, None, None, 'No setting'),
        XmlMappedEnumMember('XML_RW', 42, 'attrVal', 'Read/write setting'),
        ReturnValueOnlyEnumMember('RO', -2, 'Return value only;'),
    )


class DescribeEnumeration(object):

    def it_has_the_right_metaclass(self):
        assert type(FOOBAR).__name__ == 'MetaEnumeration'

    def it_provides_an_EnumValue_instance_for_each_named_member(self):
        with pytest.raises(AttributeError):
            getattr(FOOBAR, 'None')
        for obj in (FOOBAR.READ_WRITE, FOOBAR.READ_ONLY):
            assert type(obj).__name__ == 'EnumValue'

    def it_provides_the_enumeration_value_for_each_named_member(self):
        assert FOOBAR.READ_WRITE == 1
        assert FOOBAR.READ_ONLY == -2

    def it_knows_if_a_setting_is_valid(self):
        FOOBAR.validate(None)
        FOOBAR.validate(FOOBAR.READ_WRITE)
        with pytest.raises(ValueError):
            FOOBAR.validate('foobar')
        with pytest.raises(ValueError):
            FOOBAR.validate(FOOBAR.READ_ONLY)

    def it_can_be_referred_to_by_a_convenience_alias_if_defined(self):
        assert BARFOO is FOOBAR  # noqa


class DescribeEnumValue(object):

    def it_provides_its_symbolic_name_as_its_string_value(self):
        assert ('%s' % FOOBAR.READ_WRITE) == 'READ_WRITE (1)'

    def it_provides_its_description_as_its_docstring(self):
        assert FOOBAR.READ_ONLY.__doc__ == 'Return value only'


class DescribeXmlEnumeration(object):

    def it_knows_the_XML_value_for_each_of_its_xml_members(self):
        assert XMLFOO.to_xml(XMLFOO.XML_RW) == 'attrVal'
        assert XMLFOO.to_xml(42) == 'attrVal'
        with pytest.raises(ValueError):
            XMLFOO.to_xml(XMLFOO.RO)

    def it_can_map_each_of_its_xml_members_from_the_XML_value(self):
        assert XMLFOO.from_xml(None) is None
        assert XMLFOO.from_xml('attrVal') == XMLFOO.XML_RW
        assert str(XMLFOO.from_xml('attrVal')) == 'XML_RW (42)'