
    .Di<                         d Z ddlZddlmc mZ ddlZddlm	Z	 ddl
Z
 e	e      j                  j                  Z ee      ej                  vr"ej                  j!                  d ee             edz  Z ee      ej                  vr"ej                  j!                  d ee             ddlmZ de	deded	e	fd
Zde	deded	e	fdZ G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Zy)u  
test_spec_compliance.py - spec_compliance verifier 단위 테스트

테스트 항목:
1. task 파일에 체크리스트 있고, 보고서에 모든 키워드 포함 → PASS
2. task 파일에 체크리스트 있고, 보고서에 일부 키워드만 → WARN
3. task 파일 없음 → SKIP
4. 보고서 없음 → SKIP
5. 체크리스트 항목 0개 → PASS
6. - [x] 항목은 이미 완료로 간주 (검증 대상 아님)
    N)Path	verifiers)spec_compliancetmp_pathtask_idcontentreturnc                 l    | dz  }|j                  dd       || dz  }|j                  |d       |S )uG   임시 tasks 디렉토리에 task 파일을 생성하고 경로 반환.tasksTparentsexist_ok.mdutf-8encodingmkdir
write_text)r   r   r   	tasks_dir	task_files        ?/home/jay/workspace/teams/dev1/qc/tests/test_spec_compliance.py_make_task_filer   "   sE    7"IOOD4O0wisO+I73    c                 l    | dz  }|j                  dd       || dz  }|j                  |d       |S )uN   임시 reports 디렉토리에 보고서 파일을 생성하고 경로 반환.reportsTr   r   r   r   r   )r   r   r   reports_dirreport_files        r   _make_report_filer   +   sH    Y&KdT27)3/K7W5r   c                   (    e Zd ZdZd Zd Zd Zd Zy)TestAllChecklistItemsCovereduZ   task에 - [ ] 항목이 있고, 보고서에 해당 키워드가 모두 포함되면 PASS.c                    d}d}t        |d|      }t        |d|      }t        j                  dt	        |dz        t	        |dz              }|d   }d}||k(  }	|	st        j                  d	|	fd
||f      t        j                  |      t        j                  |      dz  }
t        j                  d|       dz   d|
iz  }t        t        j                  |            d x}x}	}y )NuB   # 작업

- [ ] API 엔드포인트 구현
- [ ] 테스트 작성
uI   # 보고서

