
    hjh                        d Z ddlmZ ddlZddlZddlZddlZddlmZmZ ddl	Z	ddl
Z
ddlZddlmZ ddlmZ ddlmZ d	 Zd
 Zd Zej                            ddddddddddddfddddddddddddddddddfdddiddddidddddfdi dd diddd didfd!dd didi dd didfd"ddddd diidd didfd#dd didddidddfd$dddd%dd&idd'd(d)d*d+d,ddd'd-dd)d.d+d,fd/d0d1d2id3d4d5g d6id7d8d4d2g d6d9d7d8fd:dddiidi idddiifd;di idddiidddiifd<d=d>d?id@dAdBdCdDdEdAdBdCdDd@fg          dFedGedHedIefdJ            Zej                            dKdLddiddiddidMdNfdOdddiidddiidddiidMdNfdPddiddQiddQid7dRfdSdddiidd2idd2id7dTfdUdd2idddiidddiid7dVfdWddiddXiddXddMdNfg          dY             Zej                            dZd[d=d\d]dAd\d^dAd\d]fd_d=d\d^dAd\d]dAd\d^fd`dadbd>dNiiidcdddedfiiidadbd>dfiiifdgdhddNdigidjddkdlgidhddkdlgifdmdhddNdigidjddkdngidhddkdngifdodpdqdigidrdsdiddtdugidpdsdiddtdugifdvdpddNdwdqdigidrdsdigidpdsdigifdxdydidddzdddzfd{d=dd|dAd}d~ddAd}d~dfdi ddddddfdddii i fddd4idddiidddiifddddiiddiddifddddNddgiidddd2ddddgiidddd2ddddgiifg          dFededHedefd            Z G d dej                  Z G d dej                  Ze                                  G d dej                  Ze                                  G d dej                  Z G d d          Z  G d de          Z! G d dej                  Z"d Z#d Z$d Z%d Z&d Z'd Z(d Z)d Z*d Z+d Z,d Z-d Z.d Z/d Z0d Z1d Z2d Z3d Z4d Z5d Z6d Z7d Z8d Z9dÄ Z:dĄ Z;dń Z<dƄ Z=dǄ Z>dȄ Z?dS )z"Tests tools in the _common module.    )EnumN)ListOptional   )_common)types)errorsc                  &   t          j        d          d             } t          j        d          5 } |               |              d d d            n# 1 swxY w Y   t	          |          dk    sJ |d         j        t          j        k    sJ d S )NWarning!c                      d S N r       i/var/www/app.qaans.com/backend/venv/lib/python3.11/site-packages/google/genai/tests/common/test_common.pyfuncztest_warn_once.<locals>.func$       Dr   Trecord   r   )r   experimental_warningwarningscatch_warningslencategoryr	   ExperimentalWarning)r   ws     r   test_warn_oncer   #   s    

++	 	 ,+	 d+++ qDFFFDFFF               
Q1	
1&4	4	4	4	4	4	4s   AAAc                  
   t          j        d          d             } t          j        d          5 }t	          j                    j        dz   } |              d d d            n# 1 swxY w Y   |d         j        |k    sJ d S )Nr   c                      d S r   r   r   r   r   r   z$test_warn_at_call_line.<locals>.func0   r   r   Tr   r   r   )r   r   r   r   inspectcurrentframef_linenolineno)r   captured_warnings	call_lines      r   test_warn_at_call_liner&   /   s    

++	 	 ,+	 d+++ /@$&&/!3IDFFF               
1		$		1	1	1	1	1	1s   &A%%A),A)c                  ~   t          j        t          t          t          t
          j        f                            sJ t          j        t
          j        t
          j        t          t
          j        f                            sJ t          j        t          t          t          t          f                            rJ t          j        t          t          t          t
          j        f                            rJ t          j        t          t                             rJ t          j        t          t          t
          j        f                   rJ t          j        t
          j        t
          j        t          t          f                            rJ t          j        t
          j        t
          j        t          t
          j        f                            rJ t          j        t
          j        t                             rJ t          j        t
          j        t          t
          j        f                   rJ d S r   )
