package testUnitaire.regEx;

import java.util.Arrays;
import java.util.Collection;
import java.util.regex.Pattern;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import tool.regEx.pays.RegExFactoryAutre;
import tool.regEx.pays.RegExFactoryCanada;
import tool.regEx.pays.RegExFactoryFrance;
import tool.regEx.pays.RegExFactoryUS;

/******************************************************************************
 * TestRegexFactory (parametized Junit)
 * 
 * tester plusieurs cas de validation des différent test de la RegexFactory
 *  
 * depend
 * RegexFactoryAutre
 *   "    "    Canada
 *   "    "    US
 *   "    "    France
 *   
 * Projet Orford
 *****************************************************************************
 *modification
 *nom date     explication
 ****************************************************************************/

@RunWith(Parameterized.class)
public class TestRegexFactory {
	private String name;
	private Pattern pattern;
	private String test;
	private boolean shouldpass;

	/**
	 * constructeur à l'intention du Parametized.Parameters
	 * @param pattern le regex
	 * @param name    le nom du test
	 * @param shouldpass   si le regex est supposé valider
	 * @param test         la ligne à valider
	 */
	public TestRegexFactory(Pattern pattern, String name, boolean shouldpass, String test) {
		this.name = name;
		this.test = test;
		this.pattern = pattern;
		this.shouldpass=shouldpass;
	}
	
    /**
     * le test junit
     */
    @Test
    public final void test() {
    	Assert.assertEquals(name + ":" + test,shouldpass,pattern.matcher(test).find());
    }
	
