
    עih                        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&                  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&                  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&                  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j4                        Z G d dej4                        Zej;                           G d dej4                        Zej;                           G d dej4                        Z G d d      Z  G d de      Z! G d dej4                        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?y)z"Tests tools in the _common module.    )EnumN)ListOptional   )_common)types)errorsc                     t        j                  d      d        } t        j                  d      5 } |          |         d d d        t	              dk(  sJ |d   j
                  t        j                  k(  sJ y # 1 sw Y   <xY w)NWarning!c                       y N r       f/sites/domain-asset-master/.venv/lib/python3.12/site-packages/google/genai/tests/common/test_common.pyfuncztest_warn_once.<locals>.func$       r   Trecord   r   )r   experimental_warningwarningscatch_warningslencategoryr	   ExperimentalWarning)r   ws     r   test_warn_oncer   #   s~    

+	 ,	 d+ qFF 
Q1	
1&44	44	4 s   A<<Bc                     t        j                  d      d        } t        j                  d      5 }t	        j
                         j                  dz   } |         d d d        d   j                  k(  sJ y # 1 sw Y   xY w)Nr   c                       y 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F 
1		$	$		11	1	 s   )A88Bc                  x   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 y r   )
r   _is_struct_typelistdictstrtypingAnyr   Dictintr   r   r   test_is_struct_typer0   ;   ss   		 	 d3

?&;!<	==	=		 	 V[[fjj-I!J	KK	K$$T$sCx.%9::	:$$T$sFJJ*?%@AA	A$$T#Y//	/$$T#vzz/%:;;	;$$V[[S#X1F%GHH	H$$V[[S&**_1M%NOO	O$$V[[%566	6$$V[[fjj%A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 y 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                    t        j                  ||       ||k(  sJ |rVt        |j                        dk(  sJ |j                  d   j                  dk(  sJ ||j                  d   j
                  v sJ y |j                  D ]F  }|j                  dk(  s||j
                  v s"t        j                  d|  d|j
                          H y )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(FNN1,=,E,EEEEnn 	[F9,1Jfnn1\=gYbHXY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                 N    t        j                  ||      }||k(  s
J d|         y )NzTest failed for: )r   align_key_case)rb   r   rd   r   aligned_dicts        r   test_align_key_caser      s3    x ''[A,	.	.M2CG90MM	.r   c                   D    e Zd ZU eed<   eed<   dZeed<   dZe	e   ed<   y)SimpleModelnamer   T	is_activeN
none_field)
__name__
__module____qualname__r+   __annotations__r/   r   boolr   r   r   r   r   r   r   =  s$    )	*)T"*hsm"r   r   c                   ,    e Zd ZU eed<   dZed    ed<   y)ChainidNchild)r   r   r   r/   r   r   r   r   r   r   r   r   D  s    	'!%'	!r   r   c                   N    e Zd ZU eed<    ej                  e      Ze	d    ed<   y)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                   J    e Zd ZU eed<    ej                  dd      Zeed<   y)ReprFalseModelvisiblesecretF)reprhiddenN)r   r   r   r+   r   r   r   r   r   r   r   r   r   T  s    ,xe4&#4r   r   c                       e Zd Zd Zy)NonPydanticc                      y)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y)MyEnumr   r2   N)r   r   r   ONETWOr   r   r   r   r   _  s    	#	#r   r   c                       e Zd Zy)
EmptyModelN)r   r   r   r   r   r   r   r   d  s    r   r   c                      t        dd      } t        j                  d      j                         }t	        |       |k(  sJ y )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  sA    C0#__  	 
  
ch		r   c                  <    t               } d}t        |       |k(  sJ y )NzEmptyModel())r   r   r   s     r   test_repr_empty_modelr   t  s     #(	ch		r   c                      t        dt        d            } t        j                  d      j                         }t	        |       |k(  sJ y )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  sE    %1+&#__  	 
  
