Files
pj_supermarket_cloud/test/search_highlight_tool_test.dart
T
2026-09-10 13:51:51 +08:00

63 lines
2.0 KiB
Dart

import 'package:flutter_test/flutter_test.dart';
import 'package:pj_supermarket_cloud/common/index.dart';
String marked(String text, String kw) {
final ranges = SearchHighlightTool.matchRanges(text, kw);
final buf = StringBuffer();
int cursor = 0;
final runes = text.runes.toList();
for (final r in ranges) {
if (r.start < cursor) continue;
if (r.start > cursor) {
buf.write(String.fromCharCodes(runes.sublist(cursor, r.start)));
}
buf.write('[${String.fromCharCodes(runes.sublist(r.start, r.end))}]');
cursor = r.end;
}
if (cursor < runes.length) buf.write(String.fromCharCodes(runes.sublist(cursor)));
return buf.toString();
}
void main() {
test('商品名直接命中', () {
expect(marked('康师傅红烧方便面', '方便'), '康师傅红烧[方便]面');
});
test('多次出现全部高亮', () {
expect(marked('可口可乐可乐瓶装', '可乐'), '可口[可乐][可乐]瓶装');
});
test('大小写不敏感', () {
expect(marked('CocaCola 500ml', 'cola'), 'Coca[Cola] 500ml');
});
test('条码直接命中', () {
expect(marked('6901234567892', '1234'), '690[1234]567892');
});
test('拼音首字母头部命中', () {
expect(marked('康师傅红烧方便面', 'ksf'), '[康师傅]红烧方便面');
});
test('拼音首字母中部命中', () {
expect(marked('康师傅红烧方便面', 'fhs'), '康师[傅红烧]方便面');
});
test('拼音首字母尾部命中', () {
expect(marked('康师傅红烧方便面', 'fbm'), '康师傅红烧[方便面]');
});
test('汉字与字母混合拼音命中', () {
expect(marked('农夫山泉550ml', 'nfsq'), '[农夫山泉]550ml');
});
test('无命中不高亮', () {
expect(marked('康师傅红烧方便面', 'zzz'), '康师傅红烧方便面');
});
test('空关键字不高亮', () {
expect(marked('康师傅红烧方便面', ''), '康师傅红烧方便面');
expect(marked('康师傅红烧方便面', ' '), '康师傅红烧方便面');
});
}