diff --git a/src/ZM/Utils/CatCode.php b/src/ZM/Utils/CatCode.php index 15d6b6e8..8bb84227 100644 --- a/src/ZM/Utils/CatCode.php +++ b/src/ZM/Utils/CatCode.php @@ -11,7 +11,7 @@ class CatCode /** * 从 MessageSegment 转换为 CatCode 字符串 */ - public static function fromSegment(mixed $message_segment): string + public static function fromSegment(array|MessageSegment|string $message_segment): string { // 传入的必须是段数组或段对象 if (is_array($message_segment)) { @@ -24,13 +24,12 @@ class CatCode } return $str; } + if ($message_segment instanceof MessageSegment) { return self::segment2CatCode($message_segment); } - if (is_string($message_segment)) { - return $message_segment; - } - return ''; + + return $message_segment; } /** diff --git a/tests/ZM/Utils/CatCodeTest.php b/tests/ZM/Utils/CatCodeTest.php new file mode 100644 index 00000000..8d09f810 --- /dev/null +++ b/tests/ZM/Utils/CatCodeTest.php @@ -0,0 +1,75 @@ +assertSame($expected, CatCode::fromSegment($segment)); + } + + public function provideTestConvertFromSegment(): array + { + return [ + 'string' => ['[CatCode:mention,user_id=123456789]', '[CatCode:mention,user_id=123456789]'], + 'segment instance' => [new MessageSegment('mention', ['user_id' => '123456789']), '[CatCode:mention,user_id=123456789]'], + 'multiple segment instance' => [ + [ + new MessageSegment('mention', ['user_id' => '123456789']), + new MessageSegment('text', ['text' => 'Hello']), + ], + '[CatCode:mention,user_id=123456789]Hello', + ], + 'array contains non-segment' => [ + [ + new MessageSegment('mention', ['user_id' => '123456789']), + 'Hello', + ], + '', + ], + 'non-string, non-segment, non-array' => [123, ''], + ]; + } + + /** + * @dataProvider provideTestEscapeText + */ + public function testEscapeText(string $text): void + { + $encoded = CatCode::encode($text); + $decoded = CatCode::decode($encoded); + $this->assertSame($text, $decoded); + } + + public function provideTestEscapeText(): array + { + return [ + ["前缀是'['后缀是']', 还有以及一个特殊的&"], + ["[前缀是'['后缀是']', 还有以及一个特殊的&"], + ["前缀是'['后缀是']', 还有以及一个特殊的"], + ["&前缀是'['后缀是']', 还有以及一个特殊的"], + ["&前缀是'['后缀是']', 还有以及一个特殊的]"], + ]; + } + + public function testEscapeTextForContent(): void + { + $text = "前缀是'['后缀是']', 还有以及一个特殊的&"; + $encoded = CatCode::encode($text, true); + $decoded = CatCode::decode($encoded, true); + $this->assertSame($text, $decoded); + } +}