ch		r   c                      t        d      } t        d      }|| _        | |_        t        j                  d      j	                         }t        |       |k(  sJ y )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     sU    	!$	!$$*$*__  	 
  
dx		r   c                      ddg} | j                  |        t        j                  d      j                         }t	        j
                  |       |k(  sJ y )Nr   r2   zG
    [
      1,
      2,
      <... Circular reference ...>,
    ]
    )appendr   r   r   r   _pretty_repr)my_listr   s     r   test_repr_circular_listr    sQ    F'	..__  	 
  
		g	&(	22	2r   c                      ddi} | | d<   t        j                  d      j                         }t        j                  |       |k(  sJ y )Nr4   r   r   zJ
    {
      'a': 1,
      'self': <... Circular reference ...>
    }
    r   r   r   r   r   )my_dictr   s     r   test_repr_circular_dictr    sN    !H''&/__  	
 
  
		g	&(	22	2r   c                     t        t        d            } t        d      D ci c]  }|| }}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 y c c}w )Nr9   z<... 5 more items ...>rH   )	max_itemsz<dict len=10>)r)   rangesettupler   r   )lstidctsttpls        r   test_repr_max_itemsr    s    U2Y#Ry!!A!#!
59~"eBi# 3!,-- --cQ??A?'"6"6rQ"GGG '"6"6sa"HHH 	"s   
Cc                      d} t        t        j                  | d            dk(  sJ t        |       t        j                  | d      k(  sJ y )Nsd   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZ   )max_len]   r   )r   r   r   r   )b_datas    r   test_repr_max_len_bytesr    sF    &	W!!&"5	6&	@@	@	f--fcB	BB	Br   c                  P    ddddddiii} dt        j                  | d      v sJ y )Nr4   r5   r3   z {<... 2 items at Max depth ...>}r   depthr   r   nesteds    r   test_repr_max_depth_dictr    s7    #3S1234&	+w/C/CFRS/T	TT	Tr   c                  H    g dggg} dt        j                  | d      v sJ y )N)rF   rG   rG   pz [<... 4 items at Max depth ...>]r   r  r  r  s    r   test_repr_max_depth_listr     s,    "#$%&	+w/C/CFRS/T	TT	Tr   c                      h dddddg dd} t        j                  d      j                         }t        j                  |       |k(  sJ y )	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$    sV    A		# __  	, 
- . 
		c	"h	..	.r   c                      dddd} t        j                  d      j                         }t        j                  |       |k(  sJ y )Nr   )r   )r   r2   )tuple0tuple1tuple2z{
    {
      'tuple0': (),
      'tuple1': (
        1,
      ),
      'tuple2': (
        1,
        2,
      )
    }
    r  r   s     r   test_tuple_collectionsr)    sN    	#
 __  	 
  
		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      j                         k(  sJ y )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	))	)35!W,,			eg	&$	..	.K/0oo 
  57r   c                      d} d}t        j                  |       |k(  sJ d}d}t        j                  |      |k(  sJ d}d}t        j                  |      |k(  sJ y )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_stringsr4    sk    "	$			b	!T	))	)+"	9$			b	!T	))	)!"	'$			b	!T	))	)r   c                      t        dd      } t        |       }d|v sJ d|vsJ t        j                  d      j	                         }||k(  sJ y )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:  +  sb    vf5#9&	V	##	#			__  	 
	 
 
8		r   c                      t        ddd       } t        |       }d|vsJ t        j                  d      j	                         }||k(  sJ y )Nz	Only Namer   )r   r   r   r   zX
    SimpleModel(
      is_active=True,
      name='Only Name',
      value=0
    )
    )r   r   r   r   r   r8  s      r   test_repr_none_fieldsr<  8  sV    A$?#9&	V	##	#__  	 
  
