
    ܖi                        d Z ddlZddlmZ ddlmZmZmZmZm	Z	m
Z
mZmZmZmZmZ ddlmZmZmZmZmZ  G d dej,                        Z G d d	ej,                        Z G d
 dej,                        Z G d dej,                        Z G d dej,                        Z G d dej,                        Z G d dej,                        Z G d dej,                        Z G d dej,                        Zy)z
Boolean Algebra.

Tests

Copyright (c) Sebastian Kraemer, basti.kr@gmail.com and others
SPDX-License-Identifier: BSD-2-Clause
    N)expectedFailure)	TOKEN_ANDTOKEN_FALSE
TOKEN_LPAR	TOKEN_NOTTOKEN_OR
TOKEN_RPARTOKEN_SYMBOL
TOKEN_TRUEBooleanAlgebra
ParseErrorSymbol)PARSE_INVALID_EXPRESSIONPARSE_INVALID_NESTINGPARSE_INVALID_OPERATOR_SEQUENCEPARSE_INVALID_SYMBOL_SEQUENCEPARSE_UNKNOWN_TOKENc                   ~    e 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 Zd Zd Zd Zd Zd Zd Zy)BooleanAlgebraTestCasec                 ^    t               }d}|j                  |      }t        |      |k(  sJ y )Nz(a|b|c)&d&(~e|(f&g)))r   parsestr)selfalgebraexpr_strexprs       X/var/www/html/content-pipeline/venv/lib/python3.12/site-packages/boolean/test_boolean.pytest_creationz$BooleanAlgebraTestCase.test_creation$   s/     ")}}X&4yH$$$    c                     G d dt               }d}t        |      }|j                  |      }|j                  |j	                  |j                  d      |j                  |j                  d            |j                  d            |j                  d      |j	                  |j                  |j                  d	            |j	                  |j                  |j                  d
      |j                  d            |j                  |j                              |j                  d            }|j                         |j                         k(  sJ ||k(  sJ y )Nc                       e Zd Zy)eBooleanAlgebraTestCase.test_parse_with_mixed_operators_multilines_and_custom_symbol.<locals>.MySymbolN__name__
__module____qualname__ r   r   MySymbolr"   +       r   r(   zl(a or ~ b +_c  ) and
                      d & ( ! e_
                      | (my * g OR 1 or 0) ) AND that Symbol_classab_cde_mygthat)	r   r   r   ANDORNOTTRUEFALSEpretty)r   r(   r   r   r   expecteds         r   <test_parse_with_mixed_operators_multilines_and_custom_symbolzSBooleanAlgebraTestCase.test_parse_with_mixed_operators_multilines_and_custom_symbol*   s   	v 	: !h7}}X&;;JJs#GNN3/0t$
 NN3JJGNN401

KKt,s+ LLMM
 NN6"%
* {{} 1111xr   c           
         d}t               }|j                  |      }|j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                        }||k(  sJ y )Nz8True or False or None or 0 or 1 or TRue or FalSE or NONe)r   r   r5   r7   r8   )r   r   r   r   r:   s        r   7test_parse_recognizes_trueish_and_falsish_symbol_tokenszNBooleanAlgebraTestCase.test_parse_recognizes_trueish_and_falsish_symbol_tokensM   ss    M "}}X&::LLMMMMMMLLLLMMMM	
 xr   c                     G d dt                G fddt              d}        }|j                  |      }|j                  |j	                  |j                  d      |j                  d            |j                  |j                  |j                  d      |j                  d	                        }||k(  sJ y )
Nc                       e Zd Zy)cBooleanAlgebraTestCase.test_parse_can_use_iterable_from_alternative_tokenizer.<locals>.CustomSymbolNr#   r'   r   r   CustomSymbolr@   ^   r)   r   rA   c                   .     e Zd ZW f fd	Zd Z xZS )dBooleanAlgebraTestCase.test_parse_can_use_iterable_from_alternative_tokenizer.<locals>.CustomAlgebrac                 &    t         |   |       y )Nr*   )super__init__)r   r+   CustomAlgebra	__class__s     r   rF   zmBooleanAlgebraTestCase.test_parse_can_use_iterable_from_alternative_tokenizer.<locals>.CustomAlgebra.__init__b   s    mT33Nr   c              3   B  K   t         t        t        t        t        d}t        |j                  d            D ]b  \  }}t        |j                               D ]A  \  }}||v r||   |||ff |dk(  r| j                  |      |||ff 5t        |||ff C d yw)z3Sample tokenizer using custom operators and symbols)WHY_NOTALSONEITHER()FCustomN)
r   r   r   r   r	   	enumerate
splitlinessplitr   r
   )r   sopsrowlinecoltoks          r   tokenizezmBooleanAlgebraTestCase.test_parse_can_use_iterable_from_alternative_tokenizer.<locals>.CustomAlgebra.tokenizee   s       (%(## "+1<<+>!? @IC$-djjl$; @S#:"%c(C#s";; H_"&++c"2C#s"CC".c3Z"??@@s   BB)r$   r%   r&   rF   rY   __classcell__)rH   rG   rA   s   @r   rG   rC   a   s    ,8 O@r   rG   zo( Custom WHY_NOT regular ) ALSO NEITHER  (
                      not_custom ALSO standard )
                   rO   regular
not_customstandard)r   r   r   r4   r5   r6   )r   r   r   r   r:   rG   rA   s        @@r   6test_parse_can_use_iterable_from_alternative_tokenizerzMBooleanAlgebraTestCase.test_parse_can_use_iterable_from_alternative_tokenizer]   s    	6 		@N 	@.  /}}X&;;JJx(y) KKNN<0NN:.
 xr   c                 x  	 dd l 	ddlm  G d dt               G d dt               G 	fddt              }d	} |       }|j                  |      }|j                  |j                   d
       d            |j                   d      |j                   d                        }||k(  sJ y )Nr   )StringIOc                       e Zd ZdZy)SBooleanAlgebraTestCase.test_parse_with_advanced_tokenizer_example.<locals>.PlainVarzPlain boolean variableNr$   r%   r&   __doc__r'   r   r   PlainVarrb      s    $r   re   c                       e Zd ZdZy)VBooleanAlgebraTestCase.test_parse_with_advanced_tokenizer_example.<locals>.ColonDotVarz/Colon and dot-separated string boolean variableNrc   r'   r   r   ColonDotVarrg      s    =r   rh   c                       e Zd Z fdZy)ZBooleanAlgebraTestCase.test_parse_with_advanced_tokenizer_example.<locals>.AdvancedAlgebrac              3   >  K   t        |t              st        dt        |      z        t        t        t
        t
        t        t        t        t        t        t        t        t        t        d}j                  j                  j                  j                  j                  j                   f}d j#                   |      j$                        D        }dfd}d\  }}}|D ]  \  }	}
}}|	|v r ||      }|||||ff d\  }}}&|j'                  |
j)                               }|# ||      }|||||ff d\  }}}||
||ff j|	j*                  k(  s|	j,                  k(  r|
v r|s|}|}||
z  }t        d	t/               z         yw)
a"  
                Example custom tokenizer derived from the standard Python tokenizer
                with a few extra features: #-style comments are supported and a
                colon- and dot-separated string is recognized and stored in custom
                symbols. In contrast with the standard tokenizer, only these
                boolean operators are recognized : & | ! and or not.

                For more advanced tokenization you could also consider forking the
                `tokenize` standard library module.
                z!expr must be string but it is %s.)&and|or!notrM   rN   true1false0nonec              3   ^   K   | ]%  \  }}\  }}}}|r|j                         r||||f ' y wN)strip).0toktyperX   rU   rW   _s         r   	<genexpr>zvBooleanAlgebraTestCase.test_parse_with_advanced_tokenizer_example.<locals>.AdvancedAlgebra.tokenize.<locals>.<genexpr>   sG       '!syy{  	s   +-):.c                 \      r(t         fdD              r
        }|S         }|S y )Nc              3   &   K   | ]  }|v  
 y wrx   r'   )rz   rS   current_dotteds     r   r}   zBooleanAlgebraTestCase.test_parse_with_advanced_tokenizer_example.<locals>.AdvancedAlgebra.tokenize.<locals>.build_symbol.<locals>.<genexpr>   s     FqqN2Fs   )any)r   sym	COLON_DOTrh   re   s   ` r   build_symbolzyBooleanAlgebraTestCase.test_parse_with_advanced_tokenizer_example.<locals>.AdvancedAlgebra.tokenize.<locals>.build_symbol   s;    %FIFF"-n"=C  #
 #+>":C"
 &r   ) NNN)r   r   r   z8Unknown token: %(tok)r at line: %(row)r, column: %(col)r)
