
    i                    0   d Z ddlmZ ddlZddlmc mZ ddl	m	Z	 ddl
mZ ddlmZmZ ddlZddlmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZ dUdZdVdZ dWdZ!dXdYdZ"dZdZ#d[dZ$d\dZ%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, G d+ d,          Z- G d- d.          Z. G d/ d0          Z/ G d1 d2          Z0	 	 	 d^d_d9Z1d`d<Z2 G d= d>          Z3 G d? d@          Z4 G dA dB          Z5 G dC dD          Z6 G dE dF          Z7 G dG dH          Z8 G dI dJ          Z9 G dK dL          Z: G dM dN          Z; G dO dP          Z<d\dQZ=d]dRZ> G dS dT          Z?dS )azGTDD tests for the deep_dive module (all written BEFORE implementation).    )annotationsN)datetime)Path)	MagicMockpatch)	HTTPXMock)ArticleContentBiasIndicatorCitedArgumentCredibilityBreakdownDeepDiveReport	FactCheckLogicalQualityMultiPerspectiveEvaluationResearchResultsSearchQueriesStructuralAnalysis	WebSourcereturnr	   c                 &    t          ddd          S )NThe Rise of AI Agentszhttps://example.com/ai-agentszAI agents are transforming software development. They can write code, browse the web, and execute tasks autonomously. Critics argue this creates risks.titleurlraw_text)r	        ;/root/projects/ai_usecases_explorer/tests/test_deep_dive.py_articler      s%    %+\   r   r   c                 0    t          dgdgdgdg          S )NzAI agents benefits productivityzAI agents risks criticismzAI agents research paper 2025z$AI agents market adoption statistics
supportingopposingexpertfact_checks)r   r   r   r   _search_queriesr&   (   s1    56-./0;<	   r   r   c            	     P    t          dddgdg dddgt                                S )	NzBAI agents will replace traditional software engineering workflows.z0Agents can autonomously execute multi-step tasksz*The technology is production-ready in 2025   因果论证)	AnthropicOpenAIzGitHub Copilot"GitHub Copilot has 1 million usersz"Claude 3.5 Sonnet released in 2024main_thesis
sub_claimslogical_structurekey_entitiesverifiable_factssearch_queries)r   r&   r   r   r   _structural_analysisr3   1   sK    X>8
 )>>>00
 '((   r   https://example.com/sourcer   strr   c                &    t          d| d          S )NExample Sourcez/This source supports the claim about AI agents.)r   r   snippet)r   r   s    r   _web_sourcer:   B   s"    A   r   r   c                 (    t          dddd          S )Nr+   verifiedz2GitHub official blog confirms 1M+ users as of 2024z$https://github.blog/copilot-1m-usersclaimstatusevidence
source_url)r   r   r   r   _fact_checkrB   J   s%    2E9	   r   r   c                     t          t          d          gt          d          gt          d          gt                      g          S )Nhttps://example.com/prohttps://example.com/conzhttps://example.com/expertr!   )r   r:   rB   r   r   r   _research_resultsrF   S   sO     9::;7889899: ]]O	   r   r   c            	     <    t          ddgddgddgddd	d
g          S )N'Increases developer productivity by 40%zReduces repetitive tasks&May introduce security vulnerabilitiesz!Reduces junior developer learningTechnology is still evolvingzAdoption varies by teamz>Author works for an AI company, potential conflict of interest
ףp=
?/Partially credible with some unsupported claimsz3Search for peer-reviewed studies on AI coding toolspro_argumentscon_argumentsneutral_contextbias_assessmentcredibility_scoreoverall_verdictfurther_exploration)r   r   r   r   _evaluationrU   \   sC    %@B\]?Ade79RSXIRS   r   tmp_pathr   r   c                    t          t                      t                      t                      t	                      t          dddddd          | dz            S )	N              r   ztest-report.mdarticle	structureresearch
evaluationgenerated_atreport_path)r   r   r3   rF   rU   r   )rV   s    r   _reportrd   h   sW    

&(("$$==dAr2r155//   r   c                  .    e Zd ZddZddZddZddZdS )	TestArticleContentr   Nonec                   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  }d	d
|iz  }t          t          j	        |                    d x}x}}|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}}|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 S )NTesthttps://example.comzSome text contentr   ==z-%(py2)s
{%(py2)s = %(py0)s.title
} == %(py5)sr^   py0py2py5assert %(py7)spy7z+%(py2)s
{%(py2)s = %(py0)s.url
} == %(py5)sz0%(py2)s
{%(py2)s = %(py0)s.raw_text
} == %(py5)s)r	   r   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationr   r   selfr^   @py_assert1@py_assert4@py_assert3@py_format6@py_format8s          r   test_valid_model_with_urlz,TestArticleContent.test_valid_model_with_urly   s    %(
 
 

 }&&}&&&&&&&&&&}&&&&&&&&&&&&w&&&&&w&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{333{33333333333{3333333333333w33333w333333{33333333333333333333333333333333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6w66666w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                   t          dd d          }|j        }d }||u }|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 S )
Nri   zDirect text inputr   isz+%(py2)s
{%(py2)s = %(py0)s.url
} is %(py5)sr^   rn   rr   rs   )
r	   r   rv   rw   rx   ry   rz   r{   r|   r}   r~   s          r   test_valid_model_without_urlz/TestArticleContent.test_valid_model_without_url   s     v4BUVVV{"d"{d""""""""""{d""""""""""""w"""""w""""""{""""d"""""""""""""""""""""""""""""r   c                    t          j        t                    5  t          dd           d d d            d S # 1 swxY w Y   d S )Nrj   text)r   r   pytestraises	Exceptionr	   r   s    r   test_requires_titlez&TestArticleContent.test_requires_title   s    ]9%% 	G 	G4vFFFF	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G   9= =c                    t          j        t                    5  t          dd            d d d            d S # 1 swxY w Y   d S )Nri   )r   r   r   r   s    r   test_requires_raw_textz)TestArticleContent.test_requires_raw_text   s    ]9%% 	3 	3T2222	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3r   Nr   rg   )__name__
__module____qualname__r   r   r   r   r   r   r   rf   rf   x   sh        7 7 7 7# # # #G G G G3 3 3 3 3 3r   rf   c                      e Zd ZddZddZdS )TestSearchQueriesr   rg   c                	   t                      }|j        }t          |          }d}||k    }|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        |          t          j        |          dz  }dd|iz  }t          t          j
        |                    d x}x}x}}|j        }t          |          }d}||k    }|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        |          t          j        |          dz  }dd|iz  }t          t          j
        |                    d x}x}x}}|j        }t          |          }d}||k    }|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        |          t          j        |          dz  }dd|iz  }t          t          j
        |                    d x}x}x}}|j        }t          |          }d}||k    }|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        |          t          j        |          dz  }dd|iz  }t          t          j
        |                    d x}x}x}}d S )N   rk   zP%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.supporting
})
} == %(py8)slenqro   py1py3rq   py8assert %(py10)spy10zN%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.opposing
})
} == %(py8)szL%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.expert
})
} == %(py8)szQ%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.fact_checks
})
} == %(py8)s)r&   r"   r   rv   rw   rx   ry   rz   r{   r|   r}   r#   r$   r%   )r   r   @py_assert2r   @py_assert7@py_assert6@py_format9@py_format11s           r   test_valid_modelz"TestSearchQueries.test_valid_model   s   <%s<  %A% A%%%%%%%%%% A%%%%%%%%%%%%s%%%%%s%%%%%%%%%%%%%1%%%%%1%%%%%%<%%%% %%%%A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%:#s:#!#!##########!############s#####s#############1#####1######:########!#############################8!s8}}!!}!!!!!!!!!!}!!!!!!!!!!!!s!!!!!s!!!!!!!!!!!!!1!!!!!1!!!!!!8!!!!}!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!=&s=!!&Q&!Q&&&&&&&&&&!Q&&&&&&&&&&&&s&&&&&s&&&&&&&&&&&&&1&&&&&1&&&&&&=&&&&!&&&&Q&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&r   c                   t          g g g g           }|j        }g }||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 S )Nr!   rk   z2%(py2)s
{%(py2)s = %(py0)s.supporting
} == %(py5)sr   rn   rr   rs   )
r   r"   rv   rw   rx   ry   rz   r{   r|   r}   )r   r   r   r   r   r   r   s          r   test_empty_lists_allowedz*TestSearchQueries.test_empty_lists_allowed   s    R"RRPPP|!r!|r!!!!!!!!!!|r!!!!!!!!!!!!q!!!!!q!!!!!!|!!!!r!!!!!!!!!!!!!!!!!!!!!!!!!!!!!r   Nr   )r   r   r   r   r   r   r   r   r   r      s<        ' ' ' '" " " " " "r   r   c                      e Zd ZddZddZdS )TestStructuralAnalysisr   rg   c                   t                      }|j        }|j        }d} ||          }|sddt          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          t          j        |          t          j        |          dz  }t          t          j	        |                    d x}x}x}}|j
        }t          |          }d}||k    }	|	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        |          t          j        |          d	z  }d
d|iz  }
t          t          j	        |
                    d x}x}x}	}|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}}|j        }t          |          }d}||k    }	|	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        |          t          j        |          d	z  }d
d|iz  }
t          t          j	        |
                    d x}x}x}	}|j        }t          |          }d}||k    }	|	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        |          t          j        |          d	z  }d
