znt/module/doc/test/model/foreachdocblock.php

110 lines
7.4 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env php
<?php
/**
title=测试 $doc->forEachDocBlockTest();
timeout=0
cid=16080
- 步骤1正常情况-遍历所有区块并计数 @15
- 步骤2正常情况-过滤特定flavour(affine:paragraph)获取区块数量 @12
- 步骤3正常情况-过滤标题类型(h1)获取区块数量 @1
- 步骤4正常情况-过滤多个标题类型(h2,h3)获取区块数量 @5
- 步骤5正常情况-获取所有标题文本内容(按类型分组) @总标题,标题 1,标题 2,标题 1.1,标题 2.1,标题 2.2,标题 2.2.1
- 步骤6边界值-空内容返回初始数据 @0
- 步骤7边界值-无匹配flavour返回初始数据 @0
- 步骤8正常情况-获取h4标题内容 @标题 2.2.1
- 步骤9正常情况-过滤affine:note获取区块数量 @1
- 步骤10正常情况-过滤affine:surface获取区块数量 @1
*/
// 1. 导入依赖(路径固定,不可修改)
include dirname(__FILE__, 5) . '/test/lib/init.php';
include dirname(__FILE__, 2) . '/lib/model.class.php';
// 2. 用户登录(选择合适角色)
su('admin');
// 3. 加载模型
global $tester;
$doc = new docModelTest();
// 5. 准备测试数据
$testDocContent = json_decode('{"type":"page","meta":{"id":"gv59xPh7Ss","title":"Test doc 2","createDate":1735009861666,"tags":[]},"blocks":{"type":"block","id":"bFt3Zebq4C","flavour":"affine:page","version":2,"props":{"title":{"$blocksuite:internal:text$":true,"delta":[{"insert":"Test doc 2"}]}},"children":[{"type":"block","id":"3ZDtESrTwV","flavour":"affine:surface","version":5,"props":{"elements":{}},"children":[]},{"type":"block","id":"2uKZ34xemh","flavour":"affine:note","version":1,"props":{"xywh":"[0,0,498,92]","background":"--affine-note-background-white","index":"a0","lockedBySelf":false,"hidden":false,"displayMode":"both","edgeless":{"style":{"borderRadius":8,"borderSize":4,"borderStyle":"none","shadowType":"--affine-note-shadow-box"}}},"children":[{"type":"block","id":"YUKg2P9jRd","flavour":"affine:paragraph","version":1,"props":{"align":"left","type":"h1","text":{"$blocksuite:internal:text$":true,"delta":[{"insert":"总标题"}]},"collapsed":false},"children":[]},{"type":"block","id":"57fqsxdUPx","flavour":"affine:paragraph","version":1,"props":{"align":"left","type":"h2","text":{"$blocksuite:internal:text$":true,"delta":[{"insert":"标题 1"}]},"collapsed":false},"children":[]},{"type":"block","id":"8K8dPj1sCM","flavour":"affine:paragraph","version":1,"props":{"align":"left","type":"text","text":{"$blocksuite:internal:text$":true,"delta":[{"insert":"test"}]},"collapsed":false},"children":[]},{"type":"block","id":"t2QW0-7wjo","flavour":"affine:paragraph","version":1,"props":{"align":"left","type":"h3","text":{"$blocksuite:internal:text$":true,"delta":[{"insert":"标题 1.1"}]},"collapsed":false},"children":[]},{"type":"block","id":"cSxIMNwE5r","flavour":"affine:paragraph","version":1,"props":{"align":"left","type":"text","text":{"$blocksuite:internal:text$":true,"delta":[{"insert":"test2"}]},"collapsed":false},"children":[]},{"type":"block","id":"OLPb8QmDkm","flavour":"affine:paragraph","version":1,"props":{"align":"left","type":"h2","text":{"$blocksuite:internal:text$":true,"delta":[{"insert":"标题 2"}]},"collapsed":false},"children":[]},{"type":"block","id":"UtmatxoW-t","flavour":"affine:paragraph","version":1,"props":{"align":"left","type":"text","text":{"$blocksuite:internal:text$":true,"delta":[{"insert":"test3"}]},"collapsed":false},"children":[]},{"type":"block","id":"6dnzn0y_X0","flavour":"affine:paragraph","version":1,"props":{"align":"left","type":"h3","text":{"$blocksuite:internal:text$":true,"delta":[{"insert":"标题 2.1"}]},"collapsed":false},"children":[]},{"type":"block","id":"J7tikZIhh0","flavour":"affine:paragraph","version":1,"props":{"align":"left","type":"text","text":{"$blocksuite:internal:text$":true,"delta":[{"insert":"test3"}]},"collapsed":false},"children":[]},{"type":"block","id":"FUUm-Oy6iC","flavour":"affine:paragraph","version":1,"props":{"align":"left","type":"h3","text":{"$blocksuite:internal:text$":true,"delta":[{"insert":"标题 2.2"}]},"collapsed":false},"children":[]},{"type":"block","id":"AGXLCs2K9D","flavour":"affine:paragraph","version":1,"props":{"align":"left","type":"h4","text":{"$blocksuite:internal:text$":true,"delta":[{"insert":"标题 2.2.1"}]},"collapsed":false},"children":[]},{"type":"block","id":"PWCMwmaZqD","flavour":"affine:paragraph","version":1,"props":{"align":"left","type":"text","text":{"$blocksuite:internal:text$":true,"delta":[]},"collapsed":false},"children":[]}]}]}}', true);
// 6. 定义测试辅助函数
/**
* 计数回调函数。
* Counting callback.
*/
$countCallback = function($block, $data, $depth, $level, $index)
{
return $data + 1;
};
/**
* 获取标题文本的回调函数。
* Get heading text callback.
*/
$getHeadingTextCallback = function($block, $data, $depth, $level, $index)
{
if(!isset($block['props']['text']['delta'][0]['insert'])) return $data;
$text = $block['props']['text']['delta'][0]['insert'];
if(!empty($text)) $data[] = $text;
return $data;
};
// 7. 🔴 强制要求必须包含至少5个测试步骤
// 步骤1正常情况-遍历所有区块并计数
$result1 = $doc->forEachDocBlockTest($testDocContent, $countCallback, 0);
r($result1) && p() && e('15');
// 步骤2正常情况-过滤特定flavour(affine:paragraph)获取区块数量
$result2 = $doc->forEachDocBlockTest($testDocContent, $countCallback, 0, 'affine:paragraph');
r($result2) && p() && e('12');
// 步骤3正常情况-过滤标题类型(h1)获取区块数量
$result3 = $doc->forEachDocBlockTest($testDocContent, $countCallback, 0, 'affine:paragraph', 'block', array('type' => 'h1'));
r($result3) && p() && e('1');
// 步骤4正常情况-过滤多个标题类型(h2,h3)获取区块数量
$result4H2 = $doc->forEachDocBlockTest($testDocContent, $countCallback, 0, 'affine:paragraph', 'block', array('type' => 'h2'));
$result4H3 = $doc->forEachDocBlockTest($testDocContent, $countCallback, 0, 'affine:paragraph', 'block', array('type' => 'h3'));
$result4 = $result4H2 + $result4H3;
r($result4) && p() && e('5');
// 步骤5正常情况-获取所有标题文本内容
$headingTypes = array('h1', 'h2', 'h3', 'h4');
$allHeadings = array();
foreach($headingTypes as $type)
{
$headings = $doc->forEachDocBlockTest($testDocContent, $getHeadingTextCallback, array(), 'affine:paragraph', 'block', array('type' => $type));
$allHeadings = array_merge($allHeadings, $headings);
}
r(implode(',', $allHeadings)) && p() && e('总标题,标题 1,标题 2,标题 1.1,标题 2.1,标题 2.2,标题 2.2.1');
// 步骤6边界值-空内容返回初始数据
$emptyContent = array();
$result6 = $doc->forEachDocBlockTest($emptyContent, $countCallback, 0);
r($result6) && p() && e('0');
// 步骤7边界值-无匹配flavour返回初始数据
$result7 = $doc->forEachDocBlockTest($testDocContent, $countCallback, 0, 'non:existent:flavour');
r($result7) && p() && e('0');
// 步骤8正常情况-获取h4标题内容
$h4Headings = $doc->forEachDocBlockTest($testDocContent, $getHeadingTextCallback, array(), 'affine:paragraph', 'block', array('type' => 'h4'));
r(implode(',', $h4Headings)) && p() && e('标题 2.2.1');
// 步骤9正常情况-过滤affine:note获取区块数量
$result9 = $doc->forEachDocBlockTest($testDocContent, $countCallback, 0, 'affine:note');
r($result9) && p() && e('1');
// 步骤10正常情况-过滤affine:surface获取区块数量
$result10 = $doc->forEachDocBlockTest($testDocContent, $countCallback, 0, 'affine:surface');
r($result10) && p() && e('1');