8		r   c                      t               } t        j                  }| |d}t        j                  d      j                         }t        j                  |      |k(  sJ y )N)npenzh
    {
      'en': <MyEnum.TWO: 2>,
      'np': NonPydantic(
          attr='value'
        )
    }
    )r   r   r   r   r   r   r   r   )r>  r?  r   r   s       r   test_repr_other_typesr@  F  sV    }"zz"#__  	 
  
		c	"h	..	.r   c                      t        dd      } t        j                  d      j                         }t	        j
                  | d      |k(  sJ y )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_deltarC  U  sJ    a0#__  	 
  
		c	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      j                         }t        |       |k(  sJ y )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_objectra  a  s    %%)+
//mmjj c 	 "..33  <??!%&& ..33!  # '	#B __ ! !B uwC 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 y)z>Test move_value_by_path function with array wildcard notation.requestsrI  rG  rE  1@   )requestoutputDimensionality23zrequests[].*zrequests[].request.*rf  )rI  rg  N)r   move_value_by_path)datapathsr   s      r   test_move_value_by_pathrm    sS     $c  ') $c  ') $c  ')3%'
$R 1
2%	T5) $c  +-	 $c  +-	 $c  +-	3%'(R 
		r   c                 r    G d dt         j                         G fddt         j                        }dddii}| j                  t        j                  d	      5  |j                  |      }d
