Record where the guidance comes from (copyright/attribution) and make clear it is general, not local gospel — kept light: - seed_saving.json gains a top-level sources list (Seed to Seed / Seed Savers Exchange / Organic Seed Alliance); parsed into SeedSavingData.sources, exposed via SeedSavingCatalog.sources. - The detail section shows a small muted footer: an italic 'advisory — adapt to your climate' line plus a 'Source: …' credit. - i18n seedSaving.advisory + sourcePrefix (en/es/pt/ast). - Tests: asset carries sources; the section renders advisory + credit.
56 lines
1.9 KiB
Dart
56 lines
1.9 KiB
Dart
import 'dart:io';
|
|
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:tane/domain/seed_saving.dart';
|
|
|
|
/// Guards the committed bundled seed-saving asset: it must parse, cover the
|
|
/// major families, and carry the notable per-species corrections the UI relies
|
|
/// on. Reads the file directly — no Flutter asset bundle — so it runs as a
|
|
/// plain VM test.
|
|
void main() {
|
|
final data =
|
|
parseSeedSaving(File('assets/catalog/seed_saving.json').readAsStringSync());
|
|
|
|
test('resolves the major families', () {
|
|
for (final family in const [
|
|
'Solanaceae',
|
|
'Fabaceae',
|
|
'Cucurbitaceae',
|
|
'Brassicaceae',
|
|
'Asteraceae',
|
|
'Apiaceae',
|
|
'Amaranthaceae',
|
|
'Poaceae',
|
|
]) {
|
|
expect(data.guideFor(family: family)?.hasAny, isTrue, reason: family);
|
|
}
|
|
});
|
|
|
|
test('faba bean is corrected to insect cross-pollination', () {
|
|
// The whole point of species overrides: unlike other legumes, Vicia faba
|
|
// crosses — the guidance must not inherit Fabaceae "self".
|
|
final g = data.guideFor(scientificName: 'Vicia faba', family: 'Fabaceae');
|
|
expect(g?.pollination, Pollination.cross);
|
|
expect(g?.vector, PollinationVector.insect);
|
|
expect(g?.noteFor('es'), isNotNull);
|
|
});
|
|
|
|
test('tomato self-pollinates and is wet-processed', () {
|
|
final g = data.guideFor(
|
|
scientificName: 'Solanum lycopersicum', family: 'Solanaceae');
|
|
expect(g?.pollination, Pollination.self);
|
|
expect(g?.processing, SeedProcessing.wet);
|
|
expect(g?.difficulty, SavingDifficulty.easy);
|
|
});
|
|
|
|
test('maize is wind-pollinated with a large population', () {
|
|
final g = data.guideFor(scientificName: 'Zea mays', family: 'Poaceae');
|
|
expect(g?.vector, PollinationVector.wind);
|
|
expect(g?.recommendedPlants, greaterThanOrEqualTo(50));
|
|
});
|
|
|
|
test('carries source attributions', () {
|
|
expect(data.sources, isNotEmpty);
|
|
expect(data.sources.map((s) => s.title), contains('Seed to Seed'));
|
|
});
|
|
}
|