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')); }); }