###########################################################################

from entreebinaire import Vrai, Faux
from portelogique import Non, Et, Ou, Diff
from circuitcombinatoire import CircuitCombinatoire

if __name__ == '__main__':

	print 'test #1'
	entree = Vrai()
	sortie = Non(entree)
	c = CircuitCombinatoire((entree,), (sortie,))
	print 'sortie:', c.sortie(0).evaluer()
	assert(c.sortie(0).evaluer() == False)

	print	
	print 'test #2'
	entree = Faux()
	sortie = Non(entree)
	c = CircuitCombinatoire((entree,), (sortie,))
	print 'sortie:', c.sortie(0).evaluer()
	assert(c.sortie(0).evaluer() == True)
	
	print
	print 'test #3'
	entrees = (Vrai(), Vrai())
	c = CircuitCombinatoire(entrees, 
				(Ou(entrees[0], entrees[1]), 
				Et(entrees[0], entrees[1]), 
				Diff(entrees[0], entrees[1])))
	print 'sortie:', ', '.join([str(c.sortie(i).evaluer()) for i in range(3)])
	assert(c.sortie(0).evaluer() == True and
               c.sortie(1).evaluer() == True and
               c.sortie(2).evaluer() == False)

	print
	print 'test #4'
	entrees = (Vrai(), Faux())
	c = CircuitCombinatoire(entrees, 
				(Ou(entrees[0], entrees[1]), 
				Et(entrees[0], entrees[1]), 
				Diff(entrees[0], entrees[1])))
	print 'sortie:', ', '.join([str(c.sortie(i).evaluer()) for i in range(3)])
	assert(c.sortie(0).evaluer() == True and
               c.sortie(1).evaluer() == False and
               c.sortie(2).evaluer() == True)
	
	print
	print 'test #5'
	entrees = (Faux(), Vrai())
	c = CircuitCombinatoire(entrees, 
				(Ou(entrees[0], entrees[1]), 
				Et(entrees[0], entrees[1]), 
				Diff(entrees[0], entrees[1])))
	print 'sortie:', ', '.join([str(c.sortie(i).evaluer()) for i in range(3)])
	assert(c.sortie(0).evaluer() == True and
               c.sortie(1).evaluer() == False and
               c.sortie(2).evaluer() == True)
	
	print
	print 'test #6'
	entrees = (Faux(), Faux())
	c = CircuitCombinatoire(entrees, 
				(Ou(entrees[0], entrees[1]), 
				Et(entrees[0], entrees[1]), 
				Diff(entrees[0], entrees[1])))
	print 'sortie:', ', '.join([str(c.sortie(i).evaluer()) for i in range(3)])
	assert(c.sortie(0).evaluer() == False
               and c.sortie(1).evaluer() == False
               and c.sortie(2).evaluer() == False)
	
	print
	print 'test #7'
	V, F = (Vrai(), Faux())
	c = CircuitCombinatoire((V, F), 
				(Ou(V, Non(F)), 
				Et(Et(Ou(V, F), Non(Diff(V, Non(F)))), V)))
	print 'sortie:', ', '.join([str(c.sortie(i).evaluer()) for i in range(2)])
	assert(c.sortie(0).evaluer() == True and c.sortie(1).evaluer() == True)

###########################################################################
