
    ki                         d Z ddlZddlmc m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     1/home/jay/workspace/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                    t               }d}||u}|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      dz  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}}|j                  } |       }|sd	dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |      d
z  }t        t        j                  |            dx}}y)u+   보고서 파일이 생성되어야 한다.Nis notz%(py0)s is not %(py3)sreport_pathpy0py3u9   gstack-analysis-*.md 보고서를 찾을 수 없습니다
>assert %(py5)spy5zAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
})r"   py2py4)r   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgAssertionError_format_explanationr   )selfr    @py_assert2@py_assert1@py_format4@py_format6@py_assert3@py_format5s           r   test_report_file_existsz.TestGstackReportExists.test_report_file_exists&   s    )+"&c{$&ccc{$cccccc{ccc{ccc$ccc(ccccccc!!#!########{###{###!##########r   c                 *   t               }|t        j                  d       |j                         }t	        |      }d}||kD  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        j                  d	      d
z   d|iz  }t        t        j                  |            dx}x}}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }	t        j                  d      dz   d|	iz  }
t        t        j                  |
            dx}}y)u(   보고서에 내용이 있어야 한다.N0   gstack-analysis 보고서 파일이 없습니다i  )>)z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)slencontent)r"   py1r#   py6zReport content too shortz
>assert %(py8)spy8gstackin)z%(py1)s in %(py3)s)r>   r#   zReport missing 'gstack' keywordr$   r%   )r   pytestskip	read_textr<   r(   r)   r*   r+   r,   r-   r.   r/   r0   )r1   r    r=   r2   @py_assert5@py_assert4@py_format7@py_format9@py_assert0r4   r5   s              r   test_report_has_contentz.TestGstackReportExists.test_report_has_content,   s(   )+KKJK'')7|>d>|d">>>|d>>>>>>s>>>s>>>>>>7>>>7>>>|>>>d>>>$>>>>>>>>Ex7"EEEx7EEExEEEEEE7EEE7EEEE$EEEEEEEr   r   N)__name__
__module____qualname____doc__r8   rL    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   rD   rE   rF   r1   r    s     r   report_contentz'TestGstackReportSections.report_content9   ,    )+KKJK$$&&r   rY   Nc                    g }d}||v }|}|sd}||v }|}|sXt        j                  d|fd||f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      nddz  }dd|iz  }	|j                  |	       |st        j                  dfd	|f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      ndd
z  }
dd|
iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}x}x}}y)u"   개요 섹션이 있어야 한다.u   개요z## 1rB   z%(py3)s in %(py5)srY   r#   r%   %(py7)spy7z%(py10)s in %(py12)spy10py12%(py14)spy14   assert %(py17)spy17N
r(   r)   r-   r*   r+   r,   append_format_boolopr/   r0   r1   rY   r3   r2   rH   rK   @py_assert9@py_assert11r5   @py_format8@py_format13@py_format15@py_format16@py_format18s                 r   test_has_overview_sectionz2TestGstackReportSections.test_has_overview_section@   s    ExEx>)EVEV~-EEEEEx>EEExEEEEEE>EEE>EEEEEEEV~EEEVEEEEEE~EEE~EEEEEEEEEEEEEEr   c                    g }d}||v }|}|sd}||v }|}|sXt        j                  d|fd||f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      nddz  }dd|iz  }	|j                  |	       |st        j                  dfd	|f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      ndd
z  }
dd|
iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}x}x}}y)u(   아키텍처 섹션이 있어야 한다.u   아키텍처ArchitecturerB   r\   rY   r]   r^   r_   r`   ra   rd   re   rf   rg   rh   Nri   rl   s                 r   test_has_architecture_sectionz6TestGstackReportSections.test_has_architecture_sectionD   s    S~S~/S>S>^3SSSSS~SSS~SSSSSSSSSSSSSSSS>^SSS>SSSSSS^SSS^SSSSSSSSSSSSSSr   c                 4   g }d}||v }|}|sd}||v }|}|sd}||v }	|	}|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      nddz  }
dd	|
iz  }|j                  |       |st        j                  dfd
|f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      nddz  }dd|iz  }|j                  |       |st        j                  d	fd|f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      nddz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}x}x}x}x}}	y)u"   스킬 섹션이 있어야 한다.u   스킬Skillsz## 3rB   r\   rY   r]   r^   r_   r`   ra   rd   re   z%(py17)s in %(py19)srh   py19%(py21)spy21rf   assert %(py24)spy24Nri   r1   rY   r3   r2   rH   rK   rm   rn   @py_assert16@py_assert18r5   ro   rp   rq   @py_format20@py_format22@py_format23@py_format25s                     r   test_has_skills_sectionz0TestGstackReportSections.test_has_skills_sectionH   s#   cxcx>)cXcX-Gc6c6UcKcccccx>cccxcccccc>ccc>ccccccccXcccXcccccccccccccccc6Ucccc6ccccccUccccUccccccccccccccccr   c                 4   g }d}||v }|}|sd}||v }|}|sd}||v }	|	}|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      nddz  }
dd	|
iz  }|j                  |       |st        j                  dfd
|f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      nddz  }dd|iz  }|j                  |       |st        j                  d	fd|f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      nddz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}x}x}x}x}}	y)u"   철학 섹션이 있어야 한다.u   철학
PhilosophyBoil the LakerB   r\   rY   r]   r^   r_   r`   ra   rd   re   rz   r{   r}   r~   rf   r   r   Nri   r   s                     r   test_has_philosophy_sectionz4TestGstackReportSections.test_has_philosophy_sectionL   s#   pxpx>)p\p\^-KppbpOpppppx>pppxpppppp>ppp>pppppppp\^ppp\pppppp^ppp^pppppppbppppppppppbppppbppppppppppppppppr   c                 4   g }d}||v }|}|sd}||v }|}|sd}||v }	|	}|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      nddz  }
dd	|
iz  }|j                  |       |st        j                  dfd
|f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      nddz  }dd|iz  }|j                  |       |st        j                  d	fd|f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      nddz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}x}x}x}x}}	y)u"   비교 섹션이 있어야 한다.u   비교
Comparisonu   우리 시스템rB   r\   rY   r]   r^   r_   r`   ra   rd   re   rz   r{   r}   r~   rf   r   r   Nri   r   s                     r   test_has_comparison_sectionz4TestGstackReportSections.test_has_comparison_sectionP   s'   sxsx>)s\s\^-KsOasOaesOsssssx>sssxssssss>sss>ssssssss\^sss\ssssss^sss^sssssssOaessssOassssssessssessssssssssssssssr   c                    g }d}||v }|}|sd}||v }|}|sXt        j                  d|fd||f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      nddz  }dd|iz  }	|j                  |	       |st        j                  dfd	|f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      ndd
z  }
dd|
iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}x}x}}y)u"   결론 섹션이 있어야 한다.u   결론
ConclusionrB   r\   rY   r]   r^   r_   r`   ra   rd   re   rf   rg   rh   Nri   rl   s                 r   test_has_conclusion_sectionz4TestGstackReportSections.test_has_conclusion_sectionT   s    KxKx>)K\K\^-KKKKKx>KKKxKKKKKK>KKK>KKKKKKK\^KKK\KKKKKK^KKK^KKKKKKKKKKKKKKr   )rN   rO   rP   rQ   rD   fixturer
   rY   rt   rw   r   r   r   r   rR   r   r   rT   rT   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   rT   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 rV   rW   rX   s     r   rY   z$TestGstackKeyConcepts.report_content\   rZ   r   rY   Nc                    g }d}||v }|}|sd}||v }|}|sXt        j                  d|fd||f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      nddz  }dd|iz  }	|j                  |	       |st        j                  dfd	|f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      ndd
z  }
dd|
iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}x}x}}y)u/   Boil the Lake 철학이 언급되어야 한다.r   u   호수를 끓여라rB   r\   rY   r]   r^   r_   r`   ra   rd   re   rf   rg   rh   Nri   rl   s                 r   test_boil_the_lake_mentionedz2TestGstackKeyConcepts.test_boil_the_lake_mentionedc   s    [[.0[4I[4I^4[[[[[.[[[[[[[[[.[[[.[[[[[[[4I^[[[4I[[[[[[^[[[^[[[[[[[[[[[[[[r   c                    g }d}||v }|}|sd}||v }|}|sXt        j                  d|fd||f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      nddz  }dd|iz  }	|j                  |	       |st        j                  dfd	|f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      ndd
z  }
dd|
iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}x}x}}y)u1   Search Before Building이 언급되어야 한다.zSearch Before Buildingu   만들기 전에 검색rB   r\   rY   r]   r^   r_   r`   ra   rd   re   rf   rg   rh   Nri   rl   s                 r   %test_search_before_building_mentionedz;TestGstackKeyConcepts.test_search_before_building_mentionedg   s    h'h'>9h=Vh=VZh=hhhhh'>hhh'hhhhhh>hhh>hhhhhhh=VZhhhh=VhhhhhhZhhhhZhhhhhhhhhhhhhhhr   c                    g }d}||v }|}|sd}||v }|}|sXt        j                  d|fd||f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      nddz  }dd|iz  }	|j                  |	       |st        j                  dfd	|f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      ndd
z  }
dd|
iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}x}x}}y)u(   Ref 시스템이 언급되어야 한다.Refz@e1rB   r\   rY   r]   r^   r_   r`   ra   rd   re   rf   rg   rh   Nri   rl   s                 r   test_ref_system_mentionedz/TestGstackKeyConcepts.test_ref_system_mentionedk   s    AuAu&A%A%>*AAAAAuAAAuAAAAAAAAAAAAAAAA%>AAA%AAAAAA>AAA>AAAAAAAAAAAAAAr   c                    g }d}||v }|}|sd}||v }|}|sXt        j                  d|fd||f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      nddz  }dd|iz  }	|j                  |	       |st        j                  dfd	|f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      ndd
z  }
dd|
iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}x}x}}y)u$   Fix-First가 언급되어야 한다.z	Fix-FirstzAUTO-FIXrB   r\   rY   r]   r^   r_   r`   ra   rd   re   rf   rg   rh   Nri   rl   s                 r   test_fix_first_mentionedz.TestGstackKeyConcepts.test_fix_first_mentionedo   s    L{L{n,L
L
n0LLLLL{nLLL{LLLLLLnLLLnLLLLLLL
nLLL
LLLLLLnLLLnLLLLLLLLLLLLLLr   c                    g }d}||v }|}|sd}||v }|}|sXt        j                  d|fd||f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      nddz  }dd|iz  }	|j                  |	       |st        j                  dfd	|f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      ndd
z  }
dd|
iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}x}x}}y)u#   Preamble이 언급되어야 한다.PreamblepreamblerB   r\   rY   r]   r^   r_   r`   ra   rd   re   rf   rg   rh   Nri   rl   s                 r   test_preamble_mentionedz-TestGstackKeyConcepts.test_preamble_mentioneds   s    KzKz^+KzKz^/KKKKKz^KKKzKKKKKK^KKK^KKKKKKKz^KKKzKKKKKK^KKK^KKKKKKKKKKKKKKr   c                 x   g }d}||v }|}|sd}|j                   } |       }||v }	|	}|st        j                  d|fd||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }
dd|
iz  }|j                  |       |st        j                  d	fd	f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                        t        j                  |      d
z  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}x}x}x}	x}}y)u$   Garry Tan이 언급되어야 한다.z	Garry TangarrytanrB   r\   rY   r]   r^   r_   )zJ%(py10)s in %(py16)s
{%(py16)s = %(py14)s
{%(py14)s = %(py12)s.lower
}()
})rb   rc   re   py16z%(py18)spy18rf   zassert %(py21)sr~   N)lowerr(   r)   r-   r*   r+   r,   rj   rk   r/   r0   )r1   rY   r3   r2   rH   rK   rm   @py_assert13@py_assert15rn   r5   ro   @py_format17@py_format19r   r   s                   r   test_garry_tan_mentionedz.TestGstackKeyConcepts.test_garry_tan_mentionedw   s    T{T{n,T
Tn>R>RT>R>TT
>T0TTTTT{nTTT{TTTTTTnTTTnTTTTTTT
>TTTT
TTTTTTnTTTnTTT>RTTT>TTTTTTTTTTTTTTTr   c                    g }d}||v }|}|sd}||v }|}|sXt        j                  d|fd||f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      nddz  }dd|iz  }	|j                  |	       |st        j                  dfd	|f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      ndd
z  }
dd|
iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}x}x}}y)u'   Y Combinator가 언급되어야 한다.zY CombinatorYCrB   r\   rY   r]   r^   r_   r`   ra   rd   re   rf   rg   rh   Nri   rl   s                 r   test_y_combinator_mentionedz1TestGstackKeyConcepts.test_y_combinator_mentioned{   s    I~I~/I4I4>3IIIII~III~IIIIIIIIIIIIIIII4>III4IIIIII>III>IIIIIIIIIIIIIIr   )rN   rO   rP   rQ   rD   r   r
   rY   r   r   r   r   r   r   r   rR   r   r   r   r   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   r   c                        e Zd ZdZddZddZy)TestDoneFileu   완료 파일 검증Nc                    t               }d}||u}|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      dz  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}}y)	u(   완료 파일이 생성되어야 한다.Nr   r   	done_pathr!   uU   task-837.1 done 파일을 찾을 수 없습니다 (memory/events/ 또는 teams/dev3/)r$   r%   )
