From dbea0c4cbf3674fc059cc30d0f84fe555d65574e Mon Sep 17 00:00:00 2001
From: Lee Rowlands <lee.rowlands@previousnext.com.au>
Date: Tue, 24 Dec 2024 07:03:13 +1000
Subject: [PATCH] Issue #3494130 by oily, nicxvan, nikolay shapovalov: Move
 helpers in field_test.module and delete it

---
 core/.phpstan-baseline.php                    |  24 ----
 .../modules/field_test/field_test.entity.inc  |  26 ----
 .../modules/field_test/field_test.field.inc   |  18 ---
 .../modules/field_test/field_test.module      | 113 ------------------
 .../field_test/src/FieldTestHelper.php        |  97 +++++++++++++++
 .../src/Hook/FieldTestEntityHooks.php         |   3 +-
 .../field_test/src/Hook/FieldTestHooks.php    |  52 +++++++-
 .../src/Plugin/Field/FieldType/TestItem.php   |   3 +-
 .../src/Functional/TranslationWebTest.php     |   3 +-
 .../field/tests/src/Kernel/BulkDeleteTest.php |  19 +--
 .../src/Kernel/FieldAttachStorageTest.php     |   5 +-
 .../tests/src/Kernel/FieldStorageCrudTest.php |   9 +-
 .../tests/src/Kernel/TranslationTest.php      |   7 +-
 .../Core/Entity/EntityQueryTest.php           |   5 +-
 14 files changed, 176 insertions(+), 208 deletions(-)
 delete mode 100644 core/modules/field/tests/modules/field_test/field_test.entity.inc
 delete mode 100644 core/modules/field/tests/modules/field_test/field_test.field.inc
 delete mode 100644 core/modules/field/tests/modules/field_test/field_test.module
 create mode 100644 core/modules/field/tests/modules/field_test/src/FieldTestHelper.php

diff --git a/core/.phpstan-baseline.php b/core/.phpstan-baseline.php
index f9a888c25d27..8430ef4feada 100644
--- a/core/.phpstan-baseline.php
+++ b/core/.phpstan-baseline.php
@@ -17686,30 +17686,6 @@
 	'count' => 1,
 	'path' => __DIR__ . '/modules/field/src/Plugin/migrate/field/Email.php',
 ];
