Files
vibe_data_ana/tests/__pycache__/test_analysis_planning.cpython-311-pytest-8.3.3.pyc

189 lines
30 KiB
Plaintext
Raw Normal View History

<EFBFBD>
<00><><EFBFBD>i<EFBFBD>(<00><00>
<00>dZddlZddlmcmZddlZddlm Z m
Z
m Z m Z ddl mZmZddlmZmZddlmZejd<07><00><00>Zejd<08><00><00>Zd <09>Zd
<EFBFBD>Zd <0B>Zd <0C>Zd <0A>Zd<0E>Zd<0F>Zd<10>Zd<11>Z d<12>Z!d<13>Z"d<14>Z#d<15>Z$d<16>Z%d<17>Z&dS)z(Unit tests for analysis planning engine.<2E>N)<04> plan_analysis<69>validate_task_dependencies<65>_fallback_analysis_planning<6E>_has_circular_dependency<63><02> DataProfile<6C>
ColumnInfo<EFBFBD><02>RequirementSpec<65>AnalysisObjective)<01> AnalysisTaskc<00><><00>tdddtdddd<02><07><00>tdd d
d<03><07><00>td d dd <0C><07><00>td ddd<03><07><00>tdddd<12><07><00>gdddd<14>dd<16><17><00>S)z)Create a sample data profile for testing.ztest.csvi<76><00><00>
created_at<EFBFBD>datetimeg)<04>name<6D>dtype<70> missing_rate<74> unique_count<6E>status<75> categoricalg<6C><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<3F>type<70>
<00>priority<74>numeric<69> description<6F>textg<74><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?i<><00>ticket)<02>timerg@U@zTicket data with 1000 rows)<08> file_path<74> row_count<6E> column_count<6E>columns<6E> inferred_type<70>
key_fields<EFBFBD> quality_score<72>summaryr<00><00><00>CD:\code\iov_data_analysis_agent_old\tests\test_analysis_planning.py<70>sample_data_profiler+s<><00><00> <17><1C><16><16> <16>!<21> <20> <20>!<21>  <0E> <0E> <0E> <17><1D>#<23> <20><1E>  <0E> <0E> <0E> <17><1B>#<23> <20><1F>  <0E> <0E> <0E> <17><1F><1F> <20><1E>  <0E> <0E> <0E> <17>"<22><1C>!<21> <20>  <0E> <0E> <0E>3
<EFBFBD>@<1F>(<28>H<EFBFBD>=<3D>=<3D><1A>,<2C>O( <06>( <06>( <06>(r)c
<00>t<00>tdtddddgd<06><07><00>tdd d
d gd <0C><07><00>g<02> <0A><00>S)z(Create a sample requirement for testing.u分析工单健康度和趋势u健康度分析u!评估工单处理的健康状况u 完成率u 处理效率r<00>rr<00>metricsru 趋势分析u$分析工单随时间的变化趋势u 时间序列u 增长率<E995BF><00><02>
user_input<EFBFBD>
objectivesr
r(r)r*<00>sample_requirementr3>sk<00><00> <1B>3<> <1D>&<26>?<3F>$<24>n<EFBFBD>5<><1A>  <0E> <0E> <0E> <1E>#<23>B<>'<27><1B>5<><1A>  <0E> <0E> <0E> 
<EFBFBD> <06> <06> <06>r)c <00><><00>t||<01><00>}|j}t|<03><00>}d}||k}|<06>stjd|fd||f<02><00>dt j<00><00>vstjt<00><00>rtjt<00><00>nddt j<00><00>vstj|<02><00>rtj|<02><00>ndtj|<03><00>tj|<04><00>tj|<05><00>d<06>z}dd|iz}ttj
|<08><00><00><00><00>d x}x}x}}|j }t|<03><00>}|j } t| <09><00>}
||
k}|<06>s<>tjd
|fd ||
f<02><00>dt j<00><00>vstjt<00><00>rtjt<00><00>nddt j<00><00>vstj|<02><00>rtj|<02><00>ndtj|<03><00>tj|<04><00>dt j<00><00>vstjt<00><00>rtjt<00><00>ndd t j<00><00>vstj|<01><00>rtj|<01><00>nd tj| <09><00>tj|
<EFBFBD><00>d <0A>z} dd| iz} ttj
| <0C><00><00><00><00>d x}x}x}x} }
|j } d}| |k}|s<>tjd|fd| |f<02><00>dt j<00><00>vstj|<02><00>rtj|<02><00>ndtj| <0A><00>tj|<04><00>d<11>z}dd|iz}ttj
|<10><00><00><00><00>d x} x}}d S)z,Test that fallback planning generates tasks.r<00><01>><3E>zJ%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.tasks
})
} > %(py8)s<>len<65>plan<61><05>py0<79>py1<79>py3<79>py5<79>py8<79>assert %(py10)s<>py10N<30><01>==)z<>%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.objectives
})
} == %(py12)s
{%(py12)s = %(py7)s(%(py10)s
{%(py10)s = %(py8)s.objectives
})
}r3)r;r<r=r><00>py7r?rA<00>py12zassert %(py14)s<>py14)z9%(py2)s
{%(py2)s = %(py0)s.estimated_duration
} > %(py5)s<>r;<00>py2r><00>assert %(py7)srD) r<00>tasksr8<00>
@pytest_ar<61>_call_reprcompare<72> @py_builtins<6E>locals<6C>_should_repr_global_name<6D> _saferepr<70>AssertionError<6F>_format_explanationr2<00>estimated_duration)r+r3r9<00> @py_assert2<74> @py_assert4<74> @py_assert7<74> @py_assert6<74> @py_format9<74> @py_format11<31> @py_assert9<74> @py_assert11<31> @py_format13<31> @py_format15<31> @py_assert1<74> @py_assert3<74> @py_format6<74> @py_format8s r*<00>&test_fallback_planning_generates_tasksrbTs4<00><00> &<26>':<3A><N<> O<> O<>D<EFBFBD><1F><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E>F<01>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>E<>'<27>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&r)c<00><><00>t||<01><00>}d<01>|jD<00><00>}t|<03><00>}d}||k}|s<>tjd|fd||f<02><00>dt j<00><00>vstjt<00><00>rtjt<00><00>nddt j<00><00>vstj|<03><00>rtj|<03><00>ndtj|<04><00>tj|<05><00>d<07>z}dd |iz}ttj
|<08><00><00><00><00>d
x}x}}d <0B>|jD<00><00>} t| <09><00>}d}||k}|s<>tjd|fd||f<02><00>dt j<00><00>vstjt<00><00>rtjt<00><00>ndd t j<00><00>vstj| <09><00>rtj| <09><00>nd tj|<04><00>tj|<05><00>d<07>z}dd |iz}ttj
|<08><00><00><00><00>d
x}x}}d
S) z>Test that fallback planning creates tasks based on objectives.c<00>6<00>g|]}d|jvs d|jv<00>|<01><02>S)u健康u质量<E8B4A8>r<00><02>.0<EFBFBD>ts r*<00>
<listcomp>z>test_fallback_planning_respects_objectives.<locals>.<listcomp>gs0<00><00>V<>V<>V<>!<21>X<EFBFBD><11><16>-?<3F>-?<3F>8<EFBFBD>q<EFBFBD>v<EFBFBD>CU<43>CU<43>A<EFBFBD>CU<43>CU<43>CUr)rr5)z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)sr8<00> health_tasks)r;r<r=<00>py6zassert %(py8)sr?Nc<00>6<00>g|]}d|jvs d|jv<00>|<01><02>S)u趋势u时间rerfs r*riz>test_fallback_planning_respects_objectives.<locals>.<listcomp>ks0<00><00>U<>U<>U<><11>H<EFBFBD><01><06>,><3E>,><3E>(<28>a<EFBFBD>f<EFBFBD>BT<42>BT<42>1<EFBFBD>BT<42>BT<42>BTr)<00> trend_tasks) rrJr8rKrLrMrNrOrPrQrR)
r+r3r9rjrT<00> @py_assert5rU<00> @py_format7rXrms
r*<00>*test_fallback_planning_respects_objectivesrpbs<><00><00> &<26>':<3A><N<> O<> O<>D<EFBFBD>W<01>V<>t<EFBFBD>z<EFBFBD>V<>V<>V<>L<EFBFBD> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20>V<01>U<>d<EFBFBD>j<EFBFBD>U<>U<>U<>K<EFBFBD><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F><1F>r)c <00><><00>tdtddgd<04><05><00>g<01><06><00>}t||<01><00>}|j}t |<03><00>}d}||k}|<06>st jd|fd ||f<02><00>d
tj<00><00>vst j t<00><00>rt j
t<00><00>nd
d tj<00><00>vst j |<02><00>rt j
|<02><00>nd t j
|<03><00>t j
|<04><00>t j
|<05><00>d <0C>z}d d|iz}tt j |<08><00><00><00><00>dx}x}x}}dS)z/Test fallback planning with generic objectives.<2E> 分析数据u 综合分析u全面分析数据<E695B0>r-r0rr5r7r8r9r:r@rAN) r r rrJr8rKrLrMrNrOrPrQrR<00> r+<00> requirementr9rTrUrVrWrXrYs r*<00>2test_fallback_planning_with_no_matching_objectivesrvos<><00><00>!<21>!<21> <1D>#<23>0<><1A><1A>  <0E> <0E> <0E>
<EFBFBD>
<06>
<06>
<06>K<EFBFBD> '<27>':<3A>K<EFBFBD> H<> H<>D<EFBFBD><1F><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E>r)c<00><><00>tdg<00><02><00>}t||<01><00>}|j}t|<03><00>}d}||k}|<06>st jd|fd||f<02><00>dt j<00><00>vst jt<00><00>rt j t<00><00>nddt j<00><00>vst j|<02><00>rt j |<02><00>ndt j |<03><00>t j |<04><00>t j |<05><00>d<08>z}d d
|iz}tt j |<08><00><00><00><00>d x}x}x}}d S) z*Test fallback planning with no objectives.rrr0rr5r7r8r9r:r@rAN) r rrJr8rKrLrMrNrOrPrQrRrts r*<00>,test_fallback_planning_with_empty_objectivesrx<00>s}<00><00>!<21>!<21><15><06><06><06>K<EFBFBD>
'<27>':<3A>K<EFBFBD> H<> H<>D<EFBFBD><1F><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E>r)c
<00>.<00>tddddg<00><05><00>tdddd dg<01><05><00>td
d d d ddg<02><05><00>g}t|<00><00>}|d}|s:ddtj|<02><00>iz}t tj|<03><00><00><00><00>d}|d}|s:ddtj|<02><00>iz}t tj|<03><00><00><00><00>d}|d}| }|s:ddtj|<02><00>iz}t tj|<05><00><00><00><00>dx}}|d}t |<06><00>}d}||k} | s<>tjd| fd||f<02><00>dtj <00><00>vstj
t <00><00>rtjt <00><00>ndtj|<06><00>tj|<07><00>tj|<08><00>d<1A>z}
dd|
iz} t tj| <0B><00><00><00><00>dx}x}x} }dS)z(Test validation with valid dependencies.<2E>task_1<5F>Task 1<>
First taskr<00><05>idrrr<00> dependencies<65>task_2<5F>Task 2<> Second taskr/<00>task_3zTask 3z
Third taskrs<00>valid<69>assert %(py1)sr<N<> forms_dag<61>has_circular_dependency<63>assert not %(py1)s<>missing_dependenciesrrB)z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sr8<00>r;rH<00>py4rD<00>assert %(py9)s<>py9<79> r rrKrPrQrRr8rLrMrNrO) rJ<00>
validation<EFBFBD> @py_assert0<74> @py_format2rT<00> @py_format3r^r_rWrnra<00> @py_format10s r*<00> test_validate_dependencies_validr<64><00>s<><00><00> <15><17><19>$<24><16><1B> 
<EFBFBD>
<EFBFBD>
<EFBFBD> <15><17><19>%<25><16>"<22><1A> 
<EFBFBD>
<EFBFBD>
<EFBFBD> <15><17><19>$<24><16>"<22>H<EFBFBD>-<2D> 
<EFBFBD>
<EFBFBD>
<EFBFBD> <06>E<EFBFBD>0,<2C>E<EFBFBD>2<>2<>J<EFBFBD><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7r)c<00>0<00>tdddddg<01><06><00>tdddd dg<01><06><00>g}t|<00><00>}|d
}| }|s:d d tj|<02><00>iz}t tj|<04><00><00><00><00>d x}}|d}|s:dd tj|<02><00>iz}t tj|<05><00><00><00><00>d }|d}| }|s:d d tj|<02><00>iz}t tj|<04><00><00><00><00>d x}}d S)z.Test validation detects circular dependencies.rzr{r|rr<>r}r<>r<>r/r<>r<>r<Nr<4E>r<>r<>)r rrKrPrQrR)rJr<>r<>rTr<>r<>s r*<00>%test_validate_dependencies_with_cycler<65><00>sy<00><00> <15><17><19>$<24><16>"<22><1A> 
<EFBFBD>
<EFBFBD>
<EFBFBD> <15><17><19>%<25><16>"<22><1A> 
<EFBFBD>
<EFBFBD>
<EFBFBD> <06>E<EFBFBD>",<2C>E<EFBFBD>2<>2<>J<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&r)c<00><><00>tdddddg<01><06><00>g}t|<00><00>}|d}| }|s:dd tj|<02><00>iz}t tj|<04><00><00><00><00>d
x}}|d }t |<05><00>}d }||k}|s<>tjd |fd||f<02><00>dtj <00><00>vstj
t <00><00>rtjt <00><00>ndtj|<05><00>tj|<06><00>tj|<07><00>d<10>z} dd| iz}
t tj|
<EFBFBD><00><00><00><00>d
x}x}x}}d
S)z-Test validation detects missing dependencies.rzr{r|r<00>task_999r}r<>r<>r<Nr<4E>rr5)z/%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} > %(py7)sr8r<>r<>r<>r<>) rJr<>r<>rTr<>r^r_rWrnrar<>s r*<00>'test_validate_dependencies_with_missingr<67><00>s<><00><00> <15><17><19>$<24><16>$<24><1C> 
<EFBFBD>
<EFBFBD>
<EFBFBD> <06>E<EFBFBD>,<2C>E<EFBFBD>2<>2<>J<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6r)c<00><00>tdddddg<01><05><00>tdddddg<01><05><00>g}t|<00><00>}|s<>ddtj<00><00>vst jt<00><00>rt jt<00><00>ndd tj<00><00>vst j|<00><00>rt j|<00><00>nd t j|<01><00>d
<EFBFBD>z}tt j|<02><00><00><00><00>d }d S) z5Test circular dependency detection with simple cycle.<2E>A<>Task Ars<00>Br}<00>Task B<>,assert %(py3)s
{%(py3)s = %(py0)s(%(py1)s)
}rrJ<00>r;r<r=N<> r rrMrNrKrOrPrQrR<00>rJrT<00> @py_format4s r*<00>)test_has_circular_dependency_simple_cycler<65><00>s'<00><00> <15><12><19> <20><16><1D><15> 
<EFBFBD>
<EFBFBD>
<EFBFBD> <15><12><19> <20><16><1D><15> 
<EFBFBD>
<EFBFBD>
<EFBFBD> <06>E<EFBFBD>"+<2B>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*r)c <00>(<00>tdddddg<01><05><00>tdddddg<01><05><00>tdddddg<01><05><00>g}t|<00><00>}|s<>d d
tj<00><00>vst jt<00><00>rt jt<00><00>nd
d tj<00><00>vst j|<00><00>rt j|<00><00>nd t j|<01><00>d <0C>z}tt j|<02><00><00><00><00>d }d S)z6Test circular dependency detection with complex cycle.r<>r<>rsr<>r}r<><00>C<>Task Cr<43>rrJr<>Nr<4E>r<>s r*<00>*test_has_circular_dependency_complex_cycler<65><00>sL<00><00> <15><12><19> <20><16><1D><15> 
<EFBFBD>
<EFBFBD>
<EFBFBD> <15><12><19> <20><16><1D><15> 
<EFBFBD>
<EFBFBD>
<EFBFBD> <15><12><19> <20><16><1D><15> 
<EFBFBD>
<EFBFBD>
<EFBFBD> <06>E<EFBFBD>0+<2B>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*r)c
<00>2<00>tddddg<00><04><00>tdddddg<01><04><00>tddddddg<02><04><00>g}t|<00><00>}| }|s<>d d
tj<00><00>vst jt<00><00>rt jt<00><00>nd
d tj<00><00>vst j|<00><00>rt j|<00><00>nd t j|<01><00>d <0C>z}tt j|<03><00><00><00><00>d x}}d S)z1Test circular dependency detection with no cycle.r<>r<>rsr}r<>r<>r<>r<>z0assert not %(py3)s
{%(py3)s = %(py0)s(%(py1)s)
}rrJr<>Nr<4E>)rJrTrU<00> @py_format5s r*<00>%test_has_circular_dependency_no_cycler<65>s[<00><00> <15><12><19> <20><16><1B> 
<EFBFBD>
<EFBFBD>
<EFBFBD> <15><12><19> <20><16><1D><15> 
<EFBFBD>
<EFBFBD>
<EFBFBD> <15><12><19> <20><16><1D>s<EFBFBD><1A> 
<EFBFBD>
<EFBFBD>
<EFBFBD> <06>E<EFBFBD>0/<2F>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.r)c <00>P<00>t||<01><00>}|jD<00>] }d}|j}||k}d}||k}|r|s<>tjd||fd|||f<03><00>tj|<04><00>dt j<00><00>vstj|<03><00>rtj|<03><00>ndtj|<05><00>tj|<07><00>d<06>z} tj d|j
<00>d|j<00><00><04><00>d zd
| iz}
ttj |
<EFBFBD><00><00><00><00>d x}x}x}x}}<07><01>d S) z8Test that all generated tasks have valid priority range.<2E>r)<02><=r<>)z0%(py1)s <= %(py6)s
{%(py6)s = %(py4)s.priority
}z0%(py6)s
{%(py6)s = %(py4)s.priority
} <= %(py8)s<>task)r<r<>rkr?<00>Task z has invalid priority z
>assert %(py10)srAN) rrJrrKrLrPrMrNrO<00>_format_assertmsgr~rQrR) r+r3r9r<>r<>rnrTrVr_rXrYs r*<00>test_task_priority_ranger<65>.s<><00><00> &<26>':<3A><N<> O<> O<>D<EFBFBD><14>
<EFBFBD>C<01>C<01><04> C<01> C<01> C<01>:B<> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01>1B<31> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01>9B<39> C<01> C<01> C<01> C<01> C<01><B<> C<01> C<01> C<01> C<01> C<01>*B<> C<01> C<01> C<01> C<01> C<01>9B<39> C<01> C<01> C<01> C<01> C<01> C<01>9B<39> C<01> C<01> C<01> C<01>9B<39> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01>1B<31> C<01> C<01>@B<> C<01> C<01> C<01>:B<> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01>/B<> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01>C<01>Cr)c <00><><00>t||<01><00>}d<01>|jD<00><00>}t|<03><00>}t|<03><00>}t|<05><00>}||k}|<07>s<>t jd|fd||f<02><00>dt j<00><00>vst jt<00><00>rt j t<00><00>nddt j<00><00>vst j|<03><00>rt j |<03><00>ndt j |<04><00>dt j<00><00>vst jt<00><00>rt j t<00><00>nddt j<00><00>vst jt<00><00>rt j t<00><00>nddt j<00><00>vst j|<03><00>rt j |<03><00>ndt j |<05><00>t j |<06><00>d<07>z}t j
d<08><00>d zd
|iz} tt j | <09><00><00><00><00>d x}x}x}}d S) z$Test that all tasks have unique IDs.c<00><00>g|] }|j<00><02>
Sr()r~)rgr<>s r*riz(test_task_unique_ids.<locals>.<listcomp>;s<00><00>/<2F>/<2F>/<2F>D<EFBFBD><04><07>/<2F>/<2F>/r)rB)zn%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py11)s
{%(py11)s = %(py5)s(%(py9)s
{%(py9)s = %(py6)s(%(py7)s)
})
}r8<00>task_ids<64>set)r;r<r=r>rkrDr<><00>py11zTask IDs should be uniquez
>assert %(py13)s<>py13N) rrJr8r<>rKrLrMrNrOrPr<>rQrR)
r+r3r9r<>rT<00> @py_assert8<74> @py_assert10rU<00> @py_format12<31> @py_format14s
r*<00>test_task_unique_idsr<73>7sJ<00><00> &<26>':<3A><N<> O<> O<>D<EFBFBD>/<2F>/<2F>D<EFBFBD>J<EFBFBD>/<2F>/<2F>/<2F>H<EFBFBD>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<>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<>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<>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<>K<>K<>K<>K<>K<>K<>K<>K<>K<>K<>K<>K<>K<>K<>K<>K<>K<>Kr)c<00>"<00>t||<01><00>}|j}d}||u}|s<>tjd|fd||f<02><00>dt j<00><00>vstj|<02><00>rtj|<02><00>ndtj|<03><00>tj|<04><00>d<05>z}dd|iz}ttj |<07><00><00><00><00>dx}x}}|j
}d}||u}|s<>tjd|fd||f<02><00>dt j<00><00>vstj|<02><00>rtj|<02><00>ndtj|<03><00>tj|<04><00>d<05>z}dd|iz}ttj |<07><00><00><00><00>dx}x}}dS) z2Test that plan has creation and update timestamps.N)<01>is not)z6%(py2)s
{%(py2)s = %(py0)s.created_at
} is not %(py5)sr9rGrIrD)z6%(py2)s
{%(py2)s = %(py0)s.updated_at
} is not %(py5)s) rrrKrLrMrNrOrPrQrR<00>
updated_at)r+r3r9r^rUr_r`ras r*<00>test_plan_has_timestampsr<73>?s<><00><00> &<26>':<3A><N<> O<> O<>D<EFBFBD>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&r)c <00><><00>t||<01><00>}|jD<00>]_}|j}t|t<00><00>}|<05>s9t jd|j<00>d<02><03><00>dzdtj <00><00>vst j
t<00><00>rt j t<00><00>nddtj <00><00>vst j
|<03><00>rt j |<03><00>ndt j |<04><00>dtj <00><00>vst j
t<00><00>rt j t<00><00>ndt j |<05><00>d<07>z}tt j |<06><00><00><00><00>dx}}<05><01>adS) z*Test that required_tools is always a list.r<>z required_tools should be a listz[
>assert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.required_tools
}, %(py4)s)
}<7D>
isinstancer<EFBFBD><00>list<73>r;r<r=r<>rkN)rrJ<00>required_toolsr<73>r<>rKr<>r~rMrNrOrPrQrR<00>r+r3r9r<>rTrnros r*<00> test_task_required_tools_is_listr<74>Gs;<00><00> &<26>':<3A><N<> O<> O<>D<EFBFBD><14>
<EFBFBD>><3E>><3E><04> ><3E>/=<3D> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E>,=<3D> ><3E> ><3E>;=<3D> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E>7=<3D> ><3E> ><3E> ><3E> ><3E> ><3E>%=<3D> ><3E> ><3E> ><3E> ><3E> ><3E>4=<3D> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E>7=<3D> ><3E> ><3E> ><3E> ><3E> ><3E>%=<3D> ><3E> ><3E> ><3E> ><3E> ><3E>4=<3D> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E>4=<3D> ><3E> ><3E> ><3E> ><3E> ><3E>7=<3D> ><3E> ><3E> ><3E> ><3E> ><3E>%=<3D> ><3E> ><3E> ><3E> ><3E> ><3E>4=<3D> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E>4=<3D> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E>*=<3D> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E>><3E>>r)c <00><><00>t||<01><00>}|jD<00>]_}|j}t|t<00><00>}|<05>s9t jd|j<00>d<02><03><00>dzdtj <00><00>vst j
t<00><00>rt j t<00><00>nddtj <00><00>vst j
|<03><00>rt j |<03><00>ndt j |<04><00>dtj <00><00>vst j
t<00><00>rt j t<00><00>ndt j |<05><00>d<07>z}tt j |<06><00><00><00><00>dx}}<05><01>adS) z(Test that dependencies is always a list.r<>z dependencies should be a listzY
>assert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.dependencies
}, %(py4)s)
}r<>r<>r<>r<>N)rrJrr<>r<>rKr<>r~rMrNrOrPrQrRr<>s r*<00>test_task_dependencies_is_listr<74>Ps;<00><00> &<26>':<3A><N<> O<> O<>D<EFBFBD><14>
<EFBFBD><<3C><<3C><04> <<3C>/;<3B> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C>*;<3B> <<3C> <<3C>9;<3B> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C>5;<3B> <<3C> <<3C> <<3C> <<3C> <<3C>#;<3B> <<3C> <<3C> <<3C> <<3C> <<3C>2;<3B> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C>5;<3B> <<3C> <<3C> <<3C> <<3C> <<3C>#;<3B> <<3C> <<3C> <<3C> <<3C> <<3C>2;<3B> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C>2;<3B> <<3C> <<3C> <<3C> <<3C> <<3C>5;<3B> <<3C> <<3C> <<3C> <<3C> <<3C>#;<3B> <<3C> <<3C> <<3C> <<3C> <<3C>2;<3B> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C>2;<3B> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C>(;<3B> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C><<3C><r))'<27>__doc__<5F>builtinsrM<00>_pytest.assertion.rewrite<74> assertion<6F>rewriterK<00>pytest<73>src.engines.analysis_planningrrrr<00>src.models.data_profilerr <00>src.models.requirement_specr r <00>src.models.analysis_planr <00>fixturer+r3rbrprvrxr<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r(r)r*<00><module>r<>s<><00><01>.<2E>.<2E><00><00><00><00><00><00><00><00><00><00><00><00><00> <0A> <0A> <0A> <0A><02><02><02><02><02><02><02><02><02><02><02><02> <<3C>;<3B>;<3B>;<3B>;<3B>;<3B>;<3B>;<3B>J<>J<>J<>J<>J<>J<>J<>J<>1<>1<>1<>1<>1<>1<><08><1E>*<06>*<06><10><1E>*<06>Z<08><1E><06><06><10><1E><06>* '<27> '<27> '<27>
 <20>
 <20>
 <20><1F><1F><1F>(
<1F>
<1F>
<1F>8<>8<>8<>D'<27>'<27>'<27>47<>7<>7<>$+<2B>+<2B>+<2B>,+<2B>+<2B>+<2B>:/<2F>/<2F>/<2F>:C<01>C<01>C<01>L<01>L<01>L<01>'<27>'<27>'<27>><3E>><3E>><3E><<3C><<3C><<3C><<3C><r)