API 엔드포인트 구현 완료. 테스트 작성 완료.
ztask-test-passr   r   r   r   statusPASS==z%(py1)s == %(py4)spy1py4u+   모든 항목 커버 시 PASS 기대, got: 
>assert %(py6)spy6r   r   r   verifystr
@pytest_ar_call_reprcompare	_saferepr_format_assertmsgAssertionError_format_explanation)selfr   task_contentreport_contentr   r   result@py_assert0@py_assert3@py_assert2@py_format5@py_format7s               r   test_all_covered_status_passz9TestAllChecklistItemsCovered.test_all_covered_status_pass<   s    _g#H.>M	'2BNS ''(W,-Hy01

 ha6a6)aaa6aaaaaa6aaa-XY_X`+aaaaaaaar   c                    d}d}t        |d|       t        |d|       t        j                  dt	        |dz        t	        |dz              }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}||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   }	t        |	t              }
|
st        j                  d      dz   dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |	      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |
      dz  }t        t        j                  |            d x}	}
y )Nu'   - [ ] 데이터베이스 연결 설정
u)   데이터베이스 연결 설정 완료.
z	task-keysr   r   r#   r$   inz%(py1)s in %(py3)sr:   r*   py3u    결과에 'status' 키가 없음z
>assert %(py5)spy5detailsu!   결과에 'details' 키가 없음u   'details'는 list여야 함7
>assert %(py5)s
{%(py5)s = %(py0)s(%(py2)s, %(py3)s)
}
isinstancelistpy0py2rF   rG   )r   r   r   r/   r0   r1   r2   r3   @py_builtinslocals_should_repr_global_namer4   r5   r6   rJ   rK   )r7   r   r8   r9   r:   r;   r=   @py_format4@py_format6@py_assert1@py_assert4s              r   "test_all_covered_has_required_keysz?TestAllChecklistItemsCovered.test_all_covered_has_required_keysJ   s   AE+|<(K@ ''(W,-Hy01

 Ex6!EEEx6EEExEEEEEE6EEE6EEEE#EEEEEEEGyF"GGGyFGGGyGGGGGGFGGGFGGGG$GGGGGGG +Qz+T2Q2QQ4QQQQQQQzQQQzQQQ+QQQQQQTQQQTQQQ2QQQQQQr   c                    d}d}t        |d|       t        |d|       t        j                  dt	        |dz        t	        |dz              }|d   }t        |      }d}||kD  }|st        j                  d	|fd
||f      dt        j                         v st        j                  t
              rt        j                  t
              ndt        j                  |      t        j                  |      t        j                  |      dz  }	t        j                  d      dz   d|	iz  }
t        t        j                  |
            d x}x}x}}y )Nu   - [ ] 파일 검증 구현
u,   파일 검증 구현을 완료했습니다.
ztask-detailsr   r   r#   rH   r   >z/%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} > %(py7)slenrM   rN   r+   py7u/   PASS여도 details에 최소 1개 항목 필요
>assert %(py9)spy9)r   r   r   r/   r0   r[   r1   r2   rO   rP   rQ   r3   r4   r5   r6   )r7   r   r8   r9   r:   rT   r<   @py_assert6@py_assert5@py_format8@py_format10s              r   "test_all_covered_details_not_emptyz?TestAllChecklistItemsCovered.test_all_covered_details_not_emptyZ   s    5H.,?(NNC ''(W,-Hy01

 )$\s$%\\%)\\\%\\\\\\s\\\s\\\$\\\%\\\\\\+\\\\\\\\r   c                    d}d}t        |d|       t        |d|       t        j                  dt	        |dz        t	        |dz              }|d   }d}||k(  }|st        j                  d	|fd
||f      t        j                  |      t        j                  |      dz  }t        j                  d|       dz   d|iz  }	t        t        j                  |	            d x}x}}y )Nui   # 작업 지시서

- [ ] 스키마 정의
- [ ] 마이그레이션 실행
- [ ] 단위 테스트 추가
ul   ## 완료 사항
스키마 정의 완료.
마이그레이션 실행 완료.
단위 테스트 추가 완료.
z
task-multir   r   r#   r$   r%   r&   r(   r)   u0   3개 항목 모두 커버 → PASS 기대, got: r,   r-   r.   
r7   r   r8   r9   r:   r;   r<   r=   r>   r?   s
             r   )test_multiple_checklist_items_all_coveredzFTestAllChecklistItemsCovered.test_multiple_checklist_items_all_coveredh   s     Q U,=(L.A ''(W,-Hy01

 hf6f6)fff6ffffff6fff-]^d]e+ffffffffr   N)__name__
__module____qualname____doc__r@   rV   rd   rg    r   r   r!   r!   9   s    dbR ]gr   r!   c                   "    e Zd ZdZd Zd Zd Zy)TestSomeChecklistItemsUncovereduJ   일부 체크리스트 항목의 키워드가 보고서에 없으면 WARN.c                    d}d}t        |d|       t        |d|       t        j                  dt	        |dz        t	        |dz              }|d   }d}||k(  }|st        j                  d	|fd
||f      t        j                  |      t        j                  |      dz  }t        j                  d|       dz   d|iz  }	t        t        j                  |	            d x}x}}y )Nu<   - [ ] 캐시 레이어 구현
- [ ] 성능 최적화 적용
u    캐시 레이어 구현 완료.
z	task-warnr   r   r#   r$   WARNr&   r(   r)   u'   일부 미커버 → WARN 기대, got: r,   r-   r.   rf   s
             r    test_partial_covered_status_warnz@TestSomeChecklistItemsUncovered.test_partial_covered_status_warn   s    Z<+|<(K@ ''(W,-Hy01

 h]6]6)]]]6]]]]]]6]]]-TU[T\+]]]]]]]]r   c                    d}d}t        |d|       t        |d|       t        j                  dt	        |dz        t	        |dz              }dj                  |d         }g }d	}||v }|}	|s/d
}
|
|v }|}	|s%d}|j                  } |       }||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                  |       |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                  |       |sBt        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                  |       |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  }t        j                  d |       d!z   d"|iz  }t!        t        j"                  |            d x}	x}x}x}x}
x}x}x}x}x}x}}y )#Nu9   - [ ] 로깅 시스템 구축
- [ ] 알림 발송 기능
u    로깅 시스템 구축 완료.
ztask-warn-detailr   r   r#   
rH   u   알림u   발송	uncoveredu	   미커버rB   )z%(py3)s in %(py5)sdetails_strrF   rG   %(py7)sr]   )z%(py10)s in %(py12)s)py10py12z%(py14)spy14)zJ%(py17)s in %(py23)s
{%(py23)s = %(py21)s
{%(py21)s = %(py19)s.lower
}()
})py17py19py21py23z%(py25)spy25)z%(py28)s in %(py30)s)py28py30z%(py32)spy32   u4   미커버 항목이 details에 언급되지 않음: z
>assert %(py35)spy35)r   r   r   r/   r0   joinlowerr1   r2   r3   rO   rP   rQ   append_format_boolopr4   r5   r6   )r7   r   r8   r9   r:   ru   rT   r=   rU   r;   @py_assert9@py_assert11@py_assert16@py_assert20@py_assert22@py_assert18@py_assert27@py_assert29rS   rb   @py_format13@py_format15@py_format24@py_format26@py_format31@py_format33@py_format34@py_format36s                               r   .test_partial_covered_details_mention_uncoveredzNTestSomeChecklistItemsUncovered.test_partial_covered_details_mention_uncovered   s&   W<"4lC($6G ''(W,-Hy01

 iiy 12	P	P#	P	P;&	P 	P *//	P 01	P 11	P 		P k)		P 	P
 ?P>O	P	P 	P
 GPi	 	P 	P
 JP	P 	P
 8P7O	 $	P 	P
 GPi	 $	P 	P 	P
 JP	P
 JP	P
 ?P>O	P;	P 	P
 GPi 	P 	P
 JP	P 	P
 8P7O '	P 	P
 GPi '	P 	P 	P
 JP	P
 JP	P
 ?P>O	P 1	P 	P
 GPi 	P 	P
 JP	P 	P
 8P7O *	P 	P
 GPi *	P 	P
 GPi 0	P 	P
 GPi 2	P 	P 	P
 JP	P
 JP	P
 ?P>O	P k		P 	P
 GPi 		P 	P
 JP	P 	P
 8P7O *		P 	P
 GPi *		P 	P 	P
 JP	P
 JP	P
 BP	P 	P
 ?P>OA+O	P 	P 	P
 =P<O	P 	P 	P 	P 	Pr   c                    d}d}t        |d|       t        |d|       t        j                  dt	        |dz        t	        |dz              }|d   }d}||k(  }|st        j                  d	|fd
||f      t        j                  |      t        j                  |      dz  }t        j                  d|       dz   d|iz  }	t        t        j                  |	            d x}x}}y )Nu$   - [ ] 복잡한 리팩토링 작업
u   작업을 완료했습니다.
ztask-all-uncoveredr   r   r#   r$   rp   r&   r(   r)   u'   전체 미커버 → WARN 기대, got: r,   r-   r.   rf   s
             r   test_all_uncovered_status_warnz>TestSomeChecklistItemsUncovered.test_all_uncovered_status_warn   s    >:"6E($8.I '' (W,-Hy01

 h]6]6)]]]6]]]]]]6]]]-TU[T\+]]]]]]]]r   N)rh   ri   rj   rk   rq   r   r   rl   r   r   rn   rn   |   s    T^P*^r   rn   c                       e Zd ZdZd Zd Zy)TestTaskFileMissingu+   task 파일이 존재하지 않으면 SKIP.c                    |dz  }|j                  dd       t        j                  dt        |dz        t        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|       dz   d|iz  }t        t	        j                  |            d x}x}}y )Nr   Tr   ztask-nonexistentr   r#   r$   SKIPr&   r(   r)   u(   task 파일 없으면 SKIP 기대, got: r,   r-   )
r   r   r/   r0   r1   r2   r3   r4   r5   r6   )	r7   r   r   r:   r;   r<   r=   r>   r?   s	            r   "test_missing_task_file_status_skipz6TestTaskFileMissing.test_missing_task_file_status_skip   s    *$6 ''(W,-K(

 h^6^6)^^^6^^^^^^6^^^-UV\U]+^^^^^^^^r   c                 d   t        j                  dt        |dz        t        |dz              }|d   }t        |      }d}||kD  }|st	        j
                  d|fd||f      d	t        j                         v st	        j                  t              rt	        j                  t              nd	t	        j                  |      t	        j                  |      t	        j                  |      d
z  }t	        j                  d      dz   d|iz  }t        t	        j                  |            d x}x}x}}y )Ntask-no-filenonexistent_tasksr   r#   rH   r   rX   rZ   r[   r\   &   SKIP이어도 details에 이유 필요r^   r_   )r   r/   r0   r[   r1   r2   rO   rP   rQ   r3   r4   r5   r6   )	r7   r   r:   rT   r<   r`   ra   rb   rc   s	            r   -test_missing_task_file_details_mention_reasonzATestTaskFileMissing.test_missing_task_file_details_mention_reason   s     ''(%889Hy01

 )$Ss$%SS%)SSS%SSSSSSsSSSsSSS$SSS%SSSSSS+SSSSSSSSr   N)rh   ri   rj   rk   r   r   rl   r   r   r   r      s    5