d
d
       j                  j                  dk(  sJ t        | j                        dk(  sJ y
# 1 sw Y   ?xY w)z0Test that no warning is logged when types match.c                       e Zd ZU eed<   y)Mtest_check_field_type_mismatches_no_warning_for_correct_types.<locals>.ModelAr   Nr   r   r   r/   r   r   r   r   ModelArp        Jr   rr  c                       e Zd ZU W  ed<   y)Ptest_check_field_type_mismatches_no_warning_for_correct_types.<locals>.TestModelmodel_aNr   r   r   r   rr  s   r   	TestModelru    s    Or   ry  rv  r   rT   google_genai._commonloggerNr   )
r   	BaseModelat_levelloggingrs   model_validaterv  r   r   rt   r{   ry  rk  r9  rr  s       @r   =test_check_field_type_mismatches_no_warning_for_correct_typesr    s    w   '##  gs^	$$w/EF ,%%d+F, 
			$$	$	V^^		!!	!	, ,s   B--B6c                     G d dt         j                         G d dt         j                        } G fddt         j                        } |d      }d	|i}| j                  t        j                  d
      5  |j                  |       ddd       t        | j                        dk(  sJ d| j                  d   j                  v sJ d| j                  d   j                  v sJ y# 1 sw Y   ^xY w)z?Test that warning is logged when Pydantic model types mismatch.c                       e Zd ZU eed<   y)Ptest_check_field_type_mismatches_warns_on_pydantic_type_mismatch.<locals>.ModelAr   Nrq  r   r   r   rr  r    rs  r   rr  c                       e Zd ZU eed<   y)Ptest_check_field_type_mismatches_warns_on_pydantic_type_mismatch.<locals>.ModelBr   Nr   r   r   r+   r   r   r   r   ModelBr    rs  r   r  c                       e Zd ZU W  ed<   y)Stest_check_field_type_mismatches_warns_on_pydantic_type_mismatch.<locals>.TestModelmodel_fieldNrw  rx  s   r   ry  r    	    r   ry  testr   r  rz  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  ry  model_b_instancerk  rr  s        @r   @test_check_field_type_mismatches_warns_on_pydantic_type_mismatchr    s    w   w   '##  &) )	*$w/EF 1**401 
V^^		!!	!	1V^^A5F5N5N	NN	N	&&..*;*C*C	CC	C1 1s   =C,,C5c                 T    G d dt         j                         G fddt         j                        }ddi}| j                  t        j                  d      5  |j                  |      }ddd       j                  J t        | j                        d	k(  sJ y# 1 sw Y   2xY w)
z/Test that no warning is logged for None values.c                       e Zd ZU eed<   y)Ktest_check_field_type_mismatches_no_warning_for_none_values.<locals>.ModelAr   Nrq  r   r   r   rr  r  2  rs  r   rr  c                   &    e Zd ZU dZeW     ed<   y)Ntest_check_field_type_mismatches_no_warning_for_none_values.<locals>.TestModelNr  r   r   r   r  r   r   rx  s   r   ry  r  5      $(K&!(r   ry  r  Nrz  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 ,%%d+F, 
			##	#	V^^		!!	!	, ,s   BB'c                 P    G d dt         j                         G fddt         j                        }i }| j                  t        j                  d      5  |j                  |      }ddd       j                  J t        | j                        dk(  sJ y# 1 sw Y   2xY w)	z2Test that no warning is logged for missing fields.c                       e Zd ZU eed<   y)Ntest_check_field_type_mismatches_no_warning_for_missing_fields.<locals>.ModelAr   Nrq  r   r   r   rr  r  D  rs  r   rr  c                   &    e Zd ZU dZeW     ed<   y)Qtest_check_field_type_mismatches_no_warning_for_missing_fields.<locals>.TestModelNr  r  rx  s   r   ry  r  G  r  r   ry  rz  r{  Nr   r  r  s       @r   >test_check_field_type_mismatches_no_warning_for_missing_fieldsr  A  s    w   )'## ) 
$w/EF ,%%d+F, 
			##	#	V^^		!!	!	, ,s   BB%c                 F    G d dt         j                        }ddd}| j                  t        j                  d      5  |j                  |      }ddd       j                  d	k(  sJ |j                  dk(  sJ t        | j                        d
k(  sJ y# 1 sw Y   FxY w)z=Test that no warning is logged for primitive type mismatches.c                   "    e Zd ZU eed<   eed<   y)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   ry  r  V  s    NNr   ry  r_   r  )r  r  rz  r{  NrT   r   )
r   r}  r~  r  rs   r  r  r  r   rt   )r{   ry  rk  r9  s       r   ?test_check_field_type_mismatches_no_warning_for_primitive_typesr  S  s    '##  6	2$w/EF ,%%d+F, 
		S	  	 			V	##	#	V^^		!!	!, ,s    BB c                     G d dt         j                         G d dt         j                        } G fddt         j                        } |d      }d	|i}| j                  t        j                  d
      5  |j                  |       ddd       t        | j                        dk(  sJ d| j                  d   j                  v sJ y# 1 sw Y   AxY w)z@Test that Optional types are properly unwrapped before checking.c                       e Zd ZU eed<   y)Ltest_check_field_type_mismatches_handles_optional_unwrapping.<locals>.ModelAr   Nrq  r   r   r   rr  r  j  rs  r   rr  c                       e Zd ZU eed<   y)Ltest_check_field_type_mismatches_handles_optional_unwrapping.<locals>.ModelBr   Nr  r   r   r   r  r  m  rs  r   r  c                   &    e Zd ZU dZeW     ed<   y)Otest_check_field_type_mismatches_handles_optional_unwrapping.<locals>.TestModelNr  r  rx  s   r   ry  r  p  r  r   ry  r  r  r  rz  r{  Nr   r  r   r  r  s        @r   <test_check_field_type_mismatches_handles_optional_unwrappingr  g  s    w   w   )'## ) &)
)	*$w/EF 1**401 
V^^		!!	!	&&..*;*C*C	CC	C	1 1s   =CCc                     G d dt         j                         G fddt         j                        } d      }d|i}| j                  t        j                  d	      5  |j                  |      }d
d
d
       j                  j                  dk(  sJ t        | j                        dk(  sJ y
# 1 sw Y   ?xY w)zJTest that no warning is logged when correct Pydantic instance is provided.c                       e Zd ZU eed<   y)Ytest_check_field_type_mismatches_no_warning_for_correct_pydantic_instance.<locals>.ModelAr   Nrq  r   r   r   rr  r    rs  r   rr  c                       e Zd ZU W  ed<   y)\test_check_field_type_mismatches_no_warning_for_correct_pydantic_instance.<locals>.TestModelr  Nrw  rx  s   r   ry  r    r  r   ry  *   r  r  rz  r{  Nr   )
r   r}  r~  r  rs   r  r  r   r   rt   )r{   ry  model_a_instancerk  r9  rr  s        @r   Itest_check_field_type_mismatches_no_warning_for_correct_pydantic_instancer  ~  s    w   '##  "%
)	*$w/EF ,%%d+F, 
			!	!R	''	'	V^^		!!	!	, ,s   $B44B=c                     G d dt         j                         G d dt         j                        } G fddt         j                        } |d      }|d	d
