mirror of
https://github.com/gabehf/Fladder.git
synced 2026-03-07 21:48:14 -08:00
104 lines
3 KiB
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));
|
|
});
|
|
});
|
|
}
|