test_block_name = null;
+
+ // Sets up the `wp-content/themes/` directory to ensure consistency when running tests.
+ $this->theme_root = realpath( __DIR__ . '/../data/themedir1' );
+ $this->orig_theme_dir = $GLOBALS['wp_theme_directories'];
+ $GLOBALS['wp_theme_directories'] = array( WP_CONTENT_DIR . '/themes', $this->theme_root );
+
+ $theme_root_callback = function () {
+ return $this->theme_root;
+ };
+ add_filter( 'theme_root', $theme_root_callback );
+ add_filter( 'stylesheet_root', $theme_root_callback );
+ add_filter( 'template_root', $theme_root_callback );
+
+ // Clear caches.
+ wp_clean_themes_cache();
+ unset( $GLOBALS['wp_themes'] );
}
/**
* Tears down tests.
*/
- function tear_down() {
+ public function tear_down() {
+ // Restores the original theme directory setup.
+ $GLOBALS['wp_theme_directories'] = $this->orig_theme_dir;
+ wp_clean_themes_cache();
+ unset( $GLOBALS['wp_themes'] );
+
+ // Resets test block name.
unregister_block_type( $this->test_block_name );
$this->test_block_name = null;
+
parent::tear_down();
}
@@ -34,7 +73,7 @@ function tear_down() {
*
* @covers ::wp_apply_typography_support
*/
- function test_should_kebab_case_font_size_slug_with_numbers() {
+ public function test_should_kebab_case_font_size_slug_with_numbers() {
$this->test_block_name = 'test/font-size-slug-with-numbers';
register_block_type(
$this->test_block_name,
@@ -68,7 +107,7 @@ function test_should_kebab_case_font_size_slug_with_numbers() {
*
* @covers ::wp_apply_typography_support
*/
- function test_should_generate_font_family_with_legacy_inline_styles_using_a_value() {
+ public function test_should_generate_font_family_with_legacy_inline_styles_using_a_value() {
$this->test_block_name = 'test/font-family-with-inline-styles-using-value';
register_block_type(
$this->test_block_name,
@@ -101,7 +140,7 @@ function test_should_generate_font_family_with_legacy_inline_styles_using_a_valu
*
* @covers ::wp_apply_typography_support
*/
- function test_should_skip_serialization_for_typography_block_supports() {
+ public function test_should_skip_serialization_for_typography_block_supports() {
$this->test_block_name = 'test/typography-with-skipped-serialization-block-supports';
register_block_type(
$this->test_block_name,
@@ -147,7 +186,7 @@ function test_should_skip_serialization_for_typography_block_supports() {
*
* @covers ::wp_apply_typography_support
*/
- function test_should_skip_serialization_for_letter_spacing_block_supports() {
+ public function test_should_skip_serialization_for_letter_spacing_block_supports() {
$this->test_block_name = 'test/letter-spacing-with-individual-skipped-serialization-block-supports';
register_block_type(
$this->test_block_name,
@@ -183,7 +222,7 @@ function test_should_skip_serialization_for_letter_spacing_block_supports() {
*
* @covers ::wp_apply_typography_support
*/
- function test_should_generate_css_var_for_font_family_with_legacy_inline_styles() {
+ public function test_should_generate_css_var_for_font_family_with_legacy_inline_styles() {
$this->test_block_name = 'test/font-family-with-inline-styles-using-css-var';
register_block_type(
$this->test_block_name,
@@ -216,7 +255,7 @@ function test_should_generate_css_var_for_font_family_with_legacy_inline_styles(
*
* @covers ::wp_apply_typography_support
*/
- function test_should_generate_classname_for_font_family() {
+ public function test_should_generate_classname_for_font_family() {
$this->test_block_name = 'test/font-family-with-class';
register_block_type(
$this->test_block_name,
@@ -263,7 +302,7 @@ function test_should_generate_classname_for_font_family() {
* @param bool $should_use_fluid_typography An override to switch fluid typography "on". Can be used for unit testing.
* @param string $expected_output Expected output of gutenberg_get_typography_font_size_value().
*/
- function test_gutenberg_get_typography_font_size_value( $font_size_preset, $should_use_fluid_typography, $expected_output ) {
+ public function test_gutenberg_get_typography_font_size_value( $font_size_preset, $should_use_fluid_typography, $expected_output ) {
$actual = gutenberg_get_typography_font_size_value( $font_size_preset, $should_use_fluid_typography );
$this->assertSame( $expected_output, $actual );
@@ -284,6 +323,30 @@ public function data_generate_font_size_preset_fixtures() {
'expected_output' => '28px',
),
+ 'size: int 0' => array(
+ 'font_size_preset' => array(
+ 'size' => 0,
+ ),
+ 'should_use_fluid_typography' => true,
+ 'expected_output' => 0,
+ ),
+
+ 'size: string 0' => array(
+ 'font_size_preset' => array(
+ 'size' => '0',
+ ),
+ 'should_use_fluid_typography' => true,
+ 'expected_output' => '0',
+ ),
+
+ 'default_return_value_when_size_is_undefined' => array(
+ 'font_size_preset' => array(
+ 'size' => null,
+ ),
+ 'should_use_fluid_typography' => false,
+ 'expected_output' => null,
+ ),
+
'default_return_value_when_fluid_is_false' => array(
'font_size_preset' => array(
'size' => '28px',
@@ -293,6 +356,24 @@ public function data_generate_font_size_preset_fixtures() {
'expected_output' => '28px',
),
+ 'default_return_value_when_value_is_already_clamped' => array(
+ 'font_size_preset' => array(
+ 'size' => 'clamp(21px, 1.3125rem + ((1vw - 7.68px) * 2.524), 42px)',
+ 'fluid' => false,
+ ),
+ 'should_use_fluid_typography' => true,
+ 'expected_output' => 'clamp(21px, 1.3125rem + ((1vw - 7.68px) * 2.524), 42px)',
+ ),
+
+ 'default_return_value_with_unsupported_unit' => array(
+ 'font_size_preset' => array(
+ 'size' => '1000%',
+ 'fluid' => false,
+ ),
+ 'should_use_fluid_typography' => true,
+ 'expected_output' => '1000%',
+ ),
+
'return_fluid_value' => array(
'font_size_preset' => array(
'size' => '1.75rem',
@@ -301,6 +382,30 @@ public function data_generate_font_size_preset_fixtures() {
'expected_output' => 'clamp(1.3125rem, 1.3125rem + ((1vw - 0.48rem) * 2.524), 2.625rem)',
),
+ 'return_fluid_value_with_floats_with_units' => array(
+ 'font_size_preset' => array(
+ 'size' => '100.175px',
+ ),
+ 'should_use_fluid_typography' => true,
+ 'expected_output' => 'clamp(75.13125px, 4.695703125rem + ((1vw - 7.68px) * 9.03), 150.2625px)',
+ ),
+
+ 'return_fluid_value_with_integer_coerced_to_px' => array(
+ 'font_size_preset' => array(
+ 'size' => 33,
+ ),
+ 'should_use_fluid_typography' => true,
+ 'expected_output' => 'clamp(24.75px, 1.546875rem + ((1vw - 7.68px) * 2.975), 49.5px)',
+ ),
+
+ 'return_fluid_value_with_float_coerced_to_px' => array(
+ 'font_size_preset' => array(
+ 'size' => 100.23,
+ ),
+ 'should_use_fluid_typography' => true,
+ 'expected_output' => 'clamp(75.1725px, 4.69828125rem + ((1vw - 7.68px) * 9.035), 150.345px)',
+ ),
+
'return_default_fluid_values_with_empty_fluid_array' => array(
'font_size_preset' => array(
'size' => '28px',
@@ -366,4 +471,276 @@ public function data_generate_font_size_preset_fixtures() {
),
);
}
+
+ /**
+ * Tests that custom font sizes are converted to fluid values
+ * in inline block supports styles,
+ * when "settings.typography.fluid" is set to `true`.
+ *
+ * @covers ::gutenberg_register_typography_support
+ *
+ * @dataProvider data_generate_block_supports_font_size_fixtures
+ *
+ * @param string $font_size_value The block supports custom font size value.
+ * @param bool $should_use_fluid_typography An override to switch fluid typography "on". Can be used for unit testing.
+ * @param string $expected_output Expected value of style property from gutenberg_apply_typography_support().
+ */
+ public function test_should_covert_font_sizes_to_fluid_values( $font_size_value, $should_use_fluid_typography, $expected_output ) {
+ if ( $should_use_fluid_typography ) {
+ switch_theme( 'block-theme-child-with-fluid-typography' );
+ } else {
+ switch_theme( 'default' );
+ }
+
+ $this->test_block_name = 'test/font-size-fluid-value';
+ register_block_type(
+ $this->test_block_name,
+ array(
+ 'api_version' => 2,
+ 'attributes' => array(
+ 'style' => array(
+ 'type' => 'object',
+ ),
+ ),
+ 'supports' => array(
+ 'typography' => array(
+ 'fontSize' => true,
+ ),
+ ),
+ )
+ );
+ $registry = WP_Block_Type_Registry::get_instance();
+ $block_type = $registry->get_registered( $this->test_block_name );
+ $block_attributes = array(
+ 'style' => array(
+ 'typography' => array(
+ 'fontSize' => $font_size_value,
+ ),
+ ),
+ );
+
+ $actual = gutenberg_apply_typography_support( $block_type, $block_attributes );
+ $expected = array( 'style' => $expected_output );
+
+ $this->assertSame( $expected, $actual );
+ }
+
+ /**
+ * Data provider for test_should_covert_font_sizes_to_fluid_values.
+ *
+ * @return array
+ */
+ public function data_generate_block_supports_font_size_fixtures() {
+ return array(
+ 'default_return_value' => array(
+ 'font_size_value' => '50px',
+ 'should_use_fluid_typography' => false,
+ 'expected_output' => 'font-size:50px;',
+ ),
+ 'return_value_with_fluid_typography' => array(
+ 'font_size_value' => '50px',
+ 'should_use_fluid_typography' => true,
+ 'expected_output' => 'font-size:clamp(37.5px, 2.34375rem + ((1vw - 7.68px) * 4.507), 75px);',
+ ),
+ );
+ }
+
+ /**
+ * Tests that a block element's custom font size in the inline style attribute
+ * is replaced with a fluid value when "settings.typography.fluid" is set to `true`,
+ * and the correct block content is generated.
+ *
+ * @covers ::gutenberg_render_typography_support
+ *
+ * @dataProvider data_generate_replace_inline_font_styles_with_fluid_values_fixtures
+ *
+ * @param string $block_content HTML block content.
+ * @param string $font_size_value The block supports custom font size value.
+ * @param bool $should_use_fluid_typography An override to switch fluid typography "on". Can be used for unit testing.
+ * @param string $expected_output Expected value of style property from gutenberg_apply_typography_support().
+ */
+ public function test_should_replace_inline_font_styles_with_fluid_values( $block_content, $font_size_value, $should_use_fluid_typography, $expected_output ) {
+ if ( $should_use_fluid_typography ) {
+ switch_theme( 'block-theme-child-with-fluid-typography' );
+ } else {
+ switch_theme( 'default' );
+ }
+
+ $block = array(
+ 'blockName' => 'core/image',
+ 'attrs' => array(
+ 'style' => array(
+ 'typography' => array(
+ 'fontSize' => $font_size_value,
+ ),
+ ),
+ ),
+ );
+ $actual = gutenberg_render_typography_support( $block_content, $block );
+
+ $this->assertSame( $expected_output, $actual );
+ }
+
+ /**
+ * Data provider for test_should_replace_inline_font_styles_with_fluid_values.
+ *
+ * @return array
+ */
+ public function data_generate_replace_inline_font_styles_with_fluid_values_fixtures() {
+ return array(
+ 'default_return_content' => array(
+ 'block_content' => 'This is a heading
',
+ 'font_size_value' => '4rem',
+ 'should_use_fluid_typography' => false,
+ 'expected_output' => 'This is a heading
',
+ ),
+ 'return_content_with_replaced_fluid_font_size_inline_style' => array(
+ 'block_content' => 'This is a heading
',
+ 'font_size_value' => '4rem',
+ 'should_use_fluid_typography' => true,
+ 'expected_output' => 'This is a heading
',
+ ),
+ 'return_content_if_no_inline_font_size_found' => array(
+ 'block_content' => 'A paragraph inside a group
',
+ 'font_size_value' => '20px',
+ 'should_use_fluid_typography' => true,
+ 'expected_output' => 'A paragraph inside a group
',
+ ),
+ 'return_content_css_var' => array(
+ 'block_content' => 'A paragraph inside a group
',
+ 'font_size_value' => 'var:preset|font-size|x-large',
+ 'should_use_fluid_typography' => true,
+ 'expected_output' => 'A paragraph inside a group
',
+ ),
+ 'return_content_with_spaces' => array(
+ 'block_content' => 'A paragraph inside a group
',
+ 'font_size_value' => '20px',
+ 'should_use_fluid_typography' => true,
+ 'expected_output' => 'A paragraph inside a group
',
+ ),
+ 'return_content_with_first_match_replace_only' => array(
+ 'block_content' => " \n \n
A paragraph inside a group
",
+ 'font_size_value' => '1em',
+ 'should_use_fluid_typography' => true,
+ 'expected_output' => " \n \n
A paragraph inside a group
",
+ ),
+ );
+ }
+
+ /**
+ * Tests that valid font size values are parsed.
+ *
+ * @ticket 56467
+ *
+ * @covers ::gutenberg_get_typography_value_and_unit
+ *
+ * @dataProvider data_valid_size_wp_get_typography_value_and_unit
+ *
+ * @param mixed $raw_value Raw size value to test.
+ * @param mixed $expected An expected return value.
+ */
+ public function test_valid_size_wp_get_typography_value_and_unit( $raw_value, $expected ) {
+ $this->assertEquals( $expected, gutenberg_get_typography_value_and_unit( $raw_value ) );
+ }
+
+ /**
+ * Data provider.
+ *
+ * @return array
+ */
+ public function data_valid_size_wp_get_typography_value_and_unit() {
+ return array(
+ 'size: 10vh with default units do not match' => array(
+ 'raw_value' => '10vh',
+ 'expected' => null,
+ ),
+ 'size: calc() values do not match' => array(
+ 'raw_value' => 'calc(2 * 10px)',
+ 'expected' => null,
+ ),
+ 'size: clamp() values do not match' => array(
+ 'raw_value' => 'clamp(15px, 0.9375rem + ((1vw - 7.68px) * 5.409), 60px)',
+ 'expected' => null,
+ ),
+ 'size: `"10"`' => array(
+ 'raw_value' => '10',
+ 'expected' => array(
+ 'value' => 10,
+ 'unit' => 'px',
+ ),
+ ),
+ 'size: `11`' => array(
+ 'raw_value' => 11,
+ 'expected' => array(
+ 'value' => 11,
+ 'unit' => 'px',
+ ),
+ ),
+ 'size: `11.234`' => array(
+ 'raw_value' => '11.234',
+ 'expected' => array(
+ 'value' => 11.234,
+ 'unit' => 'px',
+ ),
+ ),
+ 'size: `"12rem"`' => array(
+ 'raw_value' => '12rem',
+ 'expected' => array(
+ 'value' => 12,
+ 'unit' => 'rem',
+ ),
+ ),
+ 'size: `"12px"`' => array(
+ 'raw_value' => '12px',
+ 'expected' => array(
+ 'value' => 12,
+ 'unit' => 'px',
+ ),
+ ),
+ 'size: `"12em"`' => array(
+ 'raw_value' => '12em',
+ 'expected' => array(
+ 'value' => 12,
+ 'unit' => 'em',
+ ),
+ ),
+ 'size: `"12.74em"`' => array(
+ 'raw_value' => '12.74em',
+ 'expected' => array(
+ 'value' => 12.74,
+ 'unit' => 'em',
+ ),
+ ),
+ );
+ }
+
+ /**
+ * Tests that invalid font size values are not parsed and trigger incorrect usage.
+ *
+ * @ticket 56467
+ *
+ * @covers ::gutenberg_get_typography_value_and_unit
+ *
+ * @dataProvider data_invalid_size_wp_get_typography_value_and_unit
+ * @expectedIncorrectUsage gutenberg_get_typography_value_and_unit
+ *
+ * @param mixed $raw_value Raw size value to test.
+ */
+ public function test_invalid_size_wp_get_typography_value_and_unit( $raw_value ) {
+ $this->assertNull( gutenberg_get_typography_value_and_unit( $raw_value ) );
+ }
+
+ /**
+ * Data provider.
+ *
+ * @return array
+ */
+ public function data_invalid_size_wp_get_typography_value_and_unit() {
+ return array(
+ 'size: null' => array( null ),
+ 'size: false' => array( false ),
+ 'size: true' => array( true ),
+ 'size: array' => array( array( '10' ) ),
+ );
+ }
}
diff --git a/phpunit/data/themedir1/block-theme-child-with-fluid-typography/theme.json b/phpunit/data/themedir1/block-theme-child-with-fluid-typography/theme.json
new file mode 100644
index 00000000000000..93234766eddd2a
--- /dev/null
+++ b/phpunit/data/themedir1/block-theme-child-with-fluid-typography/theme.json
@@ -0,0 +1,9 @@
+{
+ "version": 2,
+ "settings": {
+ "appearanceTools": true,
+ "typography": {
+ "fluid": true
+ }
+ }
+}