
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
]%                 @   s  d Z ddlm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	Z	ddl
Z
ddlZddlZyddlmZ W n ek
r   dZY nX ddlmZmZmZmZmZmZmZmZmZ ddlmZ ddlmZmZ ddlZe	jje	jj ej!e	jj"Z#e	j$d	e	jje#d
Z%e	jj&e%se'de	jje%dZ(e	jje%ddZ)ej*ej+e)dgej,dj-Z.ee.  erpej/e.Z.ej0e.Z1W dQ R X dd Z2dd Z3de(dfddZ4G dd de5Z6G dd de5Z7dd Z8G dd de5Z9ej:d=krd#d$ Z;nd%d$ Z;e4d&e;d'd(e4d)e8ed*e4d+e4d,G d-d. d.ej<e6e7e9Z=e4d/e;d0d(e4d1e8ed*e4d2e4d3G d4d5 d5ej<e6e7e9Z>G d6d7 d7e5Z?e4d'G d8d9 d9e?ej<Z@e4d0G d:d; d;e?ej<ZAdS )>z
Test runner for the JSON Schema official test suite

Tests comprehensive correctness of each draft's validator.

See https://github.com/json-schema/JSON-Schema-Test-Suite for details.

    )closing)DecimalN)pypy_version_info)	FormatErrorSchemaErrorValidationErrorDraft3ValidatorDraft4ValidatorFormatCheckerdraft3_format_checkerdraft4_format_checkervalidate)PY3)mockunittestZJSON_SCHEMA_TEST_SUITEjsonzCan't find the JSON-Schema-Test-Suite directory. Set the 'JSON_SCHEMA_TEST_SUITE' environment variable or run the tests from alongside a checkout of the suite.testsbinZjsonschema_suiteZremotes)stdoutc                s:   |r fdd}n fdd}t s0|jd}||_|S )Nc                s(   t | di }t fd| ji| d S )Nvalidator_kwargscls)getattrr   validator_class)selfkwargs)dataschema 0/usr/lib/python3.6/test_jsonschema_test_suite.py	test_case=   s    zmake_case.<locals>.test_casec                s>   t | di }| jt t fd| ji| W d Q R X d S )Nr   r   )r   assertRaisesr   r   r   )r   r   )r   r   r   r   r   A   s    zutf-8)r   encode__name__)r   r   validnamer   r   )r   r   r   	make_case;   s    
r%   c             C   s,   | d k	r(| ||}|d k	r(t j||}|S )N)r   skip)r&   r   casetestreasonr   r   r   
maybe_skipM   s
    
r*    c                s(   rt jj  fdd}|S )Nc                s   t tj}xtjtjj D ]}||kr2q$tjjtjj|\}}tj	d}t
|}xtj|D ]}xz|d D ]n}d|t|tjdd|d f }	t| |	 st|	t|d |d |d	 |	d
}
t|
||}
t| |	|
 qxW qjW W d Q R X q$W | S )N   r   ztest_%s_%s_%sz[\W ]+_descriptionr   r   r#   )r   r   r#   r$   )setglobZiglobospathjoinsplitextbasename	itertoolscountopenr   loadnextresubhasattrAssertionErrorr%   r*   setattr)Z
test_classZignoredfilenameZ
validatingr-   idZ	test_filer'   r(   r$   r   )basedirignore_globr&   
tests_globr   r   add_test_methodsY   s,    

"z)load_json_cases.<locals>.add_test_methods)r1   r2   r3   )rD   rC   rB   r&   rE   r   )rB   rC   r&   rD   r   load_json_casesU   s    rF   c               @   s    e Zd Zejeddd ZdS )
TypesMixinz-In Python 3 json.load always produces unicodec             C   s   | j ddijd d S )Ntypestrings   foo)r   r   )r   r   r   r   $test_string_a_bytestring_is_a_string{   s    z/TypesMixin.test_string_a_bytestring_is_a_stringN)r"   
__module____qualname__r   ZskipIfr   rJ   r   r   r   r   rG   z   s   rG   c               @   s   e Zd Zdd ZdS )DecimalMixinc          
   C   s   ddi}| j |dtttfid}x(ddtdtd gD ]}|j| q8W x6di g dd gD ]$}| jt |j| W d Q R X qZW d S )	NrH   Znumber)typesr,   g?   fooT)r   intfloatr   r   r    r   )r   r   	validatorr#   Zinvalidr   r   r   "test_it_can_validate_with_decimals   s    z/DecimalMixin.test_it_can_validate_with_decimalsN)r"   rK   rL   rT   r   r   r   r   rM      s   rM   c                s    fdd}|S )Nc                sJ   | d j d}| jkr"dj|S |dkrFtd k	rFtd d d	krFdS d S )
Nr   formatzFormat checker {0!r} not found.z	date-time   r,   	   z4datetime.datetime is broken on this version of PyPy.)r,   rW   )getZcheckersrU   r   )r'   r(   rU   )checkerr   r   missing_format   s    

z&missing_format.<locals>.missing_formatr   )rY   rZ   r   )rY   r   rZ      s    rZ   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
FormatMixinc             C   s"   | j ddit d}|jd d S )NrU   Zcarrot)format_checkerZbugs)r   r
   r   )r   rS   r   r   r   7test_it_returns_true_for_formats_it_does_not_know_about   s    zCFormatMixin.test_it_returns_true_for_formats_it_does_not_know_aboutc             C   s   | j i }| j|j d S )N)r   ZassertIsNoner\   )r   rS   r   r   r   ,test_it_does_not_validate_formats_by_default   s    
