diff --git a/ImageDescriber.Test/ImageScannerTests.cs b/ImageDescriber.Test/ImageScannerTests.cs index a2b46d5..816cfad 100644 --- a/ImageDescriber.Test/ImageScannerTests.cs +++ b/ImageDescriber.Test/ImageScannerTests.cs @@ -126,4 +126,30 @@ public void ScanForImagesRecognizesAllSupportedExtensions() Directory.Delete(tempDir, true); } } + + [TestMethod] + public void ScanForImagesMatchesExtensionsCaseInsensitively() + { + string tempDir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); + Directory.CreateDirectory(tempDir); + + try + { + File.WriteAllBytes(Path.Combine(tempDir, "IMG_0001.JPG"), [0xFF, 0xD8]); + File.WriteAllBytes(Path.Combine(tempDir, "screenshot.Png"), [0x89, 0x50]); + File.WriteAllBytes(Path.Combine(tempDir, "photo.jpeg"), [0xFF, 0xD8]); + File.WriteAllBytes(Path.Combine(tempDir, "scan.TIFF"), [0x49, 0x49]); + File.WriteAllText(Path.Combine(tempDir, "NOTES.TXT"), "text"); + + IReadOnlyList results = ImageScanner.ScanForImages(tempDir.As()); + + string[] names = [.. results.Select(r => Path.GetFileName(r.WeakString)).Order(StringComparer.Ordinal)]; + string[] expected = ["IMG_0001.JPG", "photo.jpeg", "scan.TIFF", "screenshot.Png"]; + CollectionAssert.AreEqual(expected, names); + } + finally + { + Directory.Delete(tempDir, true); + } + } } diff --git a/ImageDescriber/ImageScanner.cs b/ImageDescriber/ImageScanner.cs index 369a042..b9740de 100644 --- a/ImageDescriber/ImageScanner.cs +++ b/ImageDescriber/ImageScanner.cs @@ -39,7 +39,9 @@ internal static IReadOnlyList ScanForImages(AbsoluteDirectoryP continue; } - if (ImageExtensions.Contains(ext.As())) + // FileExtension compares ordinally, and cameras and Windows tools write .JPG/.PNG, + // so fold to the lower-case form the set holds before looking it up. + if (ImageExtensions.Contains(ext.ToLowerInvariant().As())) { imageFiles.Add(file.As()); }