197 lines
6.5 KiB
Dart
197 lines
6.5 KiB
Dart
// ignore_for_file: avoid_print
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
|
|
void main() {
|
|
group('Photo Quality Algorithm Tests', () {
|
|
test('should sort photos by quality (horizontal preference)', () {
|
|
// Simulation de données de photos avec différents formats
|
|
final photos = [
|
|
{'width': 400, 'height': 600, 'photo_reference': 'vertical1'},
|
|
{'width': 800, 'height': 600, 'photo_reference': 'horizontal1'},
|
|
{'width': 300, 'height': 300, 'photo_reference': 'square1'},
|
|
{'width': 1200, 'height': 800, 'photo_reference': 'horizontal_hd'},
|
|
{'width': 600, 'height': 400, 'photo_reference': 'horizontal2'},
|
|
];
|
|
|
|
// Appliquer l'algorithme de tri de qualité
|
|
photos.sort((a, b) => _sortPhotosByQuality(a, b));
|
|
|
|
// Vérifications
|
|
expect(photos.first['photo_reference'], 'horizontal_hd');
|
|
expect(photos.first['width'], 1200);
|
|
expect(photos.first['height'], 800);
|
|
|
|
// La photo verticale devrait être parmi les dernières
|
|
final lastPhotos = photos.sublist(photos.length - 2);
|
|
expect(lastPhotos.any((p) => p['photo_reference'] == 'vertical1'), true);
|
|
|
|
print('Photos triées par qualité (meilleure en premier):');
|
|
for (var photo in photos) {
|
|
final width = photo['width'] as int;
|
|
final height = photo['height'] as int;
|
|
final ratio = width / height;
|
|
final resolution = width * height;
|
|
print(
|
|
'${photo['photo_reference']}: ${width}x$height '
|
|
'(ratio: ${ratio.toStringAsFixed(2)}, résolution: $resolution)',
|
|
);
|
|
}
|
|
});
|
|
|
|
test('should generate correct search terms for Paris', () {
|
|
final searchTerms = _generateSearchTerms('Paris');
|
|
|
|
// Vérifier que les termes spécifiques à Paris sont présents
|
|
expect(searchTerms.any((term) => term.contains('Tour Eiffel')), true);
|
|
expect(searchTerms.any((term) => term.contains('Arc de Triomphe')), true);
|
|
expect(searchTerms.any((term) => term.contains('Notre-Dame')), true);
|
|
|
|
// Vérifier que les termes génériques sont aussi présents
|
|
expect(
|
|
searchTerms.any((term) => term.contains('attractions touristiques')),
|
|
true,
|
|
);
|
|
expect(searchTerms.any((term) => term.contains('landmarks')), true);
|
|
|
|
print('Termes de recherche pour Paris:');
|
|
for (var term in searchTerms) {
|
|
print('- $term');
|
|
}
|
|
});
|
|
|
|
test('should generate correct search terms for London', () {
|
|
final searchTerms = _generateSearchTerms('London');
|
|
|
|
// Vérifier que les termes spécifiques à Londres sont présents
|
|
expect(searchTerms.any((term) => term.contains('Big Ben')), true);
|
|
expect(searchTerms.any((term) => term.contains('Tower Bridge')), true);
|
|
expect(searchTerms.any((term) => term.contains('London Eye')), true);
|
|
|
|
print('Termes de recherche pour Londres:');
|
|
for (var term in searchTerms) {
|
|
print('- $term');
|
|
}
|
|
});
|
|
|
|
test('should handle unknown cities gracefully', () {
|
|
final searchTerms = _generateSearchTerms('Petite Ville Inconnue');
|
|
|
|
// Devrait au moins avoir des termes génériques
|
|
expect(searchTerms.isNotEmpty, true);
|
|
expect(
|
|
searchTerms.any((term) => term.contains('attractions touristiques')),
|
|
true,
|
|
);
|
|
expect(searchTerms.any((term) => term.contains('landmarks')), true);
|
|
|
|
// Le terme original devrait être en dernier
|
|
expect(searchTerms.last, 'Petite Ville Inconnue');
|
|
|
|
print('Termes de recherche pour ville inconnue:');
|
|
for (var term in searchTerms) {
|
|
print('- $term');
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
/// Reproduit l'algorithme de tri de qualité des photos
|
|
int _sortPhotosByQuality(Map<String, dynamic> a, Map<String, dynamic> b) {
|
|
final aWidth = a['width'] as int;
|
|
final aHeight = a['height'] as int;
|
|
final bWidth = b['width'] as int;
|
|
final bHeight = b['height'] as int;
|
|
|
|
final aRatio = aWidth / aHeight;
|
|
final bRatio = bWidth / bHeight;
|
|
|
|
// 1. Privilégier les photos horizontales (ratio > 1)
|
|
if (aRatio > 1 && bRatio <= 1) return -1;
|
|
if (bRatio > 1 && aRatio <= 1) return 1;
|
|
|
|
// 2. Si les deux sont horizontales ou les deux ne le sont pas,
|
|
// privilégier la résolution plus élevée
|
|
final aResolution = aWidth * aHeight;
|
|
final bResolution = bWidth * bHeight;
|
|
|
|
if (aResolution != bResolution) {
|
|
return bResolution.compareTo(aResolution);
|
|
}
|
|
|
|
// 3. En cas d'égalité de résolution, privilégier le meilleur ratio (plus proche de 1.5)
|
|
final idealRatio = 1.5;
|
|
final aDiff = (aRatio - idealRatio).abs();
|
|
final bDiff = (bRatio - idealRatio).abs();
|
|
|
|
return aDiff.compareTo(bDiff);
|
|
}
|
|
|
|
/// Reproduit l'algorithme de génération de termes de recherche
|
|
List<String> _generateSearchTerms(String location) {
|
|
final terms = <String>[];
|
|
|
|
// Ajouter des termes spécifiques pour les villes connues
|
|
final citySpecificTerms = _getCitySpecificTerms(location.toLowerCase());
|
|
terms.addAll(citySpecificTerms);
|
|
|
|
// Termes génériques avec attractions
|
|
terms.addAll([
|
|
'$location attractions touristiques monuments',
|
|
'$location landmarks',
|
|
'$location tourist attractions',
|
|
'$location monuments historiques',
|
|
'$location points d\'intérêt',
|
|
'$location centre ville',
|
|
'$location skyline',
|
|
location, // Terme original en dernier
|
|
]);
|
|
|
|
return terms;
|
|
}
|
|
|
|
/// Reproduit les termes spécifiques pour des villes connues
|
|
List<String> _getCitySpecificTerms(String location) {
|
|
final specific = <String>[];
|
|
|
|
if (location.contains('paris')) {
|
|
specific.addAll([
|
|
'Tour Eiffel Paris',
|
|
'Arc de Triomphe Paris',
|
|
'Notre-Dame Paris',
|
|
'Louvre Paris',
|
|
'Champs-Élysées Paris',
|
|
]);
|
|
} else if (location.contains('london') || location.contains('londres')) {
|
|
specific.addAll([
|
|
'Big Ben London',
|
|
'Tower Bridge London',
|
|
'London Eye',
|
|
'Buckingham Palace London',
|
|
'Tower of London',
|
|
]);
|
|
} else if (location.contains('rome') || location.contains('roma')) {
|
|
specific.addAll([
|
|
'Colosseum Rome',
|
|
'Trevi Fountain Rome',
|
|
'Vatican Rome',
|
|
'Pantheon Rome',
|
|
]);
|
|
} else if (location.contains('new york') || location.contains('nyc')) {
|
|
specific.addAll([
|
|
'Statue of Liberty New York',
|
|
'Empire State Building New York',
|
|
'Times Square New York',
|
|
'Brooklyn Bridge New York',
|
|
]);
|
|
} else if (location.contains('tokyo') || location.contains('japon')) {
|
|
specific.addAll([
|
|
'Tokyo Tower',
|
|
'Senso-ji Temple Tokyo',
|
|
'Shibuya Crossing Tokyo',
|
|
'Tokyo Skytree',
|
|
]);
|
|
}
|
|
|
|
return specific;
|
|
}
|