_Tr   r   c                       e Zd ZdZd Zd Zy)TestReportFileMissingu0   보고서 파일이 존재하지 않으면 SKIP.c                    d}t        |d|       t        j                  dt        |dz        t        |dz              }|d   }d}||k(  }|st	        j
                  d|fd	||f      t	        j                  |      t	        j                  |      d
z  }t	        j                  d|       dz   d|iz  }t        t	        j                  |            d x}x}}y )N   - [ ] 기능 구현
ztask-no-reportr   r   r#   r$   r   r&   r(   r)   u&   보고서 없으면 SKIP 기대, got: r,   r-   )
r   r   r/   r0   r1   r2   r3   r4   r5   r6   )	r7   r   r8   r:   r;   r<   r=   r>   r?   s	            r   $test_missing_report_file_status_skipz:TestReportFileMissing.test_missing_report_file_status_skip   s    ."2LA !''(W,-Hy01

 h\6\6)\\\6\\\\\\6\\\-STZS[+\\\\\\\\r   c                    d}t        |d|       t        j                  dt        |dz        t        |dz              }|d   }t	        |      }d}||kD  }|st        j                  d|fd	||f      d
t        j                         v st        j                  t              rt        j                  t              nd
t        j                  |      t        j                  |      t        j                  |      dz  }t        j                  d      dz   d|iz  }	t        t        j                  |	            d x}x}x}}y )Nr   ztask-no-report2r   nonexistent_reportsr#   rH   r   rX   rZ   r[   r\   r   r^   r_   )r   r   r/   r0   r[   r1   r2   rO   rP   rQ   r3   r4   r5   r6   )
r7   r   r8   r:   rT   r<   r`   ra   rb   rc   s
             r   *test_missing_report_details_mention_reasonz@TestReportFileMissing.test_missing_report_details_mention_reason   s    ."3\B ''(W,-H'<<=

 )$Ss$%SS%)SSS%SSSSSSsSSSsSSS$SSS%SSSSSS+SSSSSSSSr   N)rh   ri   rj   rk   r   r   rl   r   r   r   r      s    :
]	Tr   r   c                       e Zd ZdZd Zd Zy)TestNoChecklistItemsu0   체크리스트 항목이 없으면 (0개) PASS.c                    d}d}t        |d|       t        |d|       t        j                  dt	        |dz        t	        |dz              }|d   }d}||k(  }|st        j                  d	|fd
||f      t        j                  |      t        j                  |      dz  }t        j                  d|       dz   d|iz  }	t        t        j                  |	            d x}x}}y )Nu,   # 작업 지시서

단순 작업입니다.
u#   # 완료 보고서

작업 완료.
ztask-no-checklistr   r   r#   r$   r%   r&   r(   r)   u+   체크리스트 0개 → PASS 기대, got: r,   r-   r.   rf   s
             r   test_no_checklist_status_passz2TestNoChecklistItems.test_no_checklist_status_pass   s    HA"5|D($7H ''(W,-Hy01

 ha6a6)aaa6aaaaaa6aaa-XY_X`+aaaaaaaar   c                    d}d}t        |d|       t        |d|       t        j                  dt	        |dz        t	        |dz              }|d   }d}||k(  }|st        j                  d	|fd