isinstancer   	TypeErrortyper   r   r   r   r	   r   r   NLNEWLINECOMMENTINDENTDEDENT	ENDMARKERgenerate_tokensreadlinegetlowerNAMEOPlocals)r   r   TOKENSignored_token_typestokensr   dottedsrowscolr{   rX   rU   rW   symbol	std_tokenr   rh   re   r`   rY   s                  @r   rY   zcBooleanAlgebraTestCase.test_parse_with_advanced_tokenizer_example.<locals>.AdvancedAlgebra.tokenize   s     "$,#$G$t*$TUU
 #$!""$##&#($'" KK$$$$OOOO&&'#  (778O8OP	
# &4"d.4 *GS#s"55!-f!5!-"(&4,">>1?.FD$  &

399; 7I ,!-f!5!-"(&4,">>19.FD$'sCj88 (--/Gx{{4JsV_O_%#&D#&D# (VY_Yaa ;s   FFN)r$   r%   r&   rY   )rh   re   r`   rY   s   r   AdvancedAlgebrarj      s    h hr   r   z
            (colon1:dot1.dot2 or colon2_name:col_on3:do_t1.do_t2.do_t3 )
            and
            ( plain_symbol & !Custom )
        zcolon1:dot1.dot2z%colon2_name:col_on3:do_t1.do_t2.do_t3plain_symbolrO   )	rY   ior`   r   r   r   r4   r5   r6   )
r   r   	test_exprr   r   r:   rh   re   r`   rY   s
         @@@@r   *test_parse_with_advanced_tokenizer_examplezABooleanAlgebraTestCase.test_parse_with_advanced_tokenizer_example   s    	%v 	%	>& 	>i	 i	n i	V	 "#}}Y';;JJ./CD KK0'++hx>P2QR
 xr   c                     t        d      }d}|j                  |      }|j                  |j                  d      |j                  d            }||k(  sJ y )N)r   r|   -+)allowed_in_tokenzl-a AND b+czl-azb+c)r   r   r4   r   )r   r   r   r   r:   s        r   -test_allowing_additional_characters_in_tokenszDBooleanAlgebraTestCase.test_allowing_additional_characters_in_tokens  sP     2FG!	}}Y';;w~~e4gnnU6KLxr   c                     t               }d}	 |j                  |       | j                  d|z         y # t        $ r}|j                  t
        k(  sJ Y d }~y d }~ww xY w)Nzl-a AND none,Exception should be raised when parsing '%s'r   r   failr   
error_coder   r   r   r   pes       r   test_parse_raise_ParseError1z3BooleanAlgebraTestCase.test_parse_raise_ParseError1  sU     "	8MM$IIDtKL 	8==$7777	8   %4 	AAAc                     t               }d}	 |j                  |       | j                  d|z         y # t        $ r}|j                  t
        k(  sJ Y d }~y d }~ww xY w)Nz(l-a + AND l-br   r   r   s       r   test_parse_raise_ParseError2z3BooleanAlgebraTestCase.test_parse_raise_ParseError2$  sU     "	8MM$IIDtKL 	8==$7777	8r   c                     t               }d}	 |j                  |       | j                  d|z         y # t        $ r}|j                  t
        k(  sJ Y d }~y d }~ww xY w)Nz(l-a + AND l-b)r   r   r   s       r   test_parse_raise_ParseError3z3BooleanAlgebraTestCase.test_parse_raise_ParseError3-  U     " 	8MM$IIDtKL 	8==$7777	8r   c                     t               }d}	 |j                  |       | j                  d|z         y # t        $ r}|j                  t
        k(  sJ Y d }~y d }~ww xY w)Nz(l-a AND l-br   r   r   s       r   test_parse_raise_ParseError4z3BooleanAlgebraTestCase.test_parse_raise_ParseError46  sU     "	8MM$IIDtKL 	8==$7777	8r   c                     t               }d}	 |j                  |       | j                  d|z         y # t        $ r}|j                  t
        k(  sJ Y d }~y d }~ww xY w)Nz(l-a + AND l-b))r   r   r   s       r   test_parse_raise_ParseError5z3BooleanAlgebraTestCase.test_parse_raise_ParseError5?  sU     "!	8MM$IIDtKL 	8==$7777	8r   c                     t               }d}	 |j                  |       | j                  d|z         y # t        $ r}|j                  t
        k(  sJ Y d }~y d }~ww xY w)Nz(l-a  AND l-b))r   r   r   s       r   test_parse_raise_ParseError6z3BooleanAlgebraTestCase.test_parse_raise_ParseError6H  r   r   c                     t               }d}	 |j                  |       | j                  d|z         y # t        $ r}|j                  t
        k(  sJ Y d }~y d }~ww xY w)Nzl-a ANDr   r   r   s       r   test_parse_raise_ParseError7z3BooleanAlgebraTestCase.test_parse_raise_ParseError7Q  sU     "	8MM$IIDtKL 	8==$7777	8r   c                     t               }d}	 |j                  |       | j                  d|z         y # t        $ r}|j                  t
        k(  sJ Y d }~y d }~ww xY w)NzOR l-ar   r   r   r   r   r   r   r   s       r   test_parse_raise_ParseError8z3BooleanAlgebraTestCase.test_parse_raise_ParseError8Z  sX     "	DMM$IIDtKL 	D==$CCCC	Dr   c                     t               }d}	 |j                  |       | j                  d|z         y # t        $ r}|j                  t
        k(  sJ Y d }~y d }~ww xY w)Nz+ l-ar   r   r   s       r   test_parse_raise_ParseError9z3BooleanAlgebraTestCase.test_parse_raise_ParseError9c  sX     "	DMM$IIDtKL 	D==$CCCC	Dr   c                     t               }d}	 |j                  |       y # t        $ r}|j                  t        k(  sJ Y d }~y d }~ww xY w)Nza or b cr   r   r   r   r   r   r   r   r   s       r   >test_parse_side_by_side_symbols_should_raise_exception_but_notzUBooleanAlgebraTestCase.test_parse_side_by_side_symbols_should_raise_exception_but_notl  sF     "	BMM(# 	B==$AAAA	B     	AAAc                     t               }d}	 |j                  |       y # t        $ r}|j                  t        k(  sJ Y d }~y d }~ww xY w)Nz
(a or b) c)r   r   r   r   r   r   s       r   ?test_parse_side_by_side_symbols_should_raise_exception_but_not2zVBooleanAlgebraTestCase.test_parse_side_by_side_symbols_should_raise_exception_but_not2t  sC     "	=MM(# 	===$<<<<	=r   c                     t               }d}	 |j                  |       y # t        $ r}|j                  t        k(  sJ Y d }~y d }~ww xY w)Nza br   r   s       r   /test_parse_side_by_side_symbols_raise_exceptionzFBooleanAlgebraTestCase.test_parse_side_by_side_symbols_raise_exception|  sF     "	BMM(# 	B==$AAAA	Br   c                     t               }d}	 |j                  |       y # t        $ r}|j                  t        k(  sJ Y d }~y d }~ww xY w)Nz(a) (b))r   r   r   r   r   r   s       r   ;test_parse_side_by_side_symbols_with_parens_raise_exceptionzRBooleanAlgebraTestCase.test_parse_side_by_side_symbols_with_parens_raise_exception  sC     "	:MM(# 	:==$9999	:r   N)r$   r%   r&   r   r;   r=   r^   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r'   r   r   r   r   #   si    %! F  - ^D L 8888888DDB=B:r   r   c                   B    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)BaseElementTestCasec                    ddl m} t               }|j                  |j                  k(  sJ  |        | j	                  t
        |d       | j	                  t
        |d       |j                  |j                  u sJ |j                  |j                  usJ |j                  |j                  u sJ t        |j                        du sJ t        |j                        du sJ |j                  dk(  sJ |j                  dk(  sJ y )Nr   )BaseElement   r,   TF)boolean.booleanr   r   r7   assertRaisesr   r8   bool)r   r   r   s      r   r   z!BaseElementTestCase.test_creation  s    / "||w||+++)[!4)[#6||w||+++||7==000}}---GLL!T)))GMM"e+++||t###}}%%%r   c                     t               }|j                  j                  t               k(  sJ |j                  j                  t               k(  sJ y rx   )r   r7   literalssetr8   r   r   s     r   test_literalsz!BaseElementTestCase.test_literals  s>     "||$$---}}%%...r   c                     t               }|j                  j                         |j                  k(  sJ |j                  j                         |j                  k(  sJ y rx   )r   r7   
