Example #1
0
def test_template_qrcode(tmp_path):  # issue-175
    elements = [
        {
            "name": "barcode_0",
            "type": "I",
            "x1": 50,
            "y1": 50,
            "x2": 100,
            "y2": 100,
            "priority": 0,
            "text": None,
        },
        {
            "name": "barcode_1",
            "type": "I",
            "x1": 150,
            "y1": 150,
            "x2": 200,
            "y2": 200,
            "priority": 0,
            "text": None,
        },
    ]
    tmpl = Template(format="letter", elements=elements)
    tmpl.add_page()
    tmpl["barcode_0"] = qrcode.make("Test 0").get_image()
    tmpl["barcode_1"] = qrcode.make("Test 1").get_image()
    assert_pdf_equal(tmpl, HERE / "template_qrcode.pdf", tmp_path)
Example #2
0
def test_template_multipage(tmp_path):
    """Testing a Template() populating several pages."""
    tmpl = Template(format="A4", title="Sample Invoice")
    tmpl.parse_csv(HERE / "mycsvfile.csv", delimiter=";")
    tmpl.add_page()
    tmpl["name0"] = "Joe Doe"
    tmpl["title0"] = "Director"
    tmpl.add_page()
    tmpl["name0"] = "Jane Doe"
    tmpl["title0"] = "General Manager"
    tmpl.add_page()
    tmpl["name0"] = "Heinz Mustermann"
    tmpl["title0"] = "Worker"
    assert_pdf_equal(tmpl, HERE / "template_multipage.pdf", tmp_path)
Example #3
0
    def do_print(self, evt):
        # genero el renderizador con propiedades del PDF
        paper_size = self.paper_size or DEFAULT_PAPER_SIZE
        orientation = self.paper_orientation or DEFAULT_PAPER_ORIENTATION

        t = Template(
            format=paper_size,
            orientation=orientation,
            elements=[e.as_dict() for e in self.elements if not e.static])
        t.add_page()
        if not t['logo'] or not os.path.exists(t['logo']):
            # put a default logo so it doesn't throw an exception
            logo = os.path.join(os.path.dirname(__file__), 'tutorial',
                                'logo.png')
            t.set('logo', logo)
        try:
            t.render(self.filename + ".pdf")
        except:
            if DEBUG and False:
                import pdb
                pdb.pm()
            else:
                raise
        if sys.platform.startswith("linux"):
            os.system('xdg-open "%s.pdf"' % self.filename)
        else:
            os.startfile(self.filename + ".pdf")
Example #4
0
def test_template_item_access():
    """Testing Template() getitem/setitem."""
    elements = [{
        "name": "name",
        "type": "T",
        "x1": 20,
        "y1": 75,
        "x2": 30,
        "y2": 90,
        "text": "default text",
    }]
    templ = Template(elements=elements)
    assert ("notthere" in templ) is False
    with raises(FPDFException):
        templ["notthere"] = "something"
    with raises(KeyError):
        # pylint: disable=pointless-statement
        templ["notthere"]
    defaultval = templ["name"]  # find in default data
    assert defaultval == "default text"
    templ["name"] = "new text"
    defaultval = templ["name"]  # find in text data
    assert defaultval == "new text"
    # bad type item access
    with raises(AssertionError):
        # pylint: disable=pointless-statement
        templ[7]
    with raises(AssertionError):
        templ[7] = 8
    with raises(AssertionError):
        # pylint: disable=pointless-statement
        7 in templ
Example #5
0
def test_template_code39(tmp_path):  # issue-161
    elements = [
        {
            "name": "code39",
            "type": "C39",
            "x1": 40,
            "y1": 50,
            "y2": 70,
            "size": 1.5,
            "text": "*Code 39 barcode*",
            "priority": 1,
        },
    ]
    tmpl = Template(format="A4",
                    title="Sample Code 39 barcode",
                    elements=elements)
    tmpl.add_page()
    assert_pdf_equal(tmpl, HERE / "template_code39.pdf", tmp_path)
Example #6
0
def test_rect_background(tmp_path):  # issue-203
    elements = [
        {
            "name": "A rectangle",
            "type": "B",
            "background": 0x80FF00,
            "foreground": 0x80FF00,
            "text": None,
            "priority": 1,
            "x1": 50,
            "y1": 50,
            "x2": 150,
            "y2": 150,
        },
    ]
    tmpl = Template(format="A4", elements=elements)
    tmpl.add_page()
    assert_pdf_equal(tmpl, HERE / "template_rect_background.pdf", tmp_path)