    /*
     * la liste de test
     * il y aura autant de test unitaire que de ligne dans cet array
     */
    @Parameterized.Parameters
    public static Collection<Object[]> instancesToTest() {
        return Arrays.asList(
            new Object[]{RegExFactoryAutre.getInstance().argent(), "argent", true, "2.00"},
            new Object[]{RegExFactoryAutre.getInstance().argent(), "argent", false, "2.0032"},
            new Object[]{RegExFactoryAutre.getInstance().argent(), "argent", true, "2.0"},
            new Object[]{RegExFactoryAutre.getInstance().argent(), "argent", true, "32352.00"},
            new Object[]{RegExFactoryAutre.getInstance().argent(), "argent", true, "2.00$"},
            new Object[]{RegExFactoryAutre.getInstance().argent(), "argent", false, "2.0032$"},
            new Object[]{RegExFactoryAutre.getInstance().argent(), "argent", true, "2.0$"},
            new Object[]{RegExFactoryAutre.getInstance().argent(), "argent", true, "32352.00$"},
            new Object[]{RegExFactoryAutre.getInstance().argent(), "argent", true, "$2.00"},
            new Object[]{RegExFactoryAutre.getInstance().argent(), "argent", false, "$2.0032"},
            new Object[]{RegExFactoryAutre.getInstance().argent(), "argent", true, "$2.0"},
            new Object[]{RegExFactoryAutre.getInstance().argent(), "argent", true, "$32352.00"},
            new Object[]{RegExFactoryAutre.getInstance().argent(), "argent", true, "180 000.00"},
            new Object[]{RegExFactoryAutre.getInstance().argent(), "argent", false, "bonjours"},

            new Object[]{RegExFactoryAutre.getInstance().villeProvince(), "villeProvince", true, "Québec"},
            new Object[]{RegExFactoryAutre.getInstance().villeProvince(), "villeProvince", true, "Canada"},
            new Object[]{RegExFactoryAutre.getInstance().villeProvince(), "villeProvince", true, "USA"},
            new Object[]{RegExFactoryAutre.getInstance().villeProvince(), "villeProvince", true, "abitibi"},
            
        	new Object[]{RegExFactoryCanada.getInstance().telephone(), "canada phone", true, "819 432 6553"},
        	new Object[]{RegExFactoryCanada.getInstance().telephone(), "canada phone", true, "(819)432 6553"},
        	new Object[]{RegExFactoryCanada.getInstance().telephone(), "canada phone", true, "(819) 432 6553"},
        	new Object[]{RegExFactoryCanada.getInstance().telephone(), "canada phone", true, "8194326553"},
        	new Object[]{RegExFactoryCanada.getInstance().telephone(), "canada phone", true, "819-432-6553"},
        	new Object[]{RegExFactoryCanada.getInstance().telephone(), "canada phone", true, "(819)432-6553"},
        	new Object[]{RegExFactoryCanada.getInstance().telephone(), "canada phone", true, "(819) 432-6553"},
        	new Object[]{RegExFactoryCanada.getInstance().telephone(), "canada phone", true, "(819)-432-6553"},
        	new Object[]{RegExFactoryCanada.getInstance().telephone(), "canada phone", true, "(819)-432 6553"},
        	new Object[]{RegExFactoryCanada.getInstance().telephone(), "canada phone", true, "819 432 6553x2425"},
        	new Object[]{RegExFactoryCanada.getInstance().telephone(), "canada phone", true, "819 432 6553ext2425"},
        	new Object[]{RegExFactoryCanada.getInstance().telephone(), "canada phone", true, "819-432-6553ext2425"},
        	new Object[]{RegExFactoryCanada.getInstance().telephone(), "canada phone", false, "213afa324aff"},
        	new Object[]{RegExFactoryCanada.getInstance().telephone(), "canada phone", true, "1-234-567-8901"},
        	new Object[]{RegExFactoryCanada.getInstance().telephone(), "canada phone", true, "1-234-567-8901 x1234"},
        	new Object[]{RegExFactoryCanada.getInstance().telephone(), "canada phone", true, "1-234-567-8901 ext1234"},
        	new Object[]{RegExFactoryCanada.getInstance().telephone(), "canada phone", true, "1 (234) 567-8901"},
        	new Object[]{RegExFactoryCanada.getInstance().telephone(), "canada phone", true, "1.234.567.8901"},
        	new Object[]{RegExFactoryCanada.getInstance().telephone(), "canada phone", false, "1/234/567/8901"},
        	new Object[]{RegExFactoryCanada.getInstance().telephone(), "canada phone", true, "12345678901"},
        	new Object[]{RegExFactoryCanada.getInstance().telephone(), "canada phone", false, "bonjours"},
        	
        	new Object[]{RegExFactoryCanada.getInstance().codePostal(), "canada CP", true, "H0H 0H0"},
        	new Object[]{RegExFactoryCanada.getInstance().codePostal(), "canada CP", true, "B3K 5X5"},
        	new Object[]{RegExFactoryCanada.getInstance().codePostal(), "canada CP", true, "K8N 5W6"},
        	new Object[]{RegExFactoryCanada.getInstance().codePostal(), "canada CP", true, "K8N5W6"},
        	new Object[]{RegExFactoryCanada.getInstance().codePostal(), "canada CP", false, "K8NSW6"},
        	new Object[]{RegExFactoryCanada.getInstance().codePostal(), "canada CP", false, "K8NW6"},
        	new Object[]{RegExFactoryCanada.getInstance().codePostal(), "canada CP", false, "bonjours"},
        	
        	new Object[]{RegExFactoryUS.getInstance().codePostal(), "us CP", true, "55416"},
        	new Object[]{RegExFactoryUS.getInstance().codePostal(), "us CP", true, "12144-7050"},
        	new Object[]{RegExFactoryUS.getInstance().codePostal(), "us CP", true, "99577-0727"},
        	new Object[]{RegExFactoryUS.getInstance().codePostal(), "us CP", true, "99750-0077"},
        	new Object[]{RegExFactoryUS.getInstance().codePostal(), "us CP", false, "995770727"},
        	new Object[]{RegExFactoryUS.getInstance().codePostal(), "us CP", false, "bonjours"},
        	
        	new Object[]{RegExFactoryFrance.getInstance().telephone(), "france phone", true, "04 76 96 12 32"},
        	new Object[]{RegExFactoryFrance.getInstance().telephone(), "france phone", true, "04 94 77 88 99"},
        	new Object[]{RegExFactoryFrance.getInstance().telephone(), "france phone", true, "04 94 77 88 99"},
        	new Object[]{RegExFactoryFrance.getInstance().telephone(), "france phone", true, "04.94.77.88.99"},
        	new Object[]{RegExFactoryFrance.getInstance().telephone(), "france phone", true, "04-94-77-88-99"},
        	new Object[]{RegExFactoryFrance.getInstance().telephone(), "france phone", false, "3004-94-77-88-99"},
        	new Object[]{RegExFactoryFrance.getInstance().telephone(), "france phone", false, "494 77 88 99"},
        	new Object[]{RegExFactoryFrance.getInstance().telephone(), "france phone", false, "bonjours"},
        	
        	new Object[]{RegExFactoryFrance.getInstance().codePostal(), "france CP", true, "69008"},
        	new Object[]{RegExFactoryFrance.getInstance().codePostal(), "france CP", true, "75008"},
        	new Object[]{RegExFactoryFrance.getInstance().codePostal(), "france CP", true, "18000"},
        	new Object[]{RegExFactoryFrance.getInstance().codePostal(), "france CP", true, "23170"},
        	new Object[]{RegExFactoryFrance.getInstance().codePostal(), "france CP", true, "61400"},
        	new Object[]{RegExFactoryFrance.getInstance().codePostal(), "france CP", true, "97100"},
        	new Object[]{RegExFactoryFrance.getInstance().codePostal(), "france CP", true, "97320"},
        	new Object[]{RegExFactoryFrance.getInstance().codePostal(), "france CP", false, "973205"},
        	new Object[]{RegExFactoryFrance.getInstance().codePostal(), "france CP", false, "497320"},
        	new Object[]{RegExFactoryFrance.getInstance().codePostal(), "france CP", false, "973d20"},
        	new Object[]{RegExFactoryFrance.getInstance().codePostal(), "france CP", true, "97439"},
        	new Object[]{RegExFactoryFrance.getInstance().codePostal(), "france CP", false, "bonjours"}
        );

    }
}
