diff --git a/phpunit/block-supports/elements-test.php b/phpunit/block-supports/elements-test.php new file mode 100644 index 00000000000000..efea11887b620b --- /dev/null +++ b/phpunit/block-supports/elements-test.php @@ -0,0 +1,305 @@ +test_block_name = null; + } + + public function tear_down() { + WP_Style_Engine_CSS_Rules_Store_Gutenberg::remove_all_stores(); + unregister_block_type( $this->test_block_name ); + $this->test_block_name = null; + parent::tear_down(); + } + + /** + * Registers a test block type with the provided color block supports. + * + * @param array $color_settings The color block support settings used for elements. + */ + public function register_block_with_color_settings( $color_settings ) { + $this->test_block_name = 'test/element-block-supports'; + + register_block_type( + $this->test_block_name, + array( + 'api_version' => 3, + 'attributes' => array( + 'style' => array( + 'type' => 'object', + ), + ), + 'supports' => array( + 'color' => $color_settings, + ), + ) + ); + } + + /** + * Tests that elements block support applies the correct classname. + * + * @covers ::gutenberg_render_elements_support + * + * @dataProvider data_elements_block_support_class + * + * @param array $color_settings The color block support settings used for elements support. + * @param array $elements_styles The elements styles within the block attributes. + * @param string $block_markup Original block markup. + * @param string $expected_markup Resulting markup after application of elements block support. + */ + public function test_elements_block_support_class( $color_settings, $elements_styles, $block_markup, $expected_markup ) { + $this->register_block_with_color_settings( $color_settings ); + + $block = array( + 'blockName' => $this->test_block_name, + 'attrs' => array( + 'style' => array( + 'elements' => $elements_styles, + ), + ), + ); + + $actual = gutenberg_render_elements_support( $block_markup, $block ); + + $this->assertMatchesRegularExpression( + $expected_markup, + $actual, + 'Elements block wrapper markup should be correct' + ); + } + + /** + * Data provider. + * + * @return array + */ + public function data_elements_block_support_class() { + $color_styles = array( + 'text' => 'var:preset|color|vivid-red', + 'background' => '#fff', + ); + + return array( + 'button element styles with serialization skipped' => array( + 'color_settings' => array( + 'button' => true, + '__experimentalSkipSerialization' => true, + ), + 'elements_styles' => array( + 'button' => array( 'color' => $color_styles ), + ), + 'block_markup' => '
Hello WordPress!
', + 'expected_markup' => '/^Hello WordPress<\/a>!<\/p>$/',
+ ),
+ 'link element styles with serialization skipped' => array(
+ 'color_settings' => array(
+ 'link' => true,
+ '__experimentalSkipSerialization' => true,
+ ),
+ 'elements_styles' => array(
+ 'link' => array( 'color' => $color_styles ),
+ ),
+ 'block_markup' => ' Hello WordPress! Hello WordPress<\/a>!<\/p>$/',
+ ),
+ 'heading element styles with serialization skipped' => array(
+ 'color_settings' => array(
+ 'heading' => true,
+ '__experimentalSkipSerialization' => true,
+ ),
+ 'elements_styles' => array(
+ 'heading' => array( 'color' => $color_styles ),
+ ),
+ 'block_markup' => ' Hello WordPress! Hello WordPress<\/a>!<\/p>$/',
+ ),
+ 'button element styles apply class to wrapper' => array(
+ 'color_settings' => array( 'button' => true ),
+ 'elements_styles' => array(
+ 'button' => array( 'color' => $color_styles ),
+ ),
+ 'block_markup' => ' Hello WordPress! Hello WordPress<\/a>!<\/p>$/',
+ ),
+ 'link element styles apply class to wrapper' => array(
+ 'color_settings' => array( 'link' => true ),
+ 'elements_styles' => array(
+ 'link' => array( 'color' => $color_styles ),
+ ),
+ 'block_markup' => ' Hello WordPress! Hello WordPress<\/a>!<\/p>$/',
+ ),
+ 'heading element styles apply class to wrapper' => array(
+ 'color_settings' => array( 'heading' => true ),
+ 'elements_styles' => array(
+ 'heading' => array( 'color' => $color_styles ),
+ ),
+ 'block_markup' => ' Hello WordPress! Hello WordPress<\/a>!<\/p>$/',
+ ),
+ 'element styles apply class to wrapper when it has other classes' => array(
+ 'color_settings' => array( 'link' => true ),
+ 'elements_styles' => array(
+ 'link' => array( 'color' => $color_styles ),
+ ),
+ 'block_markup' => ' Hello WordPress! Hello WordPress<\/a>!<\/p>$/',
+ ),
+ 'element styles apply class to wrapper when it has other attributes' => array(
+ 'color_settings' => array( 'link' => true ),
+ 'elements_styles' => array(
+ 'link' => array( 'color' => $color_styles ),
+ ),
+ 'block_markup' => ' Hello WordPress!