from datetime import datetime
from random import randrange
import sys

# générations de tableaux à trier

def tableau_aleatoire(n):
    """Retourne un tableau de n entiers tirés au hasard uniformément
    de façon indépendante dans l'intervalle d'entiers [0, n["""
    t = []
    for i in range(n):
        t.append(randrange(n))
    return t

def tableau_croissant(n):
    """Retourne le tableau [0, 1, ..., n-1]"""
    return list(range(n))

def tableau_decroissant(n):
    """Retourne le tableau [n, n-1, ..., 1]"""
    return list(range(n, 0, -1))

def tableau_triangle(n):
    """Retourne le tableau
    [n//2, n//2 - 1, 0, 1, 2, ..., n - 1 - n//2]"""
    d = n // 2
    return [ abs(i - d) for i in range(n) ]

def tableau_dense(n):
    """Retourne un tableau de n valeurs ne comportant que
    deux valeurs différentes : 0 et 1, choisies de façon équiprobables."""
    t = []
    for i in range(n):
        t.append(randrange(2))
    return t

#

def warn(msg):
    print(msg, file=sys.stderr)

def temps_exec(f, arg):
    t1 = datetime.now()
    f(arg)
    t2 = datetime.now()
    return (t2 - t1).total_seconds()

def bench(tri, methode, duree, fichier):
    """Essaie de trier des tableaux de tailles croissantes construits par la méthode methode.
    S'arrête dès que le temps total mis pour ces essais est supérieur à duree secondes.
    Pour chaque essai, écrit dans fichier une ligne contenant la taille du tableau puis la durée mise
    (séparés par un espace)."""
    n = 10
    with open(fichier, 'w') as f:
        try:
            while duree > 0:
                t = methode(n)
                d = temps_exec(tri, t)
                f.write('{} {}\n'.format(n, d))
                duree -= d
                n = n + (n//10) + 1
        except:
            warn("Erreur lors du test de performance : {}".format(sys.exc_info()[1]))
            warn("Fonction testée : {}".format(tri.__name__))
            warn("Méthode : {}".format(methode.__name__))
            warn("Taille : {}".format(n))
            warn("Fin de ce test.")