r   _is_struct_typelistdictstrtypingAnyr   Dictintr   r   r   test_is_struct_typer0   ;   sx   		 d3
?&;!<	=	====		 V[fj-I!J	K	KKKK$T$sCx.%9:::::$T$sFJ*?%@AAAAA$T#Y/////$T#vz/%:;;;;;$V[S#X1F%GHHHHH$V[S&*_1M%NOOOOO$V[%566666$V[fj%ABBBBBBBr   z5test_id, initial_target, update_dict, expected_targetsimple_updater      ab   )r5   c)r4   r5   r7   nested_update
      )xy   (   )r<   z)r;   r<   r?   add_new_nested_dictr4   r5   empty_targetr;   empty_updateoverwrite_non_dict_with_dictoverwrite_dict_with_non_dictdeeper_nesting)r7   d)r5   e   )rF   f   )r5   g   )r4   h)r7   rF   rI   )r5   rG   rK   different_value_types
string_val
nested_intd   )key1key2{   nested_list)r   r2   r   T)rR   rS   key3)rP   rU   update_with_empty_nested_dicttarget_with_empty_nested_dictkey_case_alignment_checkJohnemail_addresszjohn@example.com)
first_namecontact_infoJanezjane@example.com123)r[   phone_number)	firstNamer]   test_idinitial_targetupdate_dictexpected_targetc                 @    t          j        ||           ||k    sJ d S r   )r   recursive_dict_update)rb   rc   rd   re   s       r   test_recursive_dict_updaterh   I   s/    h 
<<<	?	*	*	*	*	*	*r   z`test_id, initial_target, update_dict, expected_target, expect_warning, expected_log_message_parttype_match_intF type_match_dicttype_mismatch_int_to_strhelloz^Type mismatch for key 'a'. Existing type: <class 'int'>, new type: <class 'str'>. Overwriting.type_mismatch_dict_to_intz_Type mismatch for key 'a'. Existing type: <class 'dict'>, new type: <class 'int'>. Overwriting.type_mismatch_int_to_dictz_Type mismatch for key 'a'. Existing type: <class 'int'>, new type: <class 'dict'>. Overwriting.add_new_keynewc                 R   t          j        ||           ||k    sJ |rJt          |j                  dk    sJ |j        d         j        dk    sJ ||j        d         j        v sJ d S |j        D ]5}|j        dk    r(||j        v rt          j        d|  d|j                    6d S )Nr   r   WARNINGzUnexpected warning logged for z: )r   rg   r   records	levelnamemessagepytestfail)rb   rc   rd   re   expect_warningexpected_log_message_partcaplogr   s           r   (test_recursive_dict_update_type_warningsr|      s    ^ !.+>>>_,,,, [6>""a''''~a *i7777(FN1,=,EEEEEEEn 	[ 	[F9,,1Jfn1\1\YgYYYYZZZ	[ 	[r   z8test_id, target_dict, update_dict, expected_aligned_dictsimple_snake_to_camelDoe)r\   	last_name)ra   lastNamesimple_camel_to_snakenested_dict_alignment	user_infocontact_detailsuserInfocontactDetailsemailAddressztest@example.comlist_of_dicts_alignment
users_list)user_id	user_name	usersListAlice)userIduserName,list_of_dicts_alignment_mixed_case_in_update)r   UserName-list_of_dicts_different_lengths_update_longer
items_dataitem_id	itemsDataitemIdExtra)r   itemName-list_of_dicts_different_lengths_target_longer)r   	item_name&no_matching_keys_preserves_update_casekey_one)KEY_TWOkeyThreemixed_match_and_no_match)r\   	age_years   Engineer)ra   	AGE_YEARSoccupation_title)r\   r   r   empty_target_dict	new_valueanotherValue)new_key
anotherKeyempty_update_dictexisting_keyvalue(target_has_non_dict_value_for_nested_keyconfig_settingsconfigSettings	themeNamedark(update_has_non_dict_value_for_nested_key
theme_namelightdark_theme_stringdeeply_nested_with_lists	level_one
list_items)r   
item_valuelevelOne	listItemsTest)r   	itemValueTest2   target_dictexpected_aligned_dictc                 V    t          j        ||          }||k    sJ d|              d S )NzTest failed for: )r   align_key_case)rb   r   rd   r   aligned_dicts        r   test_align_key_caser      s@    x '[AA,	.	.	.	.0MG0M0M	.	.	.	.	.r   c                   L    e Zd ZU eed<   eed<   dZeed<   dZe	e         ed<   dS )SimpleModelnamer   T	is_activeN
none_field)
__name__
__module____qualname__r+   __annotations__r/   r   boolr   r   r   r   r   r   r   =  sH         )))	***)T"*hsm"""""r   r   c                   4    e Zd ZU eed<   dZed          ed<   dS )ChainidNchild)r   r   r   r/   r   r   r   r   r   r   r   r   D  s0         	'''!%'	!!!!!r   r   c                   R    e Zd ZU eed<    ej        e          Ze	d          ed<   dS )Treer   )default_factorychildrenN)
r   r   r   r/   r   pydanticFieldr)   r   r   r   r   r   r   r   L  s>         	''')8>$???(DL?????r   r   c                   H    e Zd ZU eed<    ej        dd          Zeed<   dS )ReprFalseModelvisiblesecretF)reprhiddenN)r   r   r   r+   r   r   r   r   r   r   r   r   r   T  s<         ,,,xe444&#44444r   r   c                       e Zd Zd ZdS )NonPydanticc                     dS )NzNonPydantic(
  attr='value'
)r   )selfs    r   __repr__zNonPydantic.__repr__[  s    ,,r   N)r   r   r   r   r   r   r   r   r   Y  s#        - - - - -r   r   c                       e Zd ZdZdZdS )MyEnumr   r2   N)r   r   r   ONETWOr   r   r   r   r   _  s        	#	###r   r   c                       e Zd ZdS )
EmptyModelN)r   r   r   r   r   r   r   r   d  s        $r   r   c                      t          dd          } t          j        d                                          }t	          |           |k    sJ d S )Nz	Test NamerT   r   r   zZ
    SimpleModel(
      is_active=True,
      name='Test Name',
      value=123
    )
    )r   textwrapdedentstripr   objexpecteds     r   +test_repr_simple_model_defaults_and_no_noner   h  sW    C000#_  	 	 
  
ch						r   c                  P    t                      } d}t          |           |k    sJ d S )NzEmptyModel())r   r   r   s     r   test_repr_empty_modelr   t  s-    #(	ch						r   c                      t          dt          d                    } t          j        d                                          }t	          |           |k    sJ d S )Nr   r2   r   )r   r   zJ
    Chain(
      child=Chain(
        id=2
      ),
      id=1
    )
    )r   r   r   r   r   r   s     r   test_repr_nested_modelr   z  s_    %1+++&&&#_  	 	 
  
ch						r   c                      t          d          } t          d          }|| _        | |_        t          j        d                                          }t          |           |k    sJ d S )Nr   r   r2   zv
    Chain(
      child=Chain(
        child=<... Circular reference ...>,
        id=2
      ),
      id=1
    )
    )r   r   r   r   r   r   )obj1obj2r   s      r   test_repr_circular_modelr     sm    	!$	!$$*$*_  	 	 
  
dx						r   c                      ddg} |                      |            t          j        d                                          }t	          j        |           |k    sJ d S )Nr   r2   zG
    [
      1,
      2,
      <... Circular reference ...>,
    ]
    )appendr   r   r   r   _pretty_repr)my_listr   s     r   test_repr_circular_listr    se    F'	.._  	 	 
  
	g	&	&(	2	2	2	2	2	2r   c                      ddi} | | d<   t          j        d                                          }t          j        |           |k    sJ d S )Nr4   r   r   zJ
    {
      'a': 1,
      'self': <... Circular reference ...>
    }
    r   r   r   r   r   )my_dictr   s     r   test_repr_circular_dictr    s\    !H''&/_  	 	
 
  
	g	&	&(	2	2	2	2	2	2r   c                     t          t          d                    } d t          d          D             }t          t          d                    }t          t          d                    }dt	          j        | d          v sJ dt	          j        |d          v sJ dt	          j        |d          v sJ dt	          j        |d          v sJ d S )Nr9   c                     i | ]}||S r   r   ).0is     r   
<dictcomp>z'test_repr_max_items.<locals>.<dictcomp>  s    !!!!A!!!r   z<... 5 more items ...>rH   )	max_itemsz<dict len=10>)r)   rangesettupler   r   )lstdctsttpls       r   test_repr_max_itemsr    s    U2YY#!!uRyy!!!#
599~~"eBii# 3!,,,- - - - -cQ???????'"6rQ"G"G"GGGGG '"6sa"H"H"HHHHHHHr   c                      d} t          t          j        | d                    dk    sJ t          |           t          j        | d          k    sJ d S )Nsd   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZ   )max_len]   r   )r   r   r   r   )b_datas    r   test_repr_max_len_bytesr    s]    &	W!&"555	6	6&	@	@	@	@	f-fcBBB	B	B	B	B	B	Br   c                  P    ddddddiii} dt          j        | d          v sJ d S )Nr4   r5   r3   z {<... 2 items at Max depth ...>}r   depthr   r   nesteds    r   test_repr_max_depth_dictr     sF    #3S11234&	+w/CFRS/T/T/T	T	T	T	T	T	Tr   c                  H    g dggg} dt          j        | d          v sJ d S )N)rF   rG   rG   pz [<... 4 items at Max depth ...>]r   r  r  r  s    r   test_repr_max_depth_listr#    s>    """#$%&	+w/CFRS/T/T/T	T	T	T	T	T	Tr   c                      h dddddg dd} t          j        d                                          }t          j        |           |k    sJ d S )	N>   r   r2   r   )r6   rH   rJ   r2   r   )r5   r4   )rL      	   )r  r  r*   r)   z
    {
      'dict': {
        'a': 1,
        'b': 2
      },
      'list': [
        7,
        8,
        9,
      ],
      'set': {
        1,
        2,
        3,
      },
      'tuple': (
        4,
        5,
        6,
      )
    }
    r  r   s     r   test_repr_collectionsr'    st    YYAii		 	# _  	 	, 
- . 
	c	"	"h	.	.	.	.	.	.r   c                      dddd} t          j        d                                          }t          j        |           |k    sJ d S )Nr   )r   )r   r2   )tuple0tuple1tuple2z{
    {
      'tuple0': (),
      'tuple1': (
        1,
      ),
      'tuple2': (
        1,
        2,
      )
    }
    r  r   s     r   test_tuple_collectionsr,    sa    	 	#
 _  	 	 
  
	c	"	"h	.	.	.	.	.	.r   c                     t          j        g           dk    sJ t          j        i           dk    sJ t          j        t                                dk    sJ t          j        t                                dk    sJ t          j        dt                      i          t	          j        d                                          k    sJ d S )Nz[]z{}zset()z()	empty_setz8
        {
          'empty_set': set()
        }
      )r   r   r  r  r   r   r   r   r   r   test_repr_empty_collectionsr/    s    		b	!	!T	)	)	)	)		b	!	!T	)	)	)	)355!!W,,,,		egg	&	&$	.	.	.	.K/00o 
   577     r   c                      d} d}t          j        |           |k    sJ d}d}t          j        |          |k    sJ d}d}t          j        |          |k    sJ d S )Nzline onez
'line one'z!line one
line two with """ insidez*"""line one
line two with \"\"\" inside"""zA string with """ insidez'A string with """ inside'r  )s1exp1s2exp2s3exp3s         r   test_repr_stringsr7    sz    "	$		b	!	!T	)	)	)	)+"	9$		b	!	!T	)	)	)	)!"	'$		b	!	!T	)	)	)	)	)	)r   c                      t          dd          } t          |           }d|v sJ d|vsJ t          j        d                                          }||k    sJ d S )Nshowhide)r   r   zvisible='show'r   z4
    ReprFalseModel(
      visible='show'
    )
    )r   r   r   r   r   r   resultr   s      r   test_repr_repr_falser=  +  s~    vf555#99&	V	#	#	#	#					_  	 	 
	 
 
8						r   c                      t          ddd           } t          |           }d|vsJ t          j        d                                          }||k    sJ d S )Nz	Only Namer   )r   r   r   r   zX
    SimpleModel(
      is_active=True,
      name='Only Name',
      value=0
    )
    )r   r   r   r   r   r;  s      r   test_repr_none_fieldsr?  8  so    A$???#99&	V	#	#	#	#_  	 	 
  
8						r   c                      t                      } t          j        }| |d}t          j        d                                          }t          j        |          |k    sJ d S )N)npenzh
    {
      'en': <MyEnum.TWO: 2>,
      'np': NonPydantic(
          attr='value'
        )
    }
    )r   r   r   r   r   r   r   r   )rA  rB  r   r   s       r   test_repr_other_typesrC  F  sg    }}"z"#_  	 	 
  
	c	"	"h	.	.	.	.	.	.r   c                      t          dd          } t          j        d                                          }t	          j        | d          |k    sJ d S )NzIndent Testr   r   z`
    SimpleModel(
        is_active=True,
        name='Indent Test',
        value=1
    )
    r6   )indent_delta)r   r   r   r   r   r   r   s     r   test_repr_indent_deltarF  U  sa    a000#_  	 	 
  
	c	2	2	2h	>	>	>	>	>	>r   c                     t          j        g t          j        t          j        t          j        d          gd          t           j        j        d          gdt          j        dd	t          j        t           j	        j
        d	
          gdd                    } t          j        d                                          }t          |           |k    sJ d S )NaA  There isn't a single "best" LLM, as the ideal choice highly depends on your specific needs, use case, budget, and priorities. The field is evolving incredibly fast, with new models and improvements being released constantly.

