From 18c33c52f49afda63dabe7952b0ed98de6aead3a Mon Sep 17 00:00:00 2001 From: Kurt Jung Date: Wed, 26 Aug 2015 20:44:07 -0400 Subject: Factor various test example helper routines into their own internal package --- README.md | 12 +- doc.go | 12 +- fpdf_test.go | 252 +++++++++++++++++---------------------- internal/example/example.go | 104 ++++++++++++++++ internal/example/example_test.go | 31 +++++ ttfparser_test.go | 9 +- 6 files changed, 265 insertions(+), 155 deletions(-) create mode 100644 internal/example/example.go create mode 100644 internal/example/example_test.go diff --git a/README.md b/README.md index afe108f..4feb48a 100644 --- a/README.md +++ b/README.md @@ -93,8 +93,9 @@ rather than PHP. ##Example PDFs -A side effect of running "go test" is the production of a number of example -PDFs. These can be found in the gofpdf/pdf directory after the tests complete. +A side effect of running "go test ./..." is the production of a number of +example PDFs. These can be found in the gofpdf/pdf directory after the tests +complete. Please note that these examples run in the context of a test. In order run an example as a standalone application, you'll need to examine [fpdf_test.go](https://github.com/jung-kurt/gofpdf/blob/master/fpdf_test.go) for @@ -135,8 +136,11 @@ gofpdf for its document production mode. gofpdf is a global community effort and you are invited to make it even better. If you have implemented a new feature or corrected a problem, please consider -contributing your change to the project. Here are guidelines for making -submissions. Your change should +contributing your change to the project. Contributions that do not directly +pertain to the core functionality of gofpdf should be placed in their own +directory directly beneath the `contrib` directory. + +Here are guidelines for making submissions. Your change should * be compatible with the MIT License * be properly documented diff --git a/doc.go b/doc.go index 6f1cec7..4c43de0 100644 --- a/doc.go +++ b/doc.go @@ -112,8 +112,9 @@ rather than PHP. Example PDFs -A side effect of running "go test" is the production of a number of example -PDFs. These can be found in the gofpdf/pdf directory after the tests complete. +A side effect of running "go test ./..." is the production of a number of +example PDFs. These can be found in the gofpdf/pdf directory after the tests +complete. Please note that these examples run in the context of a test. In order run an example as a standalone application, you'll need to examine fpdf_test.go for @@ -149,8 +150,11 @@ Contributing Changes gofpdf is a global community effort and you are invited to make it even better. If you have implemented a new feature or corrected a problem, please consider -contributing your change to the project. Here are guidelines for making -submissions. Your change should +contributing your change to the project. Contributions that do not directly +pertain to the core functionality of gofpdf should be placed in their own +directory directly beneath the `contrib` directory. + +Here are guidelines for making submissions. Your change should • be compatible with the MIT License diff --git a/fpdf_test.go b/fpdf_test.go index 71aa0d2..0af3556 100644 --- a/fpdf_test.go +++ b/fpdf_test.go @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2014 Kurt Jung (Gmail: kurt.w.jung) + * Copyright (c) 2013-2015 Kurt Jung (Gmail: kurt.w.jung) * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -30,15 +30,7 @@ import ( "strings" "github.com/jung-kurt/gofpdf" -) - -// Absolute path needed for gocov tool; relative OK for test -const ( - cnGofpdfDir = "." - cnFontDir = cnGofpdfDir + "/font" - cnImgDir = cnGofpdfDir + "/image" - cnTextDir = cnGofpdfDir + "/text" - cnExampleDir = cnGofpdfDir + "/pdf" + "github.com/jung-kurt/gofpdf/internal/example" ) func init() { @@ -46,37 +38,23 @@ func init() { } func cleanup() { - filepath.Walk(cnExampleDir, + filepath.Walk(example.PdfDir(), func(path string, info os.FileInfo, err error) (reterr error) { - if path[len(path)-4:] == ".pdf" { - os.Remove(path) + if len(path) > 3 { + if path[len(path)-4:] == ".pdf" { + os.Remove(path) + } } return }) } -func imageFile(fileStr string) string { - return filepath.Join(cnImgDir, fileStr) -} - -func fontFile(fileStr string) string { - return filepath.Join(cnFontDir, fileStr) -} - -func textFile(fileStr string) string { - return filepath.Join(cnTextDir, fileStr) -} - -func exampleFile(fileStr string) string { - return filepath.Join(cnExampleDir, fileStr) -} - type fontResourceType struct { } func (f fontResourceType) Open(name string) (rdr io.Reader, err error) { var buf []byte - buf, err = ioutil.ReadFile(fontFile(name)) + buf, err = ioutil.ReadFile(example.FontFile(name)) if err == nil { rdr = bytes.NewReader(buf) fmt.Printf("Generalized font loader reading %s\n", name) @@ -103,35 +81,23 @@ func lorem() string { "officia deserunt mollit anim id est laborum." } -func exampleFilename(baseStr string) string { - return filepath.Join(cnExampleDir, baseStr+".pdf") -} - -func summary(err error, fileStr string) { - if err == nil { - fileStr = filepath.ToSlash(fileStr) - fmt.Printf("Successfully generated %s\n", fileStr) - } else { - fmt.Println(err) - } -} - // This example demonstrates the generation of a simple PDF document. Note that // since only core fonts are used (in this case Arial, a synonym for // Helvetica), an empty string can be specified for the font directory in the -// call to New(). Note also that the exampleFilename and summary functions are -// local to the test file and are not part of the gofpdf library. If an error -// occurs at some point during the construction of the document, subsequent -// method calls exit immediately and the error is finally retreived with the -// output call where it can be handled by the application. +// call to New(). Note also that the example.Filename() and example.Summary() +// functions belong to a separate, internal package and are not part of the +// gofpdf library. If an error occurs at some point during the construction of +// the document, subsequent method calls exit immediately and the error is +// finally retreived with the output call where it can be handled by the +// application. func Example() { pdf := gofpdf.New("P", "mm", "A4", "") pdf.AddPage() pdf.SetFont("Arial", "B", 16) pdf.Cell(40, 10, "Hello World!") - fileStr := exampleFilename("basic") + fileStr := example.Filename("basic") err := pdf.OutputFileAndClose(fileStr) - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // Successfully generated pdf/basic.pdf } @@ -140,7 +106,7 @@ func Example() { func ExampleFpdf_AddPage() { pdf := gofpdf.New("P", "mm", "A4", "") pdf.SetHeaderFunc(func() { - pdf.Image(imageFile("logo.png"), 10, 6, 30, 0, false, "", 0, "") + pdf.Image(example.ImageFile("logo.png"), 10, 6, 30, 0, false, "", 0, "") pdf.SetY(5) pdf.SetFont("Arial", "B", 15) pdf.Cell(80, 0, "") @@ -160,9 +126,9 @@ func ExampleFpdf_AddPage() { pdf.CellFormat(0, 10, fmt.Sprintf("Printing line number %d", j), "", 1, "", false, 0, "") } - fileStr := exampleFilename("Fpdf_AddPage") + fileStr := example.Filename("Fpdf_AddPage") err := pdf.OutputFileAndClose(fileStr) - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // Successfully generated pdf/Fpdf_AddPage.pdf } @@ -234,11 +200,11 @@ func ExampleFpdf_MultiCell() { chapterTitle(chapNum, titleStr) chapterBody(fileStr) } - printChapter(1, "A RUNAWAY REEF", textFile("20k_c1.txt")) - printChapter(2, "THE PROS AND CONS", textFile("20k_c2.txt")) - fileStr := exampleFilename("Fpdf_MultiCell") + printChapter(1, "A RUNAWAY REEF", example.TextFile("20k_c1.txt")) + printChapter(2, "THE PROS AND CONS", example.TextFile("20k_c2.txt")) + fileStr := example.Filename("Fpdf_MultiCell") err := pdf.OutputFileAndClose(fileStr) - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // Successfully generated pdf/Fpdf_MultiCell.pdf } @@ -340,11 +306,11 @@ func ExampleFpdf_SetLeftMargin() { pdf.CellFormat(0, 10, fmt.Sprintf("Page %d", pdf.PageNo()), "", 0, "C", false, 0, "") }) - printChapter(1, "A RUNAWAY REEF", textFile("20k_c1.txt")) - printChapter(2, "THE PROS AND CONS", textFile("20k_c2.txt")) - fileStr := exampleFilename("Fpdf_SetLeftMargin_multicolumn") + printChapter(1, "A RUNAWAY REEF", example.TextFile("20k_c1.txt")) + printChapter(2, "THE PROS AND CONS", example.TextFile("20k_c2.txt")) + fileStr := example.Filename("Fpdf_SetLeftMargin_multicolumn") err := pdf.OutputFileAndClose(fileStr) - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // Successfully generated pdf/Fpdf_SetLeftMargin_multicolumn.pdf } @@ -460,7 +426,7 @@ func ExampleFpdf_CellFormat_1() { } pdf.CellFormat(wSum, 0, "", "T", 0, "", false, 0, "") } - loadData(textFile("countries.txt")) + loadData(example.TextFile("countries.txt")) pdf.SetFont("Arial", "", 14) pdf.AddPage() basicTable() @@ -468,9 +434,9 @@ func ExampleFpdf_CellFormat_1() { improvedTable() pdf.AddPage() fancyTable() - fileStr := exampleFilename("Fpdf_CellFormat_1_tables") + fileStr := example.Filename("Fpdf_CellFormat_1_tables") err := pdf.OutputFileAndClose(fileStr) - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // Successfully generated pdf/Fpdf_CellFormat_1_tables.pdf } @@ -491,7 +457,7 @@ func ExampleFpdf_HTMLBasicNew() { // Second page: image link and basic HTML with link pdf.AddPage() pdf.SetLink(link, 0, -1) - pdf.Image(imageFile("logo.png"), 10, 12, 30, 0, false, "", 0, "http://www.fpdf.org") + pdf.Image(example.ImageFile("logo.png"), 10, 12, 30, 0, false, "", 0, "http://www.fpdf.org") pdf.SetLeftMargin(45) pdf.SetFontSize(14) _, lineHt = pdf.GetFontSize() @@ -501,23 +467,23 @@ func ExampleFpdf_HTMLBasicNew() { `www.fpdf.org, or on an image: click on the logo.` html := pdf.HTMLBasicNew() html.Write(lineHt, htmlStr) - fileStr := exampleFilename("Fpdf_HTMLBasicNew") + fileStr := example.Filename("Fpdf_HTMLBasicNew") err := pdf.OutputFileAndClose(fileStr) - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // Successfully generated pdf/Fpdf_HTMLBasicNew.pdf } // This example demonstrates the use of a non-standard font. func ExampleFpdf_AddFont() { - pdf := gofpdf.New("P", "mm", "A4", cnFontDir) + pdf := gofpdf.New("P", "mm", "A4", example.FontDir()) pdf.AddFont("Calligrapher", "", "calligra.json") pdf.AddPage() pdf.SetFont("Calligrapher", "", 35) pdf.Cell(0, 10, "Enjoy new fonts with FPDF!") - fileStr := exampleFilename("Fpdf_AddFont") + fileStr := example.Filename("Fpdf_AddFont") err := pdf.OutputFileAndClose(fileStr) - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // Successfully generated pdf/Fpdf_AddFont.pdf } @@ -527,19 +493,19 @@ func ExampleFpdf_Image() { pdf := gofpdf.New("P", "mm", "A4", "") pdf.AddPage() pdf.SetFont("Arial", "", 11) - pdf.Image(imageFile("logo.png"), 10, 10, 30, 0, false, "", 0, "") + pdf.Image(example.ImageFile("logo.png"), 10, 10, 30, 0, false, "", 0, "") pdf.Text(50, 20, "logo.png") - pdf.Image(imageFile("logo.gif"), 10, 40, 30, 0, false, "", 0, "") + pdf.Image(example.ImageFile("logo.gif"), 10, 40, 30, 0, false, "", 0, "") pdf.Text(50, 50, "logo.gif") - pdf.Image(imageFile("logo-gray.png"), 10, 70, 30, 0, false, "", 0, "") + pdf.Image(example.ImageFile("logo-gray.png"), 10, 70, 30, 0, false, "", 0, "") pdf.Text(50, 80, "logo-gray.png") - pdf.Image(imageFile("logo-rgb.png"), 10, 100, 30, 0, false, "", 0, "") + pdf.Image(example.ImageFile("logo-rgb.png"), 10, 100, 30, 0, false, "", 0, "") pdf.Text(50, 110, "logo-rgb.png") - pdf.Image(imageFile("logo.jpg"), 10, 130, 30, 0, false, "", 0, "") + pdf.Image(example.ImageFile("logo.jpg"), 10, 130, 30, 0, false, "", 0, "") pdf.Text(50, 140, "logo.jpg") - fileStr := exampleFilename("Fpdf_Image") + fileStr := example.Filename("Fpdf_Image") err := pdf.OutputFileAndClose(fileStr) - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // Successfully generated pdf/Fpdf_Image.pdf } @@ -589,17 +555,17 @@ func ExampleFpdf_SetAcceptPageBreakFunc() { pdf.SetFont("Times", "", 12) for j := 0; j < 20; j++ { if j == 1 { - pdf.Image(imageFile("fpdf.png"), -1, 0, colWd, 0, true, "", 0, "") + pdf.Image(example.ImageFile("fpdf.png"), -1, 0, colWd, 0, true, "", 0, "") } else if j == 5 { - pdf.Image(imageFile("golang-gopher.png"), + pdf.Image(example.ImageFile("golang-gopher.png"), -1, 0, colWd, 0, true, "", 0, "") } pdf.MultiCell(colWd, 5, loremStr, "", "", false) pdf.Ln(-1) } - fileStr := exampleFilename("Fpdf_SetAcceptPageBreakFunc_landscape") + fileStr := example.Filename("Fpdf_SetAcceptPageBreakFunc_landscape") err := pdf.OutputFileAndClose(fileStr) - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // Successfully generated pdf/Fpdf_SetAcceptPageBreakFunc_landscape.pdf } @@ -607,15 +573,15 @@ func ExampleFpdf_SetAcceptPageBreakFunc() { // This examples tests corner cases as reported by the gocov tool. func ExampleFpdf_SetKeywords() { var err error - fileStr := exampleFilename("Fpdf_SetKeywords") - err = gofpdf.MakeFont(fontFile("CalligrapherRegular.pfb"), - fontFile("cp1252.map"), cnFontDir, nil, true) + fileStr := example.Filename("Fpdf_SetKeywords") + err = gofpdf.MakeFont(example.FontFile("CalligrapherRegular.pfb"), + example.FontFile("cp1252.map"), example.FontDir(), nil, true) if err == nil { - err = gofpdf.MakeFont(fontFile("calligra.ttf"), - fontFile("cp1252.map"), cnFontDir, nil, true) + err = gofpdf.MakeFont(example.FontFile("calligra.ttf"), + example.FontFile("cp1252.map"), example.FontDir(), nil, true) if err == nil { pdf := gofpdf.New("", "", "", "") - pdf.SetFontLocation(cnFontDir) + pdf.SetFontLocation(example.FontDir()) pdf.SetTitle("世界", true) pdf.SetAuthor("世界", true) pdf.SetSubject("世界", true) @@ -628,7 +594,7 @@ func ExampleFpdf_SetKeywords() { err = pdf.OutputFileAndClose(fileStr) } } - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // Successfully generated pdf/Fpdf_SetKeywords.pdf } @@ -709,9 +675,9 @@ func ExampleFpdf_Circle() { pdf.SetLineWidth(thin) pdf.SetLineCapStyle("butt") - fileStr := exampleFilename("Fpdf_Circle_figures") + fileStr := example.Filename("Fpdf_Circle_figures") err := pdf.OutputFileAndClose(fileStr) - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // Successfully generated pdf/Fpdf_Circle_figures.pdf } @@ -753,7 +719,7 @@ func ExampleFpdf_SetAlpha() { pdf.SetXY(x, y+2) pdf.CellFormat(rectW, rectH, "A", "", 0, "C", false, 0, "") pdf.SetAlpha(0.5, modeList[j]) - pdf.Image(imageFile("golang-gopher.png"), + pdf.Image(example.ImageFile("golang-gopher.png"), x-gapX, y, rectW+2*gapX, 0, false, "", 0, "") pdf.SetAlpha(1.0, "Normal") x += rectW + gapX @@ -761,9 +727,9 @@ func ExampleFpdf_SetAlpha() { } y += rectH + gapY } - fileStr := exampleFilename("Fpdf_SetAlpha_transparency") + fileStr := example.Filename("Fpdf_SetAlpha_transparency") err := pdf.OutputFileAndClose(fileStr) - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // Successfully generated pdf/Fpdf_SetAlpha_transparency.pdf } @@ -784,9 +750,9 @@ func ExampleFpdf_LinearGradient() { pdf.RadialGradient(115, 120, 75, 75, 220, 220, 250, 80, 80, 220, 0.25, 0.75, 0.75, 0.75, 0.75) pdf.Rect(115, 120, 75, 75, "D") - fileStr := exampleFilename("Fpdf_LinearGradient_gradient") + fileStr := example.Filename("Fpdf_LinearGradient_gradient") err := pdf.OutputFileAndClose(fileStr) - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // Successfully generated pdf/Fpdf_LinearGradient_gradient.pdf } @@ -829,7 +795,7 @@ func ExampleFpdf_ClipText() { y += 28 pdf.ClipEllipse(26, y+10, 16, 10, true) - pdf.Image(imageFile("logo.jpg"), 10, y, 32, 0, false, "JPG", 0, "") + pdf.Image(example.ImageFile("logo.jpg"), 10, y, 32, 0, false, "JPG", 0, "") pdf.ClipEnd() pdf.ClipCircle(60, y+10, 10, true) @@ -854,9 +820,9 @@ func ExampleFpdf_ClipText() { pdf.MultiCell(130, 5, lorem(), "", "", false) pdf.ClipEnd() - fileStr := exampleFilename("Fpdf_ClipText") + fileStr := example.Filename("Fpdf_ClipText") err := pdf.OutputFileAndClose(fileStr) - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // Successfully generated pdf/Fpdf_ClipText.pdf } @@ -866,7 +832,7 @@ func ExampleFpdf_PageSize() { pdf := gofpdf.NewCustom(&gofpdf.InitType{ UnitStr: "in", Size: gofpdf.SizeType{Wd: 6, Ht: 6}, - FontDirStr: cnFontDir, + FontDirStr: example.FontDir(), }) pdf.SetMargins(0.5, 1, 0.5) pdf.SetFont("Times", "", 14) @@ -883,9 +849,9 @@ func ExampleFpdf_PageSize() { wd, ht, u := pdf.PageSize(j) fmt.Printf("%d: %6.2f %s, %6.2f %s\n", j, wd, u, ht, u) } - fileStr := exampleFilename("Fpdf_PageSize") + fileStr := example.Filename("Fpdf_PageSize") err := pdf.OutputFileAndClose(fileStr) - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // 0: 6.00 in, 6.00 in // 1: 12.00 in, 3.00 in @@ -909,9 +875,9 @@ func ExampleFpdf_Bookmark() { pdf.Bookmark("Page 2", 0, 0) pdf.Bookmark("Paragraph 3", 1, -1) pdf.Cell(0, 6, "Paragraph 3") - fileStr := exampleFilename("Fpdf_Bookmark") + fileStr := example.Filename("Fpdf_Bookmark") err := pdf.OutputFileAndClose(fileStr) - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // Successfully generated pdf/Fpdf_Bookmark.pdf } @@ -1031,9 +997,9 @@ func ExampleFpdf_TransformBegin() { refDupe() pdf.TransformEnd() - fileStr := exampleFilename("Fpdf_TransformBegin") + fileStr := example.Filename("Fpdf_TransformBegin") err := pdf.OutputFileAndClose(fileStr) - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // Successfully generated pdf/Fpdf_TransformBegin.pdf } @@ -1060,7 +1026,7 @@ func ExampleFpdf_RegisterImage() { pdf.SetMargins(10, 10, 10) pdf.SetFont("Helvetica", "", 15) for j, str := range fileList { - imageFileStr = imageFile(str) + imageFileStr = example.ImageFile(str) infoPtr = pdf.RegisterImage(imageFileStr, "") imgWd, imgHt = infoPtr.Extent() switch j { @@ -1082,10 +1048,10 @@ func ExampleFpdf_RegisterImage() { } pdf.Image(imageFileStr, lf, tp, imgWd, imgHt, false, "", 0, "") } - fileStr := exampleFilename("Fpdf_RegisterImage") + fileStr := example.Filename("Fpdf_RegisterImage") // Test the image information retrieval method infoShow := func(imageStr string) { - imageStr = imageFile(imageStr) + imageStr = example.ImageFile(imageStr) info := pdf.GetImageInfo(imageStr) if info != nil { if info.Width() > 0.0 { @@ -1100,7 +1066,7 @@ func ExampleFpdf_RegisterImage() { infoShow(fileList[0]) infoShow("foo.png") err := pdf.OutputFileAndClose(fileStr) - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // Image image/logo-gray.png is registered // Image image/foo.png is not registered @@ -1129,9 +1095,9 @@ func ExampleFpdf_SplitLines() { for _, line := range lines { pdf.CellFormat(190.0, lineHt, string(line), "", 1, "C", false, 0, "") } - fileStr := exampleFilename("Fpdf_Splitlines") + fileStr := example.Filename("Fpdf_Splitlines") err := pdf.OutputFileAndClose(fileStr) - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // Successfully generated pdf/Fpdf_Splitlines.pdf } @@ -1162,7 +1128,7 @@ func ExampleFpdf_SVGBasicWrite() { `web control is supported and is used in this example.` html := pdf.HTMLBasicNew() html.Write(lineHt, htmlStr) - sig, err = gofpdf.SVGBasicFileParse(imageFile(sigFileStr)) + sig, err = gofpdf.SVGBasicFileParse(example.ImageFile(sigFileStr)) if err == nil { scale := 100 / sig.Wd scaleY := 30 / sig.Ht @@ -1177,9 +1143,9 @@ func ExampleFpdf_SVGBasicWrite() { } else { pdf.SetError(err) } - fileStr := exampleFilename("Fpdf_SVGBasicWrite") + fileStr := example.Filename("Fpdf_SVGBasicWrite") err = pdf.OutputFileAndClose(fileStr) - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // Successfully generated pdf/Fpdf_SVGBasicWrite.pdf } @@ -1230,9 +1196,9 @@ func ExampleFpdf_CellFormat_2() { pdf.AddFont("Calligrapher", "", "calligra.json") pdf.SetFont("Calligrapher", "", 16) formatRect(pdf, recListBaseline) - fileStr := exampleFilename("Fpdf_CellFormat_2_align") + fileStr := example.Filename("Fpdf_CellFormat_2_align") err := pdf.OutputFileAndClose(fileStr) - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // Generalized font loader reading calligra.json // Generalized font loader reading calligra.z @@ -1264,9 +1230,9 @@ func ExampleFpdf_CellFormat_3() { write("Falsches \xdcben von Xylophonmusik qu\xe4lt jeden gr\xf6\xdferen Zwerg.") write("Heiz\xf6lr\xfccksto\xdfabd\xe4mpfung") write("For\xe5rsj\xe6vnd\xf8gn / Efter\xe5rsj\xe6vnd\xf8gn") - fileStr := exampleFilename("Fpdf_CellFormat_3_codepageescape") + fileStr := example.Filename("Fpdf_CellFormat_3_codepageescape") err := pdf.OutputFileAndClose(fileStr) - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // Successfully generated pdf/Fpdf_CellFormat_3_codepageescape.pdf } @@ -1274,7 +1240,7 @@ func ExampleFpdf_CellFormat_3() { // This example demonstrates the automatic conversion of UTF-8 strings to an // 8-bit font encoding. func ExampleFpdf_CellFormat_4() { - pdf := gofpdf.New("P", "mm", "A4", cnFontDir) // A4 210.0 x 297.0 + pdf := gofpdf.New("P", "mm", "A4", example.FontDir()) // A4 210.0 x 297.0 // See documentation for details on how to generate fonts pdf.AddFont("Helvetica-1251", "", "helvetica_1251.json") pdf.AddFont("Helvetica-1253", "", "helvetica_1253.json") @@ -1304,9 +1270,9 @@ func ExampleFpdf_CellFormat_4() { tr = pdf.UnicodeTranslatorFromDescriptor("cp1253") write("Θέλει αρετή και τόλμη η ελευθερία. (Ανδρέας Κάλβος)") - fileStr := exampleFilename("Fpdf_CellFormat_4_codepage") + fileStr := example.Filename("Fpdf_CellFormat_4_codepage") err := pdf.OutputFileAndClose(fileStr) - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // Successfully generated pdf/Fpdf_CellFormat_4_codepage.pdf } @@ -1318,9 +1284,9 @@ func ExampleFpdf_SetProtection() { pdf.AddPage() pdf.SetFont("Arial", "", 12) pdf.Write(10, "Password-protected.") - fileStr := exampleFilename("Fpdf_SetProtection") + fileStr := example.Filename("Fpdf_SetProtection") err := pdf.OutputFileAndClose(fileStr) - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // Successfully generated pdf/Fpdf_SetProtection.pdf } @@ -1368,9 +1334,9 @@ func ExampleFpdf_Polygon() { } y += advance } - fileStr := exampleFilename("Fpdf_Polygon") + fileStr := example.Filename("Fpdf_Polygon") err := pdf.OutputFileAndClose(fileStr) - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // Successfully generated pdf/Fpdf_Polygon.pdf } @@ -1408,9 +1374,9 @@ func ExampleFpdf_AddLayer() { pdf.Write(8, "This line belongs to layer 1 again.\n") pdf.EndLayer() - fileStr := exampleFilename("Fpdf_AddLayer") + fileStr := example.Filename("Fpdf_AddLayer") err := pdf.OutputFileAndClose(fileStr) - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // Successfully generated pdf/Fpdf_AddLayer.pdf } @@ -1451,9 +1417,9 @@ func ExampleFpdf_RegisterImageReader() { } else { pdf.SetError(err) } - fileStr := exampleFilename("Fpdf_RegisterImageReader_url") + fileStr := example.Filename("Fpdf_RegisterImageReader_url") err = pdf.OutputFileAndClose(fileStr) - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // Successfully generated pdf/Fpdf_RegisterImageReader_url.pdf @@ -1540,9 +1506,9 @@ func ExampleFpdf_Beziergon() { pdf.SetDrawColor(64, 64, 128) pdf.SetLineWidth(pdf.GetLineWidth() * 3) pdf.Beziergon(curveList, "D") - fileStr := exampleFilename("Fpdf_Beziergon") + fileStr := example.Filename("Fpdf_Beziergon") err := pdf.OutputFileAndClose(fileStr) - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // Successfully generated pdf/Fpdf_Beziergon.pdf @@ -1559,9 +1525,9 @@ func ExampleFpdf_SetFontLoader() { pdf.AddPage() pdf.SetFont("Calligrapher", "", 35) pdf.Cell(0, 10, "Load fonts from any source") - fileStr := exampleFilename("Fpdf_SetFontLoader") + fileStr := example.Filename("Fpdf_SetFontLoader") err := pdf.OutputFileAndClose(fileStr) - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // Generalized font loader reading calligra.json // Generalized font loader reading calligra.z @@ -1582,9 +1548,9 @@ func ExampleFpdf_MoveTo() { pdf.SetFillColor(200, 200, 200) pdf.SetLineWidth(3) pdf.DrawPath("DF") - fileStr := exampleFilename("Fpdf_MoveTo_path") + fileStr := example.Filename("Fpdf_MoveTo_path") err := pdf.OutputFileAndClose(fileStr) - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // Successfully generated pdf/Fpdf_MoveTo_path.pdf } @@ -1623,9 +1589,9 @@ func ExampleFpdf_SetLineJoinStyle() { draw(caps[i], joins[i], x, 50, x, 160) x += offset } - fileStr := exampleFilename("Fpdf_SetLineJoinStyle_caps") + fileStr := example.Filename("Fpdf_SetLineJoinStyle_caps") err := pdf.OutputFileAndClose(fileStr) - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // Successfully generated pdf/Fpdf_SetLineJoinStyle_caps.pdf } @@ -1699,9 +1665,9 @@ func ExampleFpdf_DrawPath() { pdf.DrawPath("B*") pdf.Text(115, 290, "B* (even odd)") - fileStr := exampleFilename("Fpdf_DrawPath_fill") + fileStr := example.Filename("Fpdf_DrawPath_fill") err := pdf.OutputFileAndClose(fileStr) - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // Successfully generated pdf/Fpdf_DrawPath_fill.pdf } @@ -1712,7 +1678,7 @@ func ExampleFpdf_CreateTemplate() { pdf.SetCompression(false) // pdf.SetFont("Times", "", 12) template := pdf.CreateTemplate(func(tpl *gofpdf.Tpl) { - tpl.Image(imageFile("logo.png"), 6, 6, 30, 0, false, "", 0, "") + tpl.Image(example.ImageFile("logo.png"), 6, 6, 30, 0, false, "", 0, "") tpl.SetFont("Arial", "B", 16) tpl.Text(40, 20, "Template says hello") tpl.SetDrawColor(0, 100, 200) @@ -1726,7 +1692,7 @@ func ExampleFpdf_CreateTemplate() { template2 := pdf.CreateTemplate(func(tpl *gofpdf.Tpl) { tpl.UseTemplate(template) subtemplate := tpl.CreateTemplate(func(tpl2 *gofpdf.Tpl) { - tpl2.Image(imageFile("logo.png"), 6, 86, 30, 0, false, "", 0, "") + tpl2.Image(example.ImageFile("logo.png"), 6, 86, 30, 0, false, "", 0, "") tpl2.SetFont("Arial", "B", 16) tpl2.Text(40, 100, "Subtemplate says hello") tpl2.SetDrawColor(0, 200, 100) @@ -1752,9 +1718,9 @@ func ExampleFpdf_CreateTemplate() { pdf.Line(60, 210, 80, 210) pdf.Text(40, 200, "Template example page 2") - fileStr := exampleFilename("Fpdf_CreateTemplate") + fileStr := example.Filename("Fpdf_CreateTemplate") err := pdf.OutputFileAndClose(fileStr) - summary(err, fileStr) + example.Summary(err, fileStr) // Output: // Successfully generated pdf/Fpdf_CreateTemplate.pdf } diff --git a/internal/example/example.go b/internal/example/example.go new file mode 100644 index 0000000..8486994 --- /dev/null +++ b/internal/example/example.go @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2015 Kurt Jung (Gmail: kurt.w.jung) + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* +Package example provides some helper routines for the test packages of +gofpdf and its various contributed packages located beneath the contrib +directory. +*/ +package example + +import ( + "fmt" + "os" + "path/filepath" + "strings" +) + +var gofpdfDir string + +func init() { + setRoot() +} + +// Assign the relative path to the gofpdfDir directory based on current working +// directory +func setRoot() { + wdStr, err := os.Getwd() + if err == nil { + gofpdfDir = "" + sepStr := string(os.PathSeparator) + list := strings.Split(wdStr, sepStr) + for j := len(list) - 1; j >= 0 && list[j] != "gofpdf"; j-- { + gofpdfDir = filepath.Join(gofpdfDir, "..") + } + } else { + panic(err) + } +} + +// ImageFile returns a qualified filename in which the path to the image +// directory is prepended to the specified filename. +func ImageFile(fileStr string) string { + return filepath.Join(gofpdfDir, "image", fileStr) +} + +// FontDir returns the path to the font directory. +func FontDir() string { + return filepath.Join(gofpdfDir, "font") +} + +// FontFile returns a qualified filename in which the path to the font +// directory is prepended to the specified filename. +func FontFile(fileStr string) string { + return filepath.Join(FontDir(), fileStr) +} + +// TextFile returns a qualified filename in which the path to the text +// directory is prepended to the specified filename. +func TextFile(fileStr string) string { + return filepath.Join(gofpdfDir, "text", fileStr) +} + +// PdfDir returns the path to the PDF output directory. +func PdfDir() string { + return filepath.Join(gofpdfDir, "pdf") +} + +// PdfFile returns a qualified filename in which the path to the PDF output +// directory is prepended to the specified filename. +func PdfFile(fileStr string) string { + return filepath.Join(PdfDir(), fileStr) +} + +// Filename returns a qualified filename in which the example PDF directory +// path is prepended and the suffix ".pdf" is appended to the specified +// filename. +func Filename(baseStr string) string { + return PdfFile(baseStr + ".pdf") +} + +// Summary generates a predictable report for use by test examples. If the +// specified error is nil, the filename delimiters are normalized and the +// filename printed to standard output with a success message. If the specified +// error is not nil, its String() value is printed to standard output. +func Summary(err error, fileStr string) { + if err == nil { + fileStr = filepath.ToSlash(fileStr) + fmt.Printf("Successfully generated %s\n", fileStr) + } else { + fmt.Println(err) + } +} diff --git a/internal/example/example_test.go b/internal/example/example_test.go new file mode 100644 index 0000000..54f4689 --- /dev/null +++ b/internal/example/example_test.go @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2015 Kurt Jung (Gmail: kurt.w.jung) + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +package example_test + +import ( + "fmt" + "path/filepath" + + "github.com/jung-kurt/gofpdf/internal/example" +) + +// Test the Filename() function. +func ExampleExample_Filename() { + fmt.Println(filepath.ToSlash(example.Filename("foo"))) + // Output: + // ../../pdf/foo.pdf +} diff --git a/ttfparser_test.go b/ttfparser_test.go index 9f494a6..3286db2 100644 --- a/ttfparser_test.go +++ b/ttfparser_test.go @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Kurt Jung (Gmail: kurt.w.jung) + * Copyright (c) 2013-2015 Kurt Jung (Gmail: kurt.w.jung) * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -19,12 +19,13 @@ package gofpdf_test import ( "bytes" "fmt" + "github.com/jung-kurt/gofpdf" - // "testing" + "github.com/jung-kurt/gofpdf/internal/example" ) func ExampleTtfParse() { - ttf, err := gofpdf.TtfParse(cnFontDir + "/calligra.ttf") + ttf, err := gofpdf.TtfParse(example.FontDir() + "/calligra.ttf") if err == nil { fmt.Printf("Postscript name: %s\n", ttf.PostScriptName) fmt.Printf("unitsPerEm: %8d\n", ttf.UnitsPerEm) @@ -55,7 +56,7 @@ func hexStr(s string) string { } func ExampleFpdf_GetStringWidth() { - pdf := gofpdf.New("", "", "", cnFontDir) + pdf := gofpdf.New("", "", "", example.FontDir()) pdf.SetFont("Helvetica", "", 12) pdf.AddPage() for _, s := range []string{"Hello", "世界", "\xe7a va?"} { -- cgit v1.2.1-24-ge1ad