import 'dart:io'; import 'package:flutter_test/flutter_test.dart'; import 'package:nanga_kathai/core/models.dart'; import 'package:nanga_kathai/core/search_normalize.dart'; import 'package:nanga_kathai/data/catalog_repository.dart'; void main() { group('foldForSearch', () { test('treats common Badaga spelling variants as equal', () { expect(foldForSearch('Madhuvae'), foldForSearch('madhuve')); expect(foldForSearch('Hethai'), foldForSearch('Hettai')); expect(foldForSearch('Hethai'), foldForSearch('Hethe')); expect(foldForSearch('Baduga'), isNot(foldForSearch('Kathai'))); }); test('keeps Tamil script searchable', () { expect(foldForSearch('பாடல்'), 'பாடல்'); }); }); group('matchesSearch', () { test('every query word must match some field', () { expect(matchesSearch('madhuve song', ['Madhuvae Song', null]), isTrue); expect(matchesSearch('madhuve habba', ['Madhuvae Song']), isFalse); expect(matchesSearch(' ', ['anything']), isFalse); }); }); group('demo catalog', () { late Catalog catalog; setUpAll(() { catalog = parseCatalogJson(File('assets/catalog/demo_catalog.json').readAsStringSync()); }); test('every track points at known singers and bundled audio', () { expect(catalog.tracks, isNotEmpty); for (final t in catalog.tracks) { expect(catalog.artistsOf(t), hasLength(t.artistIds.length), reason: t.id); final path = t.audioUrl.replaceFirst('asset:///', ''); expect(File(path).existsSync(), isTrue, reason: path); } }); test('search finds songs by occasion and singer', () { expect(catalog.searchTracks('madhuve').map((t) => t.occasion), everyElement(Occasion.madhuvae)); expect(catalog.searchTracks('demo singer c'), isNotEmpty); }); }); test('Artist.initials', () { expect(const Artist(id: 'x', name: 'Demo Singer A').initials, 'DA'); expect(const Artist(id: 'x', name: 'Ponnamma').initials, 'P'); }); }