<?php

require_once( 'CodeCheckTestBase.php' );

class DeprecatedFunctionsTest extends CodeCheckTestBase {

	public function testFunctionsParameters() {
		$functions = array(
			'wp-includes' => array(
				'0.71' => array(
					'the_category_ID'   => 'get_the_category()',
					'the_category_head' => 'get_the_category_by_ID()',
				),
				'1.2' => array(
					'permalink_link' => 'the_permalink()',
				),
				'1.5' => array(
					'start_wp' => '',
				),
				'1.5.1' => array(
					'get_postdata' => 'get_post()',
				),
				'2.0' => array(
					'create_user'                   => 'wp_create_user()',
					'next_post'                     => 'next_post_link()',
					'previous_post'                 => 'previous_post_link()',
					'user_can_create_draft'         => 'current_user_can()',
					'user_can_create_post'          => 'current_user_can()',
					'user_can_delete_post'          => 'current_user_can()',
					'user_can_delete_post_comments' => 'current_user_can()',
					'user_can_edit_post'            => 'current_user_can()',
					'user_can_edit_post_comments'   => 'current_user_can()',
					'user_can_edit_post_date'       => 'current_user_can()',
					'user_can_edit_user'            => 'current_user_can()',
					'user_can_set_post_date'        => 'current_user_can()',
				),
				'2.1' => array(
					'dropdown_cats'              => 'wp_dropdown_categories()',
					'get_archives'               => 'wp_get_archives()',
					'get_author_link'            => 'get_author_posts_url()',
					'get_autotoggle'             => '',
					'get_link'                   => 'get_bookmark()',
					'get_linkcatname'            => 'get_category()',
					'get_linkrating'             => 'sanitize_bookmark_field()',
					'get_links'                  => 'get_bookmarks()',
					'get_links_list'             => 'wp_list_bookmarks()',
					'get_links_withrating'       => 'get_bookmarks()',
					'get_linksbyname'            => 'get_bookmarks()',
					'get_linkobjects'            => 'get_bookmarks()',
					'get_linkobjectsbyname'      => 'get_bookmarks()',
					'get_linksbyname_withrating' => 'get_bookmarks()',
					'get_settings'               => 'get_option()',
					'link_pages'                 => 'wp_link_pages()',
					'links_popup_script'         => '',
					'list_authors'               => 'wp_list_authors()',
					'list_cats'                  => 'wp_list_categories()',
					'wp_get_links'               => 'wp_list_bookmarks()',
					'wp_get_linksbyname'         => 'wp_list_bookmarks()',
					'wp_get_post_cats'           => 'wp_get_post_categories()',
					'wp_list_cats'               => 'wp_list_categories()',
					'wp_set_post_cats'           => 'wp_set_post_categories()',
				),
				'2.2' => array(
					'comments_rss' => 'get_post_comments_feed_link()',
				),
				'2.3' => array(
					'permalink_single_rss' => 'the_permalink_rss()',
				),
				'2.5' => array(
					'comments_rss_link'        => 'post_comments_feed_link()',
					'get_attachment_icon'      => 'wp_get_attachment_image()',
					'get_attachment_icon_src'  => 'wp_get_attachment_image_src()',
					'get_attachment_innerHTML' => 'wp_get_attachment_image()',
					'get_author_rss_link'      => 'get_author_feed_link()',
					'get_category_rss_link'    => 'get_category_feed_link()',
					'get_the_attachment_link'  => 'wp_get_attachment_link()',
					'gzip_compression'         => '',
					'wp_clearcookie'           => 'wp_clear_auth_cookie()',
					'wp_get_cookie_login'      => '',
					'wp_login'                 => 'wp_signon()',
					'wp_setcookie'             => 'wp_set_auth_cookie()',
				),
				'2.7' => array(
					'get_commentdata' => 'get_comment()',
				),
				'2.8' => array(
					'__ngettext'                 => '_n()',
					'__ngettext_noop'            => '_n_noop()',
					'attribute_escape'           => 'esc_attr()',
					'get_author_name'            => "get_the_author_meta( 'display_name' )",
					'get_category_children'      => 'get_term_children()',
					'get_catname'                => 'get_cat_name()',
					'get_the_author_aim'         => "get_the_author_meta( 'aim' )",
					'get_the_author_description' => "get_the_author_meta( 'description' )",
					'get_the_author_email'       => "get_the_author_meta( 'email' )",
					'get_the_author_firstname'   => "get_the_author_meta( 'first_name' )",
					'get_the_author_icq'         => "get_the_author_meta( 'icq' )",
					'get_the_author_ID'          => "get_the_author_meta( 'ID' )",
					'get_the_author_lastname'    => "get_the_author_meta( 'last_name' )",
					'get_the_author_login'       => "get_the_author_meta( 'login' )",
					'get_the_author_msn'         => "get_the_author_meta( 'msn' )",
					'get_the_author_nickname'    => "get_the_author_meta( 'nickname' )",
					'get_the_author_url'         => "get_the_author_meta( 'url' )",
					'get_the_author_yim'         => "get_the_author_meta( 'yim' )",
					'js_escape'                  => 'esc_js()',
					'register_sidebar_widget'    => 'wp_register_sidebar_widget()',
					'register_widget_control'    => 'wp_register_widget_control()',
					'sanitize_url'               => 'esc_url_raw()',
					'the_author_aim'             => "the_author_meta( 'aim' )",
					'the_author_description'     => "the_author_meta( 'description' )",
					'the_author_email'           => "the_author_meta( 'email' )",
					'the_author_firstname'       => "the_author_meta( 'first_name' )",
					'the_author_icq'             => "the_author_meta( 'icq' )",
					'the_author_ID'              => "the_author_meta( 'ID' )",
					'the_author_lastname'        => "the_author_meta( 'last_name' )",
					'the_author_login'           => "the_author_meta( 'login' )",
					'the_author_msn'             => "the_author_meta( 'msn' )",
					'the_author_nickname'        => "the_author_meta( 'nickname' )",
					'the_author_url'             => "the_author_meta( 'url' )",
					'the_author_yim'             => "the_author_meta( 'yim' )",
					'unregister_sidebar_widget'  => 'wp_unregister_sidebar_widget()',
					'unregister_widget_control'  => 'wp_unregister_widget_control()',
					'wp_specialchars'            => 'esc_html()',
				),
				'2.9' => array(
					'_c'                => '_x()',
					'make_url_footnote' => '',
					'the_content_rss'   => 'the_content_feed()',
				),
				'3.0' => array(
					'_nc'                       => '_nx()',
					'automatic_feed_links'      => "add_theme_support( 'automatic-feed-links' )",
					'clean_url'                 => 'esc_url_raw()',
					'clear_global_post_cache'   => 'clean_post_cache()',
					'delete_usermeta'           => 'delete_user_meta()',
					'funky_javascript_callback' => '',
					'funky_javascript_fix'      => '',
					'generate_random_password'  => 'wp_generate_password()',
					'get_alloptions'            => 'wp_load_alloptions()',
					'get_blog_list'             => 'wp_get_sites()',
					'get_most_active_blogs'     => '',
					'get_profile'               => 'get_the_author_meta()',
					'get_user_details'          => 'get_user_by()',
					'get_usermeta'              => 'get_user_meta()',
					'get_usernumposts'          => 'count_user_posts()',
					'graceful_fail'             => 'wp_die()',
					'is_main_blog'              => 'is_main_site()',
					'is_site_admin'             => 'is_super_admin()',
					'is_taxonomy'               => 'taxonomy_exists()',
					'is_term'                   => 'term_exists()',
					'set_current_user'          => 'wp_set_current_user()',
					'translate_with_context'    => '_x()',
					'update_usermeta'           => 'update_user_meta()',
					'validate_email'            => 'is_email()',
				),
				'3.1' => array(
					'get_dashboard_blog'    => '',
					'get_users_of_blog'     => 'get_users()',
					'is_plugin_page'        => '',
					'update_category_cache' => '',
				),
				'3.2' => array(
					'wp_timezone_supported' => '',
					'wp_clone'              => '',
				),
				'3.3' => array(
					'get_boundary_post_rel_link'            => '',
					'get_index_rel_link'                    => '',
					'get_parent_post_rel_link'              => '',
					'get_user_by_email'                     => "get_user_by( 'email' )",
					'get_user_metavalues'                   => '',
					'get_userdatabylogin'                   => "get_user_by( 'login' )",
					'index_rel_link'                        => '',
					'is_blog_user'                          => 'is_user_member_of_blog()',
					'parent_post_rel_link'                  => '',
					'sanitize_user_object'                  => '',
					'start_post_rel_link'                   => '',
					'the_editor'                            => 'wp_editor()',
					'wp_admin_bar_dashboard_view_site_menu' => '',
					'wpmu_admin_do_redirect'                => '',
					'wpmu_admin_redirect_add_updated_param' => '',
				),
				'3.4' => array(
					'add_custom_background'      => 'add_theme_support( "custom-background", $args )',
					'add_custom_image_header'    => 'add_theme_support( "custom-header", $args )',
					'clean_page_cache'           => 'clean_post_cache()',
					'clean_pre'                  => '',
					'debug_fclose'               => 'error_log()',
					'debug_fopen'                => 'error_log()',
					'debug_fwrite'               => 'error_log()',
					'get_current_theme'          => 'wp_get_theme()',
					'get_theme'                  => 'wp_get_theme()',
					'get_theme_data'             => 'wp_get_theme()',
					'get_themes'                 => 'wp_get_themes()',
					'remove_custom_background'   => "remove_theme_support( 'custom-background' )",
					'remove_custom_image_header' => "remove_theme_support( 'custom-header' )",
					'update_page_cache'          => 'update_post_cache()',
					'wp_explain_nonce'           => 'wp_nonce_ays',
				),
				'3.5' => array(
					'_get_post_ancestors'   => '',
					'_save_post_hook'       => '',
					'gd_edit_image_support' => 'wp_image_editor_supports()',
					'get_page'              => 'get_post()',
					'image_resize'          => 'wp_get_image_editor()',
					'sticky_class'          => 'post_class()',
					'user_pass_ok'          => 'wp_authenticate()',
					'wp_cache_reset'        => '',
					'wp_get_single_post'    => 'get_post()',
					'wp_load_image'         => 'wp_get_image_editor()',
				),
				'3.6' => array(
					'get_user_id_from_string' => 'get_user_by()',
					'wp_convert_bytes_to_hr'  => 'size_format()',
				),
				'3.7' => array(
					'_search_terms_tidy'        => '',
					'get_blogaddress_by_domain' => '',
				),
				'3.9' => array(
					'rich_edit_exists'         => '',
					'default_topic_count_text' => '',
					'format_to_post'           => '',
					'get_current_site_name'    => 'get_current_site()',
					'wpmu_current_site'        => '',
				),
				'4.0' => array(
					'like_escape'               => '$wpdb->esc_like()',
					'url_is_accessable_via_ssl' => '',
				),
			),
			'wp-admin' => array(
				'MU' => array(
					'install_blog_defaults' => 'wp_install_defaults()',
				),
				'2.1' => array(
					'tinymce_include' => 'wp_editor()',
				),
				'2.5' => array(
					'documentation_link' => '',
				),
				'2.6' => array(
					'dropdown_categories'      => 'wp_category_checklist()',
					'dropdown_link_categories' => 'wp_link_category_checklist()',
				),
				'2.9' => array(
					'get_real_file_to_edit' => '',
				),
				'3.0' => array(
					'activate_sitewide_plugin'     => 'activate_plugin()',
					'add_option_update_handler'    => 'register_setting()',
					'codepress_footer_js'          => '',
					'codepress_get_lang'           => '',
					'deactivate_sitewide_plugin'   => 'deactivate_plugin()',
					'is_wpmu_sitewide_plugin'      => 'is_network_only_plugin()',
					'ms_deprecated_blogs_file'     => '',
					'mu_options'                   => '',
					'remove_option_update_handler' => 'unregister_setting()',
					'use_codepress'                => '',
					'wp_dropdown_cats'             => 'wp_dropdown_categories()',
					'wp_shrink_dimensions'         => 'wp_constrain_dimensions()',
					'wpmu_checkAvailableSpace'     => 'is_upload_space_available()',
					'wpmu_get_blog_allowedthemes'  => 'WP_Theme::get_allowed_on_site()',
					'wpmu_menu'                    => '',
				),
				'3.1' => array(
					'get_author_user_ids'          => 'get_users()',
					'get_editable_authors'         => 'get_users()',
					'get_editable_user_ids'        => 'get_users()',
					'get_nonauthor_user_ids'       => 'get_users()',
					'get_others_drafts'            => '',
					'get_others_unpublished_posts' => '',
					'get_others_pending'           => '',
					'install_themes_feature_list'  => 'get_theme_feature_list()',
				),
				'3.2' => array(
					'favorite_actions'                => 'WP_Admin_Bar',
					'wp_dashboard_quick_press_output' => 'wp_dashboard_quick_press()',
				),
				'3.3' => array(
					'add_contextual_help' => 'get_current_screen()->add_help_tab()',
					'media_upload_audio'  => 'wp_media_upload_handler()',
					'media_upload_file'   => 'wp_media_upload_handler()',
					'media_upload_image'  => 'wp_media_upload_handler()',
					'media_upload_video'  => 'wp_media_upload_handler()',
					'screen_layout'       => 'get_current_screen()->render_per_page_options()',
					'screen_meta'         => 'get_current_screen()->render_screen_meta()',
					'screen_options'      => 'get_current_screen()->render_per_page_options()',
					'type_url_form_audio' => "wp_media_insert_url_form( 'audio' )",
					'type_url_form_file'  => "wp_media_insert_url_form( 'file' )",
					'type_url_form_image' => "wp_media_insert_url_form( 'image' )",
					'type_url_form_video' => "wp_media_insert_url_form( 'video' )",
					'wp_preload_dialogs'  => 'wp_editor()',
					'wp_print_editor_js'  => 'wp_editor()',
					'wp_quicktags'        => 'wp_editor()',
					'wp_tiny_mce'         => 'wp_editor()',
				),
				'3.4' => array(
					'current_theme_info'      => 'wp_get_theme()',
					'get_allowed_themes'      => "wp_get_themes( array( 'allowed' => true ) )",
					'get_broken_themes'       => "wp_get_themes( array( 'errors' => true )",
					'get_site_allowed_themes' => 'WP_Theme::get_allowed_on_network()',
					'display_theme'           => '',
				),
				'3.5' => array(
					'_insert_into_post_button' => '',
					'_media_button'            => '',
					'get_default_page_to_edit' => "get_default_post_to_edit( 'page' )",
					'get_post_to_edit'         => 'get_post()',
					'get_udims'                => 'wp_constrain_dimensions()',
					'wp_create_thumbnail'      => 'image_resize()',
				),
				'3.6' => array(
					'wp_nav_menu_locations_meta_box' => '',
				),
				'3.7' => array(
					'the_attachment_links' => '',
					'wp_update_core'       => 'new Core_Upgrader()',
					'wp_update_plugin'     => 'new Plugin_Upgrader()',
					'wp_update_theme'      => 'new Theme_Upgrader()',
				),
				'3.8' => array(
					'get_screen_icon'                      => '',
					'screen_icon'                          => '',
					'wp_dashboard_incoming_links'          => '',
					'wp_dashboard_incoming_links_control'  => '',
					'wp_dashboard_incoming_links_output'   => '',
					'wp_dashboard_plugins'                 => '',
					'wp_dashboard_primary_control'         => '',
					'wp_dashboard_recent_comments_control' => '',
					'wp_dashboard_secondary'               => '',
					'wp_dashboard_secondary_control'       => '',
					'wp_dashboard_secondary_output'        => '',
				),
				'3.9' => array(
					'_relocate_children' => '',
				),
			),
			'' => array( // Root folder
				'3.4' => array(
					'logIO' => 'error_log()',
				),
			),
		);

		$description_template = 'The function %s is deprecated.';
		$replacement_template = ' Use %s instead.';

		$line = 4;
		$expected_errors = array();
		foreach( $functions as $directory => $versions ) {
			/*
			 * In DeprecatedFunctionsTest.inc, there's a 3 line comment header
			 * mentioning the directory the functions are found in
			 */
			$line += 3;
			foreach( $versions as $version => $group ) {
				// There's a header line comment mentioning the version in DeprecatedFunctionsTest.inc
				++$line;
				foreach ( $group as $function => $replacement ) {
					$message = sprintf( $description_template, '<code>' . $function . '</code>' );
					if ( ! empty( $replacement ) ) {
						$message .= sprintf( $replacement_template, '<code>' . $replacement . '</code>' );;
					}

					$expected_errors[] = array(
						'slug' => 'deprecated',
						'level' => BaseScanner::LEVEL_BLOCKER,
						'description' => $message,
						'file' => 'DeprecatedFunctionsTest.inc',
						'lines' => ++$line,
					);
				}
			}
		}

		$actual_errors = $this->checkFile( 'DeprecatedFunctionsTest.inc' );
		$this->assertEqualErrors( $expected_errors, $actual_errors );
	}
}
