Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 26 additions & 10 deletions core/lib/src/converter.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,27 @@ import 'detector.dart' as detector;
import 'logger.dart' as logger;
import 'validator.dart';

const List<String> cdPlatformKeywords = [
const List<String> cdPlatforms = [
'PS1',
'Dreamcast',
'Saturn',
'Sega CD',
'PC-Engine CD',
'Neo Geo CD',
'CD',
'3DO',
'CD-i',
];

const List<String> dvdPlatforms = [
'PS2',
'Xbox',
'Xbox 360',
'PSP',
'GameCube',
'Wii',
'Wii U',
'DVD',
];

const Map<String, String> chdCdCompression = {
Expand Down Expand Up @@ -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';
Expand Down
59 changes: 59 additions & 0 deletions core/test/detector_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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<int>.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<int>.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);
}
});
}
Loading