Salome HOME
git: ignore VSCode cache files, sat cache file and add a pre-commit config
[tools/sat.git] / src / test / TOOLS.py
1 #!/usr/bin/env python
2 #-*- coding:utf-8 -*-
3
4 # ToolBox for test framework
5
6 import os
7 import string
8 import subprocess
9
10
11 class SatTestError(Exception):
12     """
13     Exception class for test errors.
14     """
15     def __init__(self, value):
16         self.value = value
17
18     def __str__(self):
19         return repr(self.value)
20
21 class SatNotApplicableError(Exception):
22     """
23     Exception class for test errors.
24     """
25     def __init__(self, value):
26         self.value = value
27
28     def __str__(self):
29         return repr(self.value)
30
31 def ERROR(message):
32     print("ERROR", message)
33     raise SatTestError(message)
34     
35 def NOT_APPLICABLE(message):
36     print("NOT_APPLICABLE", message)
37     raise SatNotApplicableError(message)
38
39 def compFloat(f1, f2, tol=10e-10):
40     """Compares 2 numbers with tolerance tol."""
41     diff = abs(f1 - f2)
42     print("|f1-f2| = %s (tol=%s)" % (str(diff), str(tol)))
43     if diff <= tol:
44         comp = "OK"
45     else:
46         comp = "KO"
47     return comp
48
49 def compFiles(f1, f2, tol=0):
50     """Compares 2 files."""
51     assert os.path.exists(f1), "compFiles: file not found: %s" % f1
52     assert os.path.exists(f2), "compFiles: file not found: %s" % f2
53     diffLine = os.popen("diff -y --suppress-common-lines %s %s" % (f1, f2))
54     diff = len(string.split(diffLine.read(), "\n"))
55     diffLine.close()
56     print("nb of diff lines = %s (tol=%s)" % (str(diff), str(tol)))
57     if diff <= tol:
58         comp = "OK"
59     else:
60         comp = "KO"
61     return comp
62
63 def mdump_med(med_file, dump_file, options):
64     """Uses mdump to dump a med file."""
65     assert isinstance(options, list), "Bad options for mdump: %s" % options
66     assert len(options) == 3, "Bad options for mdump: %s" % options
67     cmd = "mdump %s %s" % (med_file, " ".join(options))
68     #print(cmd)
69
70     with open(dump_file, "w") as df:
71         pdump = subprocess.Popen(cmd, shell=True, stdout=df)
72         st = pdump.wait()
73     return st
74
75 def compMED(file1, file2, tol=0, diff_flags=""):
76     """Compares 2 med files by using mdump."""
77
78     # local utility method
79     def do_dump(med):
80         dump = os.path.join(os.environ['TT_TMP_RESULT'], os.path.basename(med) + ".mdump")
81         st = mdump_med(med, dump, ["1", "NODALE", "FULL_INTERLACE"])
82         if st != 0 or not os.path.exists(dump):
83             raise Exception("Error mpdump %s" % med)
84
85         # replace file name with "filename"
86         with open(dump, "r") as ff:
87             lines = ff.readlines()
88         with open(dump, "w") as dumpfile:
89             for line in lines:
90                 try:
91                     line.index('Universal name of mesh')
92                     continue
93                 except:
94                     dumpfile.write(line.replace(med, 'filename'))
95         return dump
96
97
98     # begin method
99     print(""">>>> compMED
100  file1: %s
101  file2: %s
102 """ % (file1, file2))
103
104     if not os.path.exists(file1):
105         print("compMED: file not found: '%s'" % file1)
106         print("<<<< compMED\n")
107         return 1
108     if not os.path.exists(file2):
109         print("compMED: file not found: '%s'" % file2)
110         print("<<<< compMED\n")
111         return 1
112
113     dump1 = do_dump(file1)
114     dump2 = do_dump(file2)
115
116     diff_cmd = "diff %s %s %s" % (diff_flags, dump1, dump2)
117     print(" >" + diff_cmd)
118     pdiff = subprocess.Popen(diff_cmd, shell=True, stdout=subprocess.PIPE)
119     status = pdiff.wait()
120     print(" Diff =", status)
121     if status != 0:
122         print(pdiff.stdout.read())
123
124     print("<<<< compMED\n")
125     return status
126
127
128 class TOOLS_class(object):
129     def __init__(self, base_ressources_dir, tmp_dir, test_ressources_dir):
130         self.base_ressources_dir = base_ressources_dir
131         self.tmp_dir = tmp_dir
132         self.test_ressources_dir = test_ressources_dir
133         pass
134
135     def init(self):
136         self.inFiles = []
137
138     def ERROR(self, message):
139         # Simulation d'un plantage
140         ERROR(message)
141
142     def compMED(self, file1, file2, tol=0):
143         return compMED(file1, file2, tol, "--ignore-all-space")
144
145     def compFloat(self, f1, f2, tol=10e-10):
146         return compFloat(f1, f2, tol)
147
148     def compFiles(self, f1, f2, tol=0):
149         return compFiles(f1, f2, tol)
150
151     def get_inFile(self, name=None):
152         if not name:
153             return self.base_ressources_dir
154         self.inFiles.append(name)
155         return os.path.join(self.base_ressources_dir, name)
156
157     def get_outFile(self, name=None):
158         if not name:
159             return self.tmp_dir
160         return os.path.join(self.tmp_dir, name)
161
162     def writeInFiles(self, pylog):
163         pylog.write('inFiles=%s\n' % str(self.inFiles))
164