
    i&                    H   d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
Z
ddlZddlZddlmZ ddlZ ee      j#                         j$                  d   Zedz  dz  ZddZdd	Zddd
Zdd	 	 	 	 	 	 	 	 	 ddZej2                  dd       Zd Zd Zd Zd Zd Zd Z d Z!d Z"y)u  tests/mixed_commit/test_detector.py — mixed_commit_detector 시나리오 테스트.

task-2459 Phase 2-C / dev5팀 닌기르수 (테스터).

scripts/mixed_commit_detector.py 의 5단계 알고리즘과 freeze/evidence 부수효과를
임시 git repo + subprocess 호출로 검증.

원칙:
  - 모듈 코드 read-only.
  - subprocess 로만 호출 (import 하지 않음 — CLI 동작 검증).
  - 각 시나리오는 독립 fixture 사용.
    )annotationsN)Path   scriptszmixed_commit_detector.pyc                N    t        j                  dg|t        |       ddd      S )NgitTFcwdcapture_outputtextcheck)
subprocessrunstr)r
   argss     Q/home/jay/workspace/.worktrees/task-2459-dev5/tests/mixed_commit/test_detector.py_gitr       s(    >>	CHTE     c                f   | dz  }|j                          t        dddd|       t        ddd	|       t        dd
d|       t        ddd|       |dz  j                  dd       t        dd|       t        dddd|       t        dd|      }|j                  j	                         }||fS )u   임시 git repo 초기화. 초기 commit 1개 생성하여 base ref 로 사용.

    Returns:
        (repo_path, base_sha): repo 경로와 base commit sha (origin/main 대용).
    repoinit-qz-bmainr
   configz
user.emailztest@example.comz	user.nametesterzcommit.gpgsignfalsez	README.mdzbase
utf-8encodingaddcommit-mzbase: initial	rev-parseHEAD)mkdirr   
write_textstdoutstrip)tmp_pathr   resbase_shas       r   	make_repor-   &   s     fDJJLtV.<!3>;d3#W$7 
K##Hw#?&4D9
{F
-Czz!H>r   c                |   |xs3 dt        |       dt        j                  d      j                          d}| |z  j	                  |dz   d       t        d|| 	       t        d
dd|| 	      }|j                  dk7  rt        d|j                         t        dd| 	      }|j                  j                         S )uF   repo 에 commit 추가. file 내용은 매 commit 다르도록 보장.f__   z.txt
r   r   r!   r   r"   r   r#   r   zcommit failed: r$   r%   )lenosurandomhexr'   r   
returncodeRuntimeErrorstderrr(   r)   )r   message	file_namefnamer+   sha_ress         r   
add_commitr>   <   s    F2c'l^1RZZ]->->-@,AFE	E\gnw?4 
xtW$
7C
~~_SZZL9::;D1G>>!!r   )	workspacec                   |xs |}t         j                  t        t              | dt        |      g|}t	        j
                  |t        |      ddd      S )u?   detector subprocess 실행. workspace 미지정 시 cwd 사용.z--workspaceTFr	   )sys
executabler   DETECTORr   r   )task_idr
   r?   
