hasConstant( 'TAX_FAMILY' ), 'TAX_FAMILY constant removed' ); /* ── CPT guard: post_type_exists === true => no-op ──────────────────── */ echo "\nCPT registration guard:\n"; pr_core_test_reset(); $GLOBALS['pr_core_test_state']['existing_post_types'] = [ 'peptide' ]; PR_Core_Peptide_CPT::register_peptide_post_type(); pr_assert( empty( $GLOBALS['pr_core_test_state']['registered_post_types'] ), 'register_peptide_post_type() no-ops when post_type_exists("peptide") is true' ); /* ── CPT registration payload ───────────────────────────────────────── */ echo "\nCPT registration payload:\n"; pr_core_test_reset(); PR_Core_Peptide_CPT::register_peptide_post_type(); pr_assert( isset( $GLOBALS['pr_core_test_state']['registered_post_types']['peptide'] ), 'register_post_type was called with slug "peptide"' ); $args = $GLOBALS['pr_core_test_state']['registered_post_types']['peptide'] ?? []; pr_assert_equals( true, $args['public'] ?? null, 'public = true' ); pr_assert_equals( true, $args['publicly_queryable'] ?? null, 'publicly_queryable = true' ); pr_assert_equals( true, $args['show_in_rest'] ?? null, 'show_in_rest = true' ); pr_assert_equals( 'peptides', $args['rest_base'] ?? null, 'rest_base = "peptides"' ); pr_assert( ! array_key_exists( 'rest_namespace', $args ), 'rest_namespace absent — defaults to wp/v2 (Gutenberg requirement)' ); pr_assert_equals( 'post', $args['capability_type'] ?? null, 'capability_type = "post"' ); pr_assert_equals( true, $args['map_meta_cap'] ?? null, 'map_meta_cap = true' ); pr_assert_equals( false, $args['hierarchical'] ?? null, 'hierarchical = false' ); pr_assert_equals( true, $args['has_archive'] ?? null, 'has_archive = true' ); pr_assert_equals( 'peptides', $args['rewrite']['slug'] ?? null, 'rewrite slug = "peptides"' ); pr_assert_equals( false, $args['rewrite']['with_front'] ?? null, 'rewrite with_front = false' ); $supports = $args['supports'] ?? []; foreach ( [ 'title', 'editor', 'thumbnail', 'excerpt', 'revisions', 'custom-fields' ] as $feature ) { pr_assert( in_array( $feature, $supports, true ), "supports includes \"{$feature}\"" ); } /* ── Taxonomy guard: taxonomy_exists === true => no-op ──────────────── */ echo "\nTaxonomy registration guard:\n"; pr_core_test_reset(); $GLOBALS['pr_core_test_state']['existing_taxonomies'] = [ 'peptide_category' ]; PR_Core_Peptide_CPT::register_taxonomies(); pr_assert( empty( $GLOBALS['pr_core_test_state']['registered_taxonomies'] ), 'register_taxonomies() no-ops when taxonomy_exists("peptide_category") is true' ); /* ── Taxonomy registration payload ──────────────────────────────────── */ echo "\nTaxonomy registration payload:\n"; pr_core_test_reset(); PR_Core_Peptide_CPT::register_taxonomies(); pr_assert( isset( $GLOBALS['pr_core_test_state']['registered_taxonomies']['peptide_category'] ), 'peptide_category taxonomy registered' ); pr_assert( ! isset( $GLOBALS['pr_core_test_state']['registered_taxonomies']['pr_peptide_family'] ), 'pr_peptide_family taxonomy NOT registered (removed in v0.2.0)' ); pr_assert( ! isset( $GLOBALS['pr_core_test_state']['registered_taxonomies']['peptide_family'] ), 'peptide_family taxonomy NOT registered either (the rename-only path would have left this lingering)' ); $tax = $GLOBALS['pr_core_test_state']['registered_taxonomies']['peptide_category'] ?? []; pr_assert_equals( 'peptide', $tax['object_type'] ?? null, 'peptide_category attached to peptide CPT' ); pr_assert_equals( true, $tax['args']['hierarchical'] ?? null, 'peptide_category hierarchical = true' ); pr_assert_equals( true, $tax['args']['show_in_rest'] ?? null, 'peptide_category show_in_rest = true' ); pr_assert_equals( 'peptide-category', $tax['args']['rewrite']['slug'] ?? null, 'peptide_category rewrite slug = "peptide-category"' ); /* ── Hook registration ──────────────────────────────────────────────── */ echo "\nHook registration:\n"; pr_core_test_reset(); $cpt = new PR_Core_Peptide_CPT(); $cpt->register_hooks(); $hooks = array_column( $GLOBALS['pr_core_test_state']['added_actions'], 'hook' ); pr_assert( in_array( 'init', $hooks, true ), 'register_hooks() adds action on "init"' ); /* ── Summary ────────────────────────────────────────────────────────── */ exit( pr_test_summary() );