d|iz  }
t          t          j	        |
                    d x}x}x}	}|j        }t#          |t$                    }|sd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        |          dt          j                    v st          j        t$                    rt          j        t$                    ndt          j        |          dz  }t          t          j	        |                    d x}}d S )N	AI agentszmassert %(py8)s
{%(py8)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.main_thesis
}.startswith
}(%(py6)s)
}sa)ro   rp   py4py6r   rY   rk   zP%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.sub_claims
})
} == %(py8)sr   r   r   r   r(   )z9%(py2)s
{%(py2)s = %(py0)s.logical_structure
} == %(py5)srn   rr   rs      )zR%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.key_entities
})
} == %(py8)s)zV%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.verifiable_facts
})
} == %(py8)sYassert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.search_queries
}, %(py4)s)
}
isinstancer   ro   r   r   r   r   )r3   r-   
startswithrx   ry   rv   rz   r{   r|   r}   r.   r   rw   r/   r0   r1   r2   r   r   )r   r   r   r   @py_assert5r   r   r   r   r   r   r   r   @py_format7s                 r   r   z'TestStructuralAnalysis.test_valid_model   s   !##~5~(55((555555555555555r55555r555555~5555(55555555555555555555555555555555=&s=!!&Q&!Q&&&&&&&&&&!Q&&&&&&&&&&&&s&&&&&s&&&&&&&&&&&&&2&&&&&2&&&&&&=&&&&!&&&&Q&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#5~5#~5555555555#~555555555555r55555r555555#5555~555555555555555555555555555?(s?##(q(#q((((((((((#q((((((((((((s(((((s(((((((((((((2(((((2((((((?((((#((((q(((((((((((((((((((((((((((((&,s&'',1,'1,,,,,,,,,,'1,,,,,,,,,,,,s,,,,,s,,,,,,,,,,,,,2,,,,,2,,,,,,&,,,,',,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,+;z+];;;;;;;;;;;;;;;z;;;;;z;;;;;;;;;;;;;";;;;;";;;;;;+;;;;;;;;;;;];;;;;];;;;;;;;;;;;;;;;;;;;;;;;;;;;r   c                    t          j        t                    5  t          d           d d d            d S # 1 swxY w Y   d S )Nz	only this)r-   )r   r   r   r   r   s    r   test_requires_all_fieldsz/TestStructuralAnalysis.test_requires_all_fields   s    ]9%% 	8 	8;7777	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8s   8<<Nr   )r   r   r   r   r   r   r   r   r   r      s<        < < < <8 8 8 8 8 8r   r   c                      e Zd ZddZdS )TestWebSourcer   rg   c                   t                      }|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}}|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
}|j        }||v }|st          j        d|fd||f          t          j        |          dt	          j                    v st          j        |          rt          j        |          ndt          j        |          dz  }dd|iz  }t          t          j	        |                    d x}x}}d S )Nr7   rk   rm   wsrn   rr   rs   r4   rt   r   in)z/%(py1)s in %(py5)s
{%(py5)s = %(py3)s.snippet
}r   r   rq   )r:   r   rv   rw   rx   ry   rz   r{   r|   r}   r   r8   )	r   r   r   r   r   r   r   @py_assert0r   s	            r   r   zTestWebSource.test_valid_model   s   ]]x+++x+++++++++++x+++++++++++++r+++++r++++++x++++++++++++++++++++++++++++++++v555v55555555555v5555555555555r55555r555555v55555555555555555555555555555555(bj({j(((((((((({j((((({(((((((((((b(((((b((((((j(((((((((((((((((((((((((((((r   Nr   r   r   r   r   r   r   r   r   r      s(        ) ) ) ) ) )r   r   c                      e Zd ZddZddZdS )TestFactCheckr   rg   c                "   t                      }|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}}|j
        }d }||u}|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 S )
Nr<   rk   z.%(py2)s
{%(py2)s = %(py0)s.status
} == %(py5)sfcrn   rr   rs   is not)z6%(py2)s
{%(py2)s = %(py0)s.source_url
} is not %(py5)s)rB   r?   rv   rw   rx   ry   rz   r{   r|   r}   rA   r   r   r   r   r   r   r   s          r   r   zTestFactCheck.test_valid_model   s   ]]y&J&yJ&&&&&&&&&&yJ&&&&&&&&&&&&r&&&&&r&&&&&&y&&&&J&&&&&&&&&&&&&&&&&&&&&&&&&&&}(D(}D((((((((((}D((((((((((((r(((((r((((((}((((D(((((((((((((((((((((((((((((r   c                ,   t          d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  }d	d
|iz  }t          t          j	        |                    d x}x}}|j
        }d }||u }|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 S )Nz
Some claimdisputedzEvidence herer=   rk   r   r   rn   rr   rs   r   )z2%(py2)s
{%(py2)s = %(py0)s.source_url
} is %(py5)s)r   r?   rv   rw   rx   ry   rz   r{   r|   r}   rA   r   s          r   test_status_can_be_any_stringz+TestFactCheck.test_status_can_be_any_string   s   $	
 
 
 y&J&yJ&&&&&&&&&&yJ&&&&&&&&&&&&r&&&&&r&&&&&&y&&&&J&&&&&&&&&&&&&&&&&&&&&&&&&&&}$$}$$$$$$$$$$}$$$$$$$$$$$$r$$$$$r$$$$$$}$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$r   Nr   )r   r   r   r   r   r   r   r   r   r      s<        ) ) ) )
% % % % % %r   r   c                      e Zd ZddZdS )TestResearchResultsr   rg   c                	   t                      }|j        }t          |          }d}||k    }|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        |          t          j        |          dz  }dd|iz  }t          t          j
        |                    d x}x}x}}|j        }t          |          }d}||k    }|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        |          t          j        |          dz  }dd|iz  }t          t          j
        |                    d x}x}x}}|j        }t          |          }d}||k    }|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        |          t          j        |          dz  }dd|iz  }t          t          j
        |                    d x}x}x}}|j        }t          |          }d}||k    }|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        |          t          j        |          dz  }dd|iz  }t          t          j
        |                    d x}x}x}}d S )Nr   rk   r   r   rrr   r   r   r   r   r   )rF   r"   r   rv   rw   rx   ry   rz   r{   r|   r}   r#   r$   r%   )r   r   r   r   r   r   r   r   s           r   r   z$TestResearchResults.test_valid_model   s     =&s=!!&Q&!Q&&&&&&&&&&!Q&&&&&&&&&&&&s&&&&&s&&&&&&&&&&&&&2&&&&&2&&&&&&=&&&&!&&&&Q&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;$s;$1$1$$$$$$$$$$1$$$$$$$$$$$$s$$$$$s$$$$$$$$$$$$$2$$$$$2$$$$$$;$$$$$$$$1$$$$$$$$$$$$$$$$$$$$$$$$$$$$$9"s9~~""~""""""""""~""""""""""""s"""""s"""""""""""""2"""""2""""""9""""~""""""""""""""""""""""""""""""""">'s>""'a'"a''''''''''"a''''''''''''s'''''s'''''''''''''2'''''2''''''>''''"''''a'''''''''''''''''''''''''''''''r   Nr   r   r   r   r   r   r      s(        ( ( ( ( ( (r   r   c                      e Zd ZddZddZdS )TestMultiPerspectiveEvaluationr   rg   c                \   t                      }|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}}|j
        }t          |          }d}||k    }	|	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        |          t          j        |          dz  }
dd|
iz  }t          t          j	        |                    d x}x}x}	}|j        }t          |          }d}||k    }	|	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        |          t          j        |          dz  }
dd|
iz  }t          t          j	        |                    d x}x}x}	}d S )NrK   rk   z9%(py2)s
{%(py2)s = %(py0)s.credibility_score
} == %(py5)sevrn   rr   rs   rY   zS%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.pro_arguments
})
} == %(py8)sr   r   r   r   zS%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.con_arguments
})
} == %(py8)s)rU   rR   rv   rw   rx   ry   rz   r{   r|   r}   rN   r   rO   )r   r   r   r   r   r   r   r   r   r   r   r   s               r   r   z/TestMultiPerspectiveEvaluation.test_valid_model   sn   ]]#+t+#t++++++++++#t++++++++++++r+++++r++++++#++++t+++++++++++++++++++++++++++#)s#$$))$))))))))))$))))))))))))s)))))s)))))))))))))2)))))2))))))#))))$)))))))))))))))))))))))))))))))))#)s#$$))$))))))))))$))))))))))))s)))))s)))))))))))))2)))))2))))))#))))$)))))))))))))))))))))))))))))))))))r   c                   t                      }|j        }t          |t                    }|sd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        |          dt	          j                    v st          j        t                    rt          j        t                    ndt          j        |          dz  }t          t          j
        |                    d x}}d S )Nz\assert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.credibility_score
}, %(py4)s)
}r   r   floatr   )rU   rR   r   r   rx   ry   rv   rz   r{   r|   r}   )r   r   r   r   r   s        r   test_credibility_score_is_floatz>TestMultiPerspectiveEvaluation.test_credibility_score_is_float   s2   ]].6z.666666666666666z66666z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   Nr   )r   r   r   r   r   r   r   r   r   r      s<        * * * *7 7 7 7 7 7r   r   c                      e Zd ZddZd	dZdS )
TestDeepDiveReportrV   r   r   rg   c                   t          |          }|j        }|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        |          t          j        |          dz  }dd|iz  }t          t          j
        |                    d x}x}x}}|j        }	t          |	t                    }|sd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        |	          d
t          j                    v st          j        t                    rt          j        t                    nd
t          j        |          dz  }
t          t          j
        |
                    d x}	}|j        }d }||u}|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 S )Nr   rk   )zJ%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.article
}.title
} == %(py7)srro   rp   r   rs   assert %(py9)spy9zWassert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.generated_at
}, %(py4)s)
}r   r   r   r   )z7%(py2)s
{%(py2)s = %(py0)s.report_path
} is not %(py5)srn   rr   rs   )rd   r^   r   rv   rw   rx   ry   rz   r{   r|   r}   rb   r   r   rc   )r   rV   r   r   r   r   r   r   @py_format10r   r   r   r   s                r   r   z#TestDeepDiveReport.test_valid_model   s   Hy9y9"99"99999999999"9999999999999q99999q999999y99999999"999999999999999999999999999999.3z.(333333333333333z33333z3333333333333!33333!333333.33333333333(33333(33333333333333333333333333}(D(}D((((((((((}D((((((((((((q(((((q((((((}((((D(((((((((((((((((((((((((((((r   c                *   t          t                      t                      t                      t	                      t          ddd                    }|j        }d }||u }|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 S )NrX   rY   rZ   )r^   r_   r`   ra   rb   r   z3%(py2)s
{%(py2)s = %(py0)s.report_path
} is %(py5)sr   rn   rr   rs   )r   r   r3   rF   rU   r   rc   rv   rw   rx   ry   rz   r{   r|   r}   )r   r   r   r   r   r   r   s          r   test_report_path_optionalz,TestDeepDiveReport.test_report_path_optional   s*   JJ*,,&(("}}!$2..
 
 
 }$$}$$$$$$$$$$}$$$$$$$$$$$$q$$$$$q$$$$$$}$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$r   NrV   r   r   rg   r   )r   r   r   r   r   r   r   r   r   r      s<        ) ) ) )% % % % % %r   r   c                  >    e Zd ZddZddZddZddZdd	Zdd
ZdS )TestContentFetcherr   rg   c                   ddl m}  |            }|                    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}}|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}}|j        }d }||u }|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 S )Nr   ContentFetcherzSome article text about AIz
My Article)r   rk   rm   r^   rn   rr   rs   ru   r   r   )&ai_usecases_explorer.deep_dive.fetcherr   	from_textr   rv   rw   rx   ry   rz   r{   r|   r}   r   r   	r   r   fetcherr^   r   r   r   r   r   s	            r   test_from_text_returns_articlez1TestContentFetcher.test_from_text_returns_article   s   IIIIII .""##$@#UU},,},,,,,,,,,,},,,,,,,,,,,,w,,,,,w,,,,,,},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,?#??#???????????#?????????????w?????w??????????#????????????????????????????{"d"{d""""""""""{d""""""""""""w"""""w""""""{""""d"""""""""""""""""""""""""""""r   c                   ddl m}  |            }|                    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 S )Nr   r   zSome content !=z-%(py2)s
{%(py2)s = %(py0)s.title
} != %(py5)sr^   rn   rr   rs   )r   r   r   r   rv   rw   rx   ry   rz   r{   r|   r}   r   s	            r   test_from_text_default_titlez/TestContentFetcher.test_from_text_default_title   s   IIIIII .""##N33}""}""""""""""}""""""""""""w"""""w""""""}"""""""""""""""""""""""""""""""""r   
httpx_mockr   c                   ddl m} d}|                    |ddi            |            }|                    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}|j        }||v }|st          j        d|fd||f          t          j
        |          d
t          j                    v st          j	        |          rt          j
        |          nd
t          j
        |          dz  }	dd|	iz  }
t          t          j        |
                    d x}x}}d S )Nr   r   zX<html><head><title>Test Page</title></head><body><p>Main content here.</p></body></html>content-type	text/htmlr   headershttps://example.com/articlerk   rt   r^   rn   rr   rs   zMain content herer   )z0%(py1)s in %(py5)s
{%(py5)s = %(py3)s.raw_text
}r   )r   r   add_response	fetch_urlr   rv   rw   rx   ry   rz   r{   r|   r}   r   )r   r  r   htmlr   r^   r   r   r   r   r   r   r   s                r   test_fetch_url_returns_articlez1TestContentFetcher.test_fetch_url_returns_article  s#   IIIIIIiTNK3PQQQ .""##$ABB{;;;{;;;;;;;;;;;{;;;;;;;;;;;;;w;;;;;w;;;;;;{;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"6g&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6g66666g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                   ddl m} ddz  }d| d}|                    |ddi	            |            }|                    d
          }|j        }t          |          }d}	||	k    }
|
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        |          t          j        |	          dz  }dd|iz  }t          t          j        |                    d x}x}x}
}	d S )Nr   r   zword i'  z<html><body><p>z</p></body></html>r  r  r  zhttps://example.com/longi@  )<=)zN%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.raw_text
})
} <= %(py8)sr   r^   r   r   r   )r   r   r	  r
  r   r   rv   rw   rx   ry   rz   r{   r|   r}   )r   r  r   	long_textr  r   r^   r   r   r   r   r   r   s                r   &test_fetch_url_truncates_at_8000_charsz9TestContentFetcher.test_fetch_url_truncates_at_8000_chars  s   IIIIIIeO	>>>>TNK3PQQQ .""##$>??#,s#$$,,$,,,,,,,,,,$,,,,,,,,,,,,s,,,,,s,,,,,,,,,,,,,7,,,,,7,,,,,,#,,,,$,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,r   c                   ddl m} d}|                    |ddi            |            }|                    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 S )Nr   r   zR<html><head><title>Article Title</title></head><body><p>Content.</p></body></html>r  r  r  r  zArticle Titlerk   rm   r^   rn   rr   rs   )r   r   r	  r
  r   rv   rw   rx   ry   rz   r{   r|   r}   )r   r  r   r  r   r^   r   r   r   r   r   s              r   #test_fetch_url_sets_title_from_htmlz6TestContentFetcher.test_fetch_url_sets_title_from_html  s;   IIIIIIcTNK3PQQQ .""##$ABB}//}//////////}////////////w/////w//////}/////////////////////////////////r   c                    ddl m} |                    d            |            }t          j        t
                    5  |                    d           d d d            d S # 1 swxY w Y   d S )Nr   r   i  )status_codezhttps://example.com/notfound)r   r   r	  r   r   r   r
  )r   r  r   r   s       r   #test_fetch_url_raises_on_http_errorz6TestContentFetcher.test_fetch_url_raises_on_http_error"  s    IIIIIIC000 .""]9%% 	> 	><===	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	>s    A##A'*A'Nr   )r  r   r   rg   )	r   r   r   r   r  r  r  r  r  r   r   r   r   r      s        # # # ## # # #	7 	7 	7 	7	- 	- 	- 	-0 0 0 0> > > > > >r   r   c                  6    e Zd Zd
dZddZddZddZddZd	S )TestStructuralAnalyzerr   dictc           
     0    dddgdddgdgdgd	gd
gdgddS )N&AI will transform software developmentClaim 1zClaim 2r(   r)   GitHubGitHub has 100M userszAI benefits productivityzAI risks criticismzAI research paperzGitHub users countr!   r,   r   r   s    r   _fake_llm_responsez)TestStructuralAnalyzer._fake_llm_response2  sO    C$i0!/((3!8 99:12./ 45	 
 
 	
r   rg   c                   ddl m} t          d|                                           5   |t	                      d          }|                    t                                }d d d            n# 1 swxY w Y   t          |t                    }|sd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 }|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 S )Nr   StructuralAnalyzerDai_usecases_explorer.deep_dive.analyzer.StructuralAnalyzer._call_llmreturn_valueclaude-sonnet-4-6clientmodel5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}r   resultr   ro   r   rp   r   r  rk   )z3%(py2)s
{%(py2)s = %(py0)s.main_thesis
} == %(py5)srn   rr   rs   )'ai_usecases_explorer.deep_dive.analyzerr!  r   r  r   runr   r   r   rx   ry   rv   rz   r{   r|   r}   r-   rw   )
r   r!  analyzerr*  r   @py_format5r   r   r   r   s
             r   $test_run_returns_structural_analysisz;TestStructuralAnalyzer.test_run_returns_structural_analysisA  s   NNNNNNR0022
 
 
 	. 	. *)DWXXXH\\(**--F	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. &"4555555555555555z55555z5555555555555&55555&5555555555555"455555"4555555555555555555555555!M%MM!%MMMMMMMMMMM!%MMMMMMMMMMMMMvMMMMMvMMMMMM!MMMM%MMMMMMMMMMMMMMMMMMMMMMMMMMMMMM   ;A11A58A5c                   ddl m} t          d|                                           5   |t	                      d          }|                    t                                }d d d            n# 1 swxY w Y   |j        }t          |          }d}||k    }|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        |          t          j        |          dz  }dd|iz  }	t          t          j        |	                    d x}x}x}}d}
|j        }|
|v }|st          j
        d|fd|
|f          t          j        |
          dt          j                    v st          j        |          rt          j        |          ndt          j        |          dz  }dd|iz  }t          t          j        |                    d x}
x}}d S )Nr   r   r"  r#  r%  r&  rY   rk   r   r   r*  r   r   r   r  r   )z2%(py1)s in %(py5)s
{%(py5)s = %(py3)s.sub_claims
}r   rr   rs   )r,  r!  r   r  r   r-  r   r.   r   rv   rw   rx   ry   rz   r{   r|   r}   )r   r!  r.  r*  r   r   r   r   r   r   r   r   r   s                r   test_run_parses_sub_claimsz1TestStructuralAnalyzer.test_run_parses_sub_claimsN  s   NNNNNNR0022
 
 
 	. 	. *)DWXXXH\\(**--F	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. $*s$%%**%**********%************s*****s*************6*****6******$****%*********************************-F--y-----------y------y-----------F-----F------------------------------------r1  c           	        ddl m} t          d|                                           5   |t	                      d          }|                    t                                }d d d            n# 1 swxY w Y   |j        }t          |t                    }|sd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        |          d
t          j                    v st          j        t                    rt          j        t                    nd
t          j        |          dz  }t          t          j        |                    d x}}|j        }|j        }t%          |          }d}	||	k    }
|
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        |          t          j        |          t          j        |	          dz  }dd|iz  }t          t          j        |                    d x}x}x}x}
}	d S )Nr   r   r"  r#  r%  r&  r   r   r*  r   r   r   rk   )zu%(py7)s
{%(py7)s = %(py0)s(%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.search_queries
}.supporting
})
} == %(py10)sr   ro   r   r   rq   rs   r   assert %(py12)spy12)r,  r!  r   r  r   r-  r   r2   r   r   rx   ry   rv   rz   r{   r|   r}   r"   r   rw   )r   r!  r.  r*  r   r   r   r   r   @py_assert9@py_assert8r   @py_format13s                r   test_run_parses_search_queriesz5TestStructuralAnalyzer.test_run_parses_search_queries[  sF   NNNNNNR0022
 
 
 	. 	. *)DWXXXH\\(**--F	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. !/?z/???????????????z?????z?????????????&?????&??????/??????????????????????????????????????????(9(39s34499499999999994999999999999s99999s99999999999996999996999999(99993999949999999999999999999999999999999999999r1  c                   ddl m} t          d|                                           5 } |t	                      d          }|                    t                                 d d d            n# 1 swxY w Y   |                                 |j        d         d         }t          |t                    }|sd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 }d S )Nr   r   r"  r#  r%  r&  r)  r   call_argr	   r+  )r,  r!  r   r  r   r-  r   assert_called_once	call_argsr   r	   rx   ry   rv   rz   r{   r|   r}   )r   r!  mock_llmr.  r=  r   r/  s          r   'test_run_calls_llm_with_article_contentz>TestStructuralAnalyzer.test_run_calls_llm_with_article_contenth  s   NNNNNNR0022
 
 
 	% ))DWXXXHLL$$$	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	##%%%%a(+(N333333333333333z33333z3333333333333(33333(3333333333333N33333N33333333333333333333333333r1  Nr   r  r   )r   r   r   r  r0  r3  r;  rA  r   r   r   r  r  1  s|        
 
 
 
N N N N. . . .: : : :4 4 4 4 4 4r   r  https://example.com/resultResearch Finding)This is the content of the search result.r   r   r   c                L    t                      }| |_        ||_        ||_        |S N)r   r   r   r   )r   r   r   r*  s       r   _make_exa_resultrH  |  s'    
 [[FFJFLFKMr   resultslist[MagicMock]c                0    t                      }| |_        |S rG  )r   rI  )rI  responses     r   _make_exa_responserM    s    {{HHOr   c                  >    e Zd Zd
dZd
dZd
dZd
dZd
dZd
dZd	S )TestWebResearcherr   rg   c                   ddl m} t                      }t          t	                      g          |j        _         ||          }|                    t                                }t          |t                    }|sd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 }d S )	Nr   WebResearcher
exa_clientr)  r   r*  r   r+  ))ai_usecases_explorer.deep_dive.researcherrR  r   rM  rH  search_and_contentsr$  r-  r&   r   r   rx   ry   rv   rz   r{   r|   r}   )r   rR  mock_exa
researcherr*  r   r/  s          r   !test_run_returns_research_resultsz3TestWebResearcher.test_run_returns_research_results  sr   KKKKKK;;4F 5
 5
$1 #]h777
 1 122&/222222222222222z22222z2222222222222&22222&2222222222222/22222/22222222222222222222222222r   c                
   ddl m} t                      }t          t	          d          g          |j        _         ||          }|                    t                                }|j	        }t          |t                    }|sd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        |          d	t          j                    v st          j        t                    rt          j        t                    nd	t          j        |          d
z  }t#          t          j        |                    d x}}|j        }t          |t                    }|sd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        |          d	t          j                    v st          j        t                    rt          j        t                    nd	t          j        |          d
z  }t#          t          j        |                    d x}}|j        }t          |t                    }|sd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        |          d	t          j                    v st          j        t                    rt          j        t                    nd	t          j        |          d
z  }t#          t          j        |                    d x}}|j        }t          |t                    }|sd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        |          d	t          j                    v st          j        t                    rt          j        t                    nd	t          j        |          d
z  }t#          t          j        |                    d x}}d S )Nr   rQ  zhttps://pro.example.comr9   rS  zUassert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.supporting
}, %(py4)s)
}r   r*  listr   zSassert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.opposing
}, %(py4)s)
}zQassert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.expert
}, %(py4)s)
}zVassert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.fact_checks
}, %(py4)s)
})rU  rR  r   rM  rH  rV  r$  r-  r&   r"   r   r[  rx   ry   rv   rz   r{   r|   r}   r#   r$   r%   )r   rR  rW  rX  r*  r   r   r   s           r   #test_run_returns_supporting_sourcesz5TestWebResearcher.test_run_returns_supporting_sources  s   KKKKKK;;4F";<<<=5
 5
$1 #]h777
 1 122 +2z+T222222222222222z22222z2222222222222&22222&222222+22222222222T22222T22222222222222222222222222 /0z/4000000000000000z00000z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000000004000004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 -.z-...............z.....z.............&.....&......-.......................................... ,3z,d333333333333333z33333z3333333333333&33333&333333,33333333333d33333d3333333333333333333333333333r   c                t   ddl m} t                      }t          g           |j        _         ||          }|                    t                                 |j        }|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        |          t          j        |          dz  }d	d
|iz  }	t          t          j        |	                    d x}x}x}}d S )Nr   rQ  rS     )>=)z[%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.search_and_contents
}.call_count
} >= %(py7)srW  r   r   r   )rU  rR  r   rM  rV  r$  r-  r&   
call_countrv   rw   rx   ry   rz   r{   r|   r}   )
r   rR  rW  rX  r   r   r   r   r   r   s
             r   &test_run_calls_exa_for_each_query_typez8TestWebResearcher.test_run_calls_exa_for_each_query_type  sa   KKKKKK;;4Fr4J4J$1"]h777
(())) +;+6;!;6!;;;;;;;;;;6!;;;;;;;;;;;;x;;;;;x;;;;;;+;;;;6;;;;!;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;r   c                B   ddl m} t          d          }t                      }t	          ||g          |j        _         ||          }|                    t                                }d |j	        |j
        z   |j        z   D             }t          |          }t          |          }t          |          }	||	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        |          d	t!          j                    v st          j        t                    rt          j        t                    nd	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}
x}}	d S )Nr   rQ  zhttps://example.com/duplicater9   rS  c                    g | ]	}|j         
S r   r9   ).0ss     r   
<listcomp>zJTestWebResearcher.test_run_deduplicates_results_by_url.<locals>.<listcomp>  s    WWWaAEWWWr   rk   )zn%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py11)s
{%(py11)s = %(py5)s(%(py9)s
{%(py9)s = %(py6)s(%(py7)s)
})
}r   all_urlsset)ro   r   r   rq   r   rs   r   py11zassert %(py13)spy13)rU  rR  rH  r   rM  rV  r$  r-  r&   r"   r#   r$   r   rh  rv   rw   rx   ry   rz   r{   r|   r}   )r   rR  same_resultrW  rX  r*  rg  r   r9  @py_assert10r   @py_format12@py_format14s                r   $test_run_deduplicates_results_by_urlz6TestWebResearcher.test_run_deduplicates_results_by_url  s   KKKKKK&+JKKK;;4F+&5
 5
$1 #]h777
 1 122WW6#4v#F#VWWW8}}2CMM2M 2 22} 22222222222} 2222222222222s22222s22222222222228222228222222}22222222222222222222222222222C22222C222222222222222222222222M2222 22222222222222222222222222222222r   c                   ddl m} t                      }t          d          |j        _         ||          }|                    t                                }t          |t                    }|sd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 }|j        }g }||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 S )Nr   rQ  z	API errorrS  r)  r   r*  r   r+  rk   r   rn   rr   rs   )rU  rR  r   RuntimeErrorrV  side_effectr-  r&   r   r   rx   ry   rv   rz   r{   r|   r}   r"   rw   )r   rR  rW  rX  r*  r   r/  r   r   r   r   s              r   %test_run_gracefully_handles_exa_errorz7TestWebResearcher.test_run_gracefully_handles_exa_error  sE   KKKKKK;;3?3L3L$0"]h777
 1 122 &/222222222222222z22222z2222222222222&22222&2222222222222/22222/222222222222222222222222 &B& B&&&&&&&&&& B&&&&&&&&&&&&v&&&&&v&&&&&& &&&&B&&&&&&&&&&&&&&&&&&&&&&&&&&&&&r   c                   ddl m} t                      }t          t	          ddd          g          |j        _         ||          }|                    t                                }|j	        rR|j	        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}}|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}}|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 S d S )Nr   rQ  zhttps://example.com/r1zTitle 1z	Snippet 1)r   r   r   rS  r   r   r   sourcern   rr   rs   )z+%(py2)s
{%(py2)s = %(py0)s.url
} != %(py5)s)z/%(py2)s
{%(py2)s = %(py0)s.snippet
} != %(py5)s)rU  rR  r   rM  rH  rV  r$  r-  r&   r"   r   rv   rw   rx   ry   rz   r{   r|   r}   r   r8   )r   rR  rW  rX  r*  ru  r   r   r   r   r   s              r   #test_web_source_has_required_fieldsz5TestWebResearcher.test_web_source_has_required_fields  s3   KKKKKK;;4F":)R]^^^_5
 5
$1 #]h777
 1 122 	(&q)F<%2%<2%%%%%%%%%%<2%%%%%%%%%%%%6%%%%%6%%%%%%<%%%%2%%%%%%%%%%%%%%%%%%%%%%%%%%%:##:##########:############6#####6######:###############################>'R'>R''''''''''>R''''''''''''6'''''6''''''>''''R'''''''''''''''''''''''''''''		( 	(r   Nr   )	r   r   r   rY  r\  ra  ro  rs  rv  r   r   r   rO  rO    s        
3 
3 
3 
34 4 4 4	< 	< 	< 	<3 3 3 3
' 
' 
' 
'( ( ( ( ( (r   rO  c                  >    e Zd ZddZddZddZddZddZdd	Zd
S )TestMultiPerspectiveEvaluatorr   r  c                     ddgdgdgddddgd	S )
NArgument for 1zArgument for 2zArgument against 1zBackground context 1zSlight pro-AI bias detected?z Moderately credible with caveatszLook for peer-reviewed studiesrM   r   r   s    r   r  z0TestMultiPerspectiveEvaluator._fake_llm_response  s5    .0@A23 67<!%A$D#E
 
 	
r   rg   c                   ddl m} t          d|                                           5   |t	                      d          }|                    t                      t                                }d d d            n# 1 swxY w Y   t          |t                    }|sd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 }|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 S )Nr   MultiPerspectiveEvaluatorLai_usecases_explorer.deep_dive.evaluator.MultiPerspectiveEvaluator._call_llmr#  r%  r&  r)  r   r*  r   r+  r{  rk   r   rn   rr   rs   )(ai_usecases_explorer.deep_dive.evaluatorr~  r   r  r   r-  r3   rF   r   r   rx   ry   rv   rz   r{   r|   r}   rR   rw   )
r   r~  	evaluatorr*  r   r/  r   r   r   r   s
             r   test_run_returns_evaluationz9TestMultiPerspectiveEvaluator.test_run_returns_evaluation  s   VVVVVVZ0022
 
 
 	P 	P 21L_```I]]#7#9#9;L;N;NOOF	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P &"<===============z=====z=============&=====&============="<====="<========================'/4/'4//////////'4////////////v/////v//////'////4/////////////////////////////   AA>>BBc                   ddl m} t          d|                                           5   |t	                      d          }|                    t                      t                                }d d d            n# 1 swxY w Y   |j        }t          |          }d}||k    }|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        |          t          j        |          dz  }dd|iz  }	t!          t          j        |	                    d x}x}x}}d}
|j        }|
|v }|st          j        d|fd|
|f          t          j        |
          dt          j                    v st          j        |          rt          j        |          ndt          j        |          dz  }dd|iz  }t!          t          j        |                    d x}
x}}d S )Nr   r}  r  r#  r%  r&  rY   rk   r   r   r*  r   r   r   rz  r   )z5%(py1)s in %(py5)s
{%(py5)s = %(py3)s.pro_arguments
}r   rr   rs   )r  r~  r   r  r   r-  r3   rF   rN   r   rv   rw   rx   ry   rz   r{   r|   r}   r   r~  r  r*  r   r   r   r   r   r   r   r   r   s                r   test_run_parses_pro_argumentsz;TestMultiPerspectiveEvaluator.test_run_parses_pro_arguments  s   VVVVVVZ0022
 
 
 	P 	P 21L_```I]]#7#9#9;L;N;NOOF	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P '-s'((-A-(A----------(A------------s-----s-------------6-----6------'----(----A-----------------------------76#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76777776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                r   ddl m} t          d|                                           5   |t	                      d          }|                    t                      t                                }d d d            n# 1 swxY w Y   |j        }t          |          }d}||k    }|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        |          t          j        |          dz  }dd|iz  }	t!          t          j        |	                    d x}x}x}}d S )Nr   r}  r  r#  r%  r&  r   rk   r   r   r*  r   r   r   )r  r~  r   r  r   r-  r3   rF   rO   r   rv   rw   rx   ry   rz   r{   r|   r}   )
r   r~  r  r*  r   r   r   r   r   r   s
             r   test_run_parses_con_argumentsz;TestMultiPerspectiveEvaluator.test_run_parses_con_arguments  s$   VVVVVVZ0022
 
 
 	P 	P 21L_```I]]#7#9#9;L;N;NOOF	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P '-s'((-A-(A----------(A------------s-----s-------------6-----6------'----(----A-------------------------------r  c                X   ddl m} t          d|                                           5 } |t	                      d          }|                    t                      t                                 d d d            n# 1 swxY w Y   |                                 |j	        d         }|d         }t          |t                    }|sd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         }t          |t&                    }|sd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 S )Nr   r}  r  r#  r%  r&  z5assert %(py5)s
{%(py5)s = %(py0)s(%(py2)s, %(py3)s)
}r   r   )ro   rp   r   rq   r   r   )r  r~  r   r  r   r-  r3   rF   r>  r?  r   r   rx   ry   rv   rz   r{   r|   r}   r   )r   r~  r@  r  argsr   r   r   s           r   #test_run_calls_llm_with_both_inputszATestMultiPerspectiveEvaluator.test_run_calls_llm_with_both_inputs  s   VVVVVVZ0022
 
 
 	G 11L_```IMM.002C2E2EFFF	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	##%%%!!$q'6z'#5666666666666666z66666z666666'66666666666#566666#5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q'3z'?333333333333333z33333z333333'33333333333?33333?3333333333333333333333333333r  c                   ddl m} t          d|                                           5   |t	                      d          }|                    t                      t                                }d d d            n# 1 swxY w Y   |j        }t          |t                    }|sd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        |          d
t          j                    v st          j        t                    rt          j        t                    nd
t          j        |          dz  }t!          t          j        |                    d x}}|j        }t%          |          }d}||k    }	|	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        |          t          j        |          dz  }
dd|
iz  }t!          t          j        |                    d x}x}x}	}d S )Nr   r}  r  r#  r%  r&  zZassert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.overall_verdict
}, %(py4)s)
}r   r*  r5   r   >)zT%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.overall_verdict
})
} > %(py8)sr   r   r   r   )r  r~  r   r  r   r-  r3   rF   rS   r   r5   rx   ry   rv   rz   r{   r|   r}   r   rw   )r   r~  r  r*  r   r   r   r   r   r   r   r   s               r   test_overall_verdict_is_stringz<TestMultiPerspectiveEvaluator.test_overall_verdict_is_string&  sE   VVVVVVZ0022
 
 
 	P 	P 21L_```I]]#7#9#9;L;N;NOOF	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P !06z0#666666666666666z66666z6666666666666&66666&6666660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).s)**.Q.*Q..........*Q............s.....s.............6.....6......)....*....Q...............................r  NrB  r   )	r   r   r   r  r  r  r  r  r  r   r   r   rx  rx    s        	
 	
 	
 	
0 0 0 08 8 8 8
. 
. 
. 
.4 4 4 4/ / / / / /r   rx  c                  f    e Zd ZddZddZddZddZdd	Zdd
ZddZ	ddZ
ddZddZddZdS )TestDeepDiveReporterrV   r   r   rg   c                   ddl m}  ||          }t          |          }|                    |          }|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}}d S )Nr   DeepDiveReporter
report_dirAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}output_pathro   rp   r   'ai_usecases_explorer.deep_dive.reporterr  rd   writeexistsrx   ry   rv   rz   r{   r|   r}   )	r   rV   r  reporterreportr  r   r   r/  s	            r   test_write_creates_filez,TestDeepDiveReporter.test_write_creates_file:  s    LLLLLL##x888""nnV,,!#!!###############{#####{######!##########################r   c                8   ddl m}  ||          }t          |          }|                    |          }t	          |t
                    }|sd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 }|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 S )Nr   r  r  r)  r   r  r   r+  z.mdrk   )z.%(py2)s
{%(py2)s = %(py0)s.suffix
} == %(py5)srn   rr   rs   )r  r  rd   r  r   r   rx   ry   rv   rz   r{   r|   r}   suffixrw   )r   rV   r  r  r  r  r   r/  r   r   r   r   s               r   test_write_returns_pathz,TestDeepDiveReporter.test_write_returns_pathC  s/   LLLLLL##x888""nnV,,+t,,,,,,,,,,,,,,,z,,,,,z,,,,,,,,,,,,,+,,,,,+,,,,,,,,,,,,,t,,,,,t,,,,,,,,,,,,,,,,,,,,,,,,!*U*!U**********!U************{*****{******!****U*****************************r   c                   ddl m} |dz  dz  dz  } ||          }t          |          }|                    |          }|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}}d S )
Nr   r  abcr  r  r  r  r  )
r   rV   r  deep_dirr  r  r  r   r   r/  s
             r   test_write_creates_parent_dirsz3TestDeepDiveReporter.test_write_creates_parent_dirsM  s
   LLLLLLc>C'#-##x888""nnV,,!#!!###############{#####{######!##########################r   c                   ddl m}  ||          }t          |          }|                    |          }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 S )Nr   r  r  r   r   z%(py1)s in %(py3)smdr   r   assert %(py5)srq   r  r  rd   _render_markdownrv   rw   r{   rx   ry   rz   r|   r}   
r   rV   r  r  r  r  r   r   @py_format4r   s
             r   #test_render_markdown_contains_titlez8TestDeepDiveReporter.test_render_markdown_contains_titleW  s   LLLLLL##x888""&&v..&,&",,,,,,,,,,&",,,,,&,,,,,,,,,,,",,,,,",,,,,,,,,,,,,,,,,,,,,,,,,,,,,r   c                   ddl m}  ||          }t          |          }|                    |          }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 S )Nr   r  r  z7AI agents will replace traditional software engineeringr   r  r  r  r  rq   r  r  s
             r   )test_render_markdown_contains_main_thesisz>TestDeepDiveReporter.test_render_markdown_contains_main_thesis`  s   LLLLLL##x888""&&v..HNHBNNNNNNNNNNHBNNNNNHNNNNNNNNNNNBNNNNNBNNNNNNNNNNNNNNNNNNNNNNNNNNNNNr   c                   ddl m}  ||          }t          |          }|                    |          }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 S )Nr   r  r  0.72r   r  r  r  r  rq   r  r  s
             r   /test_render_markdown_contains_credibility_scorezDTestDeepDiveReporter.test_render_markdown_contains_credibility_scorei  s   LLLLLL##x888""&&v..v|vvr   c                   ddl m}  ||          }t          |          }|                    |          }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 S )Nr   r  r   Increases developer productivityr   r  r  r  r  rq   r  r  s
             r   +test_render_markdown_contains_pro_argumentsz@TestDeepDiveReporter.test_render_markdown_contains_pro_argumentsr  s   LLLLLL##x888""&&v..171R77777777771R77777177777777777R77777R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                   ddl m}  ||          }t          |          }|                    |          }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 S )Nr   r  r  r+   r   r  r  r  r  rq   r  r  s
             r   .test_render_markdown_contains_fact_check_tablezCTestDeepDiveReporter.test_render_markdown_contains_fact_check_table{  s   LLLLLL##x888""&&v..393r99999999993r99999399999999999r99999r99999999999999999999999999999r   c                   ddl m}  ||          }t          |          }|                    |          }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 S )Nr   r  r  rD   r   r  r  r  r  rq   r  r  s
             r   0test_render_markdown_contains_supporting_sourceszETestDeepDiveReporter.test_render_markdown_contains_supporting_sources  s   LLLLLL##x888""&&v..(.(B..........(B.....(...........B.....B.............................r   c                   ddl m}  ||          }t          |          }|                    |          }|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  }	d	d
|	iz  }
t          t          j        |
                    d x}}d S )Nr   r  r  z
2026-02-28r   r  filenamer  r  rq   )r  r  rd   r  namerv   rw   r{   rx   ry   rz   r|   r}   )r   rV   r  r  r  r  r  r   r   r  r   s              r   $test_filename_contains_date_and_slugz9TestDeepDiveReporter.test_filename_contains_date_and_slug  s   LLLLLL##x888""nnV,,#'|x''''''''''|x'''''|'''''''''''x'''''x'''''''''''''''''''''''''''''r   c                   ddl m}  ||          }t          |          }|                    |          }|                    d          }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 S )Nr   r  r  zutf-8)encodingu   深度探索r   r  contentr  r  rq   )r  r  rd   r  	read_textrv   rw   r{   rx   ry   rz   r|   r}   )r   rV   r  r  r  r  r  r   r   r  r   s              r   test_file_written_with_utf8z0TestDeepDiveReporter.test_file_written_with_utf8  s#   LLLLLL##x888""nnV,,'''99(~((((((((((~(((((~(((((((((((((((((((((((((((((((((((((((((((((r   Nr   )r   r   r   r  r  r  r  r  r  r  r  r  r  r  r   r   r   r  r  9  s        $ $ $ $+ + + +$ $ $ $- - - -O O O O   8 8 8 8: : : :/ / / /( ( ( () ) ) ) ) )r   r  c                  >    e Zd ZddZddZddZdd	Zdd
ZddZdS )TestDeepDiveOrchestratorr   <tuple[MagicMock, MagicMock, MagicMock, MagicMock, MagicMock]c                   t                      }t                      |j        _        t                      |j        _        t                      }t                      |j        _        t                      }t                      |j        _        t                      }t                      |j        _        t                      }t          d          |j
        _        |||||fS )Nz/tmp/2026-02-28-1430-test.md)r   r   r
  r$  r   r3   r-  rF   rU   r   r  )r   mock_fetchermock_analyzermock_researchermock_evaluatormock_reporters         r   _setup_mocksz%TestDeepDiveOrchestrator._setup_mocks  s     {{.6jj+.6jj+!)=)?)?&#+++<+>+>("*5--'!+/0N+O+O(]O^]ZZr   rV   r   rg   c                
   ddl m} |                                 \  }}}}} ||||||          }|                    d          }	t	          |	t
                    }
|
sd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 }
|j                            d           d S )Nr   DeepDiveOrchestratorr   r.  rX  r  r  r  r9   r)  r   r*  r   r+  )"ai_usecases_explorer.deep_dive.clir  r  r-  r   r   rx   ry   rv   rz   r{   r|   r}   r
  assert_called_once_withr   rV   r  r   r.  rX  r  r  orchestratorr*  r   r/  s               r    test_run_with_url_returns_reportz9TestDeepDiveOrchestrator.test_run_with_url_returns_report  s   KKKKKK=A=N=N=P=P::y(++!
 
 
 !!&C!DD&.111111111111111z11111z1111111111111&11111&1111111111111.11111.111111111111111111111111112OPPPPPr   c                   ddl m} |                                 \  }}}}} ||||||          }|                    d          }	t	          |	t
                    }