literalizer8   r   s     r   test_literalizez#BaseElementTestCase.test_literalize  sH     "||&&(GLL888}}'')W]]:::r   c                     t               }|j                  j                         |j                  k(  sJ |j                  j                         |j                  k(  sJ y rx   r   r7   simplifyr8   r   s     r   test_simplifyz!BaseElementTestCase.test_simplify  sH     "||$$&',,666}}%%'7==888r   c                     t               }t               }|j                  j                         |j                  k(  sJ |j                  j                         |j                  k(  sJ y rx   r   )r   algebra1algebra2s      r   test_simplify_two_algebraz-BaseElementTestCase.test_simplify_two_algebra  sP    !#!#}}%%'8==888~~&&(HNN:::r   c                     t               }|j                  j                  |j                  k(  sJ |j                  j                  |j                  k(  sJ y rx   )r   r7   dualr8   r   s     r   	test_dualzBaseElementTestCase.test_dual  sB     "||  GMM111}}!!W\\111r   c                     t               }|j                  |j                  k(  sJ |j                  |j                  k(  sJ |j                  |j                  k7  sJ y rx   )r   r7   r8   r   s     r   test_equalityz!BaseElementTestCase.test_equality  sL     "||w||+++}}---||w}},,,r   c                     t               }|j                  |j                  k  sJ |j                  |j                  kD  sJ y rx   )r   r8   r7   r   s     r   
test_orderzBaseElementTestCase.test_order  s6     "}}w||+++||gmm+++r   c                     t               }t        |j                        dk(  sJ t        |j                        dk(  sJ t	        |j                        dk(  sJ t	        |j                        dk(  sJ y )Nrs   ru   r7   r8   )r   r   r7   r8   reprr   s     r   test_printingz!BaseElementTestCase.test_printing  sf     "7<< C'''7==!S(((GLL!V+++GMM"g---r   N)r$   r%   r&   r   r   r   r   r   r   r   r   r   r'   r   r   r   r     s/    & /
;
9
;2
-,
.r   r   c                   B    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)SymbolTestCasec                     t        d       t        d       t        d        t        t               t        d       t        ddg       y )N   r,   )r   r      r   )r   sumr   s    r   	test_initzSymbolTestCase.test_init  s1    q	stsy1vr   c                 6    t        d      j                  du sJ y )Nr   T)r   	isliteralr   s    r   test_isliteralzSymbolTestCase.test_isliteral  s    ay""d***r   c                     t        d      }t        d      }||j                  v sJ ||j                  v sJ ||j                  v sJ ||j                  v sJ | j                  t        t        |dd       y )Nr   r   )r   r   r   AttributeErrorsetattr)r   l1l2s      r   r   zSymbolTestCase.test_literals  sr    AYAYR[[   R[[   R[[   R[[   .'2z1Er   c                 D    t        d      }|j                         |k(  sJ y Nr   )r   r   r   rS   s     r   r   zSymbolTestCase.test_literalize  s    1I||~"""r   c                 D    t        d      }|j                         |k(  sJ y r  r   r   r  s     r   r   zSymbolTestCase.test_simplify  s    1Izz|q   r   c                 v    t        d      }t        d      }|j                         |j                         k(  sJ y r  r  )r   s1s2s      r   !test_simplify_different_instancesz0SymbolTestCase.test_simplify_different_instances  s.    AYAY{{}---r   c                 \   t               }|j                  d      }|j                  d      }|j                  d      }|j                  d      }|j                  d      }||k(  sJ ||k(  sJ ||k(  rJ ||k(  rJ ||k(  sJ ||k(  rJ ||k(  rJ ||k7  rJ ||k7  rJ ||k7  sJ ||k7  sJ y )Nr,   r-   r/   er   r   )r   r   r,   a2cr/   r  s          r   test_equal_symbolsz!SymbolTestCase.test_equal_symbols  s     "NN3^^C NN3NN3NN3 AvvBww6z7{Avv6z6z6z7{AvvQwwr   c                     t         } |d       |d      k  sJ  |d       |d      kD  sJ  |d       |d      k  sJ  |d       |d      kD  sJ y )Nxyr   r   )r   )r   Ss     r   r   zSymbolTestCase.test_order  sW    v#v#tad{{tad{{r   c                     t        t        d            dk(  sJ t        t        d            dk(  sJ t        t        d            dk(  sJ t        t        d            dk(  sJ y )Nr,   r   rs   zSymbol('a')z	Symbol(1))r   r   r   r   s    r   r   zSymbolTestCase.test_printing  s\    6#;3&&&6!9~$$$F3K M111F1I+---r   N)r$   r%   r&   r   r   r   r   r   r
  r  r   r   r'   r   r   r   r     s0    +F#!.
..r   r   c                   B    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)NOTTestCasec                    t               }| j                  t        |j                         | j                  t        |j                  dd       |j                  |j	                  d             |j                  |j
                        j                         |j                  k(  sJ |j                  |j                        j                         |j
                  k(  sJ y )Nr,   r-   )r   r   r   r6   r   r7   r   r8   r   s     r   r   zNOTTestCase.test_init  s     ")W[[1)W[[#s;GNN3'(GLL)335FFFGMM*446',,FFFr   c                     t               }|j                  d      }|j                  |      j                  sJ |j	                  d      j                  rJ y )Nr   ~(a|b))r   r   r6   r   r   )r   r   rS   s      r   r   zNOTTestCase.test_isliteral  sJ     "NN1{{1~''''==*44444r   c                    t               }|j                  d      }| }|j                  sJ ||j                  v sJ t	        |j                        dk(  sJ |j                  d      }|j                  rJ ||j                  v sJ t	        |j                        dk(  sJ |j                  dd      }|j                  sJ y )Nr,   r   ~(a&a)Tr   )r   r   r   r   lenr   )r   r   r,   ls       r   r   zNOTTestCase.test_literals!  s     "NN3B{{{AJJ1::!###MM(#;;AJJ1::!###MM(TM2{{{r   c                     t               j                  } |d       |d      j                         k(  sJ  |d       |d      j                         k(  sJ  |d       |d      j                         k(  sJ y )N~az~a|~b~(a&b)z~a&~br  r   r   r   r   r   s     r   r   zNOTTestCase.test_literalize1  sm     &&T{eDk446666W~x!;!;!====W~x!;!;!====r   c                 *   t               }|j                  d      }| | k(  sJ |j                  d      |j                  d      k(  sJ |j                  d      |k7  sJ |  j                         |k(  sJ |   j                         | k(  sJ |    j                         |k(  sJ ||z  |z   j                         ||z  |z   j                         k(  sJ |j                  dd      |k(  sJ t               }|j                  dd      |k(  sJ y )Nr,   ~~aTr  )r   r   r   r   )r   r   r,   r   s       r   r   zNOTTestCase.test_simplify7  s%    "NN3raRxx~~c"gnnS&9999}}U#q(((~~1$$$" QB&&&2#!Q&&&a%!)&&(q1uqy\,C,C,EEEE}}UT}2a777!#~~ed~3q888r   c                 B   t               }|j                  d      }| j                         | k(  sJ |j                  d      j                         |k(  sJ |j                  d      j                         | k(  sJ |j                  d      j                         |k(  sJ y )Nr,   r&  z~~~az~~~~a)r   r   cancelr   )r   r   r,   s      r   test_cancelzNOTTestCase.test_cancelE  s     "NN3{{}"""}}U#**,111}}V$++-!333}}W%,,.!333r   c                 f   t               }|j                  d      }|j                  d      }|j                  d      }|j                  d      j                         | | z  k(  sJ |j                  d      j                         |j                  d      k(  sJ |j                  d      j                         || z  k(  sJ ||z  |z    j                         ||z  |z  k(  sJ ||z  |z     j                         ||z   | z  k(  sJ |j                  d      j                         ||z  |z  k(  sJ |j                  d	      j                         ||z  |z   j                         k(  sJ |j                  }|j
                  }| j                         |k(  sJ | j                         |k(  sJ y )
Nr,   r-   r  r"  z~(a|b|c)~a&~b&~cz~(~a&b)z~~~~~~~~~~(a&b|c)z~~~~~~~~~~~(a&b|c))r   r   r   demorganr8   r7   )r   r   r,   r-   r  _0_1s          r   test_demorganzNOTTestCase.test_demorganM  s    "NN3NN3NN3}}X&//1aR1"W<<<}}Z(113w}}Z7PPPP}}Y'002a1"f<<<q519'')QUQY666EAI,((*Ah!m;;;}}12;;=QJJJ}}12;;=AEAI,AXAXAZZZZ]]\\!R'''!R'''r   c                     t               }|j                  d      }|j                  d      }|| k  sJ | |kD  sJ | |k  sJ || kD  sJ y )Nr   r   r  )r   r   r  r  s       r   r   zNOTTestCase.test_order^  sZ     "NN1NN1A2vvrAvvrAvvA2vvr   c                     t               }|j                  d      }t        |       dk(  sJ t        |       dk(  sJ |j	                  d      }t        |      dk(  sJ t        |      sJ d       y )Nr,   r!  zNOT(Symbol('a'))r  z$NOT(AND(Symbol('a') == Symbol('a'))))r   r   r   r   r   )r   r   r,   r   s       r   r   zNOTTestCase.test_printingg  sq     "NN3A2w$QBx----}}X&4yH$$$DzAAAzr   N)r$   r%   r&   r   r   r   r   r   r)  r/  r   r   r'   r   r   r  r    s1    G5 >94("B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d
 Zed        Zed        Zed        Zed        Zd Zd Zd Zd Zd Zd Zd Zy)DualBaseTestCaseNc                     ddl m} t        d      t        d      t        d      }}} |||      } ||||      } |||      } ||||      }| j                  t        |       ||||fD ]  }	t        |	|      rJ  y Nr   DualBaser,   r-   r  )r   r7  r   r   r   r   
