* @copyright 2011-2024 Nicola Asuni - Tecnick.com LTD * @license http://www.gnu.org/copyleft/lesser.html GNU-LGPL v3 (see LICENSE.TXT) * @link https://github.com/tecnickcom/tc-lib-pdf-font * * This file is part of tc-lib-pdf-font software library. */ namespace Test; use PHPUnit\Framework\Attributes\DataProvider; /** * Import Test * * @since 2011-05-23 * @category Library * @package PdfFont * @author Nicola Asuni * @copyright 2011-2024 Nicola Asuni - Tecnick.com LTD * @license http://www.gnu.org/copyleft/lesser.html GNU-LGPL v3 (see LICENSE.TXT) * @link https://github.com/tecnickcom/tc-lib-pdf-font * * @SuppressWarnings("PHPMD.LongVariable") */ class ImportTest extends TestUtil { public function testImportForbiddenProtocol(): void { $this->bcExpectException('\\' . \Com\Tecnick\Pdf\Font\Exception::class); new \Com\Tecnick\Pdf\Font\Import('phar://test.txt'); } public function testImportParentDir(): void { $this->bcExpectException('\\' . \Com\Tecnick\Pdf\Font\Exception::class); new \Com\Tecnick\Pdf\Font\Import('/tmp/something/../test.txt'); } public function testImportEmptyName(): void { $this->bcExpectException('\\' . \Com\Tecnick\Pdf\Font\Exception::class); new \Com\Tecnick\Pdf\Font\Import(''); } public function testImportExist(): void { $this->bcExpectException('\\' . \Com\Tecnick\Pdf\Font\Exception::class); $fin = dirname(__DIR__) . '/util/vendor/tecnickcom/tc-font-mirror/core/Helvetica.afm'; $outdir = dirname(__DIR__) . '/target/tmptest/'; system('rm -rf ' . $outdir . ' && mkdir -p ' . $outdir); new \Com\Tecnick\Pdf\Font\Import($fin, $outdir); new \Com\Tecnick\Pdf\Font\Import($fin, $outdir); } public function testImportWrongFile(): void { $this->bcExpectException('\\' . \Com\Tecnick\Pdf\Font\Exception::class); new \Com\Tecnick\Pdf\Font\Import(dirname(__DIR__) . '/util/vendor/tecnickcom/tc-font-mirror/core/Missing.afm'); } public function testImportDefaultOutput(): void { $this->bcExpectException('\\' . \Com\Tecnick\Pdf\Font\Exception::class); new \Com\Tecnick\Pdf\Font\Import(dirname(__DIR__) . '/util/vendor/tecnickcom/tc-font-mirror/core/Missing.afm'); } public function testImportUnsupportedType(): void { $this->bcExpectException('\\' . \Com\Tecnick\Pdf\Font\Exception::class); $fin = dirname(__DIR__) . '/util/vendor/tecnickcom/tc-font-mirror/core/Helvetica.afm'; $outdir = dirname(__DIR__) . '/target/tmptest/core/'; system('rm -rf ' . $outdir . ' && mkdir -p ' . $outdir); new \Com\Tecnick\Pdf\Font\Import($fin, $outdir, 'ERROR'); } public function testImportUnsupportedOpenType(): void { $this->bcExpectException('\\' . \Com\Tecnick\Pdf\Font\Exception::class); $outdir = dirname(__DIR__) . '/target/tmptest/core/'; system('rm -rf ' . $outdir . ' && mkdir -p ' . $outdir); file_put_contents($outdir . 'test.ttf', 'OTTO 1234'); new \Com\Tecnick\Pdf\Font\Import($outdir . 'test.ttf', $outdir); } #[DataProvider('importDataProvider')] public function testImport( string $fontdir, string $font, mixed $outname, string $type = '', string $encoding = '' ): void { $indir = dirname(__DIR__) . '/util/vendor/tecnickcom/tc-font-mirror/' . $fontdir . '/'; $outdir = dirname(__DIR__) . '/target/tmptest/' . $fontdir . '/'; system('rm -rf ' . dirname(__DIR__) . '/target/tmptest/ && mkdir -p ' . $outdir); $import = new \Com\Tecnick\Pdf\Font\Import($indir . $font, $outdir, $type, $encoding); $this->assertEquals($outname, $import->getFontName()); $file = file_get_contents($outdir . $outname . '.json'); $this->assertNotFalse($file); $json = json_decode($file, true, 512, JSON_THROW_ON_ERROR); $this->assertNotNull($json); $this->assertIsArray($json); $this->assertArrayHasKey('type', $json); $this->assertArrayHasKey('name', $json); $this->assertArrayHasKey('up', $json); $this->assertArrayHasKey('ut', $json); $this->assertArrayHasKey('dw', $json); $this->assertArrayHasKey('diff', $json); $this->assertArrayHasKey('desc', $json); $this->assertArrayHasKey('Flags', $json['desc']); $metric = $import->getFontMetrics(); $this->assertEquals('[' . $metric['bbox'] . ']', $json['desc']['FontBBox']); $this->assertEquals($metric['italicAngle'], $json['desc']['ItalicAngle']); $this->assertEquals($metric['Ascent'], $json['desc']['Ascent']); $this->assertEquals($metric['Descent'], $json['desc']['Descent']); $this->assertEquals($metric['Leading'], $json['desc']['Leading']); $this->assertEquals($metric['CapHeight'], $json['desc']['CapHeight']); $this->assertEquals($metric['XHeight'], $json['desc']['XHeight']); $this->assertEquals($metric['StemV'], $json['desc']['StemV']); $this->assertEquals($metric['StemH'], $json['desc']['StemH']); $this->assertEquals($metric['AvgWidth'], $json['desc']['AvgWidth']); $this->assertEquals($metric['MaxWidth'], $json['desc']['MaxWidth']); $this->assertEquals($metric['MissingWidth'], $json['desc']['MissingWidth']); } /** * @return array> */ public static function importDataProvider(): array { return [ ['core', 'Courier.afm', 'courier'], ['core', 'Courier-Bold.afm', 'courierb'], ['core', 'Courier-BoldOblique.afm', 'courierbi'], ['core', 'Courier-Oblique.afm', 'courieri'], ['core', 'Helvetica.afm', 'helvetica'], ['core', 'Helvetica-Bold.afm', 'helveticab'], ['core', 'Helvetica-BoldOblique.afm', 'helveticabi'], ['core', 'Helvetica-Oblique.afm', 'helveticai'], ['core', 'Symbol.afm', 'symbol'], ['core', 'Times.afm', 'times'], ['core', 'Times-Bold.afm', 'timesb'], ['core', 'Times-BoldItalic.afm', 'timesbi'], ['core', 'Times-Italic.afm', 'timesi'], ['core', 'ZapfDingbats.afm', 'zapfdingbats'], ['pdfa/pfb', 'PDFACourierBoldOblique.pfb', 'pdfacourierbi', '', ''], ['pdfa/pfb', 'PDFACourierBold.pfb', 'pdfacourierb', 'Type1', 'cp1252'], ['pdfa/pfb', 'PDFACourierOblique.pfb', 'pdfacourieri', 'Type1', 'cp1252'], ['pdfa/pfb', 'PDFACourier.pfb', 'pdfacourier', 'Type1', 'cp1252'], ['pdfa/pfb', 'PDFAHelveticaBoldOblique.pfb', 'pdfahelveticabi', 'Type1', 'cp1252'], ['pdfa/pfb', 'PDFAHelveticaBold.pfb', 'pdfahelveticab', 'Type1', 'cp1252'], ['pdfa/pfb', 'PDFAHelveticaOblique.pfb', 'pdfahelveticai', 'Type1', 'cp1252'], ['pdfa/pfb', 'PDFAHelvetica.pfb', 'pdfahelvetica', 'Type1', 'cp1252'], ['pdfa/pfb', 'PDFASymbol.pfb', 'pdfasymbol', '', 'symbol'], ['pdfa/pfb', 'PDFATimesBoldItalic.pfb', 'pdfatimesbi', 'Type1', 'cp1252'], ['pdfa/pfb', 'PDFATimesBold.pfb', 'pdfatimesb', 'Type1', 'cp1252'], ['pdfa/pfb', 'PDFATimesItalic.pfb', 'pdfatimesi', 'Type1', 'cp1252'], ['pdfa/pfb', 'PDFATimes.pfb', 'pdfatimes', 'Type1', 'cp1252'], ['pdfa/pfb', 'PDFAZapfDingbats.pfb', 'pdfazapfdingbats'], ['freefont', 'FreeMonoBoldOblique.ttf', 'freemonobi'], ['freefont', 'FreeMonoBold.ttf', 'freemonob'], ['freefont', 'FreeMonoOblique.ttf', 'freemonoi'], ['freefont', 'FreeMono.ttf', 'freemono'], ['freefont', 'FreeSansBoldOblique.ttf', 'freesansbi'], ['freefont', 'FreeSansBold.ttf', 'freesansb'], ['freefont', 'FreeSansOblique.ttf', 'freesansi'], ['freefont', 'FreeSans.ttf', 'freesans'], ['freefont', 'FreeSerifBoldItalic.ttf', 'freeserifbi'], ['freefont', 'FreeSerifBold.ttf', 'freeserifb'], ['freefont', 'FreeSerifItalic.ttf', 'freeserifi'], ['freefont', 'FreeSerif.ttf', 'freeserif'], ['unifont', 'unifont.ttf', 'unifont'], ['cid0', 'cid0cs.ttf', 'cid0cs', 'CID0CS'], ['cid0', 'cid0ct.ttf', 'cid0ct', 'CID0CT'], ['cid0', 'cid0jp.ttf', 'cid0jp', 'CID0JP'], ['cid0', 'cid0kr.ttf', 'cid0kr', 'CID0KR'], ['dejavu/ttf', 'DejaVuSans.ttf', 'dejavusans'], ['dejavu/ttf', 'DejaVuSans-BoldOblique.ttf', 'dejavusansbi'], ['dejavu/ttf', 'DejaVuSans-Bold.ttf', 'dejavusansb'], ['dejavu/ttf', 'DejaVuSans-Oblique.ttf', 'dejavusansi'], ['dejavu/ttf', 'DejaVuSansCondensed.ttf', 'dejavusanscondensed'], ['dejavu/ttf', 'DejaVuSansCondensed-BoldOblique.ttf', 'dejavusanscondensedbi'], ['dejavu/ttf', 'DejaVuSansCondensed-Bold.ttf', 'dejavusanscondensedb'], ['dejavu/ttf', 'DejaVuSansCondensed-Oblique.ttf', 'dejavusanscondensedi'], ['dejavu/ttf', 'DejaVuSansMono.ttf', 'dejavusansmono'], ['dejavu/ttf', 'DejaVuSansMono-BoldOblique.ttf', 'dejavusansmonobi'], ['dejavu/ttf', 'DejaVuSansMono-Bold.ttf', 'dejavusansmonob'], ['dejavu/ttf', 'DejaVuSansMono-Oblique.ttf', 'dejavusansmonoi'], ['dejavu/ttf', 'DejaVuSans-ExtraLight.ttf', 'dejavusansextralight'], ['dejavu/ttf', 'DejaVuSerif.ttf', 'dejavuserif'], ['dejavu/ttf', 'DejaVuSerif-BoldItalic.ttf', 'dejavuserifbi'], ['dejavu/ttf', 'DejaVuSerif-Bold.ttf', 'dejavuserifb'], ['dejavu/ttf', 'DejaVuSerif-Italic.ttf', 'dejavuserifi'], ['dejavu/ttf', 'DejaVuSerifCondensed.ttf', 'dejavuserifcondensed'], ['dejavu/ttf', 'DejaVuSerifCondensed-BoldItalic.ttf', 'dejavuserifcondensedbi'], ['dejavu/ttf', 'DejaVuSerifCondensed-Bold.ttf', 'dejavuserifcondensedb'], ['dejavu/ttf', 'DejaVuSerifCondensed-Italic.ttf', 'dejavuserifcondensedi'], ]; } }