||f      t        j                  |      t        j                  |      dz  }t        j                  d|       dz   d|iz  }	t        t        j                  |	            dx}x}}y)u>   - [x] 항목만 있으면 미완료 항목 0개이므로 PASS.uG   # 작업

- [x] 이미 완료된 항목
- [x] 또 다른 완료 항목
u#   # 보고서

모든 작업 완료.
ztask-only-doner   r   r#   r$   r%   r&   r(   r)   u,   - [x] 항목만 있으면 PASS 기대, got: r,   r-   Nr.   rf   s
             r   1test_only_completed_items_treated_as_no_checklistzFTestNoChecklistItems.test_only_completed_items_treated_as_no_checklist  s    dA"2LA($4nE ''(W,-Hy01

 hb6b6)bbb6bbbbbb6bbb-YZ`Ya+bbbbbbbbr   N)rh   ri   rj   rk   r   r   rl   r   r   r   r      s    :bcr   r   c                       e Zd ZdZd Zd Zy)TestCompletedItemsIgnoredu;   - [x] 항목은 검증 대상에서 제외되어야 한다.c                    d}d}t        |d|       t        |d|       t        j                  dt	        |dz        t	        |dz              }|d   }d}||k(  }|st        j                  d	|fd
||f      t        j                  |      t        j                  |      dz  }t        j                  d|       dz   d|iz  }	t        t        j                  |	            d x}x}}y )Nu<   - [x] 완료된 작업 항목
- [ ] 미완료 작업 항목
u'   미완료 작업 항목 처리 완료.
z
task-mixedr   r   r#   r$   r%   r&   r(   r)   uD   - [x] 항목은 무시되고 - [ ] 항목만 검증해야 함, got: r,   r-   r.   rf   s
             r   !test_completed_items_not_verifiedz;TestCompletedItemsIgnored.test_completed_items_not_verified  s    ZC,=(L.A ''(W,-Hy01
 hz6z6)zzz6zzzzzz6zzz-qrxqy+zzzzzzzzr   c                    d}d}t        |d|       t        |d|       t        j                  dt	        |dz        t	        |dz              }dj                  |d         }g }d	}||v}|}	|s|d
   }
d}|
|k(  }|}	|	sDt        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                  |
      t        j                  |      dz  }dd|iz  }|j                  |       t        j                  |d      i z  }t        j                  d|       dz   d|iz  }t        t        j                   |            d x}	x}x}x}x}
x}}y )NuB   - [x] 완료된 특별한 작업
- [ ] 진행중인 신규 기능
u#   완료된 특별한 작업 내용.
ztask-mixed-warnr   r   r#   rs   rH   u   완료된 특별한 작업r$   r%   )not in)z%(py3)s not in %(py5)sru   rv   rw   r]   r&   )z%(py10)s == %(py13)s)rx   py13z%(py15)spy15r   u:   - [x] 항목이 미커버 목록에 나타나면 안 됨: z
>assert %(py18)spy18)r   r   r   r/   r0   r   r1   r2   r3   rO   rP   rQ   r   r   r4   r5   r6   )r7   r   r8   r9   r:   ru   rT   r=   rU   r;   r   @py_assert12r   rS   rb   @py_format14@py_format16@py_format17@py_format19s                      r   *test_completed_items_not_in_uncovered_listzDTestCompletedItemsIgnored.test_completed_items_not_in_uncovered_list-  s   `?"3\B($5~F ''(W,-Hy01

 iiy 12	V(	V(;	V?Eh?O	VSY	V?OSY?Y	V 	VDUDU	V(	V 	VLUI )	V 	VOUv	V 	V=U=U 1<	V 	VLUI 1<	V 	V 	VOUv	VOU	VDUDU	V?OSY	V 	VLUI @P	V 	VLUI TZ	V 	V 	VOUv	VOU	VGU~	V 	VDUDUG}U	V 	V 	VBUBU	V 	V 	V 	Vr   N)rh   ri   rj   rk   r   r   rl   r   r   r   r     s    E{ Vr   r   c                   "    e Zd ZdZd Zd Zd Zy)TestReturnFormatContractuO   verify() 반환 딕셔너리가 항상 규약된 형식을 따르는지 확인.c                    d}d}t        |d|       t        |d|       t        j                  dt	        |dz        t	        |dz              }|d   }h d}||v }|st        j                  d	|fd
||f      t        j                  |      t        j                  |      dz  }t        j                  d|d          dz   d|iz  }	t        t        j                  |	            d x}x}}y )Nr      기능 구현 완료.
ztask-formatr   r   r#   r$   >   FAILr%   r   rp   rB   )z%(py1)s in %(py4)sr)   u(   status가 유효한 enum 값이 아님: r,   r-   r.   rf   s
             r   test_status_is_valid_enumz2TestReturnFormatContract.test_status_is_valid_enumI  s   .2->(M>B ''(W,-Hy01

 h 	I $
 	I $
 
 	I
 8I7H	I $
 	I 	I
 @Iy   	I 	I
 @Iy$
 	I 	I
 8I7H5fX6F5GH	I 	I 	I
 6I5H	I 	I 	Ir   c                 H   d}d}t        |d|       t        |d|       t        j                  dt	        |dz        t	        |dz              }|d   }t        |t              }|st        j                  d      d	z   d