Example #7
0
def test_template_code39_defaultheight(
        tmp_path):  # height <= 0 invokes default
    elements = [
        {
            "name": "code39",
            "type": "C39",
            "x1": 40,
            "y1": 50,
            "y2": 50,
            "size": 1.5,
            "text": "*Code 39 barcode*",
            "priority": 1,
        },
    ]
    tmpl = Template(format="A4",
                    title="Sample Code 39 barcode",
                    elements=elements)
    tmpl.add_page()
    assert_pdf_equal(tmpl, HERE / "template_code39_defaultheight.pdf",
                     tmp_path)
Example #8
0
def test_template_code39_legacy(tmp_path):
    # check that old parameters still work
    # This uses the same values as above, and compares to the same file.
    elements = [
        {
            "name": "code39",
            "type": "C39",
            "x": 40,
            "y": 50,
            "w": 1.5,
            "h": 20,
            "text": "*Code 39 barcode*",
            "priority": 1,
        },
    ]
    with warns(DeprecationWarning):
        tmpl = Template(format="A4",
                        title="Sample Code 39 barcode",
                        elements=elements)
        tmpl.add_page()
        assert_pdf_equal(tmpl, HERE / "template_code39.pdf", tmp_path)
Example #9
0
 def test_nominal_csv(self):
     "Taken from docs/Templates.md"
     tmpl = Template(format="A4", title="Sample Invoice")
     tmpl.parse_csv(relative_path_to("mycsvfile.csv"), delimiter=";")
     tmpl.add_page()
     tmpl["company_name"] = "Sample Company"
     assert_pdf_equal(self, tmpl, "test_nominal_csv.pdf")
Example #10
0
def test_nominal_csv(tmp_path):
    """Taken from docs/Templates.md"""
    tmpl = Template(format="A4", title="Sample Invoice")
    tmpl.parse_csv(HERE / "mycsvfile.csv", delimiter=";")
    tmpl.add_page()
    tmpl["company_name"] = "Sample Company"
    assert_pdf_equal(tmpl, HERE / "template_nominal_csv.pdf", tmp_path)
Example #11
0
def test_template_split_multicell():
    elements = [{
        "name": "multline_text",
        "type": "T",
        "x1": 20,
        "y1": 100,
        "x2": 60,
        "y2": 105,
        "font": "helvetica",
        "size": 12,
        "bold": 0,
        "italic": 0,
        "underline": 0,
        "foreground": 0,
        "background": 0x88FF00,
        "align": "I",
        "text": "Lorem ipsum",
        "priority": 2,
        "multiline": True,
    }]
    text = ("Lorem ipsum dolor sit amet, consetetur sadipscing elitr,"
            " sed diam nonumy eirmod tempor invidunt ut labore et dolore"
            " magna aliquyam erat, sed diam voluptua.")
    expected = [
        "Lorem ipsum dolor",
        "sit amet, consetetur",
        "sadipscing elitr, sed",
        "diam nonumy",
        "eirmod tempor",
        "invidunt ut labore et",
        "dolore magna",
        "aliquyam erat, sed",
        "diam voluptua.",
    ]
    tmpl = Template(format="A4", unit="pt", elements=elements)
    res = tmpl.split_multicell(text, "multline_text")
    assert res == expected
Example #12
0
def test_template_justify(tmp_path):  # issue-207
    elements = [
        {
            "name":
            "paragraph",
            "type":
            "T",
            "x1":
            10,
            "y1":
            15,
            "x2":
            580,
            "y2":
            45,
            "font":
            "helvetica",
            "size":
            16,
            "align":
            "J",
            "text":
            "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore"
            " et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi"
            " ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit"
            " esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,"
            " sunt in culpa qui officia deserunt mollit anim id est laborum.",
            "priority":
            1,
            "multiline":
            True,
        },
    ]
    tmpl = Template(format="A4", unit="pt", elements=elements)
    tmpl.add_page()
    assert_pdf_equal(tmpl, HERE / "template_justify.pdf", tmp_path)
Example #13
0
    def test_RenderCSV(self):
        f = Template(paperformat="A4", title="testCSV")

        f.parse_csv("testTemplateFile.csv", delimiter=";")
        f.add_page("testTemplateFile.csv")

        pdf = f.getFPDF()
        set_doc_date_0(pdf)

        outfile = relative_path_to("testTemplateFile.pdf")
        pdf.output(outfile, 'F')

        test_hash = calculate_hash_of_file(outfile)
        # Assert versus a well know hash
        self.assertEqual(test_hash, "8d4e2060e5d8264d03ebca707a2ed1ca")

        os.unlink(outfile)