-$ignoreErrors[] = [
-	// identifier: missingType.return
-	'message' => '#^Function field_test_entity_info_translatable\\(\\) has no return type specified\\.$#',
-	'count' => 1,
-	'path' => __DIR__ . '/modules/field/tests/modules/field_test/field_test.entity.inc',
-];
-$ignoreErrors[] = [
-	// identifier: missingType.return
-	'message' => '#^Function field_test_default_value\\(\\) has no return type specified\\.$#',
-	'count' => 1,
-	'path' => __DIR__ . '/modules/field/tests/modules/field_test/field_test.field.inc',
-];
-$ignoreErrors[] = [
-	// identifier: missingType.return
-	'message' => '#^Function _field_test_alter_widget\\(\\) has no return type specified\\.$#',
-	'count' => 1,
-	'path' => __DIR__ . '/modules/field/tests/modules/field_test/field_test.module',
-];
-$ignoreErrors[] = [
-	// identifier: missingType.return
-	'message' => '#^Function field_test_field_storage_config_create\\(\\) has no return type specified\\.$#',
-	'count' => 1,
-	'path' => __DIR__ . '/modules/field/tests/modules/field_test/field_test.module',
-];
 $ignoreErrors[] = [
 	// identifier: missingType.return
 	'message' => '#^Method Drupal\\\\field_test\\\\FieldDefaultValueCallbackProvider\\:\\:calculateDefaultValue\\(\\) has no return type specified\\.$#',
diff --git a/core/modules/field/tests/modules/field_test/field_test.entity.inc b/core/modules/field/tests/modules/field_test/field_test.entity.inc
deleted file mode 100644
index 24e79ea74dac..000000000000
--- a/core/modules/field/tests/modules/field_test/field_test.entity.inc
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-
-/**
- * @file
- * Defines an entity type.
- */
-
-declare(strict_types=1);
-
-/**
- * Helper function to enable entity translations.
- */
-function field_test_entity_info_translatable($entity_type_id = NULL, $translatable = NULL) {
-  static $stored_value = [];
-  if (isset($entity_type_id)) {
-    $entity_definition_update_manager = \Drupal::entityDefinitionUpdateManager();
-    $entity_type = $entity_definition_update_manager->getEntityType($entity_type_id);
-    $stored_value[$entity_type_id] = $translatable;
-    if ($translatable != $entity_type->isTranslatable()) {
-      $entity_definition_update_manager->uninstallEntityType($entity_type);
-      $entity_type->set('translatable', $translatable);
-      $entity_definition_update_manager->installEntityType($entity_type);
-    }
-  }
-  return $stored_value;
-}
diff --git a/core/modules/field/tests/modules/field_test/field_test.field.inc b/core/modules/field/tests/modules/field_test/field_test.field.inc
deleted file mode 100644
index 70099c926972..000000000000
--- a/core/modules/field/tests/modules/field_test/field_test.field.inc
+++ /dev/null
@@ -1,18 +0,0 @@
-<?php
-
-/**
- * @file
- * Defines a field type and its formatters and widgets.
- */
-
-declare(strict_types=1);
-
-use Drupal\Core\Entity\FieldableEntityInterface;
-use Drupal\Core\Field\FieldDefinitionInterface;
-
-/**
- * Sample 'default value' callback.
- */
-function field_test_default_value(FieldableEntityInterface $entity, FieldDefinitionInterface $definition) {
-  return [['value' => 99]];
-}
diff --git a/core/modules/field/tests/modules/field_test/field_test.module b/core/modules/field/tests/modules/field_test/field_test.module
deleted file mode 100644
index 449cc5033a39..000000000000
--- a/core/modules/field/tests/modules/field_test/field_test.module
+++ /dev/null
@@ -1,113 +0,0 @@
-<?php
-
-/**
- * @file
- * Helper module for the Field API tests.
- *
- * The module defines
- * - a field type and its formatters and widgets (field_test.field.inc)
- * - a field storage backend (field_test.storage.inc)
- *
- * The main field_test.module file implements generic hooks and provides some
- * test helper functions
- */
-
-declare(strict_types=1);
-
-use Drupal\Core\Form\FormStateInterface;
-use Drupal\Core\Render\Element;
-use Drupal\field\FieldStorageConfigInterface;
-
-require_once __DIR__ . '/field_test.entity.inc';
-require_once __DIR__ . '/field_test.field.inc';
-
-/**
- * Store and retrieve keyed data for later verification by unit tests.
- *
- * This function is a simple in-memory key-value store with the
- * distinction that it stores all values for a given key instead of
- * just the most recently set value. field_test module hooks call
- * this function to record their arguments, keyed by hook name. The
- * unit tests later call this function to verify that the correct
- * hooks were called and were passed the correct arguments.
- *
- * This function ignores all calls until the first time it is called
- * with $key of NULL. Each time it is called with $key of NULL, it
- * erases all previously stored data from its internal cache, but also
- * returns the previously stored data to the caller. A typical usage
- * scenario is:
- *
- * @code
- *   // calls to field_test_memorize() here are ignored
- *
- *   // turn on memorization
- *   field_test_memorize();
- *
- *   // call some Field API functions that invoke field_test hooks
- *   FieldStorageConfig::create($field_definition)->save();
- *
- *   // retrieve and reset the memorized hook call data
- *   $mem = field_test_memorize();
- *
- *   // make sure hook_field_storage_config_create() is invoked correctly
- *   assertEquals(1, count($mem['field_test_field_storage_config_create']));
- *   assertEquals([$field], $mem['field_test_field_storage_config_create'][0]);
- * @endcode
- *
- * @param $key
- *   The key under which to store to $value, or NULL as described above.
- * @param $value
- *   A value to store for $key.
- *
- * @return array|null
- *   An array mapping each $key to an array of each $value passed in
- *   for that key.
- */
-function field_test_memorize($key = NULL, $value = NULL) {
-  static $memorize;
-
-  if (!isset($key)) {
-    $return = $memorize;
-    $memorize = [];
-    return $return;
-  }
-  if (is_array($memorize)) {
-    $memorize[$key][] = $value;
-  }
-}
-
-/**
- * Memorize calls to field_test_field_storage_config_create().
- */
-function field_test_field_storage_config_create(FieldStorageConfigInterface $field_storage) {
-  $args = func_get_args();
-  field_test_memorize(__FUNCTION__, $args);
-}
-
-/**
- * Sets up alterations for widget alter tests.
- *
- * @see \Drupal\field\Tests\FormTest::widgetAlterTest()
- */
-function _field_test_alter_widget($hook, array &$field_widget_complete_form, FormStateInterface $form_state, array $context) {
-  $elements = &$field_widget_complete_form['widget'];
-  // Set a message if this is for the form displayed to set default value for
-  // the field.
-  if ($context['default']) {
-    \Drupal::messenger()->addStatus("From $hook(): Default form is true.");
-  }
-  $alter_info = \Drupal::state()->get("field_test.widget_alter_test");
-  $name = $context['items']->getFieldDefinition()->getName();
-  if (!empty($alter_info) && $hook === $alter_info['hook'] && $name === $alter_info['field_name']) {
-    $elements['#prefix'] = "From $hook(): prefix on $name parent element.";
-    foreach (Element::children($elements) as $delta => $element) {
-      $elements[$delta]['#suffix'] = "From $hook(): suffix on $name child element.";
-    }
-  }
-}
-
-function field_test_entity_reference_selection_alter(array &$definitions): void {
-  if (\Drupal::state()->get('field_test_disable_broken_entity_reference_handler')) {
-    unset($definitions['broken']);
-  }
-}
diff --git a/core/modules/field/tests/modules/field_test/src/FieldTestHelper.php b/core/modules/field/tests/modules/field_test/src/FieldTestHelper.php
new file mode 100644
index 000000000000..0caaf9962469
--- /dev/null
+++ b/core/modules/field/tests/modules/field_test/src/FieldTestHelper.php
@@ -0,0 +1,97 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\field_test;
+
+use Drupal\Core\Entity\FieldableEntityInterface;
+use Drupal\Core\Field\FieldDefinitionInterface;
+
+/**
+ * Helper class for testing fields.
+ */
+class FieldTestHelper {
+
+  /**
+   * Helper function to enable entity translations.
+   */
+  public static function entityInfoTranslatable($entity_type_id = NULL, $translatable = NULL): array {
+    static $stored_value = [];
+    if (isset($entity_type_id)) {
+      $entity_definition_update_manager = \Drupal::entityDefinitionUpdateManager();
+      $entity_type = $entity_definition_update_manager->getEntityType($entity_type_id);
+      $stored_value[$entity_type_id] = $translatable;
+      if ($translatable != $entity_type->isTranslatable()) {
+        $entity_definition_update_manager->uninstallEntityType($entity_type);
+        $entity_type->set('translatable', $translatable);
+        $entity_definition_update_manager->installEntityType($entity_type);
+      }
+    }
+    return $stored_value;
+  }
+
+  /**
+   * Sample 'default value' callback.
+   */
+  public static function defaultValue(FieldableEntityInterface $entity, FieldDefinitionInterface $definition): array {
+    return [['value' => 99]];
+  }
+
+  /**
+   * Store and retrieve keyed data for later verification by unit tests.
+   *
+   * This function is a simple in-memory key-value store with the
+   * distinction that it stores all values for a given key instead of
+   * just the most recently set value. field_test module hooks call
+   * this function to record their arguments, keyed by hook name. The
+   * unit tests later call this function to verify that the correct
+   * hooks were called and were passed the correct arguments.
+   *
+   * This function ignores all calls until the first time it is called
+   * with $key of NULL. Each time it is called with $key of NULL, it
+   * erases all previously stored data from its internal cache, but also
+   * returns the previously stored data to the caller. A typical usage
+   * scenario is:
+   *
+   * @code
+   *   // calls to FieldTestHelper::memorize() here are ignored
+   *
+   *   // turn on memorization
+   *   FieldTestHelper::memorize();
+   *
+   *   // call some Field API functions that invoke field_test hooks
+   *   FieldStorageConfig::create($field_definition)->save();
+   *
+   *   // retrieve and reset the memorized hook call data
+   *   $mem = FieldTestHelper::memorize();
+   *
+   *   // make sure hook_field_storage_config_create() is invoked correctly
+   *   assertEquals(1, count($mem['fieldStorageConfigCreate']));
+   *   assertEquals([$field], $mem['fieldStorageConfigCreate'][0]);
+   * @endcode
+   *
+   * @param $key
+   *   The key under which to store to $value, or NULL as described above.
+   * @param $value
+   *   A value to store for $key.
+   *
+   * @return array|null
+   *   An array mapping each $key to an array of each $value passed in
+   *   for that key.
+   */
+  public static function memorize($key = NULL, $value = NULL): array|null {
+    static $memorize;
+
+    if (!isset($key)) {
+      $return = $memorize;
+      $memorize = [];
+      return $return;
+    }
+    if (is_array($memorize)) {
+      $memorize[$key][] = $value;
+    }
+
+    return NULL;
+  }
+
+}
diff --git a/core/modules/field/tests/modules/field_test/src/Hook/FieldTestEntityHooks.php b/core/modules/field/tests/modules/field_test/src/Hook/FieldTestEntityHooks.php
index 1f0bb302500f..4b06d8ffbbfd 100644
--- a/core/modules/field/tests/modules/field_test/src/Hook/FieldTestEntityHooks.php
+++ b/core/modules/field/tests/modules/field_test/src/Hook/FieldTestEntityHooks.php
@@ -5,6 +5,7 @@
 namespace Drupal\field_test\Hook;
 
 use Drupal\Core\Hook\Attribute\Hook;
+use Drupal\field_test\FieldTestHelper;
 
 /**
  * Hook implementations for field_test.
@@ -17,7 +18,7 @@ class FieldTestEntityHooks {
   #[Hook('entity_type_alter')]
   public function entityTypeAlter(array &$entity_types) : void {
     /** @var \Drupal\Core\Entity\EntityTypeInterface[] $entity_types */
-    foreach (field_test_entity_info_translatable() as $entity_type => $translatable) {
+    foreach (FieldTestHelper::entityInfoTranslatable() as $entity_type => $translatable) {
       $entity_types[$entity_type]->set('translatable', $translatable);
     }
   }
diff --git a/core/modules/field/tests/modules/field_test/src/Hook/FieldTestHooks.php b/core/modules/field/tests/modules/field_test/src/Hook/FieldTestHooks.php
index d5e307fb34a9..6b5d84b8b7d7 100644
--- a/core/modules/field/tests/modules/field_test/src/Hook/FieldTestHooks.php
+++ b/core/modules/field/tests/modules/field_test/src/Hook/FieldTestHooks.php
@@ -9,6 +9,9 @@
 use Drupal\Core\Entity\EntityTypeInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Hook\Attribute\Hook;
+use Drupal\Core\Render\Element;
+use Drupal\field_test\FieldTestHelper;
+use Drupal\field\FieldStorageConfigInterface;
 
 /**
  * Hook implementations for field_test.
@@ -46,7 +49,7 @@ public function fieldWidgetSingleElementFormAlter(&$element, FormStateInterface
    */
   #[Hook('field_widget_complete_form_alter')]
   public function fieldWidgetCompleteFormAlter(array &$field_widget_complete_form, FormStateInterface $form_state, array $context): void {
-    _field_test_alter_widget("hook_field_widget_complete_form_alter", $field_widget_complete_form, $form_state, $context);
+    $this->alterWidget("hook_field_widget_complete_form_alter", $field_widget_complete_form, $form_state, $context);
   }
 
   /**
@@ -54,7 +57,7 @@ public function fieldWidgetCompleteFormAlter(array &$field_widget_complete_form,
    */
   #[Hook('field_widget_complete_test_field_widget_multiple_form_alter')]
   public function fieldWidgetCompleteTestFieldWidgetMultipleFormAlter(array &$field_widget_complete_form, FormStateInterface $form_state, array $context): void {
-    _field_test_alter_widget("hook_field_widget_complete_WIDGET_TYPE_form_alter", $field_widget_complete_form, $form_state, $context);
+    $this->alterWidget("hook_field_widget_complete_WIDGET_TYPE_form_alter", $field_widget_complete_form, $form_state, $context);
   }
 
   /**
@@ -62,7 +65,7 @@ public function fieldWidgetCompleteTestFieldWidgetMultipleFormAlter(array &$fiel
    */
   #[Hook('field_widget_complete_test_field_widget_multiple_single_value_form_alter')]
   public function fieldWidgetCompleteTestFieldWidgetMultipleSingleValueFormAlter(array &$field_widget_complete_form, FormStateInterface $form_state, array $context): void {
-    _field_test_alter_widget("hook_field_widget_complete_WIDGET_TYPE_form_alter", $field_widget_complete_form, $form_state, $context);
+    $this->alterWidget("hook_field_widget_complete_WIDGET_TYPE_form_alter", $field_widget_complete_form, $form_state, $context);
   }
 
   /**
@@ -84,7 +87,7 @@ public function queryEfqTablePrefixingTestAlter(&$query): void {
    */
   #[Hook('query_efq_metadata_test_alter')]
   public function queryEfqMetadataTestAlter(&$query): void {
-    field_test_memorize('field_test_query_efq_metadata_test_alter', $query->getMetadata('foo'));
+    FieldTestHelper::memorize('field_test_query_efq_metadata_test_alter', $query->getMetadata('foo'));
   }
 
   /**
@@ -186,4 +189,45 @@ public function entityQueryTagEntityTestMulrevEntityQueryEntityTestMulrevAlterTa
     $query->condition('id', '15', '<>');
   }
 
+  /**
+   * Implements hook_field_storage_config_create().
+   */
+  #[Hook('field_storage_config_create')]
+  public function fieldStorageConfigCreate(FieldStorageConfigInterface $field_storage): void {
+    $args = func_get_args();
+    FieldTestHelper::memorize(__METHOD__, $args);
+  }
+
+  /**
+   * Implements hook_entity_reference_selection_alter().
+   */
+  #[Hook('entity_reference_selection_alter')]
+  public function entityReferenceSelectionAlter(array &$definitions): void {
+    if (\Drupal::state()->get('field_test_disable_broken_entity_reference_handler')) {
+      unset($definitions['broken']);
+    }
+  }
+
+  /**
+   * Sets up alterations for widget alter tests.
+   *
+   * @see \Drupal\field\Tests\FormTest::widgetAlterTest()
+   */
+  public function alterWidget($hook, array &$field_widget_complete_form, FormStateInterface $form_state, array $context): void {
+    $elements = &$field_widget_complete_form['widget'];
+    // Set a message if this is for the form displayed to set default value for
+    // the field.
+    if ($context['default']) {
+      \Drupal::messenger()->addStatus("From $hook(): Default form is true.");
+    }
+    $alter_info = \Drupal::state()->get("field_test.widget_alter_test");
+    $name = $context['items']->getFieldDefinition()->getName();
+    if (!empty($alter_info) && $hook === $alter_info['hook'] && $name === $alter_info['field_name']) {
+      $elements['#prefix'] = "From $hook(): prefix on $name parent element.";
+      foreach (Element::children($elements) as $delta => $element) {
+        $elements[$delta]['#suffix'] = "From $hook(): suffix on $name child element.";
+      }
+    }
+  }
+
 }