|
sd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 }
|j                                         d S )Nr   r  r  zSome article textr   r)  r   r*  r   r+  )r  r  r  r-  r   r   rx   ry   rv   rz   r{   r|   r}   r   r>  r  s               r   !test_run_with_text_returns_reportz:TestDeepDiveOrchestrator.test_run_with_text_returns_report  s   KKKKKK=A=N=N=P=P::y(++!
 
 
 !!':!;;&.111111111111111z11111z1111111111111&11111&1111111111111.11111.111111111111111111111111,,.....r   c                |   ddl m} g |                                 \  }}}}}fd|j        _        fd|j        _        fd|j        _        fd|j        _        fd|j        _         ||||||          }|                    d	
           g d}|k    }	|	st          j        d|	fd|f          dt          j
                    v st          j                  rt          j                  ndt          j        |          dz  }
dd|
iz  }t          t          j        |                    d x}	}d S )Nr   r  c                 V                         d          t                      fd         S )Nfetchr   )appendr   r  kw
call_orders     r   <lambda>zKTestDeepDiveOrchestrator.test_run_calls_pipeline_in_order.<locals>.<lambda>  s'    *:K:KG:T:TV^V`V`9abc9d r   c                 V                         d          t                      fd         S )Nanalyzer   )r  r3   r  s     r   r  zKTestDeepDiveOrchestrator.test_run_calls_pipeline_in_order.<locals>.<lambda>  s'    Z5F5Fy5Q5QSgSiSi4jkl4m r   c                 V                         d          t                      fd         S )Nr`   r   )r  rF   r  s     r   r  zKTestDeepDiveOrchestrator.test_run_calls_pipeline_in_order.<locals>.<lambda>  s'    z7H7H7T7TVgViVi6jkl6m r   c                 V                         d          t                      fd         S )Nevaluater   )r  rU   r  s     r   r  zKTestDeepDiveOrchestrator.test_run_calls_pipeline_in_order.<locals>.<lambda>  s'    j6G6G
6S6SU`UbUb5cde5f r   c                 X                         d          t          d          fd         S )Nr  z	/tmp/r.mdr   )r  r   r  s     r   r  zKTestDeepDiveOrchestrator.test_run_calls_pipeline_in_order.<locals>.<lambda>  s*    z7H7H7R7RTXYdTeTe6fgh6i r   r  rj   r9   )r  r  r`   r  r  rk   )z%(py0)s == %(py3)sr  )ro   r   r  rq   )r  r  r  r
  rr  r-  r  rv   rw   rx   ry   rz   r{   r|   r}   )r   r  r   r.  rX  r  r  r  r   r   r  r   r  s               @r    test_run_calls_pipeline_in_orderz9TestDeepDiveOrchestrator.test_run_calls_pipeline_in_order  s   KKKKKK "
=A=N=N=P=P::y((d(d(d(d%#m#m#m#m %m%m%m%m
"$f$f$f$f	!%i%i%i%i"++!
 
 
 	2333SSSSzSSSSSSSSSSSzSSSSSSSSSSSSSzSSSSSz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                   ddl m} |                                 \  }}}}} ||||||          }|                    dd          }|j                                         t          |t                    }	|	sd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 }	|j        }d }||u }	|	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 S )Nr   r  r  rj   T)r   dry_runr)  r   r*  r   r+  r   r   rn   rr   rs   )r  r  r  r-  r  assert_not_calledr   r   rx   ry   rv   rz   r{   r|   r}   rc   rw   )r   r  r   r.  rX  r  r  r  r*  r   r/  r   r   r   r   s                  r   test_run_dry_run_skips_reporterz8TestDeepDiveOrchestrator.test_run_dry_run_skips_reporter  so   KKKKKK=A=N=N=P=P::y(++!
 
 
 !!&;T!JJ((***&.111111111111111z11111z1111111111111&11111&1111111111111.11111.111111111111111111111111!)T)!T))))))))))!T))))))))))))v)))))v))))))!))))T)))))))))))))))))))))))))))))r   c                    ddl m} |                                 \  }}}}} ||||||          }t          j        t
                    5  |                                 d d d            d S # 1 swxY w Y   d S )Nr   r  r  )r  r  r  r   r   
ValueErrorr-  )r   r  r   r.  rX  r  r  r  s           r   test_run_raises_when_no_inputz6TestDeepDiveOrchestrator.test_run_raises_when_no_input  s    KKKKKK=A=N=N=P=P::y(++!
 
 
 ]:&& 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   
A,,A03A0N)r   r  r   r   )	r   r   r   r  r  r  r  r  r  r   r   r   r  r    s        [ [ [ [&Q Q Q Q / / / / T T T T.* * * *"     r   r  c                      e Zd ZddZddZdS )TestLogicalQualityr   rg   c                   t          ddg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}}|j
        }t          |          }d}||k    }	|	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        |          t          j        |          dz  }
dd|
iz  }t          t          j	        |                    d x}x}x}	}|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 S )Nu   论证总体严密$   诉诸权威：仅引用单一来源   中validity_assessmentidentified_fallaciesstrengthrk   )z;%(py2)s
{%(py2)s = %(py0)s.validity_assessment
} == %(py5)slqrn   rr   rs   r   )zZ%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.identified_fallacies
})
} == %(py8)sr   r   r   r   )z0%(py2)s
{%(py2)s = %(py0)s.strength
} == %(py5)s)r   r  rv   rw   rx   ry   rz   r{   r|   r}   r  r   r  )r   r  r   r   r   r   r   r   r   r   r   r   s               r   test_constructionz$TestLogicalQuality.test_construction  s*    4"H!I
 
 

 %=)==%)===========%)=============r=====r======%====)============================*0s*++0q0+q0000000000+q000000000000s00000s00000000000002000002000000*0000+0000q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00{#e#{e##########{e############r#####r######{####e#############################r   c                   t          dg d          }|j        }g }||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 S )
Nu   逻辑清晰u   强r  rk   )z<%(py2)s
{%(py2)s = %(py0)s.identified_fallacies
} == %(py5)sr  rn   rr   rs   )
r   r  rv   rw   rx   ry   rz   r{   r|   r}   )r   r  r   r   r   r   r   s          r   test_empty_fallacies_allowedz/TestLogicalQuality.test_empty_fallacies_allowed"  s    .!#
 
 

 &,",&",,,,,,,,,,&",,,,,,,,,,,,r,,,,,r,,,,,,&,,,,",,,,,,,,,,,,,,,,,,,,,,,,,,,,,r   Nr   )r   r   r   r  r  r   r   r   r  r    s<        $ $ $ $- - - - - -r   r  c                      e Zd ZddZddZdS )TestCitedArgumentr   rg   c                   t          ddg          }|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}}|j
        }t          |          }d
}||k    }	|	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        |          t          j        |          dz  }
dd|
iz  }t          t          j	        |                    d x}x}x}	}d S )Nu   AI 显著提升开发效率zhttps://example.com/studyr   source_urlsrk   )z,%(py2)s
{%(py2)s = %(py0)s.text
} == %(py5)scarn   rr   rs   r   )zQ%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.source_urls
})
} == %(py8)sr   r   r   r   )r   r   rv   rw   rx   ry   rz   r{   r|   r}   r  r   )r   r  r   r   r   r   r   r   r   r   r   r   s               r   test_construction_with_urlsz-TestCitedArgument.test_construction_with_urls,  sC   .45
 
 
 w777w77777777777w7777777777777r77777r777777w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>'s>""'a'"a''''''''''"a''''''''''''s'''''s'''''''''''''2'''''2''''''>''''"''''a'''''''''''''''''''''''''''''''r   c                   t          d          }|j        }g }||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 S )	Nu   某个论据r  rk   )z3%(py2)s
{%(py2)s = %(py0)s.source_urls
} == %(py5)sr  rn   rr   rs   )
r   r  rv   rw   rx   ry   rz   r{   r|   r}   )r   r  r   r   r   r   r   s          r   "test_source_urls_defaults_to_emptyz4TestCitedArgument.test_source_urls_defaults_to_empty4  s    ///~##~##########~############r#####r######~#################################r   Nr   )r   r   r   r  r
  r   r   r   r  r  +  s<        ( ( ( ($ $ $ $ $ $r   r  c                      e Zd ZddZdS )TestBiasIndicatorr   rg   c                .   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  }d	d
|iz  }t          t          j	        |                    d x}x}}|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 S )N   确认偏误u'   作者只引用支持其观点的研究u   高	bias_typedescriptionseverityrk   )z1%(py2)s
{%(py2)s = %(py0)s.bias_type
} == %(py5)sbirn   rr   rs   )z0%(py2)s
{%(py2)s = %(py0)s.severity
} == %(py5)s)r
   r  rv   rw   rx   ry   rz   r{   r|   r}   r  )r   r  r   r   r   r   r   s          r   r  z#TestBiasIndicator.test_construction:  s   $A
 
 

 |-~-|~----------|~------------r-----r------|----~---------------------------{#e#{e##########{e############r#####r######{####e#############################r   Nr   r   r   r   r  r   r   r   r  r  9  s(        $ $ $ $ $ $r   r  c                      e Zd ZddZdS )TestCredibilityBreakdownr   rg   c                   t          dd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  }dd|iz  }t          t          j	        |                    d x}x}}|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}}|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}}|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}|j        }||v }|st          j        d|fd||f          t          j        |          d	t	          j                    v st          j        |          rt          j        |          nd	t          j        |          dz  }dd|iz  }t          t          j	        |                    d x}x}}d S )Nffffff?333333?皙?      ?u-   证据质量较高，但来源多样性不足evidence_qualitysource_diversitylogical_rigorauthor_transparencyexplanationrk   )z8%(py2)s
{%(py2)s = %(py0)s.evidence_quality
} == %(py5)scbrn   rr   rs   )z8%(py2)s
{%(py2)s = %(py0)s.source_diversity
} == %(py5)s)z5%(py2)s
{%(py2)s = %(py0)s.logical_rigor
} == %(py5)s)z;%(py2)s
{%(py2)s = %(py0)s.author_transparency
} == %(py5)su   证据r   )z3%(py1)s in %(py5)s
{%(py5)s = %(py3)s.explanation
}r   )r   r  rv   rw   rx   ry   rz   r{   r|   r}   r  r  r   r!  )	r   r"  r   r   r   r   r   r   r   s	            r   r  z*TestCredibilityBreakdown.test_constructionE  s   !   #G
 
 
 ")c)"c))))))))))"c))))))))))))r)))))r))))))"))))c)))))))))))))))))))))))))))")c)"c))))))))))"c))))))))))))r)))))r))))))"))))c)))))))))))))))))))))))))))&3&3&&&&&&&&&&3&&&&&&&&&&&&r&&&&&r&&&&&&&&&&3&&&&&&&&&&&&&&&&&&&&&&&&&&&%,,%,,,,,,,,,,%,,,,,,,,,,,,r,,,,,r,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)2>)x>))))))))))x>)))))x)))))))))))2)))))2))))))>)))))))))))))))))))))))))))))r   Nr   r  r   r   r   r  r  D  s(        * * * * * *r   r  c                  .    e Zd Zd	dZd	dZd
dZd
dZdS )$TestStructuralAnalyzerLogicalQualityr   r  c           
     :    ddgddgdgdgdgdgd	gd
dddgdddS )Nr  r  r(   r)   r  AI benefitsAI risksAI researchGitHub usersr!   u6   论证基本有效，但部分因果关系缺乏支撑u   滑坡谬误：夸大AI影响r  r  r  r-   r.   r/   r0   r1   r2   logical_qualityr   r   s    r   _fake_llm_response_with_lqz?TestStructuralAnalyzerLogicalQuality._fake_llm_response_with_lqZ  sb    C$+!/(M!8 9,o'L(/ ./	  (`)HJp(q!   
 
 	
r   c           
     ,    ddgddgdgdgdgdgd	gd
dS )Nr  r  r(   r)   r  r&  r'  r(  r)  r!   r,   r   r   s    r   _fake_llm_response_without_lqzBTestStructuralAnalyzerLogicalQuality._fake_llm_response_without_lqn  sF    C$+!/(M!8 9,o'L(/ ./	 
 
 	
r   rg   c           	        ddl m} t          d|                                           5   |t	                      d          }|                    t                                }d d d            n# 1 swxY w Y   |j        }d }||u}|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}}|j        }|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        |          t          j        |	          dz  }dd|iz  }t          t          j        |                    d x}x}x}
}	|j        }|j        }t%          |          }	d}|	|k    }|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        |          t          j        |	          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}x}x}	x}}d S )Nr   r   r"  r#  r%  r&  r   )z;%(py2)s
{%(py2)s = %(py0)s.logical_quality
} is not %(py5)sr*  rn   rr   rs   r  rk   )zU%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.logical_quality
}.strength
} == %(py7)sr   r   r   rY   )z%(py7)s
{%(py7)s = %(py0)s(%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.logical_quality
}.identified_fallacies
})
} == %(py10)sr   r5  r6  r7  )r,  r!  r   r,  r   r-  r   r+  rv   rw   rx   ry   rz   r{   r|   r}   r  r  r   )r   r!  r.  r*  r   r   r   r   r   r   r   r   r   r8  r9  r   r:  s                    r   test_run_parses_logical_qualityzDTestStructuralAnalyzerLogicalQuality.test_run_parses_logical_quality}  s   NNNNNNR88::
 
 
 	. 	. *)DWXXXH\\(**--F	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. %1T1%T1111111111%T111111111111v11111v111111%1111T111111111111111111111111111%7%.7%7.%7777777777.%777777777777v77777v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)D)>Ds>??D1D?1DDDDDDDDDD?1DDDDDDDDDDDDsDDDDDsDDDDDDDDDDDDD6DDDDD6DDDDDD)DDDD>DDDD?DDDD1DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDr1  c                z   ddl m} t          d|                                           5   |t	                      d          }|                    t                                }d d d            n# 1 swxY w Y   |j        }d }||u }|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 S )Nr   r   r"  r#  r%  r&  r   )z7%(py2)s
{%(py2)s = %(py0)s.logical_quality
} is %(py5)sr*  rn   rr   rs   )r,  r!  r   r.  r   r-  r   r+  rv   rw   rx   ry   rz   r{   r|   r}   )	r   r!  r.  r*  r   r   r   r   r   s	            r   (test_run_handles_missing_logical_qualityzMTestStructuralAnalyzerLogicalQuality.test_run_handles_missing_logical_quality  s   NNNNNNR;;==
 
 
 	. 	. *)DWXXXH\\(**--F	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. %--%----------%------------v-----v------%---------------------------------r1  NrB  r   )r   r   r   r,  r.  r0  r2  r   r   r   r$  r$  Y  sh        
 
 
 
