121 lines
5.7 KiB
Dart
121 lines
5.7 KiB
Dart
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
import 'package:words999/models/word_model.dart';
|
|
import 'package:words999/services/manual_dive.dart';
|
|
import 'package:words999/services/words_repository.dart';
|
|
|
|
void main() {
|
|
TestWidgetsFlutterBinding.ensureInitialized();
|
|
|
|
const snake = WordItem(
|
|
id: 12,
|
|
word: 'змей',
|
|
partOfSpeech: 'существительное',
|
|
frequency: 1,
|
|
category: 'Образ',
|
|
core: 'Сброс кожи оставляет старый покров на тропе.',
|
|
);
|
|
|
|
test('role prompts name the sign and stay inside their closed menus', () {
|
|
final cultures = cultureRoutePrompt(snake);
|
|
expect(cultures, contains('«змей»'));
|
|
expect(cultures, contains('Шумер и Месопотамия'));
|
|
expect(cultures, contains('Алхимия и герметизм'));
|
|
expect(cultures, contains('три названия через запятую'));
|
|
|
|
final languages = languageRoutePrompt(snake);
|
|
expect(languages, contains('санскрит'));
|
|
expect(languages, contains('церковнославянский'));
|
|
|
|
expect(mysticPrompt(snake), contains('Не занимай чужую карту'));
|
|
expect(psychoPrompt(snake), contains('не архетип'));
|
|
expect(cultureSlicePrompt(snake, 'Древний Китай'), contains('следа нет'));
|
|
expect(languageSlicePrompt(snake, 'санскрит'), contains('прямого корня нет'));
|
|
expect(traditionSlicePrompt(snake, 'Руны'), contains('Руны'));
|
|
});
|
|
|
|
test('route answers map onto the closed registries', () {
|
|
expect(
|
|
matchCultureNames('Китай, Египет, выдуманная страна'),
|
|
['Древний Китай', 'Древний Египет'],
|
|
);
|
|
expect(matchLanguageNames('греческий, китайский'), ['древнегреческий', 'древнекитайский']);
|
|
});
|
|
|
|
test('synthesizer JSON fills cultures, a tradition and the core', () {
|
|
const raw = '''
|
|
```json
|
|
{"word":"змей","core":"Кожа сходит кольцом.","oracle":"Старый покров остаётся.","shadow":"Яд в той же коже.","asks":"Какое кольцо уже снято?","step":"Положи кольцо за порог.","binds":["кожа","порог"],"cultures":{"Китай":"Лун отпустил чешую и не стал драконом воды."},"languages":{"санскрит":"прямого корня нет"},"layers":[{"system":"alchemy","title":"Алхимия","law":"Чернота снимает цвет, новое тело его ещё не держит."}]}
|
|
```
|
|
''';
|
|
final draft = parseDiveCanon(raw);
|
|
expect(draft, isNotNull);
|
|
expect(draft!.core, 'Кожа сходит кольцом.');
|
|
expect(draft.cultures, {'Древний Китай': 'Лун отпустил чешую и не стал драконом воды.'});
|
|
expect(draft.languages, {'санскрит': 'прямого корня нет'});
|
|
expect(draft.layers!.single.system, 'alchemy');
|
|
expect(draft.binds, ['кожа', 'порог']);
|
|
|
|
final prompt = synthesizerPrompt(
|
|
word: snake,
|
|
reports: const {'mystic': 'закон кожи'},
|
|
core: 'Кожа сходит кольцом.',
|
|
oracle: '',
|
|
shadow: '',
|
|
asks: '',
|
|
step: '',
|
|
binds: '',
|
|
cultures: draft.cultures!,
|
|
languages: const {},
|
|
traditions: const {},
|
|
);
|
|
expect(prompt, contains('«змей»'));
|
|
expect(prompt, contains('закон кожи'));
|
|
expect(prompt, contains('Лун отпустил чешую'));
|
|
});
|
|
|
|
test('manual fields survive save, card and import', () async {
|
|
SharedPreferences.setMockInitialValues({});
|
|
final repo = WordsRepository();
|
|
await repo.init(remoteDailyShuffle: false);
|
|
await repo.clearAllCustomEdits();
|
|
const word = 'змей';
|
|
|
|
await repo.saveCustomEdit(
|
|
word,
|
|
core: 'Кожа сходит кольцом.',
|
|
oracle: 'Старый покров остаётся на тропе.',
|
|
shadow: 'Яд остаётся в снятой коже.',
|
|
asks: 'Какое кольцо уже снято?',
|
|
step: 'Положи кольцо за порог.',
|
|
cultures: const {'Древний Китай': 'Лун отпустил чешую.'},
|
|
languages: const {'санскрит': 'прямого корня нет'},
|
|
layers: const [
|
|
SymbolLayer(system: 'alchemy', title: 'Алхимия', law: 'Чернота снимает цвет.'),
|
|
],
|
|
binds: const ['кожа'],
|
|
reports: const {'mystic': 'закон кожи'},
|
|
);
|
|
|
|
final edited = repo.getWordByName(word)!;
|
|
expect(edited.core, 'Кожа сходит кольцом.');
|
|
expect(edited.cultures['Древний Китай'], 'Лун отпустил чешую.');
|
|
expect(edited.languages['санскрит'], 'прямого корня нет');
|
|
expect(edited.layers.any((layer) => layer.system == 'alchemy'), isTrue);
|
|
expect(edited.binds, ['кожа']);
|
|
expect(repo.customEditOf(word)!['reports']['mystic'], 'закон кожи');
|
|
|
|
final exported = repo.exportCustomEditsJson();
|
|
await repo.clearAllCustomEdits();
|
|
expect(repo.getWordByName(word)!.languages, isEmpty);
|
|
|
|
final count = await repo.importCustomEditsJson(exported);
|
|
expect(count, 1);
|
|
final again = repo.getWordByName(word)!;
|
|
expect(again.cultures['Древний Китай'], 'Лун отпустил чешую.');
|
|
expect(again.languages['санскрит'], 'прямого корня нет');
|
|
expect(again.layers.any((layer) => layer.law == 'Чернота снимает цвет.'), isTrue);
|
|
await repo.clearAllCustomEdits();
|
|
});
|
|
}
|