Example #14
0
    def test_RenderYML(self):
        f = Template(paperformat="A4", title="testCSV")

        f.parse_YML("testTemplateFile.yaml")
        f.add_page("testTemplateFile.yaml")

        pdf = f.getFPDF()
        set_doc_date_0(pdf)

        outfile = relative_path_to("testTemplateFile.pdf")
        pdf.output(outfile, 'F')

        test_hash = calculate_hash_of_file(outfile)
        # Must reproduce the same file than test_RenderCSV
        self.assertEqual(test_hash, "8d4e2060e5d8264d03ebca707a2ed1ca")

        os.unlink(outfile)
Example #15
0
 def do_print(self, evt):
     # genero el renderizador con propiedades del PDF
     t = Template(
         elements=[e.as_dict() for e in self.elements if not e.static])
     t.add_page()
     if not t['logo'] or not os.path.exists(t['logo']):
         # put a default logo so it doesn't trow an exception
         logo = os.path.join(os.path.dirname(__file__), 'tutorial',
                             'logo.png')
         t.set('logo', logo)
     try:
         t.render(self.filename + ".pdf")
     except:
         if DEBUG and False:
             import pdb
             pdb.pm()
         else:
             raise
     if sys.platform == "linux2":
         os.system("evince " "%s" "" % self.filename + ".pdf")
     else:
         os.startfile(self.filename + ".pdf")
 def do_print(self, evt):
     # genero el renderizador con propiedades del PDF
     t = Template(elements=[e.as_dict() for e in self.elements if not e.static])
     t.add_page()
     if not t['logo'] or not os.path.exists(t['logo']):
         # put a default logo so it doesn't trow an exception
         logo = os.path.join(os.path.dirname(__file__), 'tutorial','logo.png')
         t.set('logo', logo)
     try:
         t.render(self.filename +".pdf")
     except:
         if DEBUG and False:
             import pdb;
             pdb.pm()
         else:
             raise
     if sys.platform=="linux2":
         os.system("evince ""%s""" % self.filename +".pdf")
     else:
         os.startfile(self.filename +".pdf")
Example #17
0
 def do_print(self, evt):
     # genero el renderizador con propiedades del PDF
     paper_size = self.paper_size or DEFAULT_PAPER_SIZE
     orientation = self.paper_orientation or DEFAULT_PAPER_ORIENTATION
     
     t = Template(format=paper_size, orientation=orientation, elements=[e.as_dict() for e in self.elements if not e.static])
     t.add_page()
     if not t['logo'] or not os.path.exists(t['logo']):
         # put a default logo so it doesn't throw an exception
         logo = os.path.join(os.path.dirname(__file__), 'tutorial','logo.png')
         t.set('logo', logo)
     try:
         t.render(self.filename +".pdf")
     except:
         if DEBUG and False:
             import pdb;
             pdb.pm()
         else:
             raise
     if sys.platform.startswith("linux"):
         os.system('xdg-open "%s.pdf"' % self.filename)
     else:
         os.startfile(self.filename +".pdf")
