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..78b0104 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,62 @@ 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); + } + }); }