r   r7  r,   r-   r  t1t2t3t4terms
             r   r   zDualBaseTestCase.test_initu  s    ,+vc{F3Ka1a^aAa^aA)X.R$ 	.DdH---	.r   c                     ddl m} t        d      t        d      t        d      }}} |||      } ||||      }|j                  rJ |j                  rJ y r5  )r   r7  r   r   )r   r7  r,   r-   r  r9  r:  s          r   r   zDualBaseTestCase.test_isliteral  sS    ,+vc{F3Ka1a^aA<<<<<r   c                 :   ddl m} t        d      t        d      t        d      }}} |||      } ||||      } |||      } ||||      }||||fD ]  }	||	j                  v rJ  |||fD ]  }	||	j                  v rJ  ||fD ]  }	||	j                  v rJ  y r5  )r   r7  r   r   r8  s
             r   r   zDualBaseTestCase.test_literals  s    ,+vc{F3Ka1a^aAa^aAR$ 	&D%%%	&RL 	&D%%%	&H 	&D%%%	&r   c                 n    t               j                  } |d      j                          |d      k(  sJ y )Nza|~(b|c)z	a|(~b&~c)r#  r$  s     r   r   z DualBaseTestCase.test_literalize  s1     &&Z ++-{1CCCCr   c                     t               }|j                  d      j                  |j                  k(  sJ |j                  d      j                  |j                  k(  sJ y )Na&aa|a)r   r   annihilatorr8   r7   r   s     r   test_annihilatorz!DualBaseTestCase.test_annihilator  sL     "}}U#//7==@@@}}U#//7<<???r   c                     t               }|j                  d      j                  |j                  k(  sJ |j                  d      j                  |j                  k(  sJ y )Na|ba&b)r   r   identityr8   r7   r   s     r   test_identityzDualBaseTestCase.test_identity  sL     "}}U#,,===}}U#,,<<<r   c                    t               }|j                  |j                  d      |j                  d            j                  |j                  k(  sJ |j	                  |j                  d      |j                  d            j                  |j                  k(  sJ |j                  d      j                  |j                  k(  sJ |j                  d      j                  |j                  k(  sJ y )Nr,   r-   rG  rH  )r   r4   r   r   r5   r   r   s     r   r   zDualBaseTestCase.test_dual  s     "{{7>>#.s0CDIIWZZWWWzz'..-w~~c/BCHHGKKWWW}}U#((GKK777}}U#((GJJ666r   c                     t               }t               }|j                  d      }|j                  d      }|j                  d      }|j                  }|j                  }||z  j	                         |k(  sJ |||z  z  j	                         ||z  k(  sJ ||z  j	                         |k(  sJ ||z  j	                         |k(  sJ ||z  j	                         |k(  sJ ||z  j	                         |k(  sJ || z  j	                         |k(  sJ || z  j	                         |k(  sJ |||z  z  j	                         |k(  sJ |||z  z  j	                         |k(  sJ ||z  ||z  |z  z  j	                         ||z  k(  sJ || z  ||z  z  j	                         |k(  sJ ||z  |z  j	                         }||z  |z  j	                  d      }	|	|k(  sJ |j                         |	j                         k7  sJ ||z  |z  j	                         }||z  |z  j	                  d      }	|	|k(  sJ |j                         |	j                         k7  sJ |j                  d      }
