swagger_generator_flutter/test/param_doc_wrap_test.dart

120 lines
3.7 KiB
Dart
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.

// 测试参数文档换行功能
// ignore_for_file: avoid_print, lines_longer_than_80_chars
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]}"',
);
}
});
});
}