However, we can talk about the **leading contenders** and what they are generally known for:...)textmodel)partsroler   )contentfinish_reasonindexz%models/gemini-2.5-flash-preview-05-20i>  rL   )modalitytoken_counti\  i  )candidates_token_countprompt_token_countprompt_tokens_detailsthoughts_token_counttotal_token_count)"automatic_function_calling_history
candidatesmodel_versionusage_metadataa  
      GenerateContentResponse(
        automatic_function_calling_history=[],
        candidates=[
          Candidate(
            content=Content(
              parts=[
                Part(
                  text="""There isn't a single "best" LLM, as the ideal choice highly depends on your specific needs, use case, budget, and priorities. The field is evolving incredibly fast, with new models and improvements being released constantly.

      However, we can talk about the **leading contenders** and what they are generally known for:..."""
                ),
              ],
              role='model'
            ),
            finish_reason=<FinishReason.STOP: 'STOP'>,
            index=0
          ),
        ],
        model_version='models/gemini-2.5-flash-preview-05-20',
        usage_metadata=GenerateContentResponseUsageMetadata(
          candidates_token_count=1086,
          prompt_token_count=7,
          prompt_tokens_details=[
            ModalityTokenCount(
              modality=<MediaModality.TEXT: 'TEXT'>,
              token_count=7
            ),
          ],
          thoughts_token_count=860,
          total_token_count=1953
        )
      )
  )r   GenerateContentResponse	CandidateContentPartFinishReasonSTOP$GenerateContentResponseUsageMetadataModalityTokenCountMediaModalityTEXTr   r   r   r   r   s     r   test_repr_complex_objectrd  a  s   %)+