|j                  dd	      }||
k(  sJ |j                  d      }
|j                  dd	      }||
k(  sJ |j                  d
      }
|j                  dd	      }||
k(  sJ |j                  d
      }
|j                  dd	      }||
k(  sJ |j                  dd	      }
|j                  dd	      }|j                         |
j                         k(  sJ |j                  dd	      }
|j                  dd	      }|j                         |
j                         k(  sJ y )Nr,   r-   r  Fsortz(a&b)|(b&c)|(a&c)z((~a&b&c) | (a&~b&c) | (a&b&~c) | (a&b&c)Tr  b&dz(a&b&c&d) | (b&d)z(~b&~d&a) | (~c&~d&b) | (a&c&d)zj(~a&b&~c&~d) | (a&~b&~c&~d) | (a&~b&c&~d) |
                          (a&~b&c&d) | (a&b&~c&~d) | (a&b&c&d))r   r   r8   r7   r   r9   r   )r   r   r   r,   r-   r  r-  r.  sorted_expressionunsorted_expressionr:   results               r   r   zDualBaseTestCase.test_simplify  s   !#!#OOC OOC OOC ^^]]A!Q&&&QU%%'1q5000B  "b(((B  "b(((B  "a'''B  "a'''QB  "b(((QB  "b(((QU%%'1,,,QU%%'1,,,Q1q519%//1QU::: aRAE",,.!333 UQY002 1uqy222>"&7777 '')-@-G-G-IIIIUQY002 1uqy222>"&7777 '')-@-G-G-IIII>>"56 JUYZ!!!>>"56 JUYZ!!!>>%( 3dC!!!>>%( 3dC!!!>>"Cd>SB   

 }}(//"3333>>"Cd>SB   

 }}(//"3333r   c                 N   t               }|j                  dd      \  }}| | z  |z  | z  }| | z  | |g}|j                  |      }|d   |d   c|d<   |d<   |j                  |      }t        |      dk(  sJ t        |      dk(  sJ |d   |d   k(  sJ |d   |d   k(  sJ y )Nr,   r-   r   r   r   )r   symbolsabsorbr  )r   r   r,   r-   r  argsresult_originalresult_swappeds           r   "test_absorption_invariant_to_orderz3DualBaseTestCase.test_absorption_invariant_to_order  s     "sC(1R1"WMQBB!GB
 ((4.7DGQa$?#q(((>"a'''q!^A%6666q!^A%6666r   c                     t               } |j                  d \  }}}d}|j                  |      }| | z  | z  }|j                         |j                         k(  sJ ||k(  sJ y )Nabcz(~a | ~b | ~c))r   rT  r   r9   )r   r   r,   r-   r  test_expression_strparsedtest_expressions           r   Etest_parse_complex_expression_should_create_same_expression_as_pythonzVDualBaseTestCase.test_parse_complex_expression_should_create_same_expression_as_python  su     "!'//5)1a223"r'QB, }}/"8"8"::::(((r   c                 @   t               }|j                  d      }|j                  d      }|j                  d      }|j                  d      }d}|j                  |d      }| | z  | z  | z  | | z  | z  |z  z  | |z  | z  | z  z  | |z  |z  |z  z  | |z  | z  |z  z  | |z  |z  | z  z  || z  | z  |z  z  | |z  |z  |z  z  || z  |z  |z  z  ||z  |z  |z  z  j                         }|j	                         |j	                         k(  sJ y )Nr,   r-   r  r/   z
            (~a&~b&~c&~d) | (~a&~b&~c&d) | (~a&b&~c&~d) |
            (~a&b&c&d) | (~a&b&~c&d) | (~a&b&c&~d) |
            (a&~b&~c&d) | (~a&b&c&d) | (a&~b&c&d) | (a&b&c&d)
            Tr  )r   r   r   r   r9   	r   r   r,   r-   r  r/   r\  r]  r^  s	            r   5test_simplify_complex_expression_parsed_with_simplifyzFDualBaseTestCase.test_simplify_complex_expression_parsed_with_simplify#  s    !"NN3NN3NN3NN3 2TB R1"Wr\QBrQBw!|a!rAv{aR! rAvzA~ rAv{Q	 
 rAvzQB  A2v{Q  rAvzA~ A2vzA~ 1uqy1}	 (* 	 }}/"8"8"::::r   c                     t               }|j                  d      }|j                  d      }|j                  d      }|j                  d      }d}|j                  |      }| | z  | z  | z  | | z  | z  |z  z  | |z  | z  | z  z  | |z  |z  |z  z  | |z  | z  |z  z  | |z  |z  | z  z  || z  | z  |z  z  | |z  |z  |z  z  || z  |z  |z  z  ||z  |z  |z  z  }|j                         |j                         k(  sJ y )Nr,   r-   r  r/   z
            ~a&~b&~c&~d | ~a&~b&~c&d | ~a&b&~c&~d |
            ~a&b&c&d | ~a&b&~c&d | ~a&b&c&~d |
            a&~b&~c&d | ~a&b&c&d | a&~b&c&d | a&b&c&d
            )r   r   r   r9   ra  s	            r   Ttest_complex_expression_without_parens_parsed_or_built_in_python_should_be_identicalzeDualBaseTestCase.test_complex_expression_without_parens_parsed_or_built_in_python_should_be_identicalE  s}    !"NN3NN3NN3NN3 23 B!GqbLA2bA2glQb1frkQB b1fqj1n b1frkAo	
 b1fqjA2o 1"frkAo b1fqj1n 1"fqj1n !eai!m	 	 }}/"8"8"::::r   c                    t               }|j                  d      }|j                  d      }|j                  d      }|j                  d      }|j                  }dj                  dj	                               }| | z  | z  | z  | | z  | z  |z  z  | |z  | z  | z  z  | |z  |z  |z  z  | |z  | z  |z  z  | |z  |z  | z  z  || z  | z  |z  z  | |z  |z  |z  z  || z  |z  |z  z  ||z  |z  |z  z  } ||      }	|t        |	      k(  sJ || z  |z  | |z  z  | | z  z  ||z  |z  z  }
|j                         j                         |
j                         k(  sJ  ||d      }	|	j                         j                         |
j                         j                         k(  sJ d	}t        |	      |k(  sJ  ||      }|j                         j                         |
j                         k(  sJ t        |j                               |k(  sJ |j                  |j                  |j                  |j                  d            |j                  |j                  d            |j                  |j                  d            |j                  |j                  d                  |j                  |j                  |j                  d            |j                  |j                  d            |j                  |j                  d            |j                  d            |j                  |j                  |j                  d            |j                  d      |j                  |j                  d            |j                  |j                  d                  |j                  |j                  |j                  d            |j                  d      |j                  d      |j                  d            |j                  |j                  |j                  d            |j                  d      |j                  |j                  d            |j                  d            |j                  |j                  |j                  d            |j                  d      |j                  d      |j                  |j                  d                  |j                  |j                  d      |j                  |j                  d            |j                  |j                  d            |j                  d            |j                  |j                  |j                  d            |j                  d      |j                  d      |j                  d            |j                  |j                  d      |j                  |j                  d            |j                  d      |j                  d            |j                  |j                  d      |j                  d      |j                  d      |j                  d            
      }
 ||      }|j                         }||