d}| j                  t        j                  d      5  |j                  |       d	d	d	       t        | j                        dk(  sJ d| j                  d   j                  v sJ d| j                  d   j                  v sJ y	# 1 sw Y   ^xY w)z3Test checking multiple fields with mixed scenarios.c                       e Zd ZU eed<   y)Etest_check_field_type_mismatches_with_multiple_fields.<locals>.ModelAr   Nrq  r   r   r   rr  r    rs  r   rr  c                       e Zd ZU eed<   y)Etest_check_field_type_mismatches_with_multiple_fields.<locals>.ModelBr   Nr  r   r   r   r  r    rs  r   r  c                   <    e Zd ZU W  ed<   dZeW     ed<   eed<   y)Htest_check_field_type_mismatches_with_multiple_fields.<locals>.TestModelfield_aNfield_bfield_c)r   r   r   r   r  r   r+   rx  s   r   ry  r    s    O $GXf$Lr   ry  wrongr  Nr  )r  r  r  rz  r{  r   r  r   r  r  r  s        @r   5test_check_field_type_mismatches_with_multiple_fieldsr    s    w   w   '## 
 '*!
$ w/EF 1**401 
V^^		!!	!	fnnQ'//	//	/	&&..*;*C*C	CC	C1 1s   ?C..C7c                     G d dt         j                        }dddgi}| j                  t        j                  d      5  |j                  |       ddd       t        | j                        d	k(  sJ y# 1 sw Y   $xY w)
zCTest that validation doesn't crash on generic types like list[str].c                       e Zd ZU ee   ed<   y)Itest_check_field_type_mismatches_generic_type_no_error.<locals>.TestModeltagsN)r   r   r   r)   r+   r   r   r   r   ry  r    s    
s)Or   ry  r  r4   r5   rz  r{  Nr   )r   r}  r~  r  rs   r  r   rt   )r{   ry  rk  s      r   6test_check_field_type_mismatches_generic_type_no_errorr    su    '##  3*	$w/EF #T"# 
V^^		!!	!# #s   A66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,  r4  r:  r<  r@  rC  ra  rm  r  r  r  r  r  r  r  r  r  r   r   r   <module>r     s  " )      !      
5	2
C ; !!!!$		
 ,-$1-"5A>		
 "!H$%,-		
 3)$3)$		
 3)$3)$		
 +!3)3)$		
 +3)$!H!		
 aa(q12a(q1:aa0qqAJ		
 $!L#+>?=)"<dK'*9E			
 ,3(O"I3(O		
 ,"I3(O3(O		
 '!OEW3XY DVhm2no!EWin3op		
OMPb++"&+59+LP+c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,ae0DeRPS*-\
[]-\
[ > $!6 e4!6		
 $ e4!6 e4		
 $,.CDE*^=O,PQR,@R.STU		
 &;<=aW=>?qg>?@		
 ;;<=qg>?@w?@A		
 <YN+,Ha=aW*MNOXqMqg+NOP		
 <;i^LMHb>*+XrN+,		
 5Nq)q)		
 '!3 rzR!
S		
  #>B#>B		
  W%		
 7$V45f 56		
 7w 7823 34		
 '<!*L)MNO+V#(N]dsvPw'xyz<vC*P_fuxRy)z{|	

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

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