Files
plezy/test/media/media_display_criteria_test.dart

128 lines
5.1 KiB
Dart

import 'package:flutter_test/flutter_test.dart';
import 'package:plezy/media/media_display_criteria.dart';
void main() {
group('classifyMediaDisplayColor', () {
final cases = [
const _ColorCase('Dolby Vision', MediaDisplayColorType.dolbyVision, isDolbyVision: true),
const _ColorCase(
'Dolby Vision ignores incidental SDR tags',
MediaDisplayColorType.dolbyVision,
isDolbyVision: true,
primaries: 'bt709',
),
const _ColorCase('HLG compatibility ID', MediaDisplayColorType.hlg, doviCompatibilityId: 4),
const _ColorCase('HLG range', MediaDisplayColorType.hlg, range: 'HLG'),
const _ColorCase('ARIB transfer', MediaDisplayColorType.hlg, transfer: 'ARIB-STD-B67'),
const _ColorCase('HDR10 compatibility ID', MediaDisplayColorType.pq, doviCompatibilityId: 1),
const _ColorCase('PQ compatibility ID', MediaDisplayColorType.pq, doviCompatibilityId: 6),
const _ColorCase('HDR10 range', MediaDisplayColorType.pq, range: 'DOVIWithHDR10Plus'),
const _ColorCase('PQ transfer', MediaDisplayColorType.pq, transfer: 'PQ'),
const _ColorCase('SMPTE 2084 transfer', MediaDisplayColorType.pq, transfer: 'smpte2084'),
const _ColorCase('ST 2084 transfer', MediaDisplayColorType.pq, transfer: 'ST-2084'),
const _ColorCase('BT.2020 primaries', MediaDisplayColorType.pq, primaries: 'BT.2020'),
const _ColorCase('BT.2020 matrix', MediaDisplayColorType.pq, matrix: 'bt2020nc'),
const _ColorCase('SDR compatibility ID', MediaDisplayColorType.sdr, doviCompatibilityId: 2),
const _ColorCase('SDR range', MediaDisplayColorType.sdr, range: 'SDR'),
const _ColorCase('BT.709 primaries', MediaDisplayColorType.sdr, primaries: 'BT.709'),
const _ColorCase('assumed SDR', MediaDisplayColorType.sdr, assumeSdr: true),
const _ColorCase('missing metadata', MediaDisplayColorType.unknown),
const _ColorCase('unrecognized metadata', MediaDisplayColorType.unknown, transfer: 'gamma22'),
const _ColorCase(
'HLG takes precedence over PQ and SDR',
MediaDisplayColorType.hlg,
doviCompatibilityId: 2,
transfer: 'arib-std-b67',
primaries: 'bt2020',
),
const _ColorCase(
'PQ takes precedence over SDR and Dolby Vision',
MediaDisplayColorType.pq,
isDolbyVision: true,
doviCompatibilityId: 2,
transfer: 'smpte2084',
),
const _ColorCase(
'SDR takes precedence over Dolby Vision',
MediaDisplayColorType.sdr,
isDolbyVision: true,
doviCompatibilityId: 2,
),
];
for (final testCase in cases) {
test(testCase.name, () {
expect(
classifyMediaDisplayColor(
isDolbyVision: testCase.isDolbyVision,
doviCompatibilityId: testCase.doviCompatibilityId,
range: testCase.range,
transfer: testCase.transfer,
primaries: testCase.primaries,
matrix: testCase.matrix,
assumeSdr: testCase.assumeSdr,
),
testCase.expected,
);
});
}
test('provides defaults and HDR state for every classification', () {
const expected = <MediaDisplayColorType, ({bool isHdr, MediaDisplayColorTags tags})>{
MediaDisplayColorType.dolbyVision: (isHdr: true, tags: (transfer: null, primaries: null, matrix: null)),
MediaDisplayColorType.hlg: (
isHdr: true,
tags: (transfer: 'arib-std-b67', primaries: 'bt2020', matrix: 'bt2020nc'),
),
MediaDisplayColorType.pq: (isHdr: true, tags: (transfer: 'smpte2084', primaries: 'bt2020', matrix: 'bt2020nc')),
MediaDisplayColorType.sdr: (isHdr: false, tags: (transfer: 'bt709', primaries: 'bt709', matrix: 'bt709')),
MediaDisplayColorType.unknown: (isHdr: false, tags: (transfer: null, primaries: null, matrix: null)),
};
expect(expected.keys, unorderedEquals(MediaDisplayColorType.values));
for (final entry in expected.entries) {
expect(entry.key.isHdr, entry.value.isHdr, reason: entry.key.name);
expect(entry.key.defaultTags, entry.value.tags, reason: entry.key.name);
}
});
});
group('MediaDisplayCriteria', () {
test('can prime native display criteria from frame rate and dimensions', () {
const criteria = MediaDisplayCriteria(fps: 23.976, width: 1920, height: 1080);
expect(criteria.canPrimeNativeDisplayCriteria, isTrue);
});
test('cannot prime native display criteria without dimensions', () {
const criteria = MediaDisplayCriteria(fps: 23.976);
expect(criteria.canPrimeNativeDisplayCriteria, isFalse);
});
});
}
class _ColorCase {
final String name;
final MediaDisplayColorType expected;
final bool isDolbyVision;
final int? doviCompatibilityId;
final String? range;
final String? transfer;
final String? primaries;
final String? matrix;
final bool assumeSdr;
const _ColorCase(
this.name,
this.expected, {
this.isDolbyVision = false,
this.doviCompatibilityId,
this.range,
this.transfer,
this.primaries,
this.matrix,
this.assumeSdr = false,
});
}