// Author: fruit.com.cn import 'dart:math'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:fruitshorts/app.dart'; import 'package:fruitshorts/core/theme/app_colors.dart'; import 'package:fruitshorts/core/theme/app_dimens.dart'; import 'package:fruitshorts/core/theme/app_theme.dart'; double _contrast(Color foreground, Color background) { final first = foreground.computeLuminance(); final second = background.computeLuminance(); return (max(first, second) + 0.05) / (min(first, second) + 0.05); } void main() { test('should_expose_dark_visual_tokens', () { expect(AppColors.blue, const Color(0xFFFF6B2C)); expect(AppColors.bluePressed, const Color(0xFFE55A1F)); expect(AppColors.secondary, const Color(0xFFB0B0B0)); expect(AppColors.ink, const Color(0xFF000000)); expect(AppColors.card, const Color(0xFF16161A)); expect(AppColors.cardAlt, const Color(0xFF101010)); expect(AppColors.raised, const Color(0xFF1C1C1E)); expect(AppColors.border, const Color(0xFF1C1C1E)); expect(AppColors.skeletonSurface, const Color(0xFF0E0E0E)); expect(AppColors.skeletonMedia, const Color(0xFF1C1C1E)); expect(AppColors.textPrimary, const Color(0xFFFFFFFF)); expect(AppColors.textSecondary, const Color(0xFFB0B0B0)); expect(AppColors.textTertiary, const Color(0xFF8E8E93)); expect(AppColors.onSurface, const Color(0xEBFFFFFF)); expect(AppColors.muted, const Color(0xA3FFFFFF)); expect(AppColors.subtle, const Color(0x61FFFFFF)); expect(AppDimens.cardRadius, 12); expect(AppDimens.buttonRadius, 10); expect(AppDimens.inputRadius, 10); expect(AppDimens.chipRadius, 6); }); test('should_keep_primary_and_secondary_text_readable_on_dark', () { expect( _contrast(AppColors.onSurface, AppColors.ink), greaterThanOrEqualTo(4.5), ); expect( _contrast(AppColors.onSurface, AppColors.card), greaterThanOrEqualTo(4.5), ); expect(_contrast(AppColors.muted, AppColors.card), greaterThanOrEqualTo(3)); expect(_contrast(AppColors.gold, AppColors.ink), greaterThanOrEqualTo(3)); expect(_contrast(AppColors.blue, AppColors.ink), greaterThanOrEqualTo(3)); }); test('should_use_dark_color_scheme_and_light_system_icons', () { final theme = AppTheme.dark(); expect(theme.brightness, Brightness.dark); expect(theme.colorScheme.primary, AppColors.blue); expect(theme.colorScheme.onPrimary, AppColors.onPrimary); expect(theme.colorScheme.secondary, AppColors.secondary); expect(theme.colorScheme.surface, AppColors.ink); expect(theme.colorScheme.onSurface, AppColors.onSurface); expect(theme.colorScheme.outline, AppColors.border); expect(theme.scaffoldBackgroundColor, AppColors.ink); expect(theme.appBarTheme.backgroundColor, AppColors.transparent); expect(theme.appBarTheme.systemOverlayStyle, SystemUiOverlayStyle.light); expect(theme.cardTheme.elevation, 0); expect(theme.dialogTheme.backgroundColor, AppColors.raised); expect( theme.bottomNavigationBarTheme.backgroundColor, AppColors.navBackground, ); expect(theme.inputDecorationTheme.fillColor, AppColors.input); }); test('should_use_ink_navigation_bar_with_light_icons', () { expect(appSystemOverlayStyle.statusBarColor, Colors.transparent); expect(appSystemOverlayStyle.statusBarIconBrightness, Brightness.light); expect(appSystemOverlayStyle.systemNavigationBarColor, AppColors.ink); expect( appSystemOverlayStyle.systemNavigationBarDividerColor, Colors.transparent, ); expect( appSystemOverlayStyle.systemNavigationBarIconBrightness, Brightness.light, ); expect(appSystemOverlayStyle.systemNavigationBarContrastEnforced, isFalse); final sheetTheme = AppTheme.dark().bottomSheetTheme; expect(sheetTheme.backgroundColor, Colors.transparent); expect(sheetTheme.modalBackgroundColor, Colors.transparent); expect(sheetTheme.surfaceTintColor, Colors.transparent); }); test('should_expose_flat_page_gradient_without_card_shadow', () { expect(AppTheme.pageGradient.colors, [ AppColors.mineGradientTop, AppColors.mineGradientMiddle, AppColors.mineGradientBottom, ]); expect(AppTheme.pageGradient.stops, [0, 0.4, 0.75]); expect(AppTheme.cardShadow.color, AppColors.cardShadow); expect(AppTheme.cardShadow.blurRadius, 0); expect(AppTheme.cardShadow.offset, Offset.zero); }); }