(
 
 
 
E E E E
. 
. 
. 
. 
. 
.r   r$  c                  V    e Zd ZddZddZddZddZddZdd	Zdd
Z	ddZ
ddZdS )%TestMultiPerspectiveEvaluatorEnrichedr   r  c                r    ddgddg dgddgdgdgdd	d
ddddddgdddddddddgdddgddddd d!gd"S )#Nu   AI提升生产力rD   r  u   减少重复工作u   可能引入安全漏洞rE   u   技术仍在发展中u   作者存在轻微的AI偏向r  u   只引用支持观点的研究r  r     来源偏向u   主要引用AI公司的报告   低r  r  r  r  u'   证据质量较好但来源不够多元r  (\?   AI是否真正提升生产力u!   安全风险的实际影响范围u6   文章基本可信，但需要更多独立研究支撑uY   AI编程工具处于快速发展阶段，其长期影响尚不明确，需持续观察。u   查找同行评审研究   GitHub Copilot有100万用户r<   u   GitHub官方博客确认zhttps://github.blog/copilot   官方机构r>   r?   r@   rA   source_authority)cited_pro_argumentscited_con_argumentsrP   rQ   bias_indicatorscredibility_breakdownrR   core_disputesrS   	synthesisrT   assessed_fact_checksr   r   s    r   _fake_llm_response_enrichedzATestMultiPerspectiveEvaluatorEnriched._fake_llm_response_enriched  s     ->W=XYY-bAA$
 4E^D_``$ !88>,=]kpqq,=\jopp 
 %($'!$'*H& & "&=?bcWt$>#? =( :"?(6 %5#
 #
 #	
r   c                    dgdgdgddddgdS )	u7   Minimal response — only original fields, no new ones.Arg 1zCon 1z	Context 1z	Some biasr  zNeutral verdictzDirection 1rM   r   r   s    r   _fake_llm_response_minimalz@TestMultiPerspectiveEvaluatorEnriched._fake_llm_response_minimal  s0     &Y%Y +}*!$0$1?
 
 	
r   rg   c                   ddl m} t          d|                                           5   |t	                      d          }|                    t                      t                                }d d d            n# 1 swxY w Y   |j        }t          |          }d}||k    }|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        |          t          j        |          dz  }dd|iz  }	t!          t          j        |	                    d x}x}x}}|j        d         }
|
j        }dg}||k    }|st          j        d|fd||f          t          j        |
          t          j        |          t          j        |          dz  }dd|iz  }t!          t          j        |                    d x}
