
    i                         d Z ddlZddlZddlmZ ddlZ eej                  j                  dd            Zdedz  fdZ	dedz  fdZ
 G d	 d
      Z G d d      Z G d d      Z G d d      Zy)u|   gstack 분석 검증 테스트 (task-837.1)

보고서의 핵심 내용이 올바르게 작성되었는지 검증합니다.
    N)PathWORKSPACE_ROOTz/home/jay/workspacereturnc                      t        t        dz  dz  dz        } t        t        j                  |       d      }|rt	        |d         S dS )uD   gstack-analysis 보고서를 찾는다 (날짜 하드코딩 없이).memoryreportszgstack-analysis-*.mdT)reverser   N)strr   sortedglobr   )patternmatchess     K/home/jay/workspace/.worktrees/task-2116-dev1/tests/test_gstack_analysis.py_find_gstack_reportr      sG    .8+i7:PPQGTYYw'6G&4
0D0    c                      t         dz  dz  dz  } | j                         r| S t         dz  dz  dz  }|j                         r|S y)uM   task-837.1 done 파일을 표준 경로와 구 경로 모두에서 찾는다.r   eventsztask-837.1.doneteamsdev3N)r   exists)standardlegacys     r   _find_done_filer      sN     (836GGHg%.1BBF}}r   c                        e Zd ZdZddZddZy)TestGstackReportExistsu%   보고서 파일 존재 여부 검증Nc                 N    t               }|J d       |j                         sJ y)u+   보고서 파일이 생성되어야 한다.Nu9   gstack-analysis-*.md 보고서를 찾을 수 없습니다)r   r   selfreport_paths     r   test_report_file_existsz.TestGstackReportExists.test_report_file_exists&   s.    )+&c(cc&!!###r   c                     t               }|t        j                  d       |j                         }t	        |      dkD  sJ d       d|v sJ d       y)u(   보고서에 내용이 있어야 한다.N0   gstack-analysis 보고서 파일이 없습니다i  zReport content too shortgstackzReport missing 'gstack' keyword)r   pytestskip	read_textlen)r   r   contents      r   test_report_has_contentz.TestGstackReportExists.test_report_has_content,   sW    )+KKJK'')7|d">$>>"7"E$EE"r   r   N)__name__
__module____qualname____doc__r    r)    r   r   r   r   #   s    /$Fr   r   c                       e Zd ZdZej
                  defd       ZdeddfdZdeddfdZ	deddfdZ