z8FormatMixin.test_it_does_not_validate_formats_by_defaultc          
   C   s   t jtd}| jddi|d}|jd |jjdd t }td|d|j_	| j
t}|jd W d Q R X | j|jj| d S )N)specrU   rP   )r\   Zbaraoeu)cause)r   Mockr
   r   r   checkassert_called_once_with
ValueErrorr   side_effectr    r   assertIs	exceptionra   )r   rY   rS   ra   cmr   r   r   2test_it_validates_formats_if_a_checker_is_provided   s    
z>FormatMixin.test_it_validates_formats_if_a_checker_is_providedc             C   s   t jtd}| jddi|d}|jdddg |jjdddgd t }td|d	|j_	| j
t}|jdddg W d Q R X | j|jj| d S )
N)r_   rU   rP   )r\   r,   rV      r`   )ra   )r   rb   r
   r   r   rc   rd   re   r   rf   r    r   rg   rh   ra   )r   rY   rS   ra   ri   r   r   r   %test_it_validates_formats_of_any_type   s    z1FormatMixin.test_it_validates_formats_of_any_typeN)r"   rK   rL   r]   r^   rj   rl   r   r   r   r   r[      s   r[   rV      r,   c             C   s   d|d krdS d S )Nzsupplementary Unicoder.   z:Not running surrogate Unicode case, this Python is narrow.r   )r'   r(   r   r   r   narrow_unicode_build   s    rn   c             C   s   d S )Nr   )r'   r(   r   r   r   rn      s    zdraft3/*.jsonzdraft3/refRemote.json)r&   rC   zdraft3/optional/format.json)r&   zdraft3/optional/bignum.jsonz)draft3/optional/zeroTerminatedFloats.jsonc               @   s0   e Zd ZeZdeiZdd Zdd Zdd Z	dS )	
TestDraft3r\   c             C   s    | j ddi}|jtj  d S )NrH   any)r   r   r   rb   )r   rS   r   r   r   #test_any_type_is_valid_for_type_any   s    z.TestDraft3.test_any_type_is_valid_for_type_anyc             C   s2   | j t ti dddii| jd W d Q R X d S )N
propertiesr(   T)r   )r    r   r   r   )r   r   r   r   test_invalid_properties   s    z"TestDraft3.test_invalid_propertiesc             C   s0   | j t tdgddi| jd W d Q R X d S )Nr,   minItems1)r   )r    r   r   r   )r   r   r   r   test_minItems_invalid_string   s    z'TestDraft3.test_minItems_invalid_stringN)
r"   rK   rL   r   r   r   r   rq   rs   rv   r   r   r   r   ro      s
   ro   zdraft4/*.jsonzdraft4/refRemote.jsonzdraft4/optional/format.jsonzdraft4/optional/bignum.jsonz)draft4/optional/zeroTerminatedFloats.jsonc               @   s(   e Zd ZeZdeiZdd Zdd ZdS )
TestDraft4r\   c             C   s2   | j t ti dddii| jd W d Q R X d S )Nrr   r(   T)r   )r    r   r   r   )r   r   r   r   rs     s    z"TestDraft4.test_invalid_propertiesc             C   s0   | j t tdgddi| jd W d Q R X d S )Nr,   rt   ru   )r   )r    r   r   r   )r   r   r   r   rv   	  s    z'TestDraft4.test_minItems_invalid_stringN)	r"   rK   rL   r	   r   r   r   rs   rv   r   r   r   r   rw      s   rw   c               @   s   e Zd Zdd Zdd ZdS )RemoteRefResolutionMixinc             C   s,   t jd}|j }| j|j_| j|j d S )Nzjsonschema.validators.requests)r   patchstartresolverX   rf   Z
addCleanupstop)r   ry   Zrequestsr   r   r   setUp  s    

zRemoteRefResolutionMixin.setUpc             C   s&   |j d\}}}tjf dtj|iS )Nzhttp://localhost:1234/zjson.return_value)	partitionr   rb   REMOTESrX   )r   Z	referencer-   r   r   r   r{     s    z RemoteRefResolutionMixin.resolveN)r"   rK   rL   r}   r{   r   r   r   r   rx     s   rx   c               @   s   e Zd ZeZdS )Draft3RemoteResolutionN)r"   rK   rL   r   r   r   r   r   r   r     s   r   c               @   s   e Zd ZeZdS )Draft4RemoteResolutionN)r"   rK   rL   r	   r   r   r   r   r   r      s   r   i   i  )B__doc__
contextlibr   Zdecimalr   r0   r   ior6   r1   r;   
subprocesssysr   ImportErrorZ
jsonschemar   r   r   r   r	   r
   r   r   r   Zjsonschema.compatr   Zjsonschema.tests.compatr   r   r2   r3   dirname__file__pardirZ	REPO_ROOTgetenvZSUITEisdirre   Z	TESTS_DIRZJSONSCHEMA_SUITEPopen
executablePIPEr   Zremotes_stdoutTextIOWrapperr9   r   r%   r*   rF   objectrG   rM   rZ   r[   
maxunicodern   ZTestCasero   rw   rx   r   r   r   r   r   r   <module>   s   
,

%0