x}x}}|j        d         }
|
j        }g }||k    }|st          j        d|fd||f          t          j        |
          t          j        |          t          j        |          dz  }dd|iz  }t!          t          j        |                    d x}
x}x}}d S )Nr   r}  r  r#  r%  r&  rY   rk   )zY%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.cited_pro_arguments
})
} == %(py8)sr   r*  r   r   r   rD   )z3%(py3)s
{%(py3)s = %(py1)s.source_urls
} == %(py6)sr   r   r   assert %(py8)sr   r   )r  r~  r   rE  r   r-  r3   rF   r>  r   rv   rw   rx   ry   rz   r{   r|   r}   r  r   r~  r  r*  r   r   r   r   r   r   r   r   r   s                r   #test_run_parses_cited_pro_argumentszITestMultiPerspectiveEvaluatorEnriched.test_run_parses_cited_pro_arguments  s   VVVVVVZ99;;
 
 
 	P 	P 21L_```I]]#7#9#9;L;N;NOOF	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P -3s-..3!3.!3333333333.!333333333333s33333s33333333333336333336333333-3333.3333!33333333333333333333333333333)!,W,8W=V<WW8<WWWWWWWWWWW8<WWWWWW,WWWW8WWWW<WWWWWWWWWWWWWWWWWWWWWWWWWWWWWW)!,>,8>B>8B>>>>>>>>>>8B>>>>>,>>>>8>>>>B>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>r  c                   ddl m} t          d|                                           5   |t	                      d          }|                    t                      t                                }d d d            n# 1 swxY w Y   |j        }t          |          }d}||k    }|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        |          t          j        |          dz  }dd|iz  }	t!          t          j        |	                    d x}x}x}}|j        d         }
|
j        }d}||k    }|st          j        d|fd||f          t          j        |
          t          j        |          t          j        |          dz  }dd|iz  }t!          t          j        |                    d x}
x}x}}|j        d         }
|
j        }d}||k    }|st          j        d|fd||f          t          j        |
          t          j        |          t          j        |          dz  }dd|iz  }t!          t          j        |                    d x}
x}x}}d S )Nr   r}  r  r#  r%  r&  rY   rk   )zU%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.bias_indicators
})
} == %(py8)sr   r*  r   r   r   r  )z1%(py3)s
{%(py3)s = %(py1)s.bias_type
} == %(py6)srJ  rK  r   r  )z0%(py3)s
{%(py3)s = %(py1)s.severity
} == %(py6)s)r  r~  r   rE  r   r-  r3   rF   r@  r   rv   rw   rx   ry   rz   r{   r|   r}   r  r  rL  s                r   test_run_parses_bias_indicatorszETestMultiPerspectiveEvaluatorEnriched.test_run_parses_bias_indicators  s   VVVVVVZ99;;
 
 
 	P 	P 21L_```I]]#7#9#9;L;N;NOOF	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P )/s)**/a/*a//////////*a////////////s/////s/////////////6/////6//////)////*////a/////////////////////////////%a(D(2DnD2nDDDDDDDDDD2nDDDDD(DDDD2DDDDnDDDDDDDDDDDDDDDDDDDDDDDDDDDDD%a(:(1:U:1U::::::::::1U:::::(::::1::::U:::::::::::::::::::::::::::::::r  c                   ddl m} t          d|                                           5   |t	                      d          }|                    t                      t                                }d d d            n# 1 swxY w Y   |j        }d }||u}|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}}|j        }|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        |          t          j        |	          dz  }dd|iz  }t          t          j        |                    d x}x}x}
}	|j        }|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        |          t          j        |	          dz  }dd|iz  }t          t          j        |                    d x}x}x}
}	d S )Nr   r}  r  r#  r%  r&  r   )zA%(py2)s
{%(py2)s = %(py0)s.credibility_breakdown
} is not %(py5)sr*  rn   rr   rs   r  rk   )zc%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.credibility_breakdown
}.evidence_quality
} == %(py7)sr   r   r   r  )z`%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.credibility_breakdown
}.logical_rigor
} == %(py7)s)r  r~  r   rE  r   r-  r3   rF   rA  rv   rw   rx   ry   rz   r{   r|   r}   r  r  )r   r~  r  r*  r   r   r   r   r   r   r   r   s               r   %test_run_parses_credibility_breakdownzKTestMultiPerspectiveEvaluatorEnriched.test_run_parses_credibility_breakdown  s   VVVVVVZ99;;
 
 
 	P 	P 21L_```I]]#7#9#9;L;N;NOOF	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P +747+47777777777+4777777777777v77777v777777+77774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+C+<CC<CCCCCCCCCC<CCCCCCCCCCCCvCCCCCv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CCCCCCCCCCCCCCCCC+@+9@S@9S@@@@@@@@@@9S@@@@@@@@@@@@v@@@@@v@@@@@@+@@@@9@@@@S@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@r  c                   ddl m} t          d|                                           5   |t	                      d          }|                    t                      t                                }d d d            n# 1 swxY w Y   |j        }t          |          }d}||k    }|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        |          t          j        |          dz  }dd|iz  }	t!          t          j        |	                    d x}x}x}}d}