Example #18
0
def test_nominal_hardcoded(tmp_path):
    """Taken from docs/Templates.md"""
    elements = [
        {
            "name": "company_logo",
            "type": "I",
            "x1": 20,
            "y1": 20,
            "x2": 70,
            "y2": 70,
            "font": None,
            "size": 0,
            "bold": 0,
            "italic": 0,
            "underline": 0,
            "foreground": 0,
            "background": 0,
            "align": "I",
            "text": "logo",
            "priority": 2,
        },
        {
            "name": "company_name",
            "type": "T",
            "x1": 20,
            "y1": 75,
            "x2": 118,
            "y2": 90,
            "font": "helvetica",
            "size": 12,
            "bold": 1,
            "italic": 0,
            "underline": 0,
            "foreground": 0,
            "background": 0,
            "align": "I",
            "text": "",
            "priority": 2,
        },
        {
            "name": "box",
            "type": "B",
            "x1": 15,
            "y1": 15,
            "x2": 185,
            "y2": 260,
            "font": "helvetica",
            "size": 0,
            "bold": 0,
            "italic": 0,
            "underline": 0,
            "foreground": 0,
            "background": 0,
            "align": "I",
            "text": None,
            "priority": 0,
        },
        {
            "name": "box_x",
            "type": "B",
            "x1": 95,
            "y1": 15,
            "x2": 105,
            "y2": 25,
            "font": "helvetica",
            "size": 0,
            "bold": 1,
            "italic": 0,
            "underline": 0,
            "foreground": 0,
            "background": 0,
            "align": "I",
            "text": None,
            "priority": 2,
        },
        {
            "name": "line1",
            "type": "L",
            "x1": 100,
            "y1": 25,
            "x2": 100,
            "y2": 57,
            "font": "helvetica",
            "size": 0,
            "bold": 0,
            "italic": 0,
            "underline": 0,
            "foreground": 0,
            "background": 0,
            "align": "I",
            "text": None,
            "priority": 3,
        },
        {
            "name": "barcode",
            "type": "BC",
            "x1": 20,
            "y1": 246.5,
            "x2": 140,
            "y2": 254,
            "font": "Interleaved 2of5 NT",
            "size": 0.75,
            "bold": 0,
            "italic": 0,
            "underline": 0,
            "foreground": 0,
            "background": 0,
            "align": "I",
            "text": "200000000001000159053338016581200810081",
            "priority": 3,
        },
    ]
    tmpl = Template(format="A4", elements=elements, title="Sample Invoice")
    tmpl.add_page()
    tmpl["company_name"] = "Sample Company"
    tmpl["company_logo"] = HERE.parent.parent / "docs/fpdf2-logo.png"
    assert_pdf_equal(tmpl, HERE / "template_nominal_hardcoded.pdf", tmp_path)
Example #19
0
 def test_nominal_hardcoded(self):
     "Taken from docs/Templates.md"
     elements = [
         {
             "name": "company_logo",
             "type": "I",
             "x1": 20.0,
             "y1": 17.0,
             "x2": 78.0,
             "y2": 30.0,
             "font": None,
             "size": 0.0,
             "bold": 0,
             "italic": 0,
             "underline": 0,
             "foreground": 0,
             "background": 0,
             "align": "I",
             "text": "logo",
             "priority": 2,
         },
         {
             "name": "company_name",
             "type": "T",
             "x1": 17.0,
             "y1": 32.5,
             "x2": 115.0,
             "y2": 37.5,
             "font": "Arial",
             "size": 12.0,
             "bold": 1,
             "italic": 0,
             "underline": 0,
             "foreground": 0,
             "background": 0,
             "align": "I",
             "text": "",
             "priority": 2,
         },
         {
             "name": "box",
             "type": "B",
             "x1": 15.0,
             "y1": 15.0,
             "x2": 185.0,
             "y2": 260.0,
             "font": "Arial",
             "size": 0.0,
             "bold": 0,
             "italic": 0,
             "underline": 0,
             "foreground": 0,
             "background": 0,
             "align": "I",
             "text": None,
             "priority": 0,
         },
         {
             "name": "box_x",
             "type": "B",
             "x1": 95.0,
             "y1": 15.0,
             "x2": 105.0,
             "y2": 25.0,
             "font": "Arial",
             "size": 0.0,
             "bold": 1,
             "italic": 0,
             "underline": 0,
             "foreground": 0,
             "background": 0,
             "align": "I",
             "text": None,
             "priority": 2,
         },
         {
             "name": "line1",
             "type": "L",
             "x1": 100.0,
             "y1": 25.0,
             "x2": 100.0,
             "y2": 57.0,
             "font": "Arial",
             "size": 0,
             "bold": 0,
             "italic": 0,
             "underline": 0,
             "foreground": 0,
             "background": 0,
             "align": "I",
             "text": None,
             "priority": 3,
         },
         {
             "name": "barcode",
             "type": "BC",
             "x1": 20.0,
             "y1": 246.5,
             "x2": 140.0,
             "y2": 254.0,
             "font": "Interleaved 2of5 NT",
             "size": 0.75,
             "bold": 0,
             "italic": 0,
             "underline": 0,
             "foreground": 0,
             "background": 0,
             "align": "I",
             "text": "200000000001000159053338016581200810081",
             "priority": 3,
         },
     ]
     tmpl = Template(format="A4", elements=elements, title="Sample Invoice")
     tmpl.add_page()
     tmpl["company_name"] = "Sample Company"
     tmpl["company_logo"] = relative_path_to("../../tutorial/logo.png")
     assert_pdf_equal(self, tmpl, "test_nominal_hardcoded.pdf")