/mj c   	 	 	 ".3    <?!%& .3  !  #   '	 	 	#B _ ! ! !B uwwC D 
ch						r   c                      dddddigiiddddddigiidddddd	igiiddgi} d
di}t          j        | |           dddddigiddiddddigiddidddd	igiddigi}| |k    sJ dS )z>Test move_value_by_path function with array wildcard notation.requestsrL  rJ  rH  1@   )requestoutputDimensionality23zrequests[].*zrequests[].request.*ri  )rL  rj  N)r   move_value_by_path)datapathsr   s      r   test_move_value_by_pathrp    s}     $c  ')  $c  ')  $c  ') 3%'
$R 1
2%	T5))) $c  +-	 	 $c  +-	 	 $c  +-	 	3%'(R 
						r   c                 l    G d dt           j                   G fddt           j                  }dddii}|                     t          j        d	          5  |                    |          }d
d
d
           n# 1 swxY w Y   |j        j        dk    sJ t          | j	                  dk    sJ d
S )z0Test that no warning is logged when types match.c                       e Zd ZU eed<   dS )Mtest_check_field_type_mismatches_no_warning_for_correct_types.<locals>.ModelAr   Nr   r   r   r/   r   r   r   r   ModelArs             JJJJJr   ru  c                       e Zd ZU  ed<   dS )Ptest_check_field_type_mismatches_no_warning_for_correct_types.<locals>.TestModelmodel_aNr   r   r   r   ru  s   r   	TestModelrx    s         OOOOOr   r|  ry  r   rT   google_genai._commonloggerNr   )
r   	BaseModelat_levelloggingrs   model_validatery  r   r   rt   r{   r|  rn  r<  ru  s       @r   =test_check_field_type_mismatches_no_warning_for_correct_typesr    s1       w          '#    gs^	$$w/EFF , ,%%d++F, , , , , , , , , , , , , , , 
		$	$	$	$	V^			!	!	!	!	!	!s   A==BBc                     G d dt           j                   G d dt           j                  } G fddt           j                  } |d          }d	|i}|                     t          j        d
          5  |                    |           ddd           n# 1 swxY w Y   t          | j                  dk    sJ d| j        d         j        v sJ d| j        d         j        v sJ dS )z?Test that warning is logged when Pydantic model types mismatch.c                       e Zd ZU eed<   dS )Ptest_check_field_type_mismatches_warns_on_pydantic_type_mismatch.<locals>.ModelAr   Nrt  r   r   r   ru  r    rv  r   ru  c                       e Zd ZU eed<   dS )Ptest_check_field_type_mismatches_warns_on_pydantic_type_mismatch.<locals>.ModelBr   Nr   r   r   r+   r   r   r   r   ModelBr    rv  r   r  c                       e Zd ZU  ed<   dS )Stest_check_field_type_mismatches_warns_on_pydantic_type_mismatch.<locals>.TestModelmodel_fieldNrz  r{  s   r   r|  r             r   r|  testr   r  r}  r~  Nr   z&Type mismatch in TestModel.model_fieldr   expected ModelA, got ModelB	r   r  r  r  rs   _check_field_type_mismatchesr   rt   rv   r{   r  r|  model_b_instancern  ru  s        @r   @test_check_field_type_mismatches_warns_on_pydantic_type_mismatchr    s       w        w          '#    V&))) )	*$w/EFF 1 1**40001 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