|j        }|
|v }|st          j        d|fd|
|f          t          j        |
          dt          j                    v st          j        |          rt          j        |          ndt          j        |          dz  }dd|iz  }t!          t          j        |                    d x}
x}}d S )Nr   r}  r  r#  r%  r&  rY   rk   )zS%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.core_disputes
})
} == %(py8)sr   r*  r   r   r   r9  r   )z5%(py1)s in %(py5)s
{%(py5)s = %(py3)s.core_disputes
}r   rr   rs   )r  r~  r   rE  r   r-  r3   rF   rB  r   rv   rw   rx   ry   rz   r{   r|   r}   r  s                r   test_run_parses_core_disputeszCTestMultiPerspectiveEvaluatorEnriched.test_run_parses_core_disputes  s   VVVVVVZ99;;
 
 
 	P 	P 21L_```I]]#7#9#9;L;N;NOOF	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P '-s'((-A-(A----------(A------------s-----s-------------6-----6------'----(----A-----------------------------.F&2FF.2FFFFFFFFFFF.2FFFFFF.FFFFFFFFFFF&FFFFF&FFFFFF2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFr  c                   ddl m} t          d|                                           5   |t	                      d          }|                    t                      t                                }d d d            n# 1 swxY w Y   |j        }t          |          }d}||k    }|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        |          t          j        |          dz  }dd|iz  }	t!          t          j        |	                    d x}x}x}}d}
|j        }|
|v }|st          j        d|fd|
|f          t          j        |
          d
t          j                    v st          j        |          rt          j        |          nd
t          j        |          dz  }dd|iz  }t!          t          j        |                    d x}
x}}d S )Nr   r}  r  r#  r%  r&  r  )zN%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.synthesis
})
} > %(py8)sr   r*  r   r   r   AIr   )z1%(py1)s in %(py5)s
{%(py5)s = %(py3)s.synthesis
}r   rr   rs   )r  r~  r   rE  r   r-  r3   rF   rC  r   rv   rw   rx   ry   rz   r{   r|   r}   r  s                r   test_run_parses_synthesisz?TestMultiPerspectiveEvaluatorEnriched.test_run_parses_synthesis  s   VVVVVVZ99;;
 
 
 	P 	P 21L_```I]]#7#9#9;L;N;NOOF	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P #(s#$$(q($q(((((((((($q((((((((((((s(((((s(((((((((((((6(((((6((((((#(((($((((q((((((((((((((((((((((((((((('v''t'''''''''''t''''''t'''''''''''v'''''v''''''''''''''''''''''''''''''''''''r  c                   ddl m} t          d|                                           5   |t	                      d          }|                    t                      t                                }d d d            n# 1 swxY w Y   |j        }t          |          }d}||k    }|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        |          t          j        |          dz  }dd|iz  }	t!          t          j        |	                    d x}x}x}}|j        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}}|
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}}|
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 S )Nr   r}  r  r#  r%  r&  r   rk   )zZ%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.assessed_fact_checks
})
} == %(py8)sr   r*  r   r   r   r<   r   afcrn   rr   rs   r;  )z8%(py2)s
{%(py2)s = %(py0)s.source_authority
} == %(py5)sunverifiabler   )z.%(py2)s
{%(py2)s = %(py0)s.status
} != %(py5)s)r  r~  r   rE  r   r-  r3   rF   rD  r   rv   rw   rx   ry   rz   r{   r|   r}   r?   r=  )r   r~  r  r*  r   r   r   r   r   r   rX  r   r   r   r   s                  r   0test_run_parses_assessed_fact_checks_with_statuszVTestMultiPerspectiveEvaluatorEnriched.test_run_parses_assessed_fact_checks_with_status  s   VVVVVVZ99;;
 
 
 	P 	P 21L_```I]]#7#9#9;L;N;NOOF	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P .4s.//414/14444444444/1444444444444s44444s44444444444446444446444444.4444/44441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)!,z'Z'zZ''''''''''zZ''''''''''''s'''''s''''''z''''Z'''''''''''''''''''''''''''#5~5#~5555555555#~555555555555s55555s555555#5555~555555555555555555555555555z+^+z^++++++++++z^++++++++++++s+++++s++++++z++++^+++++++++++++++++++++++++++++r  c                   ddl m} t          d|                                           5   |t	                      d          }|                    t                      t                                }d d d            n# 1 swxY w Y   |j        }g }||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}}|j        }g }||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}}|j        }g }||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}}|j        }d }||u }|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}}|j        }g }||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}}|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}}|j        }g }||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}}|j        }dg}||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}}|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 S )Nr   r}  r  r#  r%  r&  rk   )z;%(py2)s
{%(py2)s = %(py0)s.cited_pro_arguments
} == %(py5)sr*  rn   rr   rs   )z;%(py2)s
{%(py2)s = %(py0)s.cited_con_arguments
} == %(py5)s)z7%(py2)s
{%(py2)s = %(py0)s.bias_indicators
} == %(py5)sr   )z=%(py2)s
{%(py2)s = %(py0)s.credibility_breakdown
} is %(py5)s)z5%(py2)s
{%(py2)s = %(py0)s.core_disputes
} == %(py5)sr   )z1%(py2)s
{%(py2)s = %(py0)s.synthesis
} == %(py5)s)z<%(py2)s
{%(py2)s = %(py0)s.assessed_fact_checks
} == %(py5)srG  )z5%(py2)s
{%(py2)s = %(py0)s.pro_arguments
} == %(py5)sr  r   )r  r~  r   rH  r   r-  r3   rF   r>  rv   rw   rx   ry   rz   r{   r|   r}   r?  r@  rA  rB  rC  rD  rN   rR   )	r   r~  r  r*  r   r   r   r   r   s	            r   +test_run_backward_compat_missing_new_fieldszQTestMultiPerspectiveEvaluatorEnriched.test_run_backward_compat_missing_new_fields$  s   VVVVVVZ88::
 
 
 	P 	P 21L_```I]]#7#9#9;L;N;NOOF	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P )/R/)R//////////)R////////////v/////v//////)////R///////////////////////////)/R/)R//////////)R////////////v/////v//////)////R///////////////////////////%++%++++++++++%++++++++++++v+++++v++++++%++++++++++++++++++++++++++++++++3t3+t3333333333+t333333333333v33333v333333+3333t333333333333333333333333333#)r)#r))))))))))#r))))))))))))v)))))v))))))#))))r)))))))))))))))))))))))))))%2%2%%%%%%%%%%2%%%%%%%%%%%%v%%%%%v%%%%%%%%%%2%%%%%%%%%%%%%%%%%%%%%%%%%%%*0b0*b0000000000*b000000000000v00000v000000*0000b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#0y0#y0000000000#y000000000000v00000v000000#0000y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'.3.'3..........'3............v.....v......'....3.............................r  NrB  r   )r   r   r   rE  rH  rM  rO  rQ  rS  rV  rZ  r\  r   r   r   r4  r4    s        $
 $
 $
 $