k(  sJ y )
Nr,   r-   r  r/   r   z
            (~a&~b&~c&~d) | (~a&~b&~c&d) | (~a&b&~c&~d) |
            (~a&b&c&d) | (~a&b&~c&d) | (~a&b&c&~d) |
            (a&~b&~c&d) | (~a&b&c&d) | (a&~b&c&d) | (a&b&c&d)
        Tr  z(a&~b&d)|(~a&b)|(~a&~c)|(b&c&d))r   r   r   joinrR   r   r   r9   r5   r4   r6   )r   r   r,   r-   r  r/   r   r\  r^  r]  r:   expected_strparsed2rR  s                 r   7test_simplify_complex_expression_parsed_then_simplifiedzHDualBaseTestCase.test_simplify_complex_expression_parsed_then_simplifiede  s    !"NN3NN3NN3NN3 gg EG
 R1"Wr\QBrQBw!|a!rAv{aR! rAvzA~ rAv{Q	 
 rAvzQB  A2v{Q  rAvzA~ A2vzA~ 1uqy1}	 	 *+"c&k111FQJA26*qbA2g6!a%!)D'')002hoo6GGGG*T:
  '')X->->-@-G-G-IIII86{l***+,!((*hoo.????7##%&,666::KKGNN3/0GNN3/0GNN3/0GNN3/0	 KKGNN3/0GNN3/0GNN3/0s#	 KKGNN3/0s#GNN3/0GNN3/0	 KKGNN3/0s#s#s#	 KKGNN3/0s#GNN3/0s#	 KKGNN3/0s#s#GNN3/0	 KKs#GNN3/0GNN3/0s#	 KKGNN3/0s#s#s#	 KKs#GNN3/0s#s#	 KKs#W^^C%8'..:Mw~~^aObo:
x *+"!!!r   c                     t               }d}| j                  t              5 }|j                  |       |j                  j
                  t        k(  sJ 	 d d d        y # 1 sw Y   y xY w)Nz	a (and b))r   r   r   r   	exceptionr   r   )r   r   r   contexts       r   =test_parse_invalid_nested_and_should_raise_a_proper_exceptionzNDualBaseTestCase.test_parse_invalid_nested_and_should_raise_a_proper_exception  s_     "z* 	IgMM$$$//3HHHH	I 	I 	Is   1AA&c                     t               j                  } |d      } |d      } |d      } |d      }|j                  |d      |k(  sJ |j                  |d      |k(  sJ y )Na&b&crO  za&cr-   Tr  )r   r   subtract)r   r   r   p1p2rR  s         r   test_subtractzDualBaseTestCase.test_subtract  sj     &&W~5\5\s}}R$}/4777}}R$}/6999r   c                     t               j                  } |d      } |d      }||k7  sJ |j                         |k(  sJ  |d      } |d      }||k7  sJ |j                         |k(  sJ y )Nz	a & (b&c)ro  za | ((b&c) | (a&c)) | bza | (b&c) | (a&c) | b)r   r   flatten)r   r   r9  r:  s       r   test_flattenzDualBaseTestCase.test_flatten  sw     &&;7^Rxxzz|r!!!,-*+Rxxzz|r!!!r   c           
         t               }|j                  d      }|j                  d      }|j                  d      }|j                  d      }|j                  d      }|||z  z  j                         ||z  ||z  z  k(  sJ |j                  |||z  ||z        }|j	                  |j                  |||      |j                  |||      |j                  |||      |j                  |||            }|j                         |k(  sJ y )Nr,   r-   r  r/   r  )r   r   distributiver4   r5   )	r   r   r,   r-   r  r/   r  r9  r:  s	            r   test_distributivez"DualBaseTestCase.test_distributive  s     "NN3NN3NN3NN3NN3QU))+A!a%/@@@@[[QUa!e-ZZKK1a '++aA"6Aq!8LgkkZ[]^`aNb
  B&&&r   c                 R   ddl m} t        d      t        d      t        d      }}} |||      } |||      } ||||      } ||||      }||k(  sJ ||k(  sJ ||k(  sJ ||k(  rJ |dk(  rJ |dusJ |J ||k7  rJ ||k7  rJ ||k7  rJ ||k7  sJ |dk7  sJ |dusJ |J y )Nr   r6  r,   r-   r  r   T)r   r7  r   )	r   r7  r,   r-   r  r9  t1_2r:  t2_2s	            r   
test_equalzDualBaseTestCase.test_equal  s    ,+vc{F3Ka1a^1~aA1a  Rxxrzzrzz8|7{:::: 8|2:~2:~RxxQww~~~~r   c                    t               }|j                  d      |j                  d      |j                  d      }}}|j                  ||      |j                  |||      k  sJ |j                  ||      |j                  |||      kD  rJ |j                  ||      |j                  ||      k  sJ |j                  ||      |j                  ||      kD  rJ |j                  ||      |j                  ||      k  sJ |j                  ||      |j                  ||      kD  rJ |j                  ||      |j                  ||      k  rJ |j                  ||      |j                  ||      kD  rJ y )Nr   r   r   )r   r   r4   )r   r   r  r  zs        r   r   zDualBaseTestCase.test_order#  sY    "..#W^^A%6q8Ia1{{1a 7;;q!Q#7777;;q!$w{{1a';;;;{{1a 7;;q!#4444;;q!$w{{1a'8888{{1a 7;;q!#4444;;q!$w{{1a'8888;;q!$w{{1a'8888;;q!$w{{1a'88888r   c                 @   t               j                  }t         |d            dk(  sJ t         |d            sJ d       t         |d            dk(  sJ t         |d            sJ d       t         |d            dk(  sJ t         |d            sJ d       y )NrB  zAND(Symbol('a') == Symbol('a'))rC  zOR(Symbol('a') == Symbol('a'))z(a|b)&cz0AND(OR(Symbol('a'), Symbol('b')) == Symbol('c')))r   r   r   r   r$  s     r   r   zDualBaseTestCase.test_printing/  s     &&5< E)))E%L!D#DD!5< E)))E%L!C#CC!5#$	111E)$%Y'YY%r   )r$   r%   r&   maxDiffr   r   r   r   rE  rJ  r   r   rY  r   r_  rb  rd  ri  rm  rs  rv  ry  r}  r   r   r'   r   r   r3  r3  q  s    G. & D@
=
7G4R7, ) )" ; ;B ; ;> r" r"hI:"'8
9Zr   r3  c                   T    e 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y)OtherTestCasec                 n   t               }|j                  |j                  f|j                  d      |j                  d      f|j	                  d      f|j	                  d      ff}t        |      D ]A  \  }}|D ]7  }t        |dz   t        |            D ]  }||   D ]  }||k  sJ ||kD  rJ   9 C y )Nr  r  zx&yzx|yr   )r   r7   r8   r   r   rP   ranger  )r   r   orderitestscase1jcase2s           r   test_class_orderzOtherTestCase.test_class_order:  s     "\\7==)^^C '.."56]]5!#]]5!#	
 "%( 	-HAu -q1uc%j1 -A!&q -$u},}$u},}---	-r   c                    t               }|j                  d      |j                  d      |j                  d      }}}|j                  d      |j                  k(  sJ |j                  d      |j                  k(  sJ |j                  d      |j                  k(  sJ |j                  d      |j                  k(  sJ |j                  d      |k(  sJ |j                  d      |k(  sJ |j                  d      |k(  sJ |j                  d	      |j                  d
      k(  sJ |j                  d
      |j                  d      k(  sJ |j                  d	      | k(  sJ |j                  d      | k(  sJ |j                  dd      |  j                         k(  sJ |j                  d      ||z  k(  sJ |j                  d      | |z  k(  sJ |j                  d      || z  k(  sJ |j                  d      |j                  d      k(  sJ |j                  d      |j                  |||      k(  sJ |j                  d      |j                  d      k(  sJ |j                  d      |j                  | | |       k(  sJ |j                  d      ||z  k(  sJ |j                  d      | |z  k(  sJ |j                  d      || z  k(  sJ |j                  d      |j                  d      k(  sJ |j                  d      |j                  |||      k(  sJ |j                  d      |j                  | | |       k(  sJ |j                  d      ||z  k(  sJ |j                  dd      |||z  z  j                         k(  sJ |j                  dd      ||| z  z  j                         k(  sJ |j                  dd      ||z  |||z  |||z  z  z  z  z  j                         k(  sJ |j                  dd      |j                  dd      k(  sJ |j                  d      |j                  d      k(  sJ |j                  d      |j                  d      k(  sJ y ) Nr,   r-   r  ru   z(0)rs   z(1)z(a)r!  z~(a)z(~a)r&  Tr  rH  z~a&bza&~bro  r+  rG  z~a|bza|~ba|b|cz~a|~b|~cz(a|b)za&(a|b)za&(a|~b)z(a&b)|(b&((c|a)&(b|(c&a))))za&b | b&(c|a)&(b|c&a)1abc_abc)r   r   r   r8   r7   r   r4   r5   )r   r   r,   r-   r  s        r   
test_parsezOtherTestCase.test_parseJ  s_    "..%w~~c':GNN3<Oa1}}S!W]]222}}U#w}}444}}S!W\\111}}U#w||333}}S!Q&&&}}U#q(((}}U#q(((}}T"gmmF&;;;;}}V$f(====}}T"qb(((}}V$***}}UT}2snn6FFFF}}U#q1u,,,}}V$Q...}}V$QB...}}W%w)????}}W%Q1)====}}Z(GMM*,EEEE}}Z(GKKQB,CCCC}}U#q1u,,,}}V$Q...}}V$QB...}}W%w)????}}W%Aq!)<<<<}}Z(GJJrA2r,BBBB}}W%Q...}}Y}61A;:P:P:RRRR}}Z$}7AaRL;R;R;TTTTMM7$MGQ1Q1A; 789CCEF	
F }}:T}Jgmm#d O\ O
 
 	
 
 ~~f%v)>>>>~~f%v)>>>>r   c                    t               }|j                  d      |j                  d      |j                  d      }}}||z  |z  }|j                  ||i      j                         ||z  k(  sJ |j                  ||i      j                         |k(  sJ |j                  |||z  i      j                         |j	                  d      j                         k(  sJ |j                  ||z  |i      j                         ||z  k(  sJ |j                  ||j
                  i      j                         |j
                  k(  sJ y )Nr,   r-   r  z	(b|c)&b|c)r   r   subsr   r   r7   r   r   r,   r-   r  r   s         r   	test_subszOtherTestCase.test_subss  s    "..%w~~c':GNN3<Oa11uqyyy!Q ))+q1u444yy!Q ))+t333yy!QU$--/7==3M3V3V3XXXXyy!a%$--/1q5888yy!W\\*+446',,FFFr   c                    t               }|j                  d      |j                  d      |j                  d      }}}||z  |z  }|j                  i |j                        j	                         |j                  k(  sJ |j                  ||j
                  ||j
                  i|j                        j	                         |j
                  k(  sJ |j                  j                  i |j
                        j	                         |j                  k(  sJ |j
                  j                  i |j                        j	                         |j
                  k(  sJ y )Nr,   r-   r  )default)r   r   r  r7   r   r8   r  s         r   test_subs_defaultzOtherTestCase.test_subs_default}  s    "..%w~~c':GNN3<Oa11uqyyyW\\y2;;=MMMIIq'--GMM:GLLIQZZ\}}	
 ||  W]] ;DDF',,VVV}}!!"gll!;DDF'--WWWr   c                    t               }|j                  d      }|j                  |      |k(  sJ |j                  |      |k(  sJ |j                  d      }|j                  |      |k(  sJ |j                  |      |k(  sJ |j                  d      }|j                  d      }|j                  d      }|j                  |      |k(  sJ |j                  |      |k(  sJ |j                  d      }|j                  d      }|j                  d      }|j                  |      |k(  sJ |j                  |      |k(  sJ |j                  d	      }|j	                  ||j
                        }|j                  d
      }||k(  sJ y )NrH  rG  z(a&b)|(c&b)z(a&b)|(b&c)zb&(a|c)z(a|b)&(c|b)zb|(a&c)z(a|b)&(b|c)z)((s|a)&(s|b)&(s|c)&(s|d)&(e|c|d))|(a&e&d)z#(a|s)&(b|e|s)&(c|d|e)&(c|e|s)&(d|s))r   r   dnfcnf	normalizer4   )r   r   r   
result_dnf
result_cnfrR  r:   s          r   test_normalizezOtherTestCase.test_normalize  st    "}}U#{{4 D((({{4 D(((}}U#{{4 D((({{4 D(((}}]+]]=1
]]9-
{{4 J...{{4 J...}}]+]]9-
]]=1
{{4 J...{{4 J...}}HI""42==!FG6!!!r   c                     t               }|j                  d      }|j                  d      |j                  d      |j                  d      |j                  d      g|j                         k(  sJ y Na and b or a and cr,   r-   r  )r   r   r   get_literalsr   algexps      r   7test_get_literals_return_all_literals_in_original_orderzEOtherTestCase.test_get_literals_return_all_literals_in_original_order  sg    ii,-JJsOJJsOJJsOJJsO	

   	   r   c                     t               }|j                  d      }|j                  d      |j                  d      |j                  d      |j                  d      g|j                         k(  sJ y )Nza and b or True and a and cr,   r-   r  )r   r   r   get_symbolsr  s      r   5test_get_symbols_return_all_symbols_in_original_orderzCOtherTestCase.test_get_symbols_return_all_symbols_in_original_order  se    ii56JJsOJJsOJJsOJJsO	

 __ 	 r   c                     t               }|j                  d      }t        |j                  d      |j                  d      |j                  d      g      |j                  k(  sJ y r  r   r   r   r   r   r  s      r   +test_literals_return_set_of_unique_literalsz9OtherTestCase.test_literals_return_set_of_unique_literals  sO    ii,-CJJsOSZZ_cjjoFG3<<WWWr   c                     t               }|j                  d      }t        |j                  d      |j                  d      |j                  d      g      |j                  k(  sJ y )Na and not b and not not cr,   znot bznot cr  r  s      r   test_literals_and_negationz(OtherTestCase.test_literals_and_negation  sT    ii34CJJsOSYYw%779KLMQTQ]Q]]]]r   c                     t               }|j                  d      }t        |j                  d      |j                  d      |j                  d      g      |j                  k(  sJ y )Nr  r,   r-   r  )r   r   r   r   rT  r  s      r   test_symbols_and_negationz'OtherTestCase.test_symbols_and_negation  sO    ii34CJJsOSZZ_cjjoFG3;;VVVr   c                 r    t               }|j                  d      }t        g d      |j                  k(  sJ y )Nr  r,   r-   r  )r   r   r   objectsr  s      r   -test_objects_return_set_of_unique_Symbol_objsz;OtherTestCase.test_objects_return_set_of_unique_Symbol_objs  s0    ii,-?#s{{222r   c                 &   ddl m}m}m} ddlm}  G fdd|      } G fdd|      } G fdd	|      } |t              d
}t        |||      }	|	j                  |      }
|	j                  |
      }t        |      dk(  sJ ddddk(  sJ y )Nr   )r4   r6   r5   )defaultdictc                   "     e Zd Z fdZ xZS )8OtherTestCase.test_normalize_blowup.<locals>.CountingNotc                 :    dxx   dz  cc<   t         |          S )NCountingNotr   rE   r   )r   rH   countss    r   r   zAOtherTestCase.test_normalize_blowup.<locals>.CountingNot.simplify  s!    }%*%w'))r   r$   r%   r&   r   rZ   rH   r  s   @r   r  r    s    * *r   r  c                   $     e Zd Zd fd	Z xZS )8OtherTestCase.test_normalize_blowup.<locals>.CountingAndc                 >    dxx   dz  cc<   t         |   |      S )NCountingAndr   rM  r  r   rN  rH   r  s     r   r   zAOtherTestCase.test_normalize_blowup.<locals>.CountingAnd.simplify  s&    }%*%w'T'22r   Tr  r  s   @r   r  r        3 3r   r  c                   $     e Zd Zd fd	Z xZS )7OtherTestCase.test_normalize_blowup.<locals>.CountingOrc                 >    dxx   dz  cc<   t         |   |      S )N