V^			!	!	!	!	1V^A5F5N	N	N	N	N	&&.*;*C	C	C	C	C	C	C   =BB#&B#c                 V    G d dt           j                   G fddt           j                  }ddi}|                     t          j        d          5  |                    |          }ddd           n# 1 swxY w Y   |j        J t          | j                  d	k    sJ dS )
z/Test that no warning is logged for None values.c                       e Zd ZU eed<   dS )Ktest_check_field_type_mismatches_no_warning_for_none_values.<locals>.ModelAr   Nrt  r   r   r   ru  r  2  rv  r   ru  c                   ,    e Zd ZU dZe          ed<   dS )Ntest_check_field_type_mismatches_no_warning_for_none_values.<locals>.TestModelNr  r   r   r   r  r   r   r{  s   r   r|  r  5  (         $(K&!(((((r   r|  r  Nr}  r~  r   	r   r  r  r  rs   r  r  r   rt   r  s       @r   ;test_check_field_type_mismatches_no_warning_for_none_valuesr  /  s&       w    ) ) ) ) ) ) )'# ) ) ) 	$w/EFF , ,%%d++F, , , , , , , , , , , , , , , 
		#	#	#	V^			!	!	!	!	!	!s   A;;A?A?c                 R    G d dt           j                   G fddt           j                  }i }|                     t          j        d          5  |                    |          }ddd           n# 1 swxY w Y   |j        J t          | j                  dk    sJ dS )	z2Test that no warning is logged for missing fields.c                       e Zd ZU eed<   dS )Ntest_check_field_type_mismatches_no_warning_for_missing_fields.<locals>.ModelAr   Nrt  r   r   r   ru  r  D  rv  r   ru  c                   ,    e Zd ZU dZe          ed<   dS )Qtest_check_field_type_mismatches_no_warning_for_missing_fields.<locals>.TestModelNr  r  r{  s   r   r|  r  G  r  r   r|  r}  r~  Nr   r  r  s       @r   >test_check_field_type_mismatches_no_warning_for_missing_fieldsr  A  s!       w    ) ) ) ) ) ) )'# ) ) ) 