Example #20
0
def test_template_nominal_hardcoded(tmp_path):
    """Taken from docs/Templates.md"""
    elements = [
        {
            "name": "company_logo",
            "type": "I",
            "x1": 20,
            "y1": 20,
            "x2": 70,
            "y2": 70,
            "font": None,
            "size": 0,
            "bold": 0,
            "italic": 0,
            "underline": 0,
            "foreground": 0,
            "align": "I",
            "text": "logo",
            "priority": 2,
        },
        {
            "name": "company_name",
            "type": "T",
            "x1": 20,
            "y1": 75,
            "x2": 118,
            "y2": 90,
            "font": "helvetica",
            "size": 12,
            "bold": 1,
            "italic": 1,
            "underline": 1,
            "foreground": 0,
            "align": "I",
            "text": "",
            "priority": 2,
            # multiline is optional, so we test some items without it.
        },
        {
            "name": "multline_text",
            "type": "T",
            "x1": 20,
            "y1": 100,
            "x2": 40,
            "y2": 105,
            "font": "helvetica",
            "size": 12,
            "bold": 0,
            "italic": 0,
            "underline": 0,
            "foreground": 0,
            "background": 0x88FF00,
            "align": "I",
            "text": "Lorem ipsum dolor sit amet, consectetur adipisici elit",
            "priority": 2,
            "multiline": True,
        },
        {
            "name": "box",
            "type": "B",
            "x1": 15,
            "y1": 15,
            "x2": 185,
            "y2": 260,
            "font": "helvetica",
            "size": 0,
            "bold": 0,
            "italic": 0,
            "underline": 0,
            "foreground": 0,
            "align": "I",
            "text": None,
            "priority": 0,
        },
        {
            "name": "box_x",
            "type": "B",
            "x1": 95,
            "y1": 15,
            "x2": 105,
            "y2": 25,
            "font": "helvetica",
            "size": 0,
            "bold": 1,
            "italic": 0,
            "underline": 0,
            "foreground": 0,
            "align": "I",
            "text": None,
            "priority": 2,
        },
        {
            "name": "line1",
            "type": "L",
            "x1": 100,
            "y1": 25,
            "x2": 100,
            "y2": 57,
            "font": "helvetica",
            "size": 0,
            "bold": 0,
            "italic": 0,
            "underline": 0,
            "foreground": 0,
            "align": "I",
            "text": None,
            "priority": 3,
            "multiline": False,
        },
        {
            "name": "barcode",
            "type": "BC",
            "x1": 20,
            "y1": 246.5,
            "x2": 140,
            "y2": 254,
            "font": "Interleaved 2of5 NT",
            "size": 0.75,
            "bold": 0,
            "italic": 0,
            "underline": 0,
            "foreground": 0,
            "align": "I",
            "text": "200000000001000159053338016581200810081",
            "priority": 3,
            "multiline": False,
        },
    ]
    tmpl = Template(format="A4", elements=elements, title="Sample Invoice")
    tmpl.add_page()
    tmpl["company_name"] = "Sample Company"
    assert tmpl[
        "company_name"] == "Sample Company"  # testing Template.__getitem__
    tmpl["company_logo"] = HERE.parent.parent / "docs/fpdf2-logo.png"
    assert_pdf_equal(tmpl, HERE / "template_nominal_hardcoded.pdf", tmp_path)
Example #21
0
def test_template_nominal_csv(tmp_path):
    """Same data as in docs/Templates.md
    The numeric_text tests for a regression."""
    tmpl = Template(format="A4", title="Sample Invoice")
    tmpl.parse_csv(HERE / "mycsvfile.csv", delimiter=";")
    tmpl.add_page()
    tmpl["empty_fields"] = "empty"
    assert_pdf_equal(tmpl, HERE / "template_nominal_csv.pdf", tmp_path)

    tmpl = Template(format="A4", title="Sample Invoice")
    tmpl.parse_csv(HERE / "mycsvfile.csv", delimiter=";", encoding="utf-8")
    tmpl.add_page()
    tmpl["empty_fields"] = "empty"
    assert_pdf_equal(tmpl, HERE / "template_nominal_csv.pdf", tmp_path)
