22
33from __future__ import annotations
44
5- from pptx . oxml . slide import CT_NotesMaster , CT_NotesSlide
5+ from typing import cast
66
7+ import pytest
8+
9+ from pptx .oxml .slide import (
10+ CT_HandoutMaster ,
11+ CT_HeaderFooter ,
12+ CT_NotesMaster ,
13+ CT_NotesSlide ,
14+ CT_SlideLayout ,
15+ CT_SlideMaster ,
16+ )
17+
18+ from ..unitutil .cxml import element
719from ..unitutil .file import snippet_text
820
921
@@ -21,3 +33,104 @@ class DescribeCT_NotesSlide(object):
2133 def it_can_create_a_new_notes_element (self ):
2234 notes = CT_NotesSlide .new ()
2335 assert notes .xml == snippet_text ("default-notes" )
36+
37+
38+ class DescribeCT_HeaderFooter (object ):
39+ """Unit-test suite for `pptx.oxml.slide.CT_HeaderFooter` objects."""
40+
41+ @pytest .mark .parametrize (
42+ ("hf_cxml" , "expected" ),
43+ [
44+ ("p:hf" , (True , True , True , True )),
45+ ("p:hf{sldNum=0,hdr=0,ftr=0,dt=0}" , (False , False , False , False )),
46+ ("p:hf{sldNum=1,hdr=1,ftr=1,dt=1}" , (True , True , True , True )),
47+ ("p:hf{sldNum=0}" , (False , True , True , True )),
48+ ("p:hf{hdr=0}" , (True , False , True , True )),
49+ ("p:hf{ftr=0}" , (True , True , False , True )),
50+ ("p:hf{dt=0}" , (True , True , True , False )),
51+ ],
52+ )
53+ def it_provides_boolean_access_to_its_four_visibility_attrs (
54+ self , hf_cxml : str , expected : tuple [bool , bool , bool , bool ]
55+ ):
56+ hf = cast (CT_HeaderFooter , element (hf_cxml ))
57+ assert (hf .sldNum , hf .hdr , hf .ftr , hf .dt ) == expected
58+
59+ @pytest .mark .parametrize ("attr_name" , ["sldNum" , "hdr" , "ftr" , "dt" ])
60+ def it_can_toggle_each_attribute_via_setter (self , attr_name : str ):
61+ hf = cast (CT_HeaderFooter , element ("p:hf" ))
62+ # ---default value is True when attr is absent---
63+ assert getattr (hf , attr_name ) is True
64+ # ---set False, read back False---
65+ setattr (hf , attr_name , False )
66+ assert getattr (hf , attr_name ) is False
67+ # ---set back to True---
68+ setattr (hf , attr_name , True )
69+ assert getattr (hf , attr_name ) is True
70+
71+
72+ class DescribeCT_HandoutMaster (object ):
73+ """Unit-test suite for `pptx.oxml.slide.CT_HandoutMaster` objects."""
74+
75+ def it_provides_access_to_its_hf_child (self ):
76+ handoutMaster = cast (
77+ CT_HandoutMaster ,
78+ element ("p:handoutMaster/(p:cSld/p:spTree,p:clrMap,p:hf{ftr=0})" ),
79+ )
80+ assert handoutMaster .hf is not None
81+ assert handoutMaster .hf .ftr is False
82+
83+ def it_returns_None_for_hf_when_absent (self ):
84+ handoutMaster = cast (
85+ CT_HandoutMaster , element ("p:handoutMaster/(p:cSld/p:spTree,p:clrMap)" )
86+ )
87+ assert handoutMaster .hf is None
88+
89+ def it_can_add_an_hf_child_via_get_or_add (self ):
90+ handoutMaster = cast (
91+ CT_HandoutMaster , element ("p:handoutMaster/(p:cSld/p:spTree,p:clrMap)" )
92+ )
93+ hf = handoutMaster .get_or_add_hf ()
94+ assert hf is handoutMaster .hf
95+ # ---defaults all True on a freshly-added <p:hf/>---
96+ assert (hf .sldNum , hf .hdr , hf .ftr , hf .dt ) == (True , True , True , True )
97+
98+
99+ class DescribeHFAccessOnTemplates (object ):
100+ """`hf` ZeroOrOne accessor on SlideMaster / SlideLayout / NotesMaster / HandoutMaster."""
101+
102+ def it_reads_hf_on_a_sldMaster (self ):
103+ sldMaster = cast (
104+ CT_SlideMaster ,
105+ element ("p:sldMaster/(p:cSld/p:spTree,p:hf{sldNum=0,ftr=0})" ),
106+ )
107+ assert sldMaster .hf is not None
108+ assert sldMaster .hf .sldNum is False
109+ assert sldMaster .hf .ftr is False
110+ assert sldMaster .hf .dt is True
111+
112+ def it_returns_None_for_hf_on_a_sldMaster_when_absent (self ):
113+ sldMaster = cast (CT_SlideMaster , element ("p:sldMaster/p:cSld/p:spTree" ))
114+ assert sldMaster .hf is None
115+
116+ def it_reads_hf_on_a_sldLayout (self ):
117+ sldLayout = cast (CT_SlideLayout , element ("p:sldLayout/(p:cSld/p:spTree,p:hf{dt=0})" ))
118+ assert sldLayout .hf is not None
119+ assert sldLayout .hf .dt is False
120+
121+ def it_returns_None_for_hf_on_a_sldLayout_when_absent (self ):
122+ sldLayout = cast (CT_SlideLayout , element ("p:sldLayout/p:cSld/p:spTree" ))
123+ assert sldLayout .hf is None
124+
125+ def it_reads_hf_on_a_notesMaster (self ):
126+ notesMaster = cast (
127+ CT_NotesMaster ,
128+ element ("p:notesMaster/(p:cSld/p:spTree,p:hf{hdr=0,ftr=0})" ),
129+ )
130+ assert notesMaster .hf is not None
131+ assert notesMaster .hf .hdr is False
132+ assert notesMaster .hf .ftr is False
133+
134+ def it_returns_None_for_hf_on_a_notesMaster_when_absent (self ):
135+ notesMaster = cast (CT_NotesMaster , element ("p:notesMaster/p:cSld/p:spTree" ))
136+ assert notesMaster .hf is None
0 commit comments