
                              d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlZddlZddlm	Z	 ddl
mZ ddlmc mZ  G d	 d
e      Z G d dej"                        Zy)*Unit tests for PluralityCheckableIterator.    )absolute_import)print_function)division)unicode_literalsN)range)PluralityCheckableIteratorc                       e Zd Zy)CustomTestExceptionN)__name__
__module____qualname__     @platform/gsutil/gslib/tests/test_plurality_checkable_iterator.pyr   r   &   s    r   r   c                   @    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)PluralityCheckableIteratorTestsr   c                    t        t        d            }t        |      }t        |      }| j	                  |j                                | j                  |j                                t        |      }| j                  ||       y)z'Tests empty PluralityCheckableIterator.r   N)	listr   iterr	   
assertTrueIsEmptyassertFalseHasPluralityassertEqualself
input_listitpcitoutput_lists        r   (testPluralityCheckableIteratorWith0ElemszHPluralityCheckableIteratorTests.testPluralityCheckableIteratorWith0Elems-   se    eAhJ	j	B%b)DOODLLN#T&&()t*KZ-r   c                    t        t        d            }t        |      }t        |      }| j	                  |j                                | j	                  |j                                t        |      }| j                  ||       y)z0Tests PluralityCheckableIterator with 1 element.   N)r   r   r   r	   r   r   r   r   r   s        r   'testPluralityCheckableIteratorWith1ElemzGPluralityCheckableIteratorTests.testPluralityCheckableIteratorWith1Elem7   sg    eAhJ	j	B%b)DT\\^$T&&()t*KZ-r   c                    t        t        d            }t        |      }t        |      }| j	                  |j                                | j                  |j                                t        |      }| j                  ||       y)z1Tests PluralityCheckableIterator with 2 elements.   N	r   r   r   r	   r   r   r   r   r   r   s        r   (testPluralityCheckableIteratorWith2ElemszHPluralityCheckableIteratorTests.testPluralityCheckableIteratorWith2ElemsA   e    eAhJ	j	B%b)DT\\^$OOD%%'(t*KZ-r   c                    t        t        d            }t        |      }t        |      }| j	                  |j                                | j                  |j                                t        |      }| j                  ||       y)z1Tests PluralityCheckableIterator with 3 elements.   Nr(   r   s        r   (testPluralityCheckableIteratorWith3ElemszHPluralityCheckableIteratorTests.testPluralityCheckableIteratorWith3ElemsK   r*   r   c                 N    G d dt         j                        }t         |             }| j                  |j	                                | j                  |j                                d}	 |D ]  }|} | j                  d       | j                  |d       y# t        $ r Y w xY w)zcTests PluralityCheckableIterator with 2 elements.

    The second element raises an exception.
    c                       e Zd Zd Zd Zd Zy)cPluralityCheckableIteratorTests.testPluralityCheckableIteratorWith1Elem1Exception.<locals>.IterTestc                     d| _         y Nr   positionr   s    r   __init__zlPluralityCheckableIteratorTests.testPluralityCheckableIteratorWith1Elem1Exception.<locals>.IterTest.__init__]   	    r   c                     | S Nr   r5   s    r   __iter__zlPluralityCheckableIteratorTests.testPluralityCheckableIteratorWith1Elem1Exception.<locals>.IterTest.__iter__`       r   c                     | j                   dk(  r| xj                   dz  c_         y| j                   dk(  r | xj                   dz  c_         t        d      t               )Nr   r$   zTest exceptionr4   r   StopIterationr5   s    r   __next__zlPluralityCheckableIteratorTests.testPluralityCheckableIteratorWith1Elem1Exception.<locals>.IterTest.__next__c   sM    ==A
--1
-]]a
--1
-#$45
5
r   Nr   r   r   r6   r:   r?   r   r   r   IterTestr0   [   s     r   rA   Nz Expected exception from iteratorr$   )
sixIteratorr	   r   r   r   r   failr   r   )r   rA   r    iterated_valuevalues        r   1testPluralityCheckableIteratorWith1Elem1ExceptionzQPluralityCheckableIteratorTests.testPluralityCheckableIteratorWith1Elem1ExceptionU   s     3<<  $ &hj1DT\\^$OOD%%'(N% 
ii23 	^Q'  
s   +B 	B$#B$c                     G d dt         j                        }t         |             }	 |j                          | j	                  d       	 |D ]  } | j	                  d       	 |j                          | j	                  d       	 |D ]  } | j	                  d	       |D ]  }| j	                  d
        y# t
        $ r%}| j                  t        |      d       Y d}~d}~ww xY w# t
        $ r%}| j                  t        |      d       Y d}~d}~ww xY w# t
        $ r%}| j                  t        |      d       Y d}~d}~ww xY w# t
        $ r%}| j                  t        |      d       Y d}~d}~ww xY w)zATests PluralityCheckableIterator with 2 elements that both raise.c                       e Zd Zd Zd Zd Zy)_PluralityCheckableIteratorTests.testPluralityCheckableIteratorWith2Exceptions.<locals>.IterTestc                     d| _         y r2   r3   r5   s    r   r6   zhPluralityCheckableIteratorTests.testPluralityCheckableIteratorWith2Exceptions.<locals>.IterTest.__init__~   r7   r   c                     | S r9   r   r5   s    r   r:   zhPluralityCheckableIteratorTests.testPluralityCheckableIteratorWith2Exceptions.<locals>.IterTest.__iter__   r;   r   c                     | j                   dk  r-| xj                   dz  c_         t        d| j                   z        t               )Nr'   r$   zTest exception %sr=   r5   s    r   r?   zhPluralityCheckableIteratorTests.testPluralityCheckableIteratorWith2Exceptions.<locals>.IterTest.__next__   s9    ==1
--1
-#$7$--$GH
H
r   Nr@   r   r   r   rA   rJ   |   s     r   rA   z'Expected exception 1 from PeekExceptionzTest exception 1Nz"Expected exception 1 from iteratorz'Expected exception 2 from PeekExceptionzTest exception 2z"Expected exception 2 from iteratorExpected StopIteration)rB   rC   r	   PeekExceptionrD   r   assertInstr)r   rA   r    e_s        r   -testPluralityCheckableIteratorWith2ExceptionszMPluralityCheckableIteratorTests.testPluralityCheckableIteratorWith2Exceptionsy   sP    3<<   &hj1D0

ii9:0! 
ii450

ii9:0! 
ii45 
ii() '  0
mmCF.//0  0
mmCF.//0
  0
mmCF.//0  0
mmCF.//0s_   !B9 C* &!D E 9	C'C""C'*	D3DD	E	$EE		E:E55E:c                 $    G d dt         j                        }t         |             }d}	 |D ]  } | j                  d       |D ]  }|} | j                  |d       y# t        $ r%}| j                  t        |      d       Y d}~Ed}~ww xY w)zTests PCI with an iterator that yields an exception.

    The yielded exception is in the form of a tuple and must also contain a
    stack trace.
    c                       e Zd Zd Zd Zd Zy)dPluralityCheckableIteratorTests.testPluralityCheckableIteratorWithYieldedException.<locals>.IterTestc                     d| _         y r2   r3   r5   s    r   r6   zmPluralityCheckableIteratorTests.testPluralityCheckableIteratorWithYieldedException.<locals>.IterTest.__init__   r7   r   c                     | S r9   r   r5   s    r   r:   zmPluralityCheckableIteratorTests.testPluralityCheckableIteratorWithYieldedException.<locals>.IterTest.__iter__   r;   r   c                    | j                   dk(  r!	 | xj                   dz  c_         t        d      | j                   dk(  r| xj                   dz  c_         yt	               # t        $ r#}|t        j                         d   fcY d }~S d }~ww xY w)Nr   r$   Test exception 0r'   )r4   r   sysexc_infor>   )r   rR   s     r   r?   zmPluralityCheckableIteratorTests.testPluralityCheckableIteratorWithYieldedException.<locals>.IterTest.__next__   s|    ==A*MMQM%&899 ]]a
--1
-
 % *s||~a())*s    A   	B)BBBNr@   r   r   r   rA   rW      s     r   rA   Nz"Expected exception 0 from iteratorr[   r$   )rB   rC   r	   rD   r   rP   rQ   r   )r   rA   r    rE   rS   rR   rF   s          r   2testPluralityCheckableIteratorWithYieldedExceptionzRPluralityCheckableIteratorTests.testPluralityCheckableIteratorWithYieldedException   s     3<<  * &hj1DN0! 
ii45 n ^Q'	  0
mmCF.//0s   A! !	B*B

Bc                     G d dt         j                        }t         |             }|j                          |j	                          | j                  |j                  j                  d       |j                          | j                  |j                  j                  d       t        |       | j                  |j                  j                  d       t        |       | j                  |j                  j                  d       t        |       | j                  |j                  j                  d       	 t        |       | j                  d       y# t        $ r Y yw xY w)z<Tests that the PCI does not unnecessarily read new elements.c                       e Zd Zd Zd Zd Zy)bPluralityCheckableIteratorTests.testPluralityCheckableIteratorReadsAheadAsNeeded.<locals>.IterTestc                     d| _         y r2   r3   r5   s    r   r6   zkPluralityCheckableIteratorTests.testPluralityCheckableIteratorReadsAheadAsNeeded.<locals>.IterTest.__init__   r7   r   c                     | S r9   r   r5   s    r   r:   zkPluralityCheckableIteratorTests.testPluralityCheckableIteratorReadsAheadAsNeeded.<locals>.IterTest.__iter__   r;   r   c                 `    | j                   dk(  r
t               | xj                   dz  c_         y )Nr,   r$   )r4   r>   r5   s    r   r?   zkPluralityCheckableIteratorTests.testPluralityCheckableIteratorReadsAheadAsNeeded.<locals>.IterTest.__next__   s$    ==A
r   Nr@   r   r   r   rA   ra      s    r   rA   r$   r'   r,   rN   N)rB   rC   r	   r   rO   r   orig_iteratorr4   r   nextrD   r>   )r   rA   r    s      r   0testPluralityCheckableIteratorReadsAheadAsNeededzPPluralityCheckableIteratorTests.testPluralityCheckableIteratorReadsAheadAsNeeded   s   3<<  &hj1DLLNT''00!4T''00!4 	JT''00!4JT''00!4JT''00!4
4j
ii() 
s   :E 	E#"E#N)r   r   r   __doc__r"   r%   r)   r-   rG   rT   r^   rg   r   r   r   r   r   *   s0    2...."(H**X&(P%r   r   )rh   
__future__r   r   r   r   r\   rB   	six.movesr   "gslib.plurality_checkable_iteratorr	   gslib.tests.testcaseteststestcase	Exceptionr   GsUtilUnitTestCaser   r   r   r   <module>rq      sH   , 1 & %  ' 
 
  I ' ') Hh&A&A Hr   