L

 

 

 

? ? ? ?; ; ; ;A A A AG G G G( ( ( (, , , , / / / / / /r   r4  c                    t          dgdgdgddddgt          dd	d
g          gt          ddg          gt          ddd          t          ddd          gt          ddddd          ddgdt	          ddd d!d"#          g$          S )%z2Evaluation with all new optional fields populated.rH   rI   rJ   zAuthor works for an AI companyr8  rL   z Search for peer-reviewed studies   AI显著提升生产力https://example.com/study1zhttps://example.com/study2r  u   存在安全风险zhttps://example.com/riskr  u   只引用支持性研究r  r  r6  u   主要引用AI公司报告r7  r  r  r  r  u*   证据质量较好，来源多样性不足r  r9  u   长期就业影响u   AI编程工具正在改变软件开发范式，但其长期影响需要持续评估。目前证据显示短期生产力提升明显，但质量和安全风险不可忽视。r:  r<   u   GitHub官方博客2024年确认zhttps://github.blog/copilot-1mr;  r<  )rN   rO   rP   rQ   rR   rS   rT   r>  r?  r@  rA  rB  rC  rD  )r   r   r
   r   r   r   r   r   _evaluation_enrichedr`  @  s   %@A?@788I?@.9;WX  
 3B\A]^^^
 N@ZejkkkN@\glmmm
 3   #D
 
 
 78LM B5!:;!/  
=' ' ' 'r   c                H   ddl m} t                      }t          |j        |j        |j        |j        |j        |j	         |ddgd                    }t          t                      |t                      t                      t          dd	d
ddd          | dz            S )Nr   )r   u3   论证基本有效，部分因果关系缺乏依据u&   滑坡谬误：夸大AI的替代效应r  r  r*  rX   rY   rZ   r[   r\   ztest-enriched.mdr]   )%ai_usecases_explorer.deep_dive.modelsr   r3   r   r-   r.   r/   r0   r1   r2   r   r   rF   r`  r   )rV   r   r   
sa_with_lqs       r   _report_enrichedrd  l  s    DDDDDD			B#N=._,(& U"J!K
 
 
  J 

"$$'))dAr2r15511   r   c                  N    e Zd ZddZddZddZddZdd	Zdd
ZddZ	ddZ
dS )TestDeepDiveReporterEnrichedrV   r   r   rg   c                   ddl m}  ||          }t          |          }|                    |          }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}}d S )Nr   r  r  r^  r   r  r  r  r  rq   r_  r  r  rd  r  rv   rw   r{   rx   ry   rz   r|   r}   r  s
             r   4test_render_markdown_uses_cited_arguments_with_linkszQTestDeepDiveReporterEnriched.test_render_markdown_uses_cited_arguments_with_links  s   LLLLLL##x888!(++&&v..(.(B..........(B.....(...........B.....B...........................+1+r1111111111+r11111+11111111111r11111r11111111111111111111111111111r   c                   ddl m}  ||          }t          |          }|                    |          }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}}d S )Nr   r  r  r  r   r  r  r  r  rq   r6  rh  r  s
             r   0test_render_markdown_shows_bias_indicators_tablezMTestDeepDiveReporterEnriched.test_render_markdown_shows_bias_indicators_table     LLLLLL##x888!(++&&v..#~##########~#####~############################################~##########~#####~#############################################r   c                   ddl m}  ||          }t          |          }|                    |          }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}}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  }|
                    |           |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	          j        |