diff --git a/core/modules/field/tests/modules/field_test/src/Plugin/Field/FieldType/TestItem.php b/core/modules/field/tests/modules/field_test/src/Plugin/Field/FieldType/TestItem.php
index b1945dc6e708..e9ca1a5d8df9 100644
--- a/core/modules/field/tests/modules/field_test/src/Plugin/Field/FieldType/TestItem.php
+++ b/core/modules/field/tests/modules/field_test/src/Plugin/Field/FieldType/TestItem.php
@@ -10,6 +10,7 @@
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\StringTranslation\TranslatableMarkup;
 use Drupal\Core\TypedData\DataDefinition;
+use Drupal\field_test\FieldTestHelper;
 
 /**
  * Defines the 'test_field' entity field item.
@@ -114,7 +115,7 @@ public function fieldSettingsForm(array $form, FormStateInterface $form_state) {
    */
   public function delete() {
     // Reports that delete() method is executed for testing purposes.
-    field_test_memorize('field_test_field_delete', [$this->getEntity()]);
+    FieldTestHelper::memorize('field_test_field_delete', [$this->getEntity()]);
   }
 
   /**
diff --git a/core/modules/field/tests/src/Functional/TranslationWebTest.php b/core/modules/field/tests/src/Functional/TranslationWebTest.php
index 7733054d8283..df3e1343ab20 100644
--- a/core/modules/field/tests/src/Functional/TranslationWebTest.php
+++ b/core/modules/field/tests/src/Functional/TranslationWebTest.php
@@ -6,6 +6,7 @@
 
 use Drupal\field\Entity\FieldStorageConfig;
 use Drupal\field\Entity\FieldConfig;
+use Drupal\field_test\FieldTestHelper;
 use Drupal\language\Entity\ConfigurableLanguage;
 
 /**
@@ -101,7 +102,7 @@ public function testFieldFormTranslationRevisions(): void {
     $this->drupalLogin($web_user);
 
     // Prepare the field translations.
-    field_test_entity_info_translatable($this->entityTypeId, TRUE);
+    FieldTestHelper::entityInfoTranslatable($this->entityTypeId, TRUE);
     $entity = $this->container->get('entity_type.manager')
       ->getStorage($this->entityTypeId)
       ->create();
diff --git a/core/modules/field/tests/src/Kernel/BulkDeleteTest.php b/core/modules/field/tests/src/Kernel/BulkDeleteTest.php
index c31906ee2666..f423793542de 100644
--- a/core/modules/field/tests/src/Kernel/BulkDeleteTest.php
+++ b/core/modules/field/tests/src/Kernel/BulkDeleteTest.php
@@ -8,6 +8,7 @@
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\field\Entity\FieldConfig;
 use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\field_test\FieldTestHelper;
 
 /**
  * Bulk delete storages and fields, and clean up afterwards.
@@ -59,7 +60,7 @@ class BulkDeleteTest extends FieldKernelTestBase {
    *   Each entry is the value of the "$entity" parameter the hook is expected
    *   to have been passed.
    * @param array $actual_hooks
-   *   The array of actual hook invocations recorded by field_test_memorize().
+   *   The array of actual hook invocations recorded by FieldTestHelper::memorize().
    */
   public function checkHooksInvocations($expected_hooks, $actual_hooks): void {
     foreach ($expected_hooks as $hook => $invocations) {
@@ -325,7 +326,7 @@ public function testPurgeWithDeletedAndActiveField(): void {
    */
   public function testPurgeField(): void {
     // Start recording hook invocations.
-    field_test_memorize();
+    FieldTestHelper::memorize();
 
     $bundle = reset($this->bundles);
     $field_storage = reset($this->fieldStorages);
@@ -336,7 +337,7 @@ public function testPurgeField(): void {
     $field->delete();
 
     // No field hooks were called.
-    $mem = field_test_memorize();
+    $mem = FieldTestHelper::memorize();
     $this->assertCount(0, $mem, 'No field hooks were called');
 
     $batch_size = 2;
@@ -356,7 +357,7 @@ public function testPurgeField(): void {
     // Check hooks invocations.
     // FieldItemInterface::delete() should have been called once for each entity in the
     // bundle.
-    $actual_hooks = field_test_memorize();
+    $actual_hooks = FieldTestHelper::memorize();
     $hooks = [];
     $hooks['field_test_field_delete'] = $this->entitiesByBundles[$bundle];
     $this->checkHooksInvocations($hooks, $actual_hooks);
@@ -386,7 +387,7 @@ public function testPurgeField(): void {
    */
   public function testPurgeFieldStorage(): void {
     // Start recording hook invocations.
-    field_test_memorize();
+    FieldTestHelper::memorize();
 
     $field_storage = reset($this->fieldStorages);
     $field_name = $field_storage->getName();
@@ -397,7 +398,7 @@ public function testPurgeFieldStorage(): void {
     $field->delete();
 
     // Assert that FieldItemInterface::delete() was not called yet.
-    $mem = field_test_memorize();
+    $mem = FieldTestHelper::memorize();
     $this->assertCount(0, $mem, 'No field hooks were called.');
 
     // Purge the data.
@@ -406,7 +407,7 @@ public function testPurgeFieldStorage(): void {
     // Check hooks invocations.
     // FieldItemInterface::delete() should have been called once for each entity in the
     // bundle.
-    $actual_hooks = field_test_memorize();
+    $actual_hooks = FieldTestHelper::memorize();
     $hooks = [];
     $hooks['field_test_field_delete'] = $this->entitiesByBundles[$bundle];
     $this->checkHooksInvocations($hooks, $actual_hooks);
@@ -433,14 +434,14 @@ public function testPurgeFieldStorage(): void {
     $field->delete();
 
     // Assert that FieldItemInterface::delete() was not called yet.
-    $mem = field_test_memorize();
+    $mem = FieldTestHelper::memorize();
     $this->assertCount(0, $mem, 'No field hooks were called.');
 
     // Purge the data.
     field_purge_batch(10);
 
     // Check hooks invocations (same as above, for the 2nd bundle).
-    $actual_hooks = field_test_memorize();
+    $actual_hooks = FieldTestHelper::memorize();
     $hooks = [];
     $hooks['field_test_field_delete'] = $this->entitiesByBundles[$bundle];
     $this->checkHooksInvocations($hooks, $actual_hooks);
diff --git a/core/modules/field/tests/src/Kernel/FieldAttachStorageTest.php b/core/modules/field/tests/src/Kernel/FieldAttachStorageTest.php
index e72cae7c29ea..347148ee4f8e 100644
--- a/core/modules/field/tests/src/Kernel/FieldAttachStorageTest.php
+++ b/core/modules/field/tests/src/Kernel/FieldAttachStorageTest.php
@@ -6,6 +6,7 @@
 
 use Drupal\field\Entity\FieldConfig;
 use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\field_test\FieldTestHelper;
 
 /**
  * Tests storage-related Field Attach API functions.
@@ -202,14 +203,14 @@ public function testFieldAttachSaveEmptyDataDefaultValue(): void {
     $this->createFieldWithStorage('', $entity_type);
 
     // Add a default value function.
-    $this->fieldTestData->field->set('default_value_callback', 'field_test_default_value');
+    $this->fieldTestData->field->set('default_value_callback', FieldTestHelper::class . '::defaultValue');
     $this->fieldTestData->field->save();
 
     // Verify that fields are populated with default values.
     $entity_init = $this->container->get('entity_type.manager')
       ->getStorage($entity_type)
       ->create(['id' => 1, 'revision_id' => 1]);
-    $default = field_test_default_value($entity_init, $this->fieldTestData->field);
+    $default = FieldTestHelper::defaultValue($entity_init, $this->fieldTestData->field);
     $this->assertEquals($default, $entity_init->{$this->fieldTestData->field_name}->getValue(), 'Default field value correctly populated.');
 
     // Insert: Field is NULL.
diff --git a/core/modules/field/tests/src/Kernel/FieldStorageCrudTest.php b/core/modules/field/tests/src/Kernel/FieldStorageCrudTest.php
index cd39a77a9419..6b1af094365f 100644
--- a/core/modules/field/tests/src/Kernel/FieldStorageCrudTest.php
+++ b/core/modules/field/tests/src/Kernel/FieldStorageCrudTest.php
@@ -10,6 +10,7 @@
 use Drupal\entity_test\Entity\EntityTest;
 use Drupal\field\Entity\FieldConfig;
 use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\field_test\FieldTestHelper;
 
 /**
  * Tests field storage create, read, update, and delete.
@@ -37,7 +38,7 @@ public function testCreate(): void {
       'entity_type' => 'entity_test',
       'type' => 'test_field',
     ];
-    field_test_memorize();
+    FieldTestHelper::memorize();
     $field_storage = FieldStorageConfig::create($field_storage_definition);
     $field_storage->save();
 
@@ -45,9 +46,9 @@ public function testCreate(): void {
     $this->assertEquals('TRUE', $field_storage->getSetting('storage_setting_from_config_data'));
     $this->assertNull($field_storage->getSetting('config_data_from_storage_setting'));
 
-    $mem = field_test_memorize();
-    $this->assertSame($field_storage_definition['field_name'], $mem['field_test_field_storage_config_create'][0][0]->getName(), 'hook_entity_create() called with correct arguments.');
-    $this->assertSame($field_storage_definition['type'], $mem['field_test_field_storage_config_create'][0][0]->getType(), 'hook_entity_create() called with correct arguments.');
+    $mem = FieldTestHelper::memorize();
+    $this->assertSame($field_storage_definition['field_name'], $mem['Drupal\field_test\Hook\FieldTestHooks::fieldStorageConfigCreate'][0][0]->getName(), 'hook_entity_create() called with correct arguments.');
+    $this->assertSame($field_storage_definition['type'], $mem['Drupal\field_test\Hook\FieldTestHooks::fieldStorageConfigCreate'][0][0]->getType(), 'hook_entity_create() called with correct arguments.');
 
     // Read the configuration. Check against raw configuration data rather than
     // the loaded ConfigEntity, to be sure we check that the defaults are
diff --git a/core/modules/field/tests/src/Kernel/TranslationTest.php b/core/modules/field/tests/src/Kernel/TranslationTest.php
index 6c20a5e3f43c..b563e10ccd5d 100644
--- a/core/modules/field/tests/src/Kernel/TranslationTest.php
+++ b/core/modules/field/tests/src/Kernel/TranslationTest.php
@@ -5,8 +5,9 @@
 namespace Drupal\Tests\field\Kernel;
 
 use Drupal\field\Entity\FieldConfig;
-use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\field_test\FieldTestHelper;
+use Drupal\language\Entity\ConfigurableLanguage;
 
 /**
  * Tests multilingual fields logic.
@@ -110,13 +111,13 @@ protected function setUp(): void {
    */
   public function testTranslatableFieldSaveLoad(): void {
     // Enable field translations for nodes.
-    field_test_entity_info_translatable('node', TRUE);
+    FieldTestHelper::entityInfoTranslatable('node', TRUE);
     $entity_type = \Drupal::entityTypeManager()->getDefinition('node');
     $this->assertTrue($entity_type->isTranslatable(), 'Nodes are translatable.');
 
     // Prepare the field translations.
     $entity_type_id = 'entity_test';
-    field_test_entity_info_translatable($entity_type_id, TRUE);
+    FieldTestHelper::entityInfoTranslatable($entity_type_id, TRUE);
     $entity = $this->container->get('entity_type.manager')
       ->getStorage($entity_type_id)
       ->create(['type' => $this->field->getTargetBundle()]);
diff --git a/core/tests/Drupal/KernelTests/Core/Entity/EntityQueryTest.php b/core/tests/Drupal/KernelTests/Core/Entity/EntityQueryTest.php
index c68d82e299fc..ebaa0e299fd5 100644
--- a/core/tests/Drupal/KernelTests/Core/Entity/EntityQueryTest.php
+++ b/core/tests/Drupal/KernelTests/Core/Entity/EntityQueryTest.php
@@ -10,6 +10,7 @@
 use Drupal\entity_test\Entity\EntityTestMulRev;
 use Drupal\field\Entity\FieldConfig;
 use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\field_test\FieldTestHelper;
 use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\taxonomy\Entity\Term;
 use Drupal\taxonomy\Entity\Vocabulary;
@@ -797,7 +798,7 @@ protected function assertBundleOrder(string $order): void {
    * The tags and metadata should propagate to the SQL query object.
    */
   public function testMetaData(): void {
-    field_test_memorize();
+    FieldTestHelper::memorize();
 
     $query = $this->storage->getQuery()->accessCheck(FALSE);
     $query
@@ -805,7 +806,7 @@ public function testMetaData(): void {
       ->addMetaData('foo', 'bar')
       ->execute();
 
-    $mem = field_test_memorize();
+    $mem = FieldTestHelper::memorize();
     $this->assertEquals('bar', $mem['field_test_query_efq_metadata_test_alter'][0], 'Tag and metadata propagated to the SQL query object.');
   }
 
-- 
GitLab