CountingOrr   rM  r  r  s     r   r   z@OtherTestCase.test_normalize_blowup.<locals>.CountingOr.simplify  s&    |$)$w'T'22r   r  r  r  s   @r   r  r    r  r   r  a|  
        a & (
            (b & c & d & e & f & g)
            | (c & f & g & h & i & j)
            | (c & d & f & g & i & l & o & u)
            | (c & e & f & g & i & p & y & ~v)
            | (c & f & g & i & j & z & ~(c & f & g & i & j & k))
            | (c & f & g & t & ~(b & c & d & e & f & g))
            | (c & f & g & ~t & ~(b & c & d & e & f & g))
        )
        )	NOT_class	AND_classOR_classza&c&f&g,      i	  )r  r  r  )booleanr4   r6   r5   collectionsr  intr   r   r  r   )r   r4   r6   r5   r  r  r  r  formular   r   r  r  s               @r   test_normalize_blowupz#OtherTestCase.test_normalize_blowup  s    ((+	*# 	*
	3# 	3
	3 	3
 S!

 !!!
 }}W%kk$3x9$$$ CtTTTTr   N)r$   r%   r&   r  r  r  r  r  r  r  r  r  r  r  r  r'   r   r   r  r  9  sE    - '?RG
X"8 X
^
W
3
/Ur   r  c                       e Zd Zd Zy)BooleanBoolTestCasec           
      n   t               }|j                  d      |j                  d      |j                  d      }}}||z  |z  }| j                  t        t        |j                  ||j                  i             | j                  t        t        |j                  ||j                  i             | j                  t        t        |j                  ||j                  i             | j                  t        t        |j                  ||j                  ||j                  i             |j                  ||j                  id      }|j                         }||j                  k(  sJ |j                  ||j                  ||j                  id      }|j                         }||j                  k(  sJ y )Nr,   r-   r  Tr  )r   r   r   r   r   r  r7   r   )r   r   r,   r-   r  r   rR  s          r   	test_boolzBooleanBoolTestCase.test_bool   sQ    "..%w~~c':GNN3<Oa11uqy)T499a5F+GH)T499a5F+GH)T499a5F+GH)T499aq',,5W+XYAw||,t<"%%%Aw||Q=M"%%%r   N)r$   r%   r&   r  r'   r   r   r  r    s    &r   r  c                       e Zd Zd Zy)CustomSymbolTestCasec                      G fddt               	  dd       y # t        $ r}| j                  |       Y d }~y d }~ww xY w)Nc                   $     e Zd Zd fd	Z xZS )=CustomSymbolTestCase.test_custom_symbol.<locals>.CustomSymbolc                 2    || _         t        |   |       y rx   )varrE   rF   )r   namevaluerA   rH   s      r   rF   zFCustomSymbolTestCase.test_custom_symbol.<locals>.CustomSymbol.__init__  s     lD248r   r  )r$   r%   r&   rF   rZ   )rH   rA   s   @r   rA   r    s    9 9r   rA   r,   z	This is Ar  )r   r   r   )r   r  rA   s     @r   test_custom_symbolz'CustomSymbolTestCase.test_custom_symbol  s;    	96 	9
	K0 	IIaLL	s   
 	A>AN)r$   r%   r&   r  r'   r   r   r  r    s    	r   r  c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)CallabilityTestCasec                     t               }|j                  d      }dD ](  }dD ]!  }dD ]  } ||||      |xr |xr |k(  rJ  # * y )Nro  TFr  r   r   r   r   r  r,   r-   r  s         r   test_andzCallabilityTestCase.test_and  sj     "mmG$ 	AA" A& AAa1-!--a@@@AA	Ar   c                     t               }|j                  d      }dD ](  }dD ]!  }dD ]  } ||||      |xs |xs |k(  rJ  # * y )Nr  r  r  r  r  s         r   test_orzCallabilityTestCase.test_or'  sd     "mmG$ 	?A" ?& ?Aa1-!+q+A>>>??	?r   c                 f    t               }|j                  d      }dD ]  } ||      | k(  rJ  y )Nz!ar  r,   r  r   r   r  r,   s       r   test_notzCallabilityTestCase.test_not/  s;     "mmD! 	'A8A&&&	'r   c                 d    t               }|j                  d      }dD ]  } ||      |k(  rJ  y )Nr,   r  r  r  r  s       r   test_symbolzCallabilityTestCase.test_symbol5  s7     "mmC  	!A8q= =	!r   c                     t               }|j                  d      }dD ].  }dD ]'  }dD ]   } ||||      |xs |xr |xs |  k(  r J  ) 0 y )Nz!(a|b&(a|!c))r  r  r  r  s         r   test_compositez"CallabilityTestCase.test_composite;  su     "mmO, 	QA" Q& QAa1-q7NA<N1:A2OPPPQQ	Qr   c                 ~    t               }|j                  d      }dD ]  }dD ]  } |||      |xs | k(  rJ   y )Nz!(a|b)r  )r,   r-   r  )r   r   r  r,   r-   s        r   test_negate_A_or_Bz&CallabilityTestCase.test_negate_A_or_BC  sP     "mmH% 	7A" 7Q!}af16667	7r   N)	r$   r%   r&   r  r  r  r  r  r  r'   r   r   r  r    s"    A?'!Q7r   r  ) rd   unittestunittest.caser   r  r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   TestCaser   r   r   r  r3  r  r  r  r  r'   r   r   <module>r     s     )    g:X.. g:T;.(++ ;.|D.X&& D.N\B(## \B~EZx(( EZPCUH%% CUL&(++ &$
8,, 
*7(++ *7r   