// Path: src/main/java/fr/arpinum/cocoritest/interne/extensionlangage/Objets.java
// public class Objets {
// 
// 	public static boolean egaux(Object gauche, Object droite) {
// 		if (gauche == null) {
// 			return droite == null;
// 		}
// 		return gauche.equals(droite);
// 	}
// 
// 	public static boolean différents(Object gauche, Object droite) {
// 		return !egaux(gauche, droite);
// 	}
// 
// 	public static String enChaîne(Object objet) {
// 		if (objet == null) {
// 			return "nul";
// 		}
// 		if (objet instanceof Boolean) {
// 			return ((Boolean) objet) ? "vrai" : "faux";
// 		}
// 		return objet.toString();
// 	}
// }
// 
// Path: src/main/java/fr/arpinum/cocoritest/interne/specification/FabriqueSpecification.java
// public class FabriqueSpecification {
// 
// 	public <T> Specification<T> combine(Specification<? super T> spécification,
// 										Specification<? super T> autreSpécification) {
// 		return new Specification<T>() {
// 			@Override
// 			public boolean estSatisfaitePar(T objet) {
// 				return spécification.estSatisfaitePar(objet) && autreSpécification.estSatisfaitePar(objet);
// 			}
// 
// 			@Override
// 			public String messageInsatisfactionPour(T objet) {
// 				if (!spécification.estSatisfaitePar(objet)) {
// 					return spécification.messageInsatisfactionPour(objet);
// 				}
// 				return autreSpécification.messageInsatisfactionPour(objet);
// 			}
// 		};
// 	}
// }


import java.util.Objects;
import fr.arpinum.cocoritest.interne.extensionlangage.Objets;
import fr.arpinum.cocoritest.interne.specification.FabriqueSpecification;
/*
 * Copyright (C) 2013, Arpinum
 *
 * Cocoritest est un logiciel libre ; vous pouvez le redistribuer ou le modifier suivant les termes de la GNU Lesser
 * General Public License telle que publiée par la Free Software Foundation ; soit la version 3 de la licence,
 * soit (à votre gré) toute version ultérieure.
 *
 * Cocoritest est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE GARANTIE ; pas même la garantie
 * implicite de COMMERCIABILISABILITÉ ni d'ADÉQUATION à UN OBJECTIF PARTICULIER. Consultez la GNU Lesser General
 * Public License pour plus de détails.
 *
 * Vous devez avoir reçu une copie de la GNU Lesser General Public License en même temps que Cocoritest ; si ce n'est
  * pas le cas, consultez http://www.gnu.org/licenses.
 */

package fr.arpinum.cocoritest.specification;



/**
 * Représente une spécification d'un objet.
 *
 * @param <T> le type d'objet concerné.
 */
@FunctionalInterface
public interface Specification<T> {

	/**
	 * Informe si la spécification n'est pas satisfaite par l'objet.
	 *
	 * @param objet l'objet sur lequel est vérifiée l'insatisfaction de la spécification.
	 * @return true si la spécification n'est pas satisfaite par l'objet, faux sinon.
	 */
	boolean estSatisfaitePar(T objet);

	/**
	 * Le message décrivant pourquoi la spécification n'est pas satisfaite par l'objet.
	 *
	 * @param objet l'objet qui ne satisfait pas la spécification.
	 * @return le message décrivant pourquoi la spécification n'est pas satisfaite.
	 */
	default String messageInsatisfactionPour(T objet) {
// Path: src/main/java/fr/arpinum/cocoritest/interne/extensionlangage/Objets.java
// public class Objets {
// 
// 	public static boolean egaux(Object gauche, Object droite) {
// 		if (gauche == null) {
// 			return droite == null;
// 		}
// 		return gauche.equals(droite);
// 	}
// 
// 	public static boolean différents(Object gauche, Object droite) {
// 		return !egaux(gauche, droite);
// 	}
// 
// 	public static String enChaîne(Object objet) {
// 		if (objet == null) {
// 			return "nul";
// 		}
// 		if (objet instanceof Boolean) {
// 			return ((Boolean) objet) ? "vrai" : "faux";
// 		}
// 		return objet.toString();
// 	}
// }
// 
// Path: src/main/java/fr/arpinum/cocoritest/interne/specification/FabriqueSpecification.java
// public class FabriqueSpecification {
// 
// 	public <T> Specification<T> combine(Specification<? super T> spécification,
// 										Specification<? super T> autreSpécification) {
// 		return new Specification<T>() {
// 			@Override
// 			public boolean estSatisfaitePar(T objet) {
// 				return spécification.estSatisfaitePar(objet) && autreSpécification.estSatisfaitePar(objet);
// 			}
// 
// 			@Override
// 			public String messageInsatisfactionPour(T objet) {
// 				if (!spécification.estSatisfaitePar(objet)) {
// 					return spécification.messageInsatisfactionPour(objet);
// 				}
// 				return autreSpécification.messageInsatisfactionPour(objet);
// 			}
// 		};
// 	}
// }


// Path: src/main/java/fr/arpinum/cocoritest/specification/Specification.java
import java.util.Objects;
import fr.arpinum.cocoritest.interne.extensionlangage.Objets;
import fr.arpinum.cocoritest.interne.specification.FabriqueSpecification;

/*
 * Copyright (C) 2013, Arpinum
 *
 * Cocoritest est un logiciel libre ; vous pouvez le redistribuer ou le modifier suivant les termes de la GNU Lesser
 * General Public License telle que publiée par la Free Software Foundation ; soit la version 3 de la licence,
 * soit (à votre gré) toute version ultérieure.
 *
 * Cocoritest est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE GARANTIE ; pas même la garantie
 * implicite de COMMERCIABILISABILITÉ ni d'ADÉQUATION à UN OBJECTIF PARTICULIER. Consultez la GNU Lesser General
 * Public License pour plus de détails.
 *
 * Vous devez avoir reçu une copie de la GNU Lesser General Public License en même temps que Cocoritest ; si ce n'est
  * pas le cas, consultez http://www.gnu.org/licenses.
 */

package fr.arpinum.cocoritest.specification;



/**
 * Représente une spécification d'un objet.
 *
 * @param <T> le type d'objet concerné.
 */
@FunctionalInterface
public interface Specification<T> {

	/**
	 * Informe si la spécification n'est pas satisfaite par l'objet.
	 *
	 * @param objet l'objet sur lequel est vérifiée l'insatisfaction de la spécification.
	 * @return true si la spécification n'est pas satisfaite par l'objet, faux sinon.
	 */
	boolean estSatisfaitePar(T objet);

	/**
	 * Le message décrivant pourquoi la spécification n'est pas satisfaite par l'objet.
	 *
	 * @param objet l'objet qui ne satisfait pas la spécification.
	 * @return le message décrivant pourquoi la spécification n'est pas satisfaite.
	 */
	default String messageInsatisfactionPour(T objet) {
		return Objets.enChaîne(objet) + " ne respecte pas la spécification.";