$w/EFF , ,%%d++F, , , , , , , , , , , , , , , 
		#	#	#	V^			!	!	!	!	!	!s   A99A= A=c                 D    G d dt           j                  }ddd}|                     t          j        d          5  |                    |          }ddd           n# 1 swxY w Y   |j        d	k    sJ |j        dk    sJ t          | j	                  d
k    sJ dS )z=Test that no warning is logged for primitive type mismatches.c                   $    e Zd ZU eed<   eed<   dS )Rtest_check_field_type_mismatches_no_warning_for_primitive_types.<locals>.TestModel	int_field	str_fieldN)r   r   r   r/   r   r+   r   r   r   r|  r  V  s"         NNNNNNNNr   r|  r_   r  )r  r  r}  r~  NrT   r   )
r   r  r  r  rs   r  r  r  r   rt   )r{   r|  rn  r<  s       r   ?test_check_field_type_mismatches_no_warning_for_primitive_typesr  S  s
       '#    6	2	2$w/EFF , ,%%d++F, , , , , , , , , , , , , , , 
	S	 	 	 	 		V	#	#	#	#	V^			!	!	!	!	!	!s   A!!A%(A%c                     G d dt           j                   G d dt           j                  } G fddt           j                  } |d          }d	|i}|                     t          j        d
          5  |                    |           ddd           n# 1 swxY w Y   t          | j                  dk    sJ d| j        d         j        v sJ dS )z@Test that Optional types are properly unwrapped before checking.c                       e Zd ZU eed<   dS )Ltest_check_field_type_mismatches_handles_optional_unwrapping.<locals>.ModelAr   Nrt  r   r   r   ru  r  j  rv  r   ru  c                       e Zd ZU eed<   dS )Ltest_check_field_type_mismatches_handles_optional_unwrapping.<locals>.ModelBr   Nr  r   r   r   r  r  m  rv  r   r  c                   ,    e Zd ZU dZe          ed<   dS )Otest_check_field_type_mismatches_handles_optional_unwrapping.<locals>.TestModelNr  r  r{  s   r   r|  r  p  r  r   r|  r  r  r  r}  r~  Nr   r  r   r  r  s        @r   <test_check_field_type_mismatches_handles_optional_unwrappingr  g  st       w        w    ) ) ) ) ) ) )'# ) ) ) V&)))
)	*$w/EFF 1 1**40001 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
V^			!	!	!	!	&&.*;*C	C	C	C	C	C	Cr  c                     G d dt           j                   G fddt           j                  } d          }d|i}|                     t          j        d	          5  |                    |          }d
d
d
           n# 1 swxY w Y   |j        j        dk    sJ t          | j	                  dk    sJ d
