package exo1.venteTests;

import static org.junit.Assert.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import exo1.contacts.Client;
import exo1.contacts.ClientFournisseur;
import exo1.contacts.Fournisseur;
import exo1.vente.IContact;
import exo1.vente.Vente;

class VenteTest {
	private IContact jean;
	private IContact dupont;
	private IContact sixtine;
	private Vente vente;
	
	@BeforeEach
	public void init() {
		vente = new Vente();
		jean = new Client ("Jean","CB 12345");
		dupont = new Fournisseur("Ets Dupont", "Cpte 98765");
		sixtine = new ClientFournisseur("Mme Sixtine","CB 37258","Cpte 73682");
	}

	@Test
	void test() {
		vente.ajouterClient(jean);
		assertEquals("Debiter CB 12345 de 300.0€", vente.debiter("Jean", 300));
		
		vente.ajouterFournisseur(dupont);
		assertEquals("Virer 5000.0€ sur Cpte 98765", vente.payer("Ets Dupont", 5000));
		
		vente.ajouterClient(sixtine);
		vente.ajouterFournisseur(sixtine);
		assertEquals("Debiter CB 37258 de 300.0€", vente.debiter("Mme Sixtine", 300));
		assertEquals("Virer 5000.0€ sur Cpte 73682", vente.payer("Mme Sixtine", 5000));
		
		// on ne doit pas payer un inconnu
		assertThrows(IllegalArgumentException.class,
	            ()->{
	            	vente.payer("Inconnu", 5000);
	            });
		
		// on ne doit pas payer un client
		assertThrows(IllegalArgumentException.class,
	            ()->{
	            	vente.payer("Jean",5000);
	            });
		
		// on ne doit pas debiter un inconnu
		assertThrows(IllegalArgumentException.class,
	            ()->{
	            	vente.debiter("Inconnu",300);
	            });

		// on ne doit pas débiter un fournisseur
		assertThrows(IllegalArgumentException.class,
	            ()->{
	            	vente.debiter("Ets Dupont",300);
	            });
	}
}
