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