Files
BadNote/test/search_text_test.dart
Akiba So 0cf58fb67a
Some checks failed
CI / Windows build (push) Has been cancelled
feat(f8): CJK-safe search text normalization + matching
normalizeForIndex (lowercase + collapse whitespace runs incl. hard PDF/OCR
newlines + trim) and matchesNormalized so a query matches across the line breaks
in raw extracted text. Deliberately NO word-tokenization: Chinese has no
inter-word spaces, so substring match over normalized text is correct for both
Latin and CJK (段/word segmentation belongs in the DB FTS tokenizer). Verified
on CJK inputs (你好/笔记应用).

flutter analyze lib/editor clean; 181/181 tests (+9).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 03:30:42 +08:00

52 lines
1.7 KiB
Dart

// Tests for CJK-safe search text normalization + matching (F8).
import 'package:flutter_test/flutter_test.dart';
import 'package:badnote/editor/search/search_text.dart';
void main() {
group('normalizeForIndex', () {
test('lowercases and collapses whitespace runs to single spaces', () {
expect(normalizeForIndex('Hello World'), 'hello world');
expect(normalizeForIndex('a\t b\n\nc'), 'a b c');
});
test('trims leading/trailing whitespace', () {
expect(normalizeForIndex(' padded '), 'padded');
});
test('collapses hard newlines from PDF/OCR mid-sentence', () {
expect(normalizeForIndex('hello\nworld'), 'hello world');
});
test('leaves CJK intact (no tokenization/mangling)', () {
expect(normalizeForIndex('你好 世界'), '你好 世界');
expect(normalizeForIndex('笔记\n应用'), '笔记 应用');
});
});
group('matchesNormalized', () {
test('matches across a line break in the source', () {
expect(matchesNormalized('hello\nworld', 'hello world'), isTrue);
});
test('is case-insensitive', () {
expect(matchesNormalized('The Quick Fox', 'quick'), isTrue);
});
test('CJK substring match works', () {
expect(matchesNormalized('这是一个笔记应用', '笔记'), isTrue);
expect(matchesNormalized('这是一个笔记\n应用', '笔记 应用'), isTrue);
});
test('empty query never matches', () {
expect(matchesNormalized('anything', ''), isFalse);
expect(matchesNormalized('anything', ' '), isFalse);
});
test('non-match returns false', () {
expect(matchesNormalized('hello world', 'zzz'), isFalse);
});
});
}