extra_argscmds        r   run_detectorrG   H   s\      SIHI 
C >>S$T r   c                    t        |       S )u-   초기 commit 1개를 가진 임시 git repo.)r-   )r*   s    r   repo_with_baserI   a   s     Xr   c                   | \  }}t        |d       t        dd||      }|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      d	z  }t        j                  d
|j                   d|j                         dz   d|iz  }t        t        j                  |            dx}x}}|dz  dz  dz  }	|	j                  } |       }| }
|
st        j                  d      dz   dt        j                         v st        j                  |	      rt        j                  |	      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            dx}x}}
|dz  dz  dz  }|j                         rt        |j!                  d            }g }||k(  }|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}}t#        j$                  |j                        }|d   }d}||v }|slt        j                  d |fd!||f      t        j                  |      t        j                  |      d"z  }d#d$|iz  }t        t        j                  |            dx}x}}|d%   }d}||k(  }|slt        j                  d|fd&||f      t        j                  |      t        j                  |      d"z  }d#d$|iz  }t        t        j                  |            dx}x}}y)'uX   S1 — clean: 단일 task 토큰만, alien 없음 → exit 0, freeze/evidence 미생성.z[task-2459] feat: A	task-2459--baser   r   ==z2%(py2)s
{%(py2)s = %(py0)s.returncode
} == %(py5)sr+   py0py2py5zstderr=z
stdout=
>assert %(py7)spy7N.taskslockstask-2459.frozenu$   clean 인데 freeze 마커 생성됨G
>assert not %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}frozenrQ   rR   py4evidencemixed-commit-*.jsonz%(py0)s == %(py3)sevsrQ   py3u!   clean 인데 evidence 생성됨: 
>assert %(py5)srS   status)cleanclean_with_untaggedinz%(py1)s in %(py4)spy1r\   assert %(py6)spy6rD   z%(py1)s == %(py4)s)r>   rG   r7   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgr9   r(   AssertionError_format_explanationexistslistglobjsonloads)rI   r   r,   r+   @py_assert1@py_assert4@py_assert3@py_format6@py_format8rZ   @py_assert5ev_dirr`   @py_assert2@py_format4payload@py_assert0@py_format5@py_format7s                      r   test_s1_clean_single_taskr   k   s   #ND(t*+
{HhD
AC>>KQK>QKKK>QKKKKKK3KKK3KKK>KKKQKKK'#**Yszzl KKKKKKKKH_w&);;F}}F}FFFF FFFFFFFvFFFvFFF}FFFFFFFFFH_z)K7F}}6;;456CsbyCCCsbCCCCCCsCCCsCCCbCCC=cUCCCCCCCjj$G8@ @@ @@@@@ @@@@@@@ @@@@@@@@9,,,,,,,,,,,,,,,,,,,r   c                	   | \  }}t        |d       t        |d       t        dd||      }|j                  }d}||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      d
z  }t        j                  d|j                   d|j                         dz   d|iz  }t        t        j                  |            dx}x}}|dz  dz  dz  }	|	j                  } |       }|st        j                  d      dz   dt        j                         v st        j                  |	      rt        j                  |	      ndt        j                  |      t        j                  |      dz  }
t        t        j                  |
            dx}}t        j                   |	j#                               }d}|d   }||v }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}}d}|d   }||v }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}}|d   }dg}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}}|dz  d z  dz  }t%        |j'                  d!            }t)        |      }d}||k\  }|st        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  }d'd(|iz  }t        t        j                  |            dx}x}}y))uA   S2 — mixed: 2 task 혼합 → exit 1, freeze + evidence 생성.[task-2459] A[task-9999] BrK   rL   r      rM   rO   r+   rP   stdout=
stderr=rT   rU   NrV   rW   rX   u5   mixed 감지 시 freeze 마커가 생성되어야 함zC
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}rZ   r[   mixed_tasksrg   ri   rj   rl   rm   	task-9999alien_tasksrn   r]   r^   >=z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)sr3   r`   rQ   rk   rb   rm   assert %(py8)spy8)r>   rG   r7   ro   rp   rq   rr   rs   rt   ru   r(   r9   rv   rw   rx   r{   r|   	read_textry   rz   r3   )rI   r   r,   r+   r}   r~   r   r   r   rZ   r   frozen_datar   r   r   r   r`   r   @py_format9s                      r   test_s2_mixed_two_tasksr      s   #ND(t_%t_%
{HhD
AC>>KQK>QKKK>QKKKKKK3KKK3KKK>KKKQKKK'#**Yszzl KKKKKKKKH_w&);;F==S=?S?SSSSSSSSS6SSS6SSS=SSS?SSSSSS **V--/0K4+m44;44444;4444;444444444444+m44;44444;4444;44444444444}%6+6%6666%666%6666666666 H_z)K7F
v{{01
2Cs8q8q=8q33ss8qr   c                   | \  }}t        |d       t        |d       t        dd||      }|j                  }d}||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      d
z  }t        j                  d|j                   d|j                         dz   d|iz  }t        t        j                  |            dx}x}}|dz  dz  dz  }	|	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}x}}
t        j                   |j                        }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)uK   S3 — token 없는 commit 은 alien 으로 간주하지 않음 → exit 0.z#random commit message without tokenr   rK   rL   r   r   rM   rO   r+   rP   r   r   rT   rU   NrV   rW   rX   zEassert not %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}rZ   r[   rd   rf   rn   rj   rl   rm   untagged_commit_countr   )r>   rG   r7   ro   rp   rq   rr   rs   rt   ru   r(   r9   rv   rw   rx   r{   r|   )rI   r   r,   r+   r}   r~   r   r   r   rZ   r   r   r   r   r   r   s                   r   "test_s3_untagged_commits_not_alienr      s   #ND(t:;t_%
{HhD
AC>>KQK>QKKK>QKKKKKK3KKK3KKK>KKKQKKK'#**Yszzl KKKKKKKKH_w&);;F}}}vv}jj$G85 55 55555 5555555 55555555*+0q0+q0000+q000+000q0000000r   c                   | \  }}t        |d       t        |d       t        dd||      }|j                  }d}||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}|dz  dz  dz  }	t        j                  |	j                               }
dD ]  }||
v }|st        j                  d|fd||
f      dt        j                         v st        j                  |      rt        j                  |      nd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} |
j                  d      xs |
j                  d      }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}}g }|j                   }d#} ||      }|}|rd$}||v }|}|s`d%dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      d&z  }|j#                  |       |rt        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}}g }|
d.   }t'        |t(              }|}|r|
d.   }|}|s<d/d0t        j                         v st        j                  t&              rt        j                  t&              nd0t        j                  |      d1t        j                         v st        j                  t(              rt        j                  t(              nd1t        j                  |      d2z  }|j#                  |       |r+d3d4t        j                        iz  }|j#                  |       t        j$                  |d+      i z  }d5d6|iz  }t        t        j                  |            dx}x}x}x}}|
d.   D ]  }g }d7}||v }|}|rd8}||v } | }| rd9}!|!|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#                  |       |rt        j                  d fd>||f      t        j                  |      d;t        j                         v st        j                  |      rt        j                  |      nd;d?z  }#d@dA|#iz  }$|j#                  |$       | rt        j                  d"fdB!|f      t        j                  |!      d;t        j                         v st        j                  |      rt        j                  |      nd;dCz  }%dDdE|%iz  }&|j#                  |&       t        j$                  |d+      i z  }'dFdG|'iz  }(t        t        j                  |(            dx}x}x}x}x}x} x}!}"|d9   }t'        |t(              }|sdHd0t        j                         v st        j                  t&              rt        j                  t&              nd0t        j                  |      d1t        j                         v st        j                  t(              rt        j                  t(              nd1t        j                  |      dIz  }t        t        j                  |            dx}} y)Ju*   S4 — freeze 마커 필수 필드 검증.r   r   rK   rL   r   r   rM   rO   r+   rP   assert %(py7)srU   NrV   rW   rX   )rD   r   r   r,   head_shacommitsrg   )z%(py0)s in %(py2)skeydata)rQ   rR   u   freeze marker 필드 누락: z
>assert %(py4)sr\   	frozen_atverified_at)is not)z%(py0)s is not %(py3)sts_fieldra   u5   타임스탬프 필드 부재 (frozen_at/verified_at)rc   rS   ZTzC%(py8)s
{%(py8)s = %(py4)s
{%(py4)s = %(py2)s.endswith
}(%(py6)s)
})rR   r\   rm   r   )z%(py11)s in %(py13)s)py11py13z%(py15)spy15r   zassert %(py18)spy18r   z.%(py7)s
{%(py7)s = %(py2)s(%(py4)s, %(py5)s)
}
isinstancery   )rR   r\   rS   rU   z%(py10)spy10zassert %(py13)sr   shasubjecttokens)z%(py3)s in %(py5)sc)rb   rS   z%(py7)s)z%(py10)s in %(py12)s)r   py12z%(py14)spy14)z%(py17)s in %(py19)s)py17py19z%(py21)spy21zassert %(py24)spy24z5assert %(py5)s
{%(py5)s = %(py0)s(%(py2)s, %(py3)s)
})rQ   rR   rb   rS   )r>   rG   r7   ro   rp   rq   rr   rs   rt   rv   rw   r{   r|   r   ru   getendswithappend_format_boolopr   ry   ))rI   r   r,   r+   r}   r~   r   r   r   rZ   r   r   @py_format3r   r   r   r   r   @py_assert7r   @py_assert10@py_assert12r   @py_format14@py_format16@py_format17@py_format19@py_assert6@py_assert9@py_format11@py_format12r   @py_assert11@py_assert16@py_assert18@py_format13@py_format15@py_format20@py_format22@py_format23@py_format25s)                                            r   test_s4_freeze_marker_schemar      s)   #ND(t_%t_%
{HhD
AC>>Q>Q>Q33>QH_w&);;F::f&&()D B d{AAAsdAAAAAAsAAAsAAAAAAdAAAdAAAA;C5AAAAAAAB xx$?(?HX84XXX84XXXXXX8XXX8XXX4XXX!XXXXXXX585S5S!5!5!c5cXo55555585558555555S555!5555!555cX555c555555X555X55555555555555 Ad9o@:ot,@,@,i@@@@@@@:@@@:@@@o@@@@@@t@@@t@@@,@@@@,@@@@@@@@@@@@@@@@)_ ->u>uz>i>i1n>>Q>>>>u>>>u>>>>>>>>>>>>>>>>>i1>>>i>>>>>>1>>>1>>>>>>>Q>>>>>>>>>Q>>>Q>>>>>>>>>>>>>>>H+,z+t,,,,,,,,z,,,z,,,+,,,,,,t,,,t,,,,,,,,,,-r   c                v	   | \  }}t        |d       t        |d       t        dd||      }|j                  }d}||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}|dz  dz  dz  }	t        |	j                  d            }
t        |
      }d}||k\  }|st        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  }dd|iz  }t        t        j                  |            dx}x}}t        j                  |
