From b6193ab87ac55779aec236dbadfa7a98463a2090 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Mon, 5 Oct 2026 23:38:01 +0000 Subject: [PATCH 1/2] Catch unmapped platforms in CHD routing - Define explicit cdPlatforms and dvdPlatforms lists in converter.dart - Replace default createdvd fallback with strict platform check or media override - Raise error requiring --media cd or --media dvd for unmapped platforms - Add unit tests verifying unmapped platforms fail safely without --media Co-authored-by: ClausValcaTD <193546948+ClausValcaTD@users.noreply.github.com> --- core/lib/src/converter.dart | 36 ++++++++++++++++------- core/test/detector_test.dart | 57 ++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 10 deletions(-) diff --git a/core/lib/src/converter.dart b/core/lib/src/converter.dart index 1018a1a..c8b7dc4 100644 --- a/core/lib/src/converter.dart +++ b/core/lib/src/converter.dart @@ -12,13 +12,27 @@ import 'detector.dart' as detector; import 'logger.dart' as logger; import 'validator.dart'; -const List cdPlatformKeywords = [ +const List cdPlatforms = [ 'PS1', 'Dreamcast', 'Saturn', 'Sega CD', 'PC-Engine CD', 'Neo Geo CD', + 'CD', + '3DO', + 'CD-i', +]; + +const List dvdPlatforms = [ + 'PS2', + 'Xbox', + 'Xbox 360', + 'PSP', + 'GameCube', + 'Wii', + 'Wii U', + 'DVD', ]; const Map chdCdCompression = { @@ -215,22 +229,24 @@ class Converter { subCmd = 'createcd'; } else if (mediaOverride == 'dvd') { subCmd = 'createdvd'; - } else if (platform.toUpperCase() == 'CD') { + } else if (cdPlatforms.any( + (kw) => + platform.toLowerCase() == kw.toLowerCase() || + platform.toLowerCase().contains(kw.toLowerCase()), + )) { subCmd = 'createcd'; - } else if (platform.toUpperCase() == 'DVD') { + } else if (dvdPlatforms.any( + (kw) => + platform.toLowerCase() == kw.toLowerCase() || + platform.toLowerCase().contains(kw.toLowerCase()), + )) { subCmd = 'createdvd'; - } else if (cdPlatformKeywords.any((kw) => platform.contains(kw))) { - subCmd = 'createcd'; - } else if (platform == 'UNKNOWN' || - platform == 'Unknown Disc' || - platform.isEmpty) { + } else { final err = 'Error: Platform could not be detected. Please specify --media cd or --media dvd.'; _log('[ERROR] $err'); job.error = err; return false; - } else { - subCmd = 'createdvd'; } } else { subCmd = 'createcd'; diff --git a/core/test/detector_test.dart b/core/test/detector_test.dart index 884623e..e7a7f44 100644 --- a/core/test/detector_test.dart +++ b/core/test/detector_test.dart @@ -184,6 +184,7 @@ void main() { final xgdtoolPath = getToolPath('xgdtool'); expect(xgdtoolPath, isNotEmpty); }); + test('unknown_iso_conversion_without_media_fails_safely', () { final tmpDir = Directory.systemTemp.createTempSync('unknown_iso_conv_'); try { @@ -246,4 +247,60 @@ void main() { tmpDir.deleteSync(recursive: true); } }); + + test('unmapped_custom_platform_conversion_without_media_fails_safely', () { + final tmpDir = Directory.systemTemp.createTempSync('unmapped_platform_test_'); + try { + final isoPath = p.join(tmpDir.path, 'custom.iso'); + File(isoPath).writeAsBytesSync(List.filled(2048, 0)); + + final job = ConversionJob( + filepath: isoPath, + outputDir: tmpDir.path, + targetFormat: 'CHD', + forcePlatform: 'CustomConsoleX', + ); + + final converter = Converter(); + final success = converter.convert(job); + + expect(success, isFalse); + expect(job.status, equals('Failed')); + expect( + job.error, + equals( + 'Error: Platform could not be detected. Please specify --media cd or --media dvd.', + ), + ); + } finally { + tmpDir.deleteSync(recursive: true); + } + }); + + test('unmapped_custom_platform_conversion_with_media_override_succeeds', () { + final tmpDir = Directory.systemTemp.createTempSync('unmapped_platform_override_'); + try { + final isoPath = p.join(tmpDir.path, 'custom.iso'); + File(isoPath).writeAsBytesSync(List.filled(2048, 0)); + + saveConfig({'chdman': p.join(tmpDir.path, 'missing_chdman')}); + + final job = ConversionJob( + filepath: isoPath, + outputDir: tmpDir.path, + targetFormat: 'CHD', + forcePlatform: 'CustomConsoleX', + media: 'cd', + ); + + final converter = Converter(); + converter.convert(job); + + expect(job.error, contains('Tool not found')); + expect(job.error, isNot(contains('Platform could not be detected'))); + } finally { + saveConfig({}); + tmpDir.deleteSync(recursive: true); + } + }); } From 9e399fcca65b436b48b49bc92dc6799eb677f540 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Mon, 5 Oct 2026 23:40:47 +0000 Subject: [PATCH 2/2] Catch unmapped platforms in CHD routing - Define explicit cdPlatforms and dvdPlatforms lists in converter.dart - Replace default createdvd fallback with strict platform check or media override - Raise error requiring --media cd or --media dvd for unmapped platforms - Add unit tests verifying unmapped platforms fail safely without --media Co-authored-by: ClausValcaTD <193546948+ClausValcaTD@users.noreply.github.com> --- core/test/detector_test.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/test/detector_test.dart b/core/test/detector_test.dart index e7a7f44..78b0104 100644 --- a/core/test/detector_test.dart +++ b/core/test/detector_test.dart @@ -249,7 +249,8 @@ void main() { }); test('unmapped_custom_platform_conversion_without_media_fails_safely', () { - final tmpDir = Directory.systemTemp.createTempSync('unmapped_platform_test_'); + final tmpDir = + Directory.systemTemp.createTempSync('unmapped_platform_test_'); try { final isoPath = p.join(tmpDir.path, 'custom.iso'); File(isoPath).writeAsBytesSync(List.filled(2048, 0)); @@ -278,7 +279,8 @@ void main() { }); test('unmapped_custom_platform_conversion_with_media_override_succeeds', () { - final tmpDir = Directory.systemTemp.createTempSync('unmapped_platform_override_'); + final tmpDir = + Directory.systemTemp.createTempSync('unmapped_platform_override_'); try { final isoPath = p.join(tmpDir.path, 'custom.iso'); File(isoPath).writeAsBytesSync(List.filled(2048, 0));