d          i z  }dd|iz  }t          t	          j        |                    d x}x}
x}x}x}}d S )Nr   r  r  u   证据质量r   r  r  r  r  rq   u   来源多样性z0.70z0.7)z%(py3)s in %(py5)s)r   rq   z%(py7)srs   )z%(py10)s in %(py12)s)r   r7  z%(py14)spy14r   zassert %(py17)spy17)r  r  rd  r  rv   rw   r{   rx   ry   rz   r|   r}   r  _format_boolop)r   rV   r  r  r  r  r   r   r  r   r   r   r8  @py_assert11r   r:  @py_format15@py_format16@py_format18s                      r   6test_render_markdown_shows_credibility_breakdown_tablezSTestDeepDiveReporterEnriched.test_render_markdown_shows_credibility_breakdown_table  s   LLLLLL##x888!(++&&v..#~##########~#####~########################################### & B&&&&&&&&&& B&&&&& &&&&&&&&&&&B&&&&&B&&&&&&&&&&&&&&&&&&&&&&&&&&&**v*v|*****u*u{***********v*****v*********************************************u*****u***************************************************************************r   c                   ddl m}  ||          }t          |          }|                    |          }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}}d S )Nr   r  r  u   核心争议r   r  r  r  r  rq   r9  rh  r  s
             r   0test_render_markdown_shows_core_disputes_sectionzMTestDeepDiveReporterEnriched.test_render_markdown_shows_core_disputes_section  s   LLLLLL##x888!(++&&v..#~##########~#####~###########################################.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"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4r   c                   ddl m}  ||          }t          |          }|                    |          }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}}d S )Nr   r  r  u   深度洞察r   r  r  r  r  rq   u,   AI编程工具正在改变软件开发范式rh  r  s
             r   ,test_render_markdown_shows_synthesis_sectionzITestDeepDiveReporterEnriched.test_render_markdown_shows_synthesis_section  s   LLLLLL##x888!(++&&v..#~##########~#####~###########################################=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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CCCCCCCCCr   c                   ddl m}  ||          }t          |          }|                    |          }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}}d S )Nr   r  r  r:  r   r  r  r  r  rq   u   ✅rh  r  s
             r   5test_render_markdown_uses_assessed_fact_checks_statuszRTestDeepDiveReporterEnriched.test_render_markdown_uses_assessed_fact_checks_status  s   LLLLLL##x888!(++&&v.. /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"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u{uur   c                   ddl m}  ||          }t          |          }|                    |          }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}}d S )Nr   r  r  u   论证质量r   r  r  r  r  rq   u   滑坡谬误rh  r  s
             r   0test_render_markdown_shows_logical_quality_blockzMTestDeepDiveReporterEnriched.test_render_markdown_shows_logical_quality_block  rl  r   c                D   ddl m}  ||          }t          |          }|                    |          }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}}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 S )Nr   r  r  r  r   r  r  r  r  rq   r+   r  r  r  s
             r   3test_render_markdown_fallback_when_new_fields_emptyzPTestDeepDiveReporterEnriched.test_render_markdown_fallback_when_new_fields_empty  s   LLLLLL##x888""&&v.. 271R77777777771R77777177777777777R77777R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393r99999999993r99999399999999999r99999r999999999999999999999999999v|vvr   Nr   )r   r   r   ri  rk  ru  rw  ry  r{  r}  r  r   r   r   rf  rf    s        2 2 2 2$ $ $ $	+ 	+ 	+ 	+5 5 5 5D D D D	 	 	 	$ $ $ $     r   rf  )r   r	   )r   r   )r   r   )r4   )r   r5   r   r   )r   r   )r   r   )r   r   )rV   r   r   r   )rC  rD  rE  )r   r5   r   r5   r   r5   r   r   )rI  rJ  r   r   )@__doc__
__future__r   builtinsrx   _pytest.assertion.rewrite	assertionrewriterv   r   pathlibr   unittest.mockr   r   r   pytest_httpxr   rb  r	   r
   r   r   r   r   r   r   r   r   r   r   r   r&   r3   r:   rB   rF   rU   rd   rf   r   r   r   r   r   r   r   r   r  rH  rM  rO  rx  r  r  r  r  r  r  r$  r4  r`  rd  rf  r   r   r   <module>r     s   M M " " " " " "                           * * * * * * * *  " " " " " "                           (         "          	 	 	 	    3 3 3 3 3 3 3 30
" 
" 
" 
" 
" 
" 
" 
"8 8 8 8 8 8 8 8) ) ) ) ) ) ) )% % % % % % % %"( ( ( ( ( ( ( (	7 	7 	7 	7 	7 	7 	7 	7% % % % % % % %.8> 8> 8> 8> 8> 8> 8> 8>@C4 C4 C4 C4 C4 C4 C4 C4X ,#;	 	 	 	 	   O( O( O( O( O( O( O( O(nL/ L/ L/ L/ L/ L/ L/ L/hf) f) f) f) f) f) f) f)\h h h h h h h h`- - - - - - - -($ $ $ $ $ $ $ $$ $ $ $ $ $ $ $* * * * * * * **<. <. <. <. <. <. <. <.H[/ [/ [/ [/ [/ [/ [/ [/F) ) ) )X   6T T T T T T T T T Tr   