d   j!                               }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}}d!}|d   }||v }|slt        j                  d|fd"||f      t        j                  |      t        j                  |      d#z  }d$d%|iz  }t        t        j                  |            dx}x}}|j$                  }d&}d'} |||      }|j&                  }d(} ||      }|sd)dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      d*z  }t        t        j                  |            dx}x}x}x}x}x}}y)+u3   S5 — evidence JSON 에 escalation_message 존재.r   z[task-9999] foreignrK   rL   r   r   rM   rO   r+   rP   r   rU   NrV   r]   r^   r   r   r3   r`   r   r   r   escalation_messagerg   )z%(py1)s in %(py3)sev)rk   rb   u&   evidence 에 escalation_message 누락rc   rS   r   ri   rj   rl   rm   freeze_marker_path rX   zassert %(py14)s
{%(py14)s = %(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s, %(py6)s)
}.endswith
}(%(py12)s)
})rQ   rR   r\   rm   r   r   r   r   )r>   rG   r7   ro   rp   rq   rr   rs   rt   rv   rw   sortedrz   r3   r{   r|   r   ru   r   r   )rI   r   r,   r+   r}   r~   r   r   r   r   r`   r   r   r   r   r   r   r   r   r   r   r   @py_assert13r   s                           r   #test_s5_evidence_escalation_messager      s   #ND(t_%t*+
{HhD
AC>>Q>Q>Q33>QH_z)K7F
23
4Cs8q8q=8q33ss8q	CG%%'	(BO2%OOO2OOOOOOOOO2OOO2OOOO'OOOOOOO2"122;22222;2222;2222222222266H&HH6&+H+44H5GH45GHHHHHHHH2HHH2HHH6HHH&HHHHHH+HHH4HHH5GHHHHHHHHHHHr   c                   | \  }}t        |d       t        |d       t        dd|d|      }|j                  }d}||k(  }|st        j                  d|fd	||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dz  }t        j                  d|j                   d|j                         dz   d|iz  }t        t        j                  |            dx}x}}t        j                  |j                        }	|	d   }
d}|
|u }|slt        j                  d|fd|
|f      t        j                  |
      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}
x}}d}
|	d   }|
|v }|slt        j                  d|fd|
|f      t        j                  |
      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}
x}}|dz  dz  dz  }|j                   } |       }| }|st        j                  d      d z   d!t        j                         v st        j                  |      rt        j                  |      nd!t        j                  |      t        j                  |      d"z  }t        t        j                  |            dx}x}}|dz  d#z  dz  }|j!                         rt#        |j%                  d$            }g }||k(  }|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y)+u?   S6 — `--json` dry-run: 감지하지만 파일 생성 안 함.r   r   rK   rL   z--jsonr   r   rM   rO   r+   rP   r   r   rT   rU   NmixedT)is)z%(py1)s is %(py4)srj   rl   rm   r   r   rg   ri   rV   rW   rX   u)   dry-run 에서 freeze 마커가 생성됨rY   rZ   r[   r]   r^   r_   r`   ra   u%   dry-run 에서 evidence 가 생성됨rc   rS   )r>   rG   r7   ro   rp   rq   rr   rs   rt   ru   r(   r9   rv   rw   r{   r|   rx   ry   rz   )rI   r   r,   r+   r}   r~   r   r   r   r   r   r   r   r   rZ   r   r   r`   r   s                      r   $test_s6_json_dry_run_no_side_effectsr      s   #ND(t_%t_%
{Hhd
KC>>KQK>QKKK>QKKKKKK3KKK3KKK>KKKQKKK'#**Yszzl KKKKKKKK jj$G7#t#t####t######t#######0'-00;00000;0000;00000000000 H_w&);;F}}K}KKKK KKKKKKKvKKKvKKK}KKKKKKKKKH_z)K7F}}6;;456AsbyAAAsbAAAAAAsAAAsAAAbAAAAAAAAAA r   c                   | \  }}t        |d       t        |d       t        dd||      }|j                  }d}||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      d
z  }t        j                  d|j                   d|j                         dz   d|iz  }t        t        j                  |            dx}x}}|dz  dz  dz  }	|	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}}t        j                   |	j#                               }d}|d   }||v }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}}y)uR   S7 — subject 본문 안의 토큰도 alien 감지 (prefix anchor 금지 검증).z[task-2459] step1z,[task-2459] follow up to [task-9999] cleanuprK   rL   r   r   rM   rO   r+   rP   uJ   본문 토큰이 감지되지 않음 (prefix anchor 사용 의심)
stdout=r   rT   rU   NrV   rW   rX   zAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}rZ   r[   r   r   rg   ri   rj   rl   rm   )r>   rG   r7   ro   rp   rq   rr   rs   rt   ru   r(   r9   rv   rw   rx   r{   r|   r   )rI   r   r,   r+   r}   r~   r   r   r   rZ   r   r   r   r   r   s                  r   %test_s7_inline_alien_token_in_subjectr      s   #ND(t()tCD
{HhD
AC>> Q >Q  >Q                     **Yszzl	4     H_w&);;F===??66=?::f&&()D-$}--;-----;----;-----------r   c                   | \  }}t        dd||      }|j                  }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }d	d
|iz  }t        t        j                  |            dx}x}}t        j                  |j                        }	|	d   }
d}|
|k(  }|slt        j                  d|fd|
|f      t        j                  |
      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}
x}}|	d   }
d}|
|k(  }|slt        j                  d|fd|
|f      t        j                  |
      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}
x}}y)u<   추가 — base..HEAD 비어 있으면 status=empty, exit 0.rK   rL   r   r   rM   rO   r+   rP   r   rU   Nrd   emptyrn   rj   rl   rm   	n_commits)rG   r7   ro   rp   rq   rr   rs   rt   rv   rw   r{   r|   r(   )rI   r   r,   r+   r}   r~   r   r   r   r   r   r   r   r   s                 r   &test_empty_branch_returns_status_emptyr   	  s>   #ND(
{HhD
AC>>Q>Q>Q33>Qjj$G8''''''''''''''''''';$1$1$$$$1$$$$$$1$$$$$$$r   )r   r   r
   r   returnsubprocess.CompletedProcess)r*   r   r   ztuple[Path, str])N)r   r   r:   r   r;   z
str | Noner   r   )
rD   r   rE   r   r
   r   r?   zPath | Noner   r   )#__doc__
__future__r   builtinsrq   _pytest.assertion.rewrite	assertionrewritero   r{   r4   r   rA   pathlibr   pytest__file__resolveparents	REPO_ROOTrC   r   r-   r>   rG   fixturerI   r   r   r   r   r   r   r   r    r   r   <module>r      s    #    	  
   N""$,,Q/	y #==,	"  "	 
 	
 !2  -*01" -FI&B..&	%r   