S )zJTest that no warning is logged when correct Pydantic instance is provided.c                       e Zd ZU eed<   dS )Ytest_check_field_type_mismatches_no_warning_for_correct_pydantic_instance.<locals>.ModelAr   Nrt  r   r   r   ru  r    rv  r   ru  c                       e Zd ZU  ed<   dS )\test_check_field_type_mismatches_no_warning_for_correct_pydantic_instance.<locals>.TestModelr  Nrz  r{  s   r   r|  r    r  r   r|  *   r  r  r}  r~  Nr   )
r   r  r  r  rs   r  r  r   r   rt   )r{   r|  model_a_instancern  r<  ru  s        @r   Itest_check_field_type_mismatches_no_warning_for_correct_pydantic_instancer  ~  sB       w          '#    V"%%%
)	*$w/EFF , ,%%d++F, , , , , , , , , , , , , , , 
		!R	'	'	'	'	V^			!	!	!	!	!	!s   %BBBc                     G d dt           j                   G d dt           j                  } G fddt           j                  } |d          }|d	d
d}|                     t          j        d          5  |                    |           d	d	d	           n# 1 swxY w Y   t          | j                  dk    sJ d| j        d         j        v sJ d| j        d         j        v sJ d	S )z3Test checking multiple fields with mixed scenarios.c                       e Zd ZU eed<   dS )Etest_check_field_type_mismatches_with_multiple_fields.<locals>.ModelAr   Nrt  r   r   r   ru  r    rv  r   ru  c                       e Zd ZU eed<   dS )Etest_check_field_type_mismatches_with_multiple_fields.<locals>.ModelBr   Nr  r   r   r   r  r    rv  r   r  c                   @    e Zd ZU  ed<   dZe          ed<   eed<   dS )Htest_check_field_type_mismatches_with_multiple_fields.<locals>.TestModelfield_aNfield_bfield_c)r   r   r   r   r  r   r+   r{  s   r   r|  r    s8         OOO $GXf$$$LLLLLr   r|  wrongr  Nr  )r  r  r  r}  r~  r   r  r   r  r  r  s        @r   5test_check_field_type_mismatches_with_multiple_fieldsr    s       w        w          '#   
 V'***!
 
