142 lines
4.3 KiB
Dart
142 lines
4.3 KiB
Dart
|
|
import 'package:flutter_test/flutter_test.dart';
|
||
|
|
import 'package:smplayer/shared/widgets/version_grouping.dart';
|
||
|
|
import 'package:smplayer/shared/widgets/version_source_card.dart';
|
||
|
|
|
||
|
|
void main() {
|
||
|
|
VersionSourceCardData createEntry({
|
||
|
|
required String serverName,
|
||
|
|
required String sourceKey,
|
||
|
|
String? serverKey,
|
||
|
|
int? sizeBytes = 1000,
|
||
|
|
String resolutionLabel = '4K',
|
||
|
|
bool isCurrent = false,
|
||
|
|
bool selected = false,
|
||
|
|
}) {
|
||
|
|
return VersionSourceCardData(
|
||
|
|
topLabel: '$resolutionLabel SDR',
|
||
|
|
serverName: serverName,
|
||
|
|
serverKey: serverKey ?? sourceKey.split('|').first,
|
||
|
|
sourceKey: sourceKey,
|
||
|
|
sizeBytes: sizeBytes,
|
||
|
|
resolutionLabel: resolutionLabel,
|
||
|
|
isCurrent: isCurrent,
|
||
|
|
selected: selected,
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
group('groupVersionEntries', () {
|
||
|
|
test('merges equal size and resolution in source order', () {
|
||
|
|
final firstEntry = createEntry(
|
||
|
|
serverName: 'Server A',
|
||
|
|
sourceKey: 'server-a|source-a',
|
||
|
|
);
|
||
|
|
final secondEntry = createEntry(
|
||
|
|
serverName: 'Server B',
|
||
|
|
sourceKey: 'server-b|source-b',
|
||
|
|
);
|
||
|
|
|
||
|
|
final groups = groupVersionEntries([firstEntry, secondEntry]);
|
||
|
|
|
||
|
|
expect(groups, hasLength(1));
|
||
|
|
expect(groups.single.representative, same(firstEntry));
|
||
|
|
expect(groups.single.members, [firstEntry, secondEntry]);
|
||
|
|
expect(groups.single.serverNames, ['Server A', 'Server B']);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('does not merge sources without a positive file size', () {
|
||
|
|
final missingSizeEntry = createEntry(
|
||
|
|
serverName: 'Server A',
|
||
|
|
sourceKey: 'server-a|source-a',
|
||
|
|
sizeBytes: null,
|
||
|
|
);
|
||
|
|
final zeroSizeEntry = createEntry(
|
||
|
|
serverName: 'Server B',
|
||
|
|
sourceKey: 'server-b|source-b',
|
||
|
|
sizeBytes: 0,
|
||
|
|
);
|
||
|
|
|
||
|
|
final groups = groupVersionEntries([missingSizeEntry, zeroSizeEntry]);
|
||
|
|
|
||
|
|
expect(groups, hasLength(2));
|
||
|
|
expect(groups[0].members, [missingSizeEntry]);
|
||
|
|
expect(groups[1].members, [zeroSizeEntry]);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('keeps different resolution labels in separate groups', () {
|
||
|
|
final ultraHdEntry = createEntry(
|
||
|
|
serverName: 'Server A',
|
||
|
|
sourceKey: 'server-a|source-a',
|
||
|
|
);
|
||
|
|
final fullHdEntry = createEntry(
|
||
|
|
serverName: 'Server B',
|
||
|
|
sourceKey: 'server-b|source-b',
|
||
|
|
resolutionLabel: '1080P',
|
||
|
|
);
|
||
|
|
|
||
|
|
final groups = groupVersionEntries([ultraHdEntry, fullHdEntry]);
|
||
|
|
|
||
|
|
expect(groups, hasLength(2));
|
||
|
|
});
|
||
|
|
|
||
|
|
test('does not merge duplicate files from the same server', () {
|
||
|
|
final firstEntry = createEntry(
|
||
|
|
serverName: 'Server A',
|
||
|
|
sourceKey: 'server-a|source-a',
|
||
|
|
);
|
||
|
|
final secondEntry = createEntry(
|
||
|
|
serverName: 'Server A',
|
||
|
|
sourceKey: 'server-a|source-b',
|
||
|
|
);
|
||
|
|
|
||
|
|
final groups = groupVersionEntries([firstEntry, secondEntry]);
|
||
|
|
|
||
|
|
expect(groups, hasLength(2));
|
||
|
|
});
|
||
|
|
|
||
|
|
test(
|
||
|
|
'uses selected member as visible server without moving representative',
|
||
|
|
() {
|
||
|
|
final representative = createEntry(
|
||
|
|
serverName: 'Server A',
|
||
|
|
sourceKey: 'server-a|source-a',
|
||
|
|
);
|
||
|
|
final selectedMember = createEntry(
|
||
|
|
serverName: 'Server B',
|
||
|
|
sourceKey: 'server-b|source-b',
|
||
|
|
selected: true,
|
||
|
|
);
|
||
|
|
|
||
|
|
final group = groupVersionEntries([
|
||
|
|
representative,
|
||
|
|
selectedMember,
|
||
|
|
]).single;
|
||
|
|
|
||
|
|
expect(group.representative, same(representative));
|
||
|
|
expect(group.activeMember, same(selectedMember));
|
||
|
|
expect(group.displayData.serverName, 'Server B');
|
||
|
|
expect(group.displayData.sourceKey, 'server-b|source-b');
|
||
|
|
expect(group.displayData.selected, isTrue);
|
||
|
|
expect(group.displayData.mergedServerNames, ['Server A', 'Server B']);
|
||
|
|
},
|
||
|
|
);
|
||
|
|
|
||
|
|
test('propagates current state from any member to collapsed card', () {
|
||
|
|
final representative = createEntry(
|
||
|
|
serverName: 'Server A',
|
||
|
|
sourceKey: 'server-a|source-a',
|
||
|
|
);
|
||
|
|
final currentMember = createEntry(
|
||
|
|
serverName: 'Server B',
|
||
|
|
sourceKey: 'server-b|source-b',
|
||
|
|
isCurrent: true,
|
||
|
|
);
|
||
|
|
|
||
|
|
final group = groupVersionEntries([representative, currentMember]).single;
|
||
|
|
|
||
|
|
expect(group.hasCurrentMember, isTrue);
|
||
|
|
expect(group.displayData.isCurrent, isTrue);
|
||
|
|
expect(group.displayData.serverName, 'Server B');
|
||
|
|
});
|
||
|
|
});
|
||
|
|
}
|