LCOV - code coverage report
Current view: top level - lib/utils - test_utils.dart Coverage Total Hit
Test: lcov.info Lines: 60.0 % 30 18
Test Date: 2025-08-12 03:21:51 Functions: - 0 0

            Line data    Source code
       1              : import 'dart:async';
       2              : 
       3              : import 'package:flutter/foundation.dart';
       4              : import 'package:flutter/material.dart';
       5              : import 'package:flutter/scheduler.dart';
       6              : import 'package:flutter_test/flutter_test.dart' as flutter_test;
       7              : 
       8              : /// 테스트 환경에서 사용할 유틸리티 함수들을 제공하는 클래스
       9              : class TestUtils {
      10              :   /// 테스트 모드 강제 설정 (테스트에서 명시적으로 설정 가능)
      11              :   static bool _forceTestMode = false;
      12              :   
      13              :   /// 테스트 모드 강제 설정
      14           12 :   static void setTestMode(bool isTest) {
      15              :     _forceTestMode = isTest;
      16              :   }
      17              :   
      18              :   /// 현재 테스트 환경인지 확인 (개선된 버전)
      19           15 :   static bool get isInTest {
      20              :     // 강제 설정된 경우 해당 값 반환
      21              :     if (_forceTestMode) {
      22              :       return true;
      23              :     }
      24              :     
      25              :     // 다양한 방법으로 테스트 환경 감지 시도
      26              :     try {
      27              :       // 방법 1: flutter_test 라이브러리의 속성 확인
      28              :       return flutter_test.WidgetController.hitTestWarningShouldBeFatal;
      29              :     } catch (_) {
      30              :       try {
      31              :         // 방법 2: 테스트 환경에서만 존재하는 Zone 속성 확인
      32            0 :         return Zone.current['_testZoneSpecification'] != null;
      33              :       } catch (_) {
      34              :         try {
      35              :           // 방법 3: 디버그 모드 확인 (완벽한 방법은 아니지만 대안)
      36              :           return kDebugMode;
      37              :         } catch (_) {
      38              :           return false;
      39              :         }
      40              :       }
      41              :     }
      42              :   }
      43              :   
      44              :   /// 테스트용 고정 해시 생성 (테스트에서 예측 가능한 결과를 위해)
      45              :   static int _testHashCounter = 0;
      46              :   
      47              :   /// 테스트 환경에서 사용할 예측 가능한 해시 생성
      48            1 :   static String getTestHash() {
      49            1 :     _testHashCounter++;
      50            2 :     final counter = _testHashCounter.toString().padLeft(2, '0');
      51            1 :     return 'test$counter';
      52              :   }
      53              :   
      54              :   /// 현재 타이머가 활성화되어 있는지 확인
      55              :   /// 테스트 종료 시 !timersPending assertion 실패 원인 추적용
      56            1 :   static bool isTimerPending() {
      57              :     try {
      58              :       // flutter_test 라이브러리의 테스트 환경에서만 사용 가능
      59            1 :       if (isInTest) {
      60              :         // Zone 속성을 통해 타이머 상태 확인 시도
      61            1 :         final zone = Zone.current;
      62            1 :         if (zone['_timerCount'] != null) {
      63            0 :           return zone['_timerCount'] > 0;
      64              :         }
      65              :         
      66              :         // 다른 방법으로 타이머 상태 확인 시도
      67              :         try {
      68              :           // SchedulerBinding을 통해 프레임 스케줄링 상태 확인
      69            1 :           return SchedulerBinding.instance.hasScheduledFrame ||
      70            0 :                  SchedulerBinding.instance.transientCallbackCount > 0;
      71              :         } catch (_) {
      72              :           // 실패 시 기본값 반환
      73              :           return false;
      74              :         }
      75              :       }
      76              :     } catch (e) {
      77              :       if (kDebugMode) {
      78            0 :         debugPrint('타이머 상태 확인 중 오류: $e');
      79              :       }
      80              :     }
      81              :     
      82              :     // 테스트 환경이 아니거나 오류 발생 시 기본값 반환
      83              :     return false;
      84              :   }
      85              :   
      86              :   /// 테스트 환경에서 사용할 예측 가능한 해시 생성 (테스트 파일과의 호환성을 위한 별칭)
      87            1 :   static String generatePredictableHash() {
      88            1 :     return getTestHash();
      89              :   }
      90              : 
      91              :   /// 테스트 환경에서 애니메이션을 비활성화하는 위젯
      92            1 :   static Widget disableAnimations({required Widget child}) {
      93            1 :     if (!isInTest) {
      94              :       return child;
      95              :     }
      96              :     
      97            1 :     return MediaQuery(
      98              :       data: const MediaQueryData(
      99              :         textScaleFactor: 1.0,
     100              :         platformBrightness: Brightness.light,
     101              :         padding: EdgeInsets.zero,
     102              :         viewInsets: EdgeInsets.zero,
     103              :         devicePixelRatio: 1.0,
     104              :         size: Size(800, 600),
     105              :       ),
     106            1 :       child: AnimatedBuilder(
     107              :         animation: const AlwaysStoppedAnimation<double>(1.0),
     108            1 :         builder: (BuildContext context, Widget? child) {
     109              :           return child!;
     110              :         },
     111              :         child: child,
     112              :       ),
     113              :     );
     114              :   }
     115              : 
     116              :   /// 테스트 환경에서 안전하게 SnackBar를 표시하는 함수
     117            0 :   static void showSnackBarSafely(BuildContext context, SnackBar snackBar) {
     118            0 :     if (!isInTest) {
     119            0 :       ScaffoldMessenger.of(context).showSnackBar(snackBar);
     120              :       return;
     121              :     }
     122              :     
     123              :     // 테스트 환경에서는 SnackBar 표시 대신 로그만 출력
     124            0 :     debugPrint('테스트 환경에서 SnackBar 표시 (내용: ${snackBar.content})');
     125              :   }
     126              :   
     127              :   /// 테스트 환경에서 안전하게 현재 SnackBar를 숨기는 함수
     128            0 :   static void hideCurrentSnackBarSafely(BuildContext context) {
     129            0 :     if (!isInTest) {
     130            0 :       ScaffoldMessenger.of(context).hideCurrentSnackBar();
     131              :       return;
     132              :     }
     133              :     
     134              :     // 테스트 환경에서는 로그만 출력
     135            0 :     debugPrint('테스트 환경에서 현재 SnackBar 숨김');
     136              :   }
     137              : }
        

Generated by: LCOV version 2.3.1-1