Fladder/test/util/subtitle_position_calculator_test.dart

104 lines
3 KiB
Dart

import 'package:flutter_test/flutter_test.dart';
import 'package:fladder/models/settings/subtitle_settings_model.dart';
import 'package:fladder/util/subtitle_position_calculator.dart';
void main() {
group('SubtitlePositionCalculator', () {
test('returns original offset when overlay is hidden', () {
const settings = SubtitleSettingsModel(verticalOffset: 0.2);
final result = SubtitlePositionCalculator.calculateOffset(
settings: settings,
showOverlay: false,
screenHeight: 800,
menuHeight: 120,
);
expect(result, equals(0.2));
});
test('uses dynamic menu height when available', () {
const settings = SubtitleSettingsModel(verticalOffset: 0.1);
final result = SubtitlePositionCalculator.calculateOffset(
settings: settings,
showOverlay: true,
screenHeight: 800,
menuHeight: 120, // 120/800 = 0.15 (15%)
);
// Should position at menu height + dynamic padding = (120/800) + (-0.03) = 0.12
expect(result, closeTo(0.12, 0.001));
});
test('uses fallback when menu height unavailable', () {
const settings = SubtitleSettingsModel(verticalOffset: 0.1);
final result = SubtitlePositionCalculator.calculateOffset(
settings: settings,
showOverlay: true,
screenHeight: 800,
menuHeight: null,
);
// Should use fallback: 0.15 + 0.01 = 0.16
expect(result, equals(0.16));
});
test('preserves user offset when already above menu', () {
const settings = SubtitleSettingsModel(verticalOffset: 0.3);
final result = SubtitlePositionCalculator.calculateOffset(
settings: settings,
showOverlay: true,
screenHeight: 800,
menuHeight: 120,
);
// Should keep original 0.3 since it's above menu area (0.12)
expect(result, equals(0.3));
});
test('clamps to maximum offset', () {
const settings = SubtitleSettingsModel(verticalOffset: 0.95);
final result = SubtitlePositionCalculator.calculateOffset(
settings: settings,
showOverlay: true,
screenHeight: 800,
menuHeight: 600, // Large menu that would push subtitles too high
);
// Should clamp to max 0.85
expect(result, equals(0.85));
});
test('handles zero screen height gracefully', () {
const settings = SubtitleSettingsModel(verticalOffset: 0.1);
final result = SubtitlePositionCalculator.calculateOffset(
settings: settings,
showOverlay: true,
screenHeight: 0,
menuHeight: 120,
);
// Should use fallback when screen height is invalid
expect(result, equals(0.16));
});
test('clamps to minimum offset', () {
const settings = SubtitleSettingsModel(verticalOffset: 0.05);
final result = SubtitlePositionCalculator.calculateOffset(
settings: settings,
showOverlay: true,
screenHeight: 800,
menuHeight: 120,
);
// Should not go below 0.0
expect(result, greaterThanOrEqualTo(0.0));
});
});
}