File: test_404b_object_collections.py

package info (click to toggle)
ezdxf 1.4.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 104,528 kB
  • sloc: python: 182,341; makefile: 116; lisp: 20; ansic: 4
file content (146 lines) | stat: -rw-r--r-- 4,835 bytes parent folder | download | duplicates (2)
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
#  Copyright (c) 2021, Manfred Moitzi
#  License: MIT License
"""
Test the ezdxf.entities.objectcollection module, but the tests need
a real implementation: MLeaderStyleCollection

"""
import pytest

import ezdxf
from ezdxf.entities import is_dxf_object


@pytest.fixture(scope="module")
def collection_ro():
    """Creates a read only document"""
    doc = ezdxf.new()
    doc.entitydb.locked = True
    return doc.mleader_styles


class TestGetterMethods:
    def test_len(self, collection_ro):
        assert len(collection_ro) == 1

    def test_iter(self, collection_ro):
        assert len(list(collection_ro)) == 1

    def test_is_unique_name(self, collection_ro):
        assert collection_ro.is_unique_name("STANDARD") is False

    def test_contains(self, collection_ro):
        assert ("Standard" in collection_ro) is True

    def test_contains_is_case_insensitive(self, collection_ro):
        assert ("STANDARD" in collection_ro) is True

    def test_getitem(self, collection_ro):
        assert collection_ro["Standard"].dxf.name == "Standard"

    def test_getitem_is_case_insensitive(self, collection_ro):
        assert collection_ro["STANDARD"].dxf.name == "Standard"

    def test_get(self, collection_ro):
        assert collection_ro.get("Standard").dxf.name == "Standard"

    def test_get_is_case_insensitive(self, collection_ro):
        assert collection_ro.get("STANDARD").dxf.name == "Standard"


@pytest.fixture(scope="module")
def collection_rw():
    doc = ezdxf.new()
    return doc.mleader_styles


class TestCreateNewEntry:
    def test_new_entry_is_an_object(self, collection_rw):
        obj = collection_rw.new("New1")
        assert is_dxf_object(obj) is True
        assert obj.dxf.name == "New1"

    def test_new_entry_is_added_to_collection(self, collection_rw):
        count = len(collection_rw)
        collection_rw.new("New2")
        assert len(collection_rw) == count + 1
        assert "NEW2" in collection_rw, "case insensitive names"

    def test_cannot_use_existing_name(self, collection_rw):
        collection_rw.new("New3")
        with pytest.raises(ValueError):
            collection_rw.new("NEW3"), "case insensitive names"

    def test_invalid_char_in_name_raises_exception(self, collection_rw):
        with pytest.raises(ValueError):
            collection_rw.new("New:")


class TestDeleteEntry:
    def test_delete_entry_remove_entry(self, collection_rw):
        count = len(collection_rw)
        collection_rw.new("Del1")
        collection_rw.delete("DEL1")
        assert len(collection_rw) == count

    def test_delete_non_existing_entry_does_not_raise_exception(
        self, collection_rw
    ):
        count = len(collection_rw)
        collection_rw.delete("DEL2")
        assert len(collection_rw) == count


class TestDuplicateEntry:
    def test_duplicate_existing_entry(self, collection_rw):
        count = len(collection_rw)
        obj = collection_rw.duplicate_entry("STANDARD", "Dup1")
        assert is_dxf_object(obj) is True
        assert obj.dxf.name == "Dup1"
        assert len(collection_rw) == count + 1

    def test_duplicate_non_existing_entry_raises_exception(self, collection_rw):
        with pytest.raises(ValueError):
            collection_rw.duplicate_entry("NON_EXISTING_ENTRY", "Dup1")

    def test_new_entry_replaces_existing_entry(self, collection_rw):
        count = len(collection_rw)
        obj1 = collection_rw.duplicate_entry("STANDARD", "Dup2")
        obj2 = collection_rw.duplicate_entry("Standard", "DUP2")
        assert obj1 is not obj2, "obj2 must be a new object"
        assert collection_rw.get("Dup2") is obj2, "obj2 should replace obj1"
        assert len(collection_rw) == count + 1

    def test_duplicated_entries_have_same_content(self, collection_rw):
        def attribs(obj):
            a = obj.dxf.all_existing_dxf_attribs()
            del a['handle']
            del a['name']
            return a

        obj0 = collection_rw.get("Standard")
        obj1 = collection_rw.duplicate_entry("STANDARD", "Dup3")
        attribs0 = attribs(obj0)
        attribs1 = attribs(obj1)
        assert len(attribs0) > 1
        assert attribs0 == attribs1
        assert obj1.get_reactors() == obj0.get_reactors()

    def test_duplicated_entry_is_stored_in_objects_section(self, collection_rw):
        obj = collection_rw.duplicate_entry("STANDARD", "Dup4")
        assert obj.dxf.handle in obj.doc.objects

    def test_invalid_char_in_new_name_raises_exception(self, collection_rw):
        with pytest.raises(ValueError):
            collection_rw.duplicate_entry("Standard", "New:")


def test_clear():
    doc = ezdxf.new()
    doc.mleader_styles.clear()
    # This creates an invalid DXF file!!!
    assert len(doc.mleader_styles) == 0


if __name__ == "__main__":
    pytest.main([__file__])