r   r(   r)   r*   r+   r,   r-   r.   r/   r0   )r1   r   r2   r3   r4   r5   s         r   test_done_file_existsz"TestDoneFile.test_done_file_exists   sl    #%	 $}y$}}}y}}}}}}y}}}y}}}}}}&}}}}}}}r   c                    t               }|t        j                  d       |j                         j	                         }|dk(  xs |j                  d      xr d|v }|st        j                  d|dd        dz   d	d
t        j                         v st        j                  |      rt        j                  |      nd
iz  }t        t        j                  |            y)u,   완료 파일 내용이 유효해야 한다.Nu&   task-837.1 done 파일이 없습니다done{task_idu+   done 파일 내용이 유효하지 않음: d   z
>assert %(py0)sr"   is_valid)r   rD   rE   rF   strip
startswithr(   r.   r*   r+   r,   r-   r/   r0   )r1   r   r=   r   @py_format1s        r   test_done_file_contentz#TestDoneFile.test_done_file_content   s    #%	KK@A%%'--/f$Z););C)@)YYRYEYVVFwtPS}oVVVVVVVxVVVxVVVVVxr   rM   )rN   rO   rP   rQ   r   r   rR   r   r   r   r      s    ~
Wr   r   )rQ   builtinsr*   _pytest.assertion.rewrite	assertionrewriter(   r   ospathlibr   rD   environgetr   r   r   r   rT   r   r   rR   r   r   <module>r      s   
   	  bjjnn%57LMN1TD[ 1
 
F F& L  LF$J $JNW Wr   