-
Notifications
You must be signed in to change notification settings - Fork 148
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[FEATURE] Support arithmetic operators in CSS functions (#624)
This is the enhancement from #390. `calc` was already supported. Co-authored-by: Jake Hotson <[email protected]>
- Loading branch information
Showing
3 changed files
with
118 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,107 @@ | ||
<?php | ||
|
||
namespace Sabberworm\CSS\Tests\Value; | ||
|
||
use PHPUnit\Framework\TestCase; | ||
use Sabberworm\CSS\Parsing\ParserState; | ||
use Sabberworm\CSS\Settings; | ||
use Sabberworm\CSS\Value\Value; | ||
|
||
/** | ||
* @covers \Sabberworm\CSS\Value\Value | ||
*/ | ||
final class ValueTest extends TestCase | ||
{ | ||
/** | ||
* @return array<string, array{0: string}> | ||
*/ | ||
public static function provideArithmeticOperator() | ||
{ | ||
$units = ['+', '-', '*', '/']; | ||
|
||
return \array_combine( | ||
$units, | ||
\array_map( | ||
function ($unit) { | ||
return [$unit]; | ||
}, | ||
$units | ||
) | ||
); | ||
} | ||
|
||
/** | ||
* @test | ||
* | ||
* @dataProvider provideArithmeticOperator | ||
*/ | ||
public function parsesArithmeticInFunctions($operator) | ||
{ | ||
$subject = Value::parseValue(new ParserState('max(300px, 50vh ' . $operator . ' 10px);', Settings::create())); | ||
|
||
self::assertSame('max(300px,50vh ' . $operator . ' 10px)', (string) $subject); | ||
} | ||
|
||
/** | ||
* @return array<string, array{0: string, 1: string}> | ||
* The first datum is a template for the parser (using `sprintf` insertion marker `%s` for some expression). | ||
* The second is for the expected result, which may have whitespace and trailing semicolon removed. | ||
*/ | ||
public static function provideCssFunctionTemplates() | ||
{ | ||
return [ | ||
'calc' => [ | ||
'to be parsed' => 'calc(%s);', | ||
'expected' => 'calc(%s)', | ||
], | ||
'max' => [ | ||
'to be parsed' => 'max(300px, %s);', | ||
'expected' => 'max(300px,%s)', | ||
], | ||
]; | ||
} | ||
|
||
/** | ||
* @test | ||
* | ||
* @dataProvider provideCssFunctionTemplates | ||
*/ | ||
public function parsesArithmeticWithMultipleOperatorsInFunctions( | ||
$parserTemplate, | ||
$expectedResultTemplate | ||
) { | ||
static $expression = '300px + 10% + 10vw'; | ||
|
||
$subject = Value::parseValue(new ParserState(\sprintf($parserTemplate, $expression), Settings::create())); | ||
|
||
self::assertSame(\sprintf($expectedResultTemplate, $expression), (string) $subject); | ||
} | ||
|
||
/** | ||
* @return array<string, array{0: string, 1: string}> | ||
*/ | ||
public static function provideMalformedLengthOperands() | ||
{ | ||
return [ | ||
'LHS missing number' => ['vh', '10px'], | ||
'RHS missing number' => ['50vh', 'px'], | ||
'LHS missing unit' => ['50', '10px'], | ||
'RHS missing unit' => ['50vh', '10'], | ||
]; | ||
} | ||
|
||
/** | ||
* @test | ||
* | ||
* @dataProvider provideMalformedLengthOperands | ||
*/ | ||
public function parsesArithmeticWithMalformedOperandsInFunctions($leftOperand, $rightOperand) | ||
{ | ||
$subject = Value::parseValue(new ParserState( | ||
'max(300px, ' . $leftOperand . ' + ' . $rightOperand . ');', | ||
Settings::create() | ||
)); | ||
|
||
self::assertSame('max(300px,' . $leftOperand . ' + ' . $rightOperand . ')', (string) $subject); | ||
} | ||
} |