]> SALOME platform Git repositories - tools/eficas.git/blob - Aster/Cata/cataSTA73/Macro/test_fichier_ops.py
Salome HOME
Modif V6_4_°
[tools/eficas.git] / Aster / Cata / cataSTA73 / Macro / test_fichier_ops.py
1 #@ MODIF test_fichier_ops Macro  DATE 03/11/2004   AUTEUR MCOURTOI M.COURTOIS 
2 # -*- coding: iso-8859-1 -*-
3 #            CONFIGURATION MANAGEMENT OF EDF VERSION
4 # ======================================================================
5 # COPYRIGHT (C) 1991 - 2004  EDF R&D                  WWW.CODE-ASTER.ORG
6 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY  
7 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY  
8 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR     
9 # (AT YOUR OPTION) ANY LATER VERSION.                                                  
10 #                                                                       
11 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT   
12 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF            
13 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU      
14 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.                              
15 #                                                                       
16 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE     
17 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,         
18 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.        
19 # ======================================================================
20
21 #-------------------------------------------------------------------------------
22 def test_fichier_ops(self, UNITE, FICHIER, NB_CHIFFRE, EPSILON, VALE_K, INFO, **args):
23    """
24      Macro TEST_FICHIER permettant de tester la non-regression d'un fichier
25      'a une tolerance' pres pour les nombres reels en calculant
26      le md5sum.
27    """
28    import aster
29    from Accas import _F
30    ier=0
31    # La macro compte pour 1 dans la numerotation des commandes
32    #self.icmd=1
33    self.set_icmd(1)
34
35    # On importe les definitions des commandes a utiliser dans la macro
36    # Le nom de la variable doit etre obligatoirement le nom de la commande
37    INFO_EXEC_ASTER = self.get_cmd('INFO_EXEC_ASTER')
38    DETRUIRE        = self.get_cmd('DETRUIRE')
39    CREA_TABLE      = self.get_cmd('CREA_TABLE')
40    TEST_TABLE      = self.get_cmd('TEST_TABLE')
41
42    import os.path
43    import re
44    from types import StringType
45    from Macro.test_fichier_ops import md5file
46
47    # vérifie la syntaxe des expressions régulières fournies
48    l_regexp=[]
49    if args['EXPR_IGNORE']:
50       if type(args['EXPR_IGNORE']) is StringType:
51          lexp = [args['EXPR_IGNORE']]
52       else:
53          lexp = args['EXPR_IGNORE']
54       for exp in lexp:
55          try:
56             obj=re.compile(exp)
57          except re.error, s:
58             print '<F> <TEST_FICHIER> <INVALID_REGEXP> '+str(s)+' pour "'+exp+'"'
59          else:
60             l_regexp.append(exp)
61       if len(l_regexp) < len(lexp):
62          self.cr.fatal(' <F> <TEST_FICHIER> Expression régulière invalide (voir <INVALID_REGEXP>)')
63
64
65    is_ok=0
66
67    # vérifier que le fichier a été fermé
68    tinfo__ = INFO_EXEC_ASTER(LISTE_INFO='ETAT_UNITE', FICHIER=FICHIER)
69    
70    if tinfo__['ETAT_UNITE',1].find('OUVERT')>-1:
71       print "<A> <TEST_FICHIER> LE FICHIER N'A PAS ETE FERME :\n",FICHIER
72
73    # fichier correctement fermé
74    else:
75       # calcule le md5sum du fichier
76       ier, mdsum = md5file(FICHIER, NB_CHIFFRE, EPSILON, l_regexp, INFO)
77       if ier != 0:
78          if ier==4:
79             texte_erreur='Fichier inexistant : '+FICHIER
80          else:
81             texte_erreur='Erreur dans md5file, code retour = '+str(ier)
82          texte_erreur='<S> <TEST_FICHIER> '+texte_erreur
83          # aujourd'hui, je ne sais pas déclencher autre chose que <F>...
84          self.cr.fatal(texte_erreur)
85          return ier
86
87       # comparaison a la reference
88       if INFO > 0 :
89          print ' %-20s : %32s' % ('REFERENCE',VALE_K)
90          print
91
92       if mdsum == VALE_K:
93          is_ok=1
94
95    # produit le TEST_TABLE
96    tab1__=CREA_TABLE(LISTE=(_F(PARA='TEST',
97                                TYPE_K='K8',
98                                LISTE_K='VALEUR  ',),
99                             _F(PARA='BOOLEEN',
100                                LISTE_I=is_ok,),),)
101    if args['REFERENCE'] == 'NON_REGRESSION':
102       TEST_TABLE(UNITE=UNITE,
103                  TABLE=tab1__,
104                  FILTRE=_F(NOM_PARA='TEST',
105                            VALE_K='VALEUR  ',),
106                  NOM_PARA='BOOLEEN',
107                  VALE_I=1,
108                  PRECISION=1.e-3,
109                  CRITERE='ABSOLU',
110                  REFERENCE=args['REFERENCE'],
111                  VERSION=args['VERSION'],)
112    else:
113       TEST_TABLE(UNITE=UNITE,
114                  TABLE=tab1__,
115                  FILTRE=_F(NOM_PARA='TEST',
116                            VALE_K='VALEUR  ',),
117                  NOM_PARA='BOOLEEN',
118                  VALE_I=1,
119                  PRECISION=1.e-3,
120                  CRITERE='ABSOLU',
121                  REFERENCE=args['REFERENCE'],)
122
123    DETRUIRE(CONCEPT=_F(NOM=('tinfo__','tab1__'),),
124             ALARME='NON',INFO=1,)
125    return ier
126
127
128 #-------------------------------------------------------------------------------
129 def md5file(fich,nbch,epsi,regexp_ignore=[],info=0):
130    """
131    Cette methode retourne le md5sum d'un fichier en arrondissant les nombres
132    reels a la valeur significative.
133    IN :
134       fich          : nom du fichier
135       nbch          : nombre de decimales significatives
136       epsi          : valeur en deca de laquelle on prend 0
137       regexp_ignore : liste d'expressions régulières permettant d'ignorer
138          certaines lignes
139    OUT :
140       code retour : 0 si ok, >0 sinon
141       md5sum
142    """
143    import os.path
144    import re
145    import string
146    import math
147    import md5
148    #      1 Mo   10 Mo   100 Mo
149    # v0   2.6 s  20.4 s  196.6 s
150    # v1   2.0 s  10.3 s  94.9 s (pas de distinction entier/reel)
151    # remplacer le try/except par if re.search(...), 80% plus lent
152    if not os.path.isfile(fich):
153       return 4, ''
154    f=open(fich,'r')
155    format_float='%'+str(nbch+7)+'.'+str(nbch)+'g'
156    m=md5.new()
157    i=0
158    for ligne in f:
159       i=i+1
160       if info>=2:
161          print 'LIGNE',i,
162       keep=True
163       for exp in regexp_ignore:
164          if re.search(exp,ligne):
165             keep=False
166             if info>=2:
167                print ' >>>>>>>>>> IGNOREE <<<<<<<<<<',
168             break
169       if keep:
170          #r=string.split(ligne)
171          # découpe des nombres collés : 1.34E-142-1.233D+09
172          r=string.split(re.sub('([0-9]+)\-','\g<1> -',ligne))
173          for x in r:
174             try:
175                if abs(float(x))<epsi:
176                   s='0'
177                else:
178                   s=format_float % float(x)
179             except ValueError:
180                s=x
181             if info>=2:
182                print (' %'+str(nbch+7)+'s') % s,
183             m.update(s)
184       if info>=2:
185          print
186    f.close()
187    md5sum=m.hexdigest()
188    if info>=1:
189       form=' %-20s : %32s'
190       print form % ('Fichier',fich)
191       print form % ('Nombre de lignes',str(i))
192       print form % ('Format des reels',format_float)
193       print form % ('Epsilon',str(epsi))
194       print form % ('md5sum',md5sum)
195    return 0, md5sum