Files
2026-08-30 22:02:02 +00:00

510 lines
14 KiB
PHP

<?php
/**
* StyleTest.php
*
* @since 2011-05-23
* @category Library
* @package PdfGraph
* @author Nicola Asuni <info@tecnick.com>
* @copyright 2011-2026 Nicola Asuni - Tecnick.com LTD
* @license https://www.gnu.org/copyleft/lesser.html GNU-LGPL v3 (see LICENSE)
* @link https://github.com/tecnickcom/tc-lib-pdf-graph
*
* This file is part of tc-lib-pdf-graph software library.
*/
namespace Test;
/**
* Style Test
*
* @since 2011-05-23
* @category Library
* @package PdfGraph
* @author Nicola Asuni <info@tecnick.com>
* @copyright 2011-2026 Nicola Asuni - Tecnick.com LTD
* @license https://www.gnu.org/copyleft/lesser.html GNU-LGPL v3 (see LICENSE)
* @link https://github.com/tecnickcom/tc-lib-pdf-graph
*/
class StyleTest extends TestUtil
{
protected function getTestObject(): \Com\Tecnick\Pdf\Graph\Draw
{
return new \Com\Tecnick\Pdf\Graph\Draw(1, 0, 0, new \Com\Tecnick\Color\Pdf(), $this->getEncryptObject(), false);
}
/**
* @throws \Com\Tecnick\Pdf\Graph\Exception
*/
public function testGetStyleCmd(): void
{
$draw = $this->getTestObject();
$styleCmd = $draw->getStyleCmd();
$exp1 = '';
$this->assertEquals($exp1, $styleCmd);
$style2 = [
'lineWidth' => 3,
'lineCap' => 'round',
'lineJoin' => 'bevel',
'miterLimit' => 11,
'dashArray' => [5, 7],
'dashPhase' => 0,
'lineColor' => 'greenyellow',
'fillColor' => '["RGB",0.250000,0.500000,0.750000]',
];
$res2 = $draw->getStyleCmd($style2);
$exp2 =
'3.000000 w'
. "\n"
. '1 J'
. "\n"
. '2 j'
. "\n"
. '11.000000 M'
. "\n"
. '[5.000000 7.000000] 0.000000 d'
. "\n"
. '0.678431 1.000000 0.184314 RG'
. "\n"
. '0.250000 0.500000 0.750000 rg'
. "\n";
$this->assertEquals($exp2, $res2);
}
/**
* @throws \Com\Tecnick\Pdf\Graph\Exception
*/
public function testStyle(): void
{
$draw = $this->getTestObject();
$style = [];
$res1 = $draw->add($style, true);
$exp1 =
'1.000000 w'
. "\n"
. '0 J'
. "\n"
. '0 j'
. "\n"
. '10.000000 M'
. "\n"
. '[] 0.000000 d'
. "\n"
. '/CS1 CS 1.000000 SCN'
. "\n"
. '/CS1 cs 1.000000 scn'
. "\n";
$this->assertEquals($exp1, $res1);
$style = [
'lineWidth' => 3,
'lineCap' => 'round',
'lineJoin' => 'bevel',
'miterLimit' => 11,
'dashArray' => [5, 7],
'dashPhase' => 1,
'lineColor' => 'greenyellow',
'fillColor' => '["RGB",0.250000,0.500000,0.750000]',
];
$res2 = $draw->add($style, false);
$exp2 =
'3.000000 w'
. "\n"
. '1 J'
. "\n"
. '2 j'
. "\n"
. '11.000000 M'
. "\n"
. '[5.000000 7.000000] 1.000000 d'
. "\n"
. '0.678431 1.000000 0.184314 RG'
. "\n"
. '0.250000 0.500000 0.750000 rg'
. "\n";
$this->assertEquals($exp2, $res2);
$this->assertEquals($style, $draw->getCurrentStyleArray());
$style = [
'lineCap' => 'round',
'lineJoin' => 'bevel',
'lineColor' => 'transparent',
'fillColor' => 'cmyk(67,33,0,25)',
];
$res3 = $draw->add($style, true);
$exp3 =
'3.000000 w'
. "\n"
. '1 J'
. "\n"
. '2 j'
. "\n"
. '11.000000 M'
. "\n"
. '[5.000000 7.000000] 1.000000 d'
. "\n"
. '0.670000 0.330000 0.000000 0.250000 k'
. "\n";
$this->assertEquals($exp3, $res3);
$style = [
'lineCap' => 'round',
'lineJoin' => 'bevel',
'lineColor' => 'transparent',
'fillColor' => 'cmyk(67,33,0,25)',
'dashArray' => [],
];
$res4 = $draw->add($style, true);
$exp4 =
'3.000000 w'
. "\n"
. '1 J'
. "\n"
. '2 j'
. "\n"
. '11.000000 M'
. "\n"
. '[] 1.000000 d'
. "\n"
. '0.670000 0.330000 0.000000 0.250000 k'
. "\n";
$this->assertEquals($exp4, $res4);
$style = [
'lineWidth' => 7.123,
];
$res5 = $draw->add($style, false);
$exp5 = '7.123000 w' . "\n";
$this->assertEquals($exp5, $res5);
$res = $draw->pop();
$this->assertEquals($exp5, $res);
$res = $draw->pop();
$this->assertEquals($exp4, $res);
$res = $draw->pop();
$this->assertEquals($exp3, $res);
$res = $draw->pop();
$this->assertEquals($exp2, $res);
$res = $draw->pop();
$this->assertEquals($exp1, $res);
}
/**
* @throws \Com\Tecnick\Pdf\Graph\Exception
*/
public function testStyleEx(): void
{
$this->bcExpectException(\Com\Tecnick\Pdf\Graph\Exception::class);
$draw = $this->getTestObject();
$draw->pop();
}
/**
* @throws \Com\Tecnick\Pdf\Graph\Exception
*/
public function testSaveRestoreStyle(): void
{
$draw = $this->getTestObject();
$draw->add([
'lineWidth' => 1,
], false);
$draw->add([
'lineWidth' => 2,
], false);
$draw->add([
'lineWidth' => 3,
], false);
$draw->saveStyleStatus();
$draw->add([
'lineWidth' => 4,
], false);
$draw->add([
'lineWidth' => 5,
], false);
$draw->add([
'lineWidth' => 6,
], false);
$this->assertEquals(
[
'lineWidth' => 6,
],
$draw->getCurrentStyleArray(),
);
$draw->restoreStyleStatus();
$this->assertEquals(
[
'lineWidth' => 3,
],
$draw->getCurrentStyleArray(),
);
}
/**
* @throws \Com\Tecnick\Pdf\Graph\Exception
*/
public function testStyleItem(): void
{
$draw = $this->getTestObject();
$this->assertEquals('butt', $draw->getCurrentStyleItem('lineCap'));
}
/**
* @throws \Com\Tecnick\Pdf\Graph\Exception
*/
public function testStyleItemEx(): void
{
$this->bcExpectException(\Com\Tecnick\Pdf\Graph\Exception::class);
$draw = $this->getTestObject();
$draw->getCurrentStyleItem('wrongField');
}
/**
* @throws \Com\Tecnick\Pdf\Graph\Exception
*/
public function testGetLastStyleProperty(): void
{
$draw = $this->getTestObject();
$draw->add([
'lineWidth' => 1,
], false);
$draw->add([
'lineWidth' => 2,
], false);
$draw->add([
'lineWidth' => 3,
], false);
$this->assertEquals(3, $draw->getLastStyleProperty('lineWidth', 0));
$draw->add([
'lineWidth' => 4,
], false);
$this->assertEquals(4, $draw->getLastStyleProperty('lineWidth', 0));
$this->assertEquals(7, $draw->getLastStyleProperty('unknown', 7));
}
/**
* @throws \Com\Tecnick\Pdf\Graph\Exception
*/
public function testGetPathPaintOp(): void
{
$draw = $this->getTestObject();
$res = $draw->getPathPaintOp('', '');
$this->assertEquals('', $res);
$res = $draw->getPathPaintOp('');
$this->assertEquals('S' . "\n", $res);
$res = $draw->getPathPaintOp('', 'df');
$this->assertEquals('b' . "\n", $res);
$res = $draw->getPathPaintOp('CEO');
$this->assertEquals('W* n' . "\n", $res);
$res = $draw->getPathPaintOp('F*D');
$this->assertEquals('B*' . "\n", $res);
}
/**
* @throws \Com\Tecnick\Pdf\Graph\Exception
*/
public function testIsFillingMode(): void
{
$draw = $this->getTestObject();
$this->assertTrue($draw->isFillingMode('f'));
$this->assertTrue($draw->isFillingMode('f*'));
$this->assertTrue($draw->isFillingMode('B'));
$this->assertTrue($draw->isFillingMode('B*'));
$this->assertTrue($draw->isFillingMode('b'));
$this->assertTrue($draw->isFillingMode('b*'));
$this->assertFalse($draw->isFillingMode('S'));
$this->assertFalse($draw->isFillingMode('s'));
$this->assertFalse($draw->isFillingMode('n'));
$this->assertFalse($draw->isFillingMode(''));
}
/**
* @throws \Com\Tecnick\Pdf\Graph\Exception
*/
public function testIsStrokingMode(): void
{
$draw = $this->getTestObject();
$this->assertTrue($draw->isStrokingMode('S'));
$this->assertTrue($draw->isStrokingMode('s'));
$this->assertTrue($draw->isStrokingMode('B'));
$this->assertTrue($draw->isStrokingMode('B*'));
$this->assertTrue($draw->isStrokingMode('b'));
$this->assertTrue($draw->isStrokingMode('b*'));
$this->assertFalse($draw->isStrokingMode('f'));
$this->assertFalse($draw->isStrokingMode('f*'));
$this->assertFalse($draw->isStrokingMode('n'));
$this->assertFalse($draw->isStrokingMode(''));
}
/**
* @throws \Com\Tecnick\Pdf\Graph\Exception
*/
public function testIsClosingMode(): void
{
$draw = $this->getTestObject();
$this->assertTrue($draw->isClosingMode('s'));
$this->assertTrue($draw->isClosingMode('b'));
$this->assertTrue($draw->isClosingMode('b*'));
$this->assertFalse($draw->isClosingMode('f'));
$this->assertFalse($draw->isClosingMode('f*'));
$this->assertFalse($draw->isClosingMode('S'));
$this->assertFalse($draw->isClosingMode('B'));
$this->assertFalse($draw->isClosingMode('B*'));
$this->assertFalse($draw->isClosingMode('n'));
$this->assertFalse($draw->isClosingMode(''));
}
/**
* @throws \Com\Tecnick\Pdf\Graph\Exception
*/
public function testGetModeWithoutClose(): void
{
$draw = $this->getTestObject();
$this->assertEquals('', $draw->getModeWithoutClose(''));
$this->assertEquals('S', $draw->getModeWithoutClose('s'));
$this->assertEquals('B', $draw->getModeWithoutClose('b'));
$this->assertEquals('B*', $draw->getModeWithoutClose('b*'));
$this->assertEquals('n', $draw->getModeWithoutClose('n'));
}
/**
* @throws \Com\Tecnick\Pdf\Graph\Exception
*/
public function testGetModeWithoutFill(): void
{
$draw = $this->getTestObject();
$this->assertEquals('', $draw->getModeWithoutFill(''));
$this->assertEquals('', $draw->getModeWithoutFill('f'));
$this->assertEquals('', $draw->getModeWithoutFill('f*'));
$this->assertEquals('S', $draw->getModeWithoutFill('B'));
$this->assertEquals('S', $draw->getModeWithoutFill('B*'));
$this->assertEquals('s', $draw->getModeWithoutFill('b'));
$this->assertEquals('s', $draw->getModeWithoutFill('b*'));
$this->assertEquals('n', $draw->getModeWithoutFill('n'));
}
/**
* @throws \Com\Tecnick\Pdf\Graph\Exception
*/
public function testGetModeWithoutStroke(): void
{
$draw = $this->getTestObject();
$this->assertEquals('', $draw->getModeWithoutStroke(''));
$this->assertEquals('', $draw->getModeWithoutStroke('S'));
$this->assertEquals('h', $draw->getModeWithoutStroke('s'));
$this->assertEquals('f', $draw->getModeWithoutStroke('B'));
$this->assertEquals('f*', $draw->getModeWithoutStroke('B*'));
$this->assertEquals('h f', $draw->getModeWithoutStroke('b'));
$this->assertEquals('h f*', $draw->getModeWithoutStroke('b*'));
$this->assertEquals('n', $draw->getModeWithoutStroke('n'));
}
/**
* @throws \Com\Tecnick\Pdf\Graph\Exception
*/
public function testGetExtGState(): void
{
$draw = $this->getTestObject();
$this->assertEquals('/GS1 gs' . "\n", $draw->getExtGState([
'A' => 'B',
]));
$this->assertEquals('/GS1 gs' . "\n", $draw->getExtGState([
'A' => 'B',
]));
$this->assertEquals('/GS2 gs' . "\n", $draw->getExtGState([
'C' => 'D',
]));
}
/**
* @throws \Com\Tecnick\Pdf\Graph\Exception
*/
public function testGetExtGStatePdfa(): void
{
$draw = new \Com\Tecnick\Pdf\Graph\Draw(1, 0, 0, new \Com\Tecnick\Color\Pdf(), $this->getEncryptObject(), true);
$this->assertEquals('', $draw->getExtGState([
'A' => 'B',
]));
}
/**
* @throws \Com\Tecnick\Pdf\Graph\Exception
*/
public function testRestoreStyleStatusNull(): void
{
$draw = $this->getTestObject();
// stylemark starts as [0]; first restore pops that value
$draw->restoreStyleStatus();
// stylemark is now empty; second restore pops null and falls back to 0
$draw->restoreStyleStatus();
$this->assertEquals('butt', $draw->getCurrentStyleItem('lineCap'));
}
/**
* @throws \Com\Tecnick\Pdf\Graph\Exception
*/
public function testGetCurrentStyleArrayDefaultFallback(): void
{
$draw = new class(1, 0, 0, new \Com\Tecnick\Color\Pdf(), $this->getEncryptObject(), false) extends
\Com\Tecnick\Pdf\Graph\Draw {
public function setStyleIdForTest(int $styleid): void
{
$this->styleid = $styleid;
}
};
$draw->setStyleIdForTest(999);
$this->assertSame('butt', $draw->getCurrentStyleArray()['lineCap'] ?? null);
}
/**
* @throws \Com\Tecnick\Pdf\Graph\Exception
*/
public function testIsClippingModeInvalid(): void
{
$draw = $this->getTestObject();
$this->assertFalse($draw->isClippingMode('invalid'));
}
/**
* @throws \Com\Tecnick\Pdf\Graph\Exception
*/
public function testGetLineModeWithDashArrayNoDashPhase(): void
{
$draw = $this->getTestObject();
$style = [
'dashArray' => [3, 5],
];
$res = $draw->getStyleCmd($style);
$this->assertEquals('[3.000000 5.000000] 0.000000 d' . "\n", $res);
}
}