t        j                         v st        j                  t
              rt        j                  t
              nd
t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d x}}|d   D ]<  }t        |t              }	|	s$t        j                  d|      dz   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dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |	      dz  }
t        t        j                  |
            d }	? y )Nr   r   ztask-format2r   r   r#   rH   u   details가 list가 아님rI   rJ   rK   rL   u!   details 항목이 str이 아님: z7
>assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}itemr0   )rM   r*   rN   r+   )r   r   r   r/   r0   rJ   rK   r1   r4   rO   rP   rQ   r3   r5   r6   )r7   r   r8   r9   r:   rT   rU   rS   r   r<   r>   s              r   test_details_is_list_of_stringsz8TestReturnFormatContract.test_details_is_list_of_strings\  s   .2.,?(NNC ''(W,-Hy01

 !+Oz+T2O2OO4OOOOOOOzOOOzOOO+OOOOOOTOOOTOOO2OOOOOO9% 	WDdC(V(VV,MdX*VVVVVVV:VVV:VVVVVVdVVVdVVVVVVCVVVCVVV(VVVVVV	Wr   c                    t        j                  dt        |dz        t        |dz              }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  }t        t        j                  |            d 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  }d
d|iz  }t        t        j                  |            d x}}y )Nr   no_tasks
no_reportsr#   r$   rB   rD   r:   rE   zassert %(py5)srG   rH   )r   r/   r0   r1   r2   r3   rO   rP   rQ   r5   r6   )r7   r   r:   r;   r=   rR   rS   s          r   test_has_both_required_keysz4TestReturnFormatContract.test_has_both_required_keysl  s     ''(Z/0H|34

 !x6!!!!x6!!!x!!!!!!6!!!6!!!!!!!"yF""""yF"""y""""""F"""F"""""""r   N)rh   ri   rj   rk   r   r   r   rl   r   r   r   r   F  s    YI&W #r   r   )rk   builtinsrO   _pytest.assertion.rewrite	assertionrewriter1   syspathlibr   pytest__file__parent_QC_DIRr0   pathinsert_VERIFIERS_DIRr   r   r   r   r!   rn   r   r   r   r   r   rl   r   r   <module>r      s$  
  
   x.


&
&w<sxxHHOOAs7|$;&~chh&HHOOAs>*+ %d S 3 4  s S T ;g ;gF3^ 3^vT T:T T@c cL$V $VX-# -#r   