$ w/EFF 1 1**40001 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
V^			!	!	!	!	fnQ'/	/	/	/	/	&&.*;*C	C	C	C	C	C	Cs   ?B!!B%(B%c                     G d dt           j                  }dddgi}|                     t          j        d          5  |                    |           ddd           n# 1 swxY w Y   t          | j                  d	k    sJ dS )
zCTest that validation doesn't crash on generic types like list[str].c                   &    e Zd ZU ee         ed<   dS )Itest_check_field_type_mismatches_generic_type_no_error.<locals>.TestModeltagsN)r   r   r   r)   r+   r   r   r   r   r|  r    s         
s)OOOOOr   r|  r  r4   r5   r}  r~  Nr   )r   r  r  r  rs   r  r   rt   )r{   r|  rn  s      r   6test_check_field_type_mismatches_generic_type_no_errorr    s        '#    3*	$w/EFF # #T"""# # # # # # # # # # # # # # # 
V^			!	!	!	!	!	!s    A""A&)A&)@__doc__enumr   r    r  r   r,   r   r   r   r   rw   rj   r   r   r	   r   r&   r0   markparametrizer+   r*   rh   r|   r   r  r   r   model_rebuildr   r   r   r   r   r   r   r   r   r  r  r  r  r   r#  r'  r,  r/  r7  r=  r?  rC  rF  rd  rp  r  r  r  r  r  r  r  r  r  r   r   r   <module>r     s  " ) (           ! ! ! ! ! ! ! !                     
5 
5 
5	2 	2 	2
C 
C 
C ; !!!!$$		
 ,,--$$1--"55A>>		
 "!H$$%,,--		
 3)$$3)$$		
 3)$$3)$$		
 +!3)3)$$		
 +3)$$!H!		
 aa((q112a((q11::aa00qqAAJJ		
 $!L#+>??=)))"<dKK'*999EE 			
 ,3(O"I3(O		
 ,"I3(O3(O		
 '!OEW3XYY DVhm2n2noo!EWin3o3opp		
OMP Pb++"&+59+LP+ + +cP Pb+ f !H!H!H	
 3(O3(O3(O	
 '!H'N'Nl	
 (3(O#J#Jm	
 (#J3(O3(Om	
 
a3,ae0D0DeRPS*- -\
[ 
[]- -\
[ > $!66 e44!66		
 $ e44!66 e44		
 $,.CDE*^=O,PQR,@R.STU		
 &;;<=aW==>?qg>>?@		
 ;;;<=qg>>?@w??@A		
 <YN+,Ha=aW*M*MNOXqMqg+N+NOP		
 <;;i^LMHb>*+XrN+,		
 5Nq))q))		
 '!33 rzRR!
SS		
  #>BB#>BB		
  W%		
 7$V45f 56		
 7w 7823 34		
 '<!*L*L)MNO+V#(N(N]dsvPwPw'xyz<vC*P*P_fuxRyRy)z{|	

_UX XrNN#N26NOSN N NsX XrN# # # # #'# # # #" " " " "G " " "
      @ @ @ @ @7 @ @ @
      5 5 5 5 5W& 5 5 5
- - - - - - - -
 
 
 
 
T 
 
 

    "   	 	 	  
 
 
     $
3 
3 
3	3 	3 	3  (C C CU U U
U U U
/ / /B/ / /*  "* * *
 
 
  / / /	? 	? 	?D D DNW W Wt" " "&D D D4" " "$" " "$" " "(D D D." " "(D D D<
" 
" 
" 
" 
"r   