deddfd	Zdeddfd
ZdeddfdZy)TestGstackReportSectionsu   보고서 섹션 구조 검증r   c                 d    t               }|t        j                  d       |j                         S Nr"   r   r$   r%   r&   r   s     r   report_contentz'TestGstackReportSections.report_content9   ,    )+KKJK$$&&r   r5   Nc                     d|v sd|v sJ yy)u"   개요 섹션이 있어야 한다.u   개요z## 1Nr/   r   r5   s     r   test_has_overview_sectionz2TestGstackReportSections.test_has_overview_section@   s    >)V~-EEE-E)r   c                     d|v sd|v sJ yy)u(   아키텍처 섹션이 있어야 한다.u   아키텍처ArchitectureNr/   r8   s     r   test_has_architecture_sectionz6TestGstackReportSections.test_has_architecture_sectionD   s    />^3SSS3S/r   c                 $    d|v sd|v sd|v sJ yyy)u"   스킬 섹션이 있어야 한다.u   스킬Skillsz## 3Nr/   r8   s     r   test_has_skills_sectionz0TestGstackReportSections.test_has_skills_sectionH   s(    >)X-G6UcKcccKc-G)r   c                 $    d|v sd|v sd|v sJ yyy)u"   철학 섹션이 있어야 한다.u   철학
PhilosophyBoil the LakeNr/   r8   s     r   test_has_philosophy_sectionz4TestGstackReportSections.test_has_philosophy_sectionL   s(    >)\^-KbpOpppOp-K)r   c                 $    d|v sd|v sd|v sJ yyy)u"   비교 섹션이 있어야 한다.u   비교
Comparisonu   우리 시스템Nr/   r8   s     r   test_has_comparison_sectionz4TestGstackReportSections.test_has_comparison_sectionP   s)    >)\^-KOaesOsssOs-K)r   c                     d|v sd|v sJ yy)u"   결론 섹션이 있어야 한다.u   결론
ConclusionNr/   r8   s     r   test_has_conclusion_sectionz4TestGstackReportSections.test_has_conclusion_sectionT   s    >)\^-KKK-K)r   )r+   r,   r-   r.   r$   fixturer
   r5   r9   r<   r?   rC   rF   rI   r/   r   r   r1   r1   6   s    (^^' ' 'F F FTC TD Tdc dd dq# q$ qt# t$ tL# L$ Lr   r1   c                       e Zd ZdZej
                  defd       ZdeddfdZdeddfdZ	deddfdZ
deddfd	Zdeddfd
ZdeddfdZdeddfdZy)TestGstackKeyConceptsu"   핵심 개념 포함 여부 검증r   c                 d    t               }|t        j                  d       |j                         S r3   r4   r   s     r   r5   z$TestGstackKeyConcepts.report_content\   r6   r   r5   Nc                     d|v sd|v sJ yy)u/   Boil the Lake 철학이 언급되어야 한다.rB   u   호수를 끓여라Nr/   r8   s     r   test_boil_the_lake_mentionedz2TestGstackKeyConcepts.test_boil_the_lake_mentionedc   s    .04I^4[[[4[0r   c                     d|v sd|v sJ yy)u1   Search Before Building이 언급되어야 한다.zSearch Before Buildingu   만들기 전에 검색Nr/   r8   s     r   %test_search_before_building_mentionedz;TestGstackKeyConcepts.test_search_before_building_mentionedg   s    '>9=VZh=hhh=h9r   c                     d|v sd|v sJ yy)u(   Ref 시스템이 언급되어야 한다.Refz@e1Nr/   r8   s     r   test_ref_system_mentionedz/TestGstackKeyConcepts.test_ref_system_mentionedk   s    &%>*AAA*A&r   c                     d|v sd|v sJ yy)u$   Fix-First가 언급되어야 한다.z	Fix-FirstzAUTO-FIXNr/   r8   s     r   test_fix_first_mentionedz.TestGstackKeyConcepts.test_fix_first_mentionedo   s    n,
n0LLL0L,r   c                     d|v sd|v sJ yy)u#   Preamble이 언급되어야 한다.PreamblepreambleNr/   r8   s     r   test_preamble_mentionedz-TestGstackKeyConcepts.test_preamble_mentioneds   s    ^+z^/KKK/K+r   c                 6    d|v sd|j                         v sJ yy)u$   Garry Tan이 언급되어야 한다.z	Garry TangarrytanN)lowerr8   s     r   test_garry_tan_mentionedz.TestGstackKeyConcepts.test_garry_tan_mentionedw   s&    n,
n>R>R>T0TTT0T,r   c                     d|v sd|v sJ yy)u'   Y Combinator가 언급되어야 한다.zY CombinatorYCNr/   r8   s     r   test_y_combinator_mentionedz1TestGstackKeyConcepts.test_y_combinator_mentioned{   s    /4>3III3I/r   )r+   r,   r-   r.   r$   rJ   r
   r5   rO   rQ   rT   rV   rZ   r^   ra   r/   r   r   rL   rL   Y   s    ,^^' ' '\3 \4 \iC iD iB B BMs Mt MLc Ld LUs Ut UJ# J$ Jr   rL   c                        e Zd ZdZddZddZy)TestDoneFileu   완료 파일 검증Nc                 *    t               }|J d       y)u(   완료 파일이 생성되어야 한다.NuU   task-837.1 done 파일을 찾을 수 없습니다 (memory/events/ 또는 teams/dev3/))r   )r   	done_paths     r   test_done_file_existsz"TestDoneFile.test_done_file_exists   s    #%	$}&}}$r   c                     t               }|t        j                  d       |j                         j	                         }|dk(  xs |j                  d      xr d|v }|sJ d|dd         y)u,   완료 파일 내용이 유효해야 한다.Nu&   task-837.1 done 파일이 없습니다done{task_idu+   done 파일 내용이 유효하지 않음: d   )r   r$   r%   r&   strip
startswith)r   re   r(   is_valids       r   test_done_file_contentz#TestDoneFile.test_done_file_content   su    #%	KK@A%%'--/f$Z););C)@)YYRYEYVFwtPS}oVVxr   r*   )r+   r,   r-   r.   rf   ro   r/   r   r   rc   rc      s    ~
Wr   rc   )r.   r   ospathlibr   r$   environgetr   r   r   r   r1   rL   rc   r/   r   r   <module>rt      s   
  	  bjjnn%57LMN1TD[ 1
 
F F& L  LF$J $JNW Wr   