import 'dart:convert'; import 'dart:io'; import 'package:flutter_test/flutter_test.dart'; import 'package:words999/models/culture_branch.dart'; import 'package:words999/models/word_model.dart'; void main() { final kb = json.decode(File('assets/data/oracle_kb.json').readAsStringSync()) as Map; test('Cyrillic word boundaries work (Dart \\b is ASCII-only)', () { final sumer = kCultureBranches.firstWhere((b) => b.id == 'sumer'); expect(sumer.matches(' В Шумере знак UD '), isTrue); expect(sumer.matches(' безутешный '), isFalse); // "уту" inside a word must not match }); test('ДЕНЬ is decomposed into many human traditions', () { final w = const WordItem(id: 6, word: 'день', partOfSpeech: '', frequency: 1) .enrichWithKb(kb['день'] as Map); final c = w.resolvedCultures; for (final name in [ 'Шумер и Месопотамия', 'Древний Египет', 'Иудейская традиция и Каббала', 'Античность (Греция и Рим)', 'Кельты и друиды', 'Древний Китай', 'Полинезия и Океания', 'Мезоамерика и Анды', 'Алхимия и герметизм', ]) { expect(c.containsKey(name), isTrue, reason: 'missing $name; got ${c.keys}'); } }); test('НОЧЬ covers Islamic/Sufi and Sumerian layers', () { final w = const WordItem(id: 7, word: 'ночь', partOfSpeech: '', frequency: 1) .enrichWithKb(kb['ночь'] as Map); final c = w.resolvedCultures; expect(c.keys, containsAll(['Ислам и суфизм', 'Шумер и Месопотамия', 'Древний Египет', 'Древний Китай'])); }); test('explicit cultures override auto-extraction and survive toMap/fromMap', () { const w = WordItem(id: 1, word: 'x', partOfSpeech: '', frequency: 1, cultures: {'Славянская традиция': 'Навь'}); final back = WordItem.fromMap(w.toMap()); expect(back.resolvedCultures, {'Славянская традиция': 'Навь'}); }); }