Этот файл содержит руководство для Claude Code (claude.ai/code) при работе с кодом в этом репозитории.
CoverArray — это PHP-библиотека, предоставляющая объектно-ориентированную обёртку для PHP-массивов. Реализует нативные функции PHP для работы с массивами в виде цепочечных методов, добавляя такие возможности как доступ через точечную нотацию и сериализация в JSON.
Пакет: krugozor/cover
Пространство имён: Krugozor\Cover
Требования: PHP >= 8.0
vendor/bin/phpunitvendor/bin/phpunit tests/unit/CoverArrayPhpEquivalentMethods/FilterTest.phpvendor/bin/phpunit --filter testMethodNamevendor/bin/phpunit --coverage-html html-coveragecomposer install- CoverArray.php — Основной класс, реализующий интерфейсы
IteratorAggregate,Countable,ArrayAccess,JsonSerializableиStringable. Оборачивает функции PHP для массивов в цепочечные ООП-методы. - Simple.php — Трейт, предоставляющий базовую функциональность работы с массивами (магические методы
__get,__set,__isset,__unsetи хранение данных). Используется классомCoverArray.
Тесты организованы по категориям методов:
CoverArrayCoreMethods/— Тесты основной функциональности (item, setData, clear, магические методы)CoverArrayPhpEquivalentMethods/— Тесты методов, соответствующих функциям PHP для массивовCoverArrayPrivateMethods/— Тесты внутренних методов
- Иммутабельные операции: Большинство методов возвращают новые экземпляры
CoverArray, сохраняя исходные данные - Мутирующие методы: Методы сортировки (
sort,usort,arsortи др.),pop,shift,push,walkизменяют объект на месте - Статические фабричные методы:
fromArray(),fromJson(),fromExplode(),combine(),fill(),fillKeys(),range() - Точечная нотация: Метод
get()поддерживает вложенный доступ, например$array->get('user.profile.name') - Полифиллы: Методы
all(),any(),find(),findKey(),first(),last(),isList()включают полифиллы для старых версий PHP
- Сравнение с оригинальной функцией PHP: В тестах необходимо проверять, что вызов оригинальной функции PHP и вызов метода-аналога из CoverArray возвращают одинаковые результаты.
$data = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple'];
$expected = array_count_values($data);
$cover = new CoverArray($data);
$result = $cover->countValues();
$this->assertSame($expected, $result->getDataAsArray());- Тестирование аргументов
CoverArray|array: Если метод принимаетCoverArray|array, необходимо тестировать оба варианта отдельно:
$data = ['a' => 'apple', 'b' => 'banana', 'c' => 'cherry'];
$diff = ['a' => 'apricot', 'c' => 'coconut'];
$expected = array_diff_key($data, $diff);
$cover = new CoverArray($data);
// arguments as array
$this->assertSame($expected, $cover->diffKey($diff)->getDataAsArray());
// arguments as CoverArray
$this->assertSame($expected, $cover->diffKey(new CoverArray($diff))->getDataAsArray());-
Не проверять неизменяемость исходного массива: Тесты на то, что
$this->dataне изменяется — писать не нужно. -
Не проверять результат оригинальной функции сам с собой: Избегать конструкций вида:
$expected = array_count_values($data);
$this->assertSame($expected, $expected); // НЕ нужно-
Полифиллы не сравниваются с оригиналом: Для методов
all(),any(),find(),findKey(),first(),last(),isList()(полифиллы дляarray_all,array_any,array_find,array_find_key,array_first,array_is_list,array_last) оригинальную функцию PHP не тестируем, только метод CoverArray. -
PHPDoc комментарии: Для каждого теста пишется комментарий на английском и русском языке:
/**
* Tests the diffKey() method (array_diff_key equivalent).
*
* This test verifies that the diffKey() method correctly computes
* the difference of arrays using keys for comparison.
*
* Тестирование метода diffKey() (эквивалент array_diff_key).
*
* Этот тест проверяет, что метод diffKey() корректно вычисляет
* расхождение массивов, используя ключи для сравнения.
*
* @see CoverArray::diffKey()
* @see array_diff_key()
*/-
Один кейс — один метод: Каждый отдельный кейс тестирования — отдельный метод класса теста.
-
CoverArray как тип данных: При тестировании методов с mixed-аргументами также нужно тестировать передачу CoverArray как аргумента.
- Когда пользователь изменяет README_ru.md (или просит обновить переводы):
- Определить, какие секции изменились
- Обновить соответствующие секции во всех файлах переводов
- Сохранить специфичные для языка особенности перевода
- Когда пользователь просит сделать перевод на новый язык:
- Эталон, с которого переводим - docs/README_ru.md
- Отвечай пользователю на русском языке