109 lines
3.6 KiB
Dart
109 lines
3.6 KiB
Dart
// 测试参数文档换行功能
|
||
import 'package:test/test.dart';
|
||
|
||
/// 测试用的参数文档换行函数
|
||
List<String> wrapParamDocLine(String paramDoc) {
|
||
const maxLength = 76; // 80 - '/// '.length
|
||
|
||
if (paramDoc.length <= maxLength) {
|
||
return [paramDoc];
|
||
}
|
||
|
||
final lines = <String>[];
|
||
|
||
// 提取参数名和描述部分
|
||
final match = RegExp(r'^- ([^:]+): (.+)$').firstMatch(paramDoc);
|
||
if (match == null) {
|
||
// 如果格式不匹配,返回原文本
|
||
return [paramDoc];
|
||
}
|
||
|
||
final paramName = match.group(1)!;
|
||
final description = match.group(2)!;
|
||
final firstLinePrefix = '- $paramName: ';
|
||
const continuationPrefix = ' '; // 续行使用两个空格缩进
|
||
|
||
// 计算第一行可用长度
|
||
final firstLineMaxLength = maxLength - firstLinePrefix.length;
|
||
|
||
if (description.length <= firstLineMaxLength) {
|
||
// 描述足够短,可以放在一行
|
||
return [paramDoc];
|
||
}
|
||
|
||
// 需要分多行
|
||
var remaining = description;
|
||
var isFirstLine = true;
|
||
|
||
while (remaining.isNotEmpty) {
|
||
final currentPrefix = isFirstLine ? firstLinePrefix : continuationPrefix;
|
||
final currentMaxLength = maxLength - currentPrefix.length;
|
||
|
||
if (remaining.length <= currentMaxLength) {
|
||
// 剩余内容可以放在当前行
|
||
lines.add(currentPrefix + remaining);
|
||
break;
|
||
}
|
||
|
||
// 寻找合适的断点
|
||
var breakPoint = currentMaxLength;
|
||
final breakChars = [' ', ',', ',', '、', ';', ';', '|', '/'];
|
||
var bestIdx = -1;
|
||
|
||
for (final ch in breakChars) {
|
||
final idx = remaining.lastIndexOf(ch, currentMaxLength);
|
||
if (idx > bestIdx && idx > currentMaxLength * 0.5) {
|
||
bestIdx = idx;
|
||
}
|
||
}
|
||
|
||
if (bestIdx >= 0) {
|
||
breakPoint = bestIdx + 1; // 包含分隔符
|
||
}
|
||
|
||
final lineContent = remaining.substring(0, breakPoint).trim();
|
||
lines.add(currentPrefix + lineContent);
|
||
remaining = remaining.substring(breakPoint).trim();
|
||
isFirstLine = false;
|
||
}
|
||
|
||
return lines;
|
||
}
|
||
|
||
void main() {
|
||
group('参数文档换行测试', () {
|
||
test('短参数文档不换行', () {
|
||
final result = wrapParamDocLine('- param: 简短描述');
|
||
expect(result.length, 1);
|
||
expect(result[0], '- param: 简短描述');
|
||
});
|
||
|
||
test('长参数文档自动换行', () {
|
||
const longDesc = '- solutionSemesterEnum: 备 注:解决方案学期阶段枚举 初一上上半期 71, 初一上下半期 72, 初一下上半期 73, 初一下下半期 74, 初二上上半期 81, 初二上下半期 82, 初二下上半期 83, 初二下下半期 84, 初三上上半期 91, 初三上下半期 92, 初三下上半期 93, 初三下下半期 94, 高一上上半期 101, 高一上下半期 102, 高一下上半期 103, 高一下下半期 104, 高二上上半期 111';
|
||
final result = wrapParamDocLine(longDesc);
|
||
|
||
// 打印结果以便调试
|
||
print('长参数文档换行结果:');
|
||
for (var i = 0; i < result.length; i++) {
|
||
print(' [$i] (${result[i].length}字符): ${result[i]}');
|
||
}
|
||
|
||
// 应该分成多行
|
||
expect(result.length, greaterThan(1));
|
||
|
||
// 每行都不应该超过76字符(80 - '/// '.length)
|
||
for (final line in result) {
|
||
expect(line.length, lessThanOrEqualTo(76), reason: '行内容: "$line" 长度: ${line.length}');
|
||
}
|
||
|
||
// 第一行应该以 "- solutionSemesterEnum: " 开头
|
||
expect(result[0], startsWith('- solutionSemesterEnum: '));
|
||
|
||
// 续行应该以两个空格开头
|
||
for (var i = 1; i < result.length; i++) {
|
||
expect(result[i], startsWith(' '), reason: '续行应该以两个空格开头: "${result[i]}"');
|
||
}
|
||
});
|
||
});
|
||
}
|