theme_root = DIR_TESTDATA . '/themedir1'; $this->orig_theme_dir = $GLOBALS['wp_theme_directories']; // /themes is necessary as theme.php functions assume /themes is the root if there is only one root. $GLOBALS['wp_theme_directories'] = array( WP_CONTENT_DIR . '/themes', $this->theme_root ); add_filter( 'theme_root', array( $this, 'filter_theme_root' ) ); add_filter( 'stylesheet_root', array( $this, 'filter_theme_root' ) ); add_filter( 'template_root', array( $this, 'filter_theme_root' ) ); // Clear caches. wp_clean_themes_cache(); unset( $GLOBALS['wp_themes'] ); } public function tear_down() { $GLOBALS['wp_theme_directories'] = $this->orig_theme_dir; wp_clean_themes_cache(); unset( $GLOBALS['wp_themes'] ); parent::tear_down(); } // Replace the normal theme root directory with our premade test directory. public function filter_theme_root( $dir ) { return $this->theme_root; } /** * @expectedDeprecated get_theme * @expectedDeprecated get_themes */ public function test_theme_default() { $themes = get_themes(); $theme = get_theme( 'WordPress Default' ); $this->assertSame( $themes['WordPress Default'], $theme ); $this->assertNotEmpty( $theme ); // echo gen_tests_array( 'theme', $theme ); $this->assertSame( 'WordPress Default', $theme['Name'] ); $this->assertSame( 'WordPress Default', $theme['Title'] ); $this->assertSame( 'The default WordPress theme based on the famous Kubrick.', $theme['Description'] ); $this->assertSame( 'Michael Heilemann', $theme['Author'] ); $this->assertSame( '1.6', $theme['Version'] ); $this->assertSame( 'default', $theme['Template'] ); $this->assertSame( 'default', $theme['Stylesheet'] ); $this->assertContains( $this->theme_root . '/default/functions.php', $theme['Template Files'] ); $this->assertContains( $this->theme_root . '/default/index.php', $theme['Template Files'] ); $this->assertContains( $this->theme_root . '/default/style.css', $theme['Stylesheet Files'] ); $this->assertSame( $this->theme_root . '/default', $theme['Template Dir'] ); $this->assertSame( $this->theme_root . '/default', $theme['Stylesheet Dir'] ); $this->assertSame( 'publish', $theme['Status'] ); $this->assertSame( '', $theme['Parent Theme'] ); } /** * @expectedDeprecated get_theme * @expectedDeprecated get_themes */ public function test_theme_sandbox() { $theme = get_theme( 'Sandbox' ); $this->assertNotEmpty( $theme ); // echo gen_tests_array( 'theme', $theme ); $this->assertSame( 'Sandbox', $theme['Name'] ); $this->assertSame( 'Sandbox', $theme['Title'] ); $this->assertSame( 'A theme with powerful, semantic CSS selectors and the ability to add new skins.', $theme['Description'] ); $this->assertSame( 'Andy Skelton & Scott Allan Wallick', $theme['Author'] ); $this->assertSame( '0.6.1-wpcom', $theme['Version'] ); $this->assertSame( 'sandbox', $theme['Template'] ); $this->assertSame( 'sandbox', $theme['Stylesheet'] ); $template_files = $theme['Template Files']; $this->assertSame( $this->theme_root . '/sandbox/functions.php', reset( $template_files ) ); $this->assertSame( $this->theme_root . '/sandbox/index.php', next( $template_files ) ); $stylesheet_files = $theme['Stylesheet Files']; $this->assertSame( $this->theme_root . '/sandbox/style.css', reset( $stylesheet_files ) ); $this->assertSame( $this->theme_root . '/sandbox', $theme['Template Dir'] ); $this->assertSame( $this->theme_root . '/sandbox', $theme['Stylesheet Dir'] ); $this->assertSame( 'publish', $theme['Status'] ); $this->assertSame( '', $theme['Parent Theme'] ); } /** * A CSS-only theme * * @expectedDeprecated get_themes */ public function test_theme_stylesheet_only() { $themes = get_themes(); $theme = $themes['Stylesheet Only']; $this->assertNotEmpty( $theme ); // echo gen_tests_array( 'theme', $theme ); $this->assertSame( 'Stylesheet Only', $theme['Name'] ); $this->assertSame( 'Stylesheet Only', $theme['Title'] ); $this->assertSame( 'A three-column widget-ready theme in dark blue.', $theme['Description'] ); $this->assertSame( 'Henry Crun', $theme['Author'] ); $this->assertSame( '1.0', $theme['Version'] ); $this->assertSame( 'sandbox', $theme['Template'] ); $this->assertSame( 'stylesheetonly', $theme['Stylesheet'] ); $this->assertContains( $this->theme_root . '/sandbox/functions.php', $theme['Template Files'] ); $this->assertContains( $this->theme_root . '/sandbox/index.php', $theme['Template Files'] ); $this->assertContains( $this->theme_root . '/stylesheetonly/style.css', $theme['Stylesheet Files'] ); $this->assertSame( $this->theme_root . '/sandbox', $theme['Template Dir'] ); $this->assertSame( $this->theme_root . '/stylesheetonly', $theme['Stylesheet Dir'] ); $this->assertSame( 'publish', $theme['Status'] ); $this->assertSame( 'Sandbox', $theme['Parent Theme'] ); } /** * @expectedDeprecated get_themes */ public function test_theme_list() { $themes = get_themes(); // Ignore themes in the default /themes directory. foreach ( $themes as $theme_name => $theme ) { if ( $theme->get_theme_root() !== $this->theme_root ) { unset( $themes[ $theme_name ] ); } } $theme_names = array_keys( $themes ); $expected = array( 'WordPress Default', 'Sandbox', 'Stylesheet Only', 'My Theme', 'My Theme/theme1', // Duplicate theme should be given a unique name. 'My Subdir Theme', // Theme in a subdirectory should work. 'Page Template Child Theme', // Theme which inherits page templates. 'Page Template Theme', // Theme with page templates for other test code. 'Theme with Spaces in the Directory', 'Internationalized Theme', 'camelCase', 'REST Theme', 'Block Theme', 'Block Theme Child Theme', 'Block Theme [0.4.0]', 'Block Theme [1.0.0] in subdirectory', ); sort( $theme_names ); sort( $expected ); $this->assertSame( $expected, $theme_names ); } /** * @expectedDeprecated get_themes * @expectedDeprecated get_broken_themes */ public function test_broken_themes() { $themes = get_themes(); $expected = array( 'broken-theme' => array( 'Name' => 'broken-theme', 'Title' => 'broken-theme', 'Description' => __( 'Stylesheet is missing.' ), ), 'Child and Parent Theme' => array( 'Name' => 'Child and Parent Theme', 'Title' => 'Child and Parent Theme', 'Description' => sprintf( __( 'The theme defines itself as its parent theme. Please check the %s header.' ), 'Template' ), ), ); $this->assertSame( $expected, get_broken_themes() ); } public function test_wp_get_theme_with_non_default_theme_root() { $this->assertFalse( wp_get_theme( 'sandbox', $this->theme_root )->errors() ); $this->assertFalse( wp_get_theme( 'sandbox' )->errors() ); } /** * @expectedDeprecated get_themes */ public function test_page_templates() { $themes = get_themes(); $theme = $themes['Page Template Theme']; $this->assertNotEmpty( $theme ); $templates = $theme['Template Files']; $this->assertContains( $this->theme_root . '/page-templates/template-top-level.php', $templates ); } /** * @expectedDeprecated get_theme_data */ public function test_get_theme_data_top_level() { $theme_data = get_theme_data( DIR_TESTDATA . '/themedir1/theme1/style.css' ); $this->assertSame( 'My Theme', $theme_data['Name'] ); $this->assertSame( 'http://example.org/', $theme_data['URI'] ); $this->assertSame( 'An example theme', $theme_data['Description'] ); $this->assertSame( 'Minnie Bannister', $theme_data['Author'] ); $this->assertSame( 'http://example.com/', $theme_data['AuthorURI'] ); $this->assertSame( '1.3', $theme_data['Version'] ); $this->assertSame( '', $theme_data['Template'] ); $this->assertSame( 'publish', $theme_data['Status'] ); $this->assertSame( array(), $theme_data['Tags'] ); $this->assertSame( 'My Theme', $theme_data['Title'] ); $this->assertSame( 'Minnie Bannister', $theme_data['AuthorName'] ); } /** * @expectedDeprecated get_theme_data */ public function test_get_theme_data_subdir() { $theme_data = get_theme_data( $this->theme_root . '/subdir/theme2/style.css' ); $this->assertSame( 'My Subdir Theme', $theme_data['Name'] ); $this->assertSame( 'http://example.org/', $theme_data['URI'] ); $this->assertSame( 'An example theme in a sub directory', $theme_data['Description'] ); $this->assertSame( 'Mr. WordPress', $theme_data['Author'] ); $this->assertSame( 'http://wordpress.org/', $theme_data['AuthorURI'] ); $this->assertSame( '0.1', $theme_data['Version'] ); $this->assertSame( '', $theme_data['Template'] ); $this->assertSame( 'publish', $theme_data['Status'] ); $this->assertSame( array(), $theme_data['Tags'] ); $this->assertSame( 'My Subdir Theme', $theme_data['Title'] ); $this->assertSame( 'Mr. WordPress', $theme_data['AuthorName'] ); } /** * @ticket 28662 */ public function test_theme_dir_slashes() { $size = count( $GLOBALS['wp_theme_directories'] ); @mkdir( WP_CONTENT_DIR . '/themes/foo' ); @mkdir( WP_CONTENT_DIR . '/themes/foo-themes' ); $this->assertFileExists( WP_CONTENT_DIR . '/themes/foo' ); $this->assertFileExists( WP_CONTENT_DIR . '/themes/foo-themes' ); register_theme_directory( '/' ); $this->assertCount( $size, $GLOBALS['wp_theme_directories'] ); register_theme_directory( 'themes/' ); $this->assertCount( $size, $GLOBALS['wp_theme_directories'] ); register_theme_directory( '/foo/' ); $this->assertCount( $size, $GLOBALS['wp_theme_directories'] ); register_theme_directory( 'foo/' ); $this->assertCount( $size, $GLOBALS['wp_theme_directories'] ); register_theme_directory( 'themes/foo/' ); $this->assertCount( $size + 1, $GLOBALS['wp_theme_directories'] ); register_theme_directory( WP_CONTENT_DIR . '/foo-themes/' ); $this->assertCount( $size + 1, $GLOBALS['wp_theme_directories'] ); foreach ( $GLOBALS['wp_theme_directories'] as $dir ) { $this->assertNotEquals( '/', substr( $dir, -1 ) ); } rmdir( WP_CONTENT_DIR . '/themes/foo' ); rmdir( WP_CONTENT_DIR . '/themes/foo-themes' ); } }