makeCacheKey('hello world')); self::assertSame('hello_world', $this->makeCacheKey('hello!world')); self::assertSame('a_b_c_d', $this->makeCacheKey('a/b@c#d')); } public function testMakeCacheKeyPreservesValidChars(): void { self::assertSame('ABC_123.abc', $this->makeCacheKey('ABC_123.abc')); } public function testMakeCacheKeyTruncatesLongNames(): void { $long = str_repeat('a', 300); $result = $this->makeCacheKey($long); self::assertSame(128, mb_strlen($result)); } public function testMakeCacheKeyEmptyString(): void { self::assertSame('', $this->makeCacheKey('')); } public function testMakeCacheKeyWithOnlyInvalidChars(): void { // preg_replace with + collapses consecutive invalid chars into one _ self::assertSame('_', $this->makeCacheKey('!!!')); self::assertSame('_', $this->makeCacheKey(' ')); self::assertSame('_', $this->makeCacheKey('!@#')); self::assertSame('_', $this->makeCacheKey('!@ #')); } public function testMakeCacheKeyTruncatesToExactly128(): void { $input = str_repeat('a', 128); self::assertSame(128, mb_strlen($this->makeCacheKey($input))); self::assertSame($input, $this->makeCacheKey($input)); $input129 = str_repeat('a', 129); self::assertSame(128, mb_strlen($this->makeCacheKey($input129))); } public function testMakeCacheKeyWithMultibyteChars(): void { // multibyte chars are replaced with a single underscore $result = $this->makeCacheKey('héllo wörld'); // é and ö are not in [A-Za-z0-9_.] so they become _ self::assertSame('h_llo_w_rld', $result); } public function testMakeCacheKeyWithEmoji(): void { $result = $this->makeCacheKey('a🎉b'); self::assertSame('a_b', $result); } }