Example #22
0
def test_template_textstyles(tmp_path):
    """Testing bold, italic, underline in template and in tags."""
    elements = [
        {
            "name": "tb",
            "type": "T",
            "x1": 20,
            "y1": 20,
            "x2": 30,
            "y2": 25,
            "text": "text bold",
            "bold": True,
        },
        {
            "name": "ti",
            "type": "T",
            "x1": 20,
            "y1": 30,
            "x2": 30,
            "y2": 35,
            "text": "text italic",
            "italic": True,
        },
        {
            "name": "tu",
            "type": "T",
            "x1": 20,
            "y1": 40,
            "x2": 30,
            "y2": 45,
            "text": "text underline",
            "underline": True,
        },
        {
            "name": "tbiu",
            "type": "T",
            "x1": 20,
            "y1": 50,
            "x2": 30,
            "y2": 55,
            "text": "text all",
            "bold": True,
            "italic": True,
            "underline": True,
        },
        {
            "name": "wb",
            "type": "W",
            "x1": 20,
            "y1": 60,
            "x2": 30,
            "y2": 65,
            "text": "write bold",
            "bold": True,
        },
        {
            "name": "wi",
            "type": "W",
            "x1": 20,
            "y1": 70,
            "x2": 30,
            "y2": 75,
            "text": "write italic",
            "italic": True,
        },
        {
            "name": "wu",
            "type": "W",
            "x1": 20,
            "y1": 80,
            "x2": 30,
            "y2": 85,
            "text": "write underline",
            "underline": True,
        },
        {
            "name": "wbiu",
            "type": "W",
            "x1": 20,
            "y1": 90,
            "x2": 30,
            "y2": 95,
            "text": "write all",
            "bold": True,
            "italic": True,
            "underline": True,
        },
        {
            "name": "tbt",
            "type": "T",
            "x1": 20,
            "y1": 100,
            "x2": 30,
            "y2": 105,
            "text": "<B>text bold tags</B>",
        },
        {
            "name": "tit",
            "type": "T",
            "x1": 20,
            "y1": 110,
            "x2": 30,
            "y2": 115,
            "text": "<I>text italic tags</I>",
        },
        {
            "name": "tut",
            "type": "T",
            "x1": 20,
            "y1": 120,
            "x2": 30,
            "y2": 125,
            "text": "<U>text underline tags</U>",
        },
        {
            "name": "wbt",
            "type": "W",
            "x1": 20,
            "y1": 130,
            "x2": 30,
            "y2": 135,
            "text": "<B>write bold tags</B>",
        },
        {
            "name": "wit",
            "type": "W",
            "x1": 20,
            "y1": 140,
            "x2": 30,
            "y2": 145,
            "text": "<I>write italic tags</I>",
        },
        {
            "name": "wut",
            "type": "W",
            "x1": 20,
            "y1": 150,
            "x2": 30,
            "y2": 155,
            "text": "<U>write underline tags</U>",
        },
    ]
    tmpl = Template(elements=elements)
    tmpl.add_page()
    assert_pdf_equal(tmpl, HERE / "template_textstyles.pdf", tmp_path)
Example #23
0
def test_template_badinput():
    """Testing Template() with non-conforming definitions."""
    for arg in (
            "format",
            "orientation",
            "unit",
            "title",
            "author",
            "subject",
            "creator",
            "keywords",
    ):
        with raises(TypeError):
            Template(**{arg: 7})  # numeric instead of str
    elements = [{}]
    with raises(KeyError):
        tmpl = Template(elements=elements)
    elements = [{"name": "n", "type": "X"}]
    with raises(KeyError):
        tmpl = Template(elements=elements)
        tmpl.render()
    elements = [  # missing mandatory x2
        {
            "name": "n",
            "type": "T",
            "x1": 0,
            "y1": 0,
            "y2": 0,
            "text": "Hello!",
        }
    ]
    with raises(KeyError):
        tmpl = Template(elements=elements)
        tmpl["n"] = "hello"
        tmpl.render()
    elements = [  # malformed y2
        {
            "name": "n",
            "type": "T",
            "x1": 0,
            "y1": 0,
            "x2": 0,
            "y2": "x",
            "text": "Hello!",
        }
    ]
    with raises(TypeError):
        tmpl = Template(elements=elements)
        tmpl["n"] = "hello"
        tmpl.render()
    tmpl = Template()
    with raises(FPDFException):
        tmpl.parse_csv(HERE / "mandmissing.csv", delimiter=";")
    with raises(ValueError):
        tmpl.parse_csv(HERE / "badint.csv", delimiter=";")
    with raises(ValueError):
        tmpl.parse_csv(HERE / "badfloat.csv", delimiter=";")
    with raises(KeyError):
        tmpl.parse_csv(HERE / "badtype.csv", delimiter=";")
        tmpl.render()
    with warns(DeprecationWarning):
        Template(infile="whatever")
    with raises(AttributeError):
        with warns(DeprecationWarning):
            tmpl = Template()
            tmpl.render(dest="whatever")