1 |
#!/usr/bin/python |
#!/usr/bin/python |
2 |
|
|
3 |
# $Id$ |
# $Id$ |
4 |
|
__copyright__=""" Copyright (c) 2006 by ACcESS MNRF |
5 |
|
http://www.access.edu.au |
6 |
|
Primary Business: Queensland, Australia""" |
7 |
|
__license__="""Licensed under the Open Software License version 3.0 |
8 |
|
http://www.opensource.org/licenses/osl-3.0.php""" |
9 |
|
|
10 |
import unittest |
import unittest |
11 |
from escript.modelframe import Model,Link,Simulation,ParameterSet,parse |
from esys.escript.modelframe import Model,Link,Simulation,ParameterSet,ESySXMLParser,DataSource |
12 |
import math |
import math |
13 |
from cStringIO import StringIO |
from cStringIO import StringIO |
14 |
from xml.dom import minidom |
from xml.dom import minidom |
75 |
|
|
76 |
def testParseAndInstanceOfSimulation(self): |
def testParseAndInstanceOfSimulation(self): |
77 |
|
|
78 |
newSim = parse(self.xml) |
xml = ESySXMLParser(self.xml) |
79 |
|
newSim = xml.parse()[0] |
80 |
assert (isinstance (newSim, Simulation)) |
assert (isinstance (newSim, Simulation)) |
81 |
newout = StringIO() |
newout = StringIO() |
82 |
newSim.writeXML(newout) |
newSim.writeXML(newout) |
142 |
assert ("gamma1" in xmlout) |
assert ("gamma1" in xmlout) |
143 |
assert ("gamma2" in xmlout) |
assert ("gamma2" in xmlout) |
144 |
assert ("gamma3" in xmlout) |
assert ("gamma3" in xmlout) |
145 |
parsable = parse(xmlout) |
esysxml=ESySXMLParser(xmlout) |
146 |
|
parsable = esysxml.parse()[0] |
147 |
assert (isinstance (parsable, ParameterSet)) |
assert (isinstance (parsable, ParameterSet)) |
148 |
assert (self._dom().getElementsByTagName("ParameterSet")) |
assert (self._dom(self.p).getElementsByTagName("ParameterSet")) |
149 |
|
|
150 |
def testParameterSetFromXML(self): |
def testParameterSetFromXML(self): |
151 |
doc = self._class() |
s = StringIO() |
152 |
pset = ParameterSet.fromDom(self._dom().getElementsByTagName("ParameterSet")[0]) |
self.p.writeXML(s) |
153 |
|
s.reset() |
154 |
|
xmlout = s.read() |
155 |
|
esysxml=ESySXMLParser(xmlout) |
156 |
|
doc = self._class(self.p) |
157 |
|
pset = ParameterSet.fromDom(esysxml, self._dom(self.p).getElementsByTagName("ParameterSet")[0]) |
158 |
assert (isinstance(pset, ParameterSet)) |
assert (isinstance(pset, ParameterSet)) |
159 |
assert (isinstance(doc, ParameterSet)) |
assert (isinstance(doc, ParameterSet)) |
160 |
self.assertEqual(self.p.gamma1,doc.gamma1) |
self.assertEqual(self.p.gamma1,doc.gamma1) |
164 |
p2 = ParameterSet() |
p2 = ParameterSet() |
165 |
p2.declareParameter(s="abc", f=3.) |
p2.declareParameter(s="abc", f=3.) |
166 |
self.p.declareParameter(child=p2) |
self.p.declareParameter(child=p2) |
167 |
doc = self._class() |
doc = self._class(self.p) |
168 |
#pset = ParameterSet.fromDom(doc.getElementsByTagName("ParameterSet")[0]) |
#pset = ParameterSet.fromDom(doc.getElementsByTagName("ParameterSet")[0]) |
169 |
self.assertEqual(self.p.child.f, doc.child.f) |
self.assertEqual(self.p.child.f, doc.child.f) |
170 |
|
|
175 |
self.assertEqual(self.p.child.s, "abc") |
self.assertEqual(self.p.child.s, "abc") |
176 |
self.assertEqual(self.p.child.f, 3.) |
self.assertEqual(self.p.child.f, 3.) |
177 |
|
|
178 |
def _dom(self): |
def _dom(self, input): |
179 |
s = StringIO() |
s = StringIO() |
180 |
self.p.writeXML(s) |
input.writeXML(s) |
181 |
s.reset() |
s.reset() |
182 |
xmlout = s.read() |
xmlout = s.read() |
183 |
doc = minidom.parseString(xmlout) |
doc = minidom.parseString(xmlout) |
184 |
return doc |
return doc |
185 |
|
|
186 |
def _class(self): |
def _class(self, input): |
187 |
s = StringIO() |
s = StringIO() |
188 |
self.p.writeXML(s) |
input.writeXML(s) |
189 |
s.reset() |
s.reset() |
190 |
xmlout = s.read() |
xmlout = s.read() |
191 |
doc = parse(xmlout) |
esysxml=ESySXMLParser(xmlout) |
192 |
|
doc =esysxml.parse()[0] |
193 |
return doc |
return doc |
194 |
|
|
195 |
|
def testFromDomInt(self): |
196 |
|
p3 = ParameterSet() |
197 |
|
p3.declareParameter(inttest=1) |
198 |
|
doc = self._class(p3) |
199 |
|
assert type(doc.inttest)==int |
200 |
|
|
201 |
|
def testFromDomNumarrayVector(self): |
202 |
|
import numarray |
203 |
|
p3 = ParameterSet() |
204 |
|
mynumarray = numarray.array([3., 4., 5.], type=numarray.Float64) |
205 |
|
p3.declareParameter(numtest=mynumarray) |
206 |
|
doc = self._class(p3) |
207 |
|
assert doc.numtest.type() == numarray.Float64 |
208 |
|
assert type(doc.numtest) == numarray.NumArray |
209 |
|
|
210 |
|
def testFromDomNumarrayMulti(self): |
211 |
|
import numarray |
212 |
|
p3 = ParameterSet() |
213 |
|
mynumarray = numarray.array([[1., 2., 3.], [3., 4., 5.]], type=numarray.Float64) |
214 |
|
p3.declareParameter(numtest=mynumarray) |
215 |
|
doc = self._class(p3) |
216 |
|
assert doc.numtest.type() == numarray.Float64 |
217 |
|
assert type(doc.numtest) == numarray.NumArray |
218 |
|
|
219 |
|
def testLists(self): |
220 |
|
import numarray |
221 |
|
p4 = ParameterSet() |
222 |
|
mylist = [True, False, False, True] |
223 |
|
p4.declareParameter(listest=mylist) |
224 |
|
doc = self._class(p4) |
225 |
|
assert doc.listest.type() == numarray.Bool |
226 |
|
assert type(doc.listest) == numarray.NumArray |
227 |
|
assert numarray.all(numarray.equal(mylist, doc.listest)) |
228 |
|
|
229 |
|
def testDatasource(self): |
230 |
|
p5 = ParameterSet() |
231 |
|
myURI = DataSource("somelocalfile.txt", "text") |
232 |
|
p5.declareParameter(uritest=myURI) |
233 |
|
doc = self._class(p5) |
234 |
|
self.assertEquals(myURI.uri, doc.uritest.uri) |
235 |
|
self.assertEquals(myURI.fileformat, doc.uritest.fileformat) |
236 |
|
assert type(doc.uritest) == DataSource |
237 |
|
|
238 |
|
|
239 |
|
|
240 |
class ModeltoDomTestCase(unittest.TestCase): |
class ModeltoDomTestCase(unittest.TestCase): |
241 |
|
|
242 |
def _class(self): |
def _class(self): |
245 |
self.o1.writeXML(s) |
self.o1.writeXML(s) |
246 |
s.reset() |
s.reset() |
247 |
self.xmlout = s.read() |
self.xmlout = s.read() |
248 |
doc = parse(self.xmlout) |
esysxml=ESySXMLParser(xmlout) |
249 |
|
doc =esysxml.parse()[0] |
250 |
return doc |
return doc |
251 |
|
|
252 |
def _dom(self): |
def _dom(self): |
269 |
|
|
270 |
def testModelhasID(self): |
def testModelhasID(self): |
271 |
assert int(self._dom().getElementsByTagName("Model")[0].getAttribute("id"))>99 |
assert int(self._dom().getElementsByTagName("Model")[0].getAttribute("id"))>99 |
272 |
|
|
273 |
|
class ModeltoDomTestCase(unittest.TestCase): |
274 |
|
def _xml(self, modulename, modelname): |
275 |
|
# returns a modelframe class, generated from the xml |
276 |
|
return '''<?xml version="1.0" ?> |
277 |
|
<ESys> <Simulation type="Simulation"> <Component rank="0"> |
278 |
|
|
279 |
|
<Model id="127" module="%s" type="%s"> |
280 |
|
|
281 |
|
<Parameter type="float"> <Name> a </Name> <Value> 0.9 </Value> </Parameter> |
282 |
|
<Parameter type="Link"> <Name> f </Name> <Value> <Link> <Target> 128 </Target> |
283 |
|
<Attribute> u </Attribute> </Link> </Value> </Parameter> <Parameter |
284 |
|
type="float"> <Name> tend </Name> <Value> |
285 |
|
1.0 </Value> </Parameter> <Parameter type="int"> <Name> u </Name> <Value> 10 |
286 |
|
</Value> </Parameter> <Parameter type="float"> <Name> tol </Name> <Value> |
287 |
|
1e-08 </Value> </Parameter> <Parameter type="float"> <Name> dt </Name> |
288 |
|
<Value> |
289 |
|
0.01 </Value> </Parameter> <Parameter type="str"> <Name> message </Name> |
290 |
|
<Value> current error = 9.516258e-01 </Value> </Parameter> </Model> |
291 |
|
</Component> <Component rank="1"> <Model id="128" type="ODETEST"> <Parameter |
292 |
|
type="float"> <Name> a </Name> <Value> |
293 |
|
0.9 </Value> </Parameter> <Parameter type="Link"> <Name> f </Name> <Value> |
294 |
|
<Link> <Target> 127 </Target> <Attribute> u </Attribute> </Link> </Value> |
295 |
|
</Parameter> <Parameter type="float"> <Name> tend </Name> <Value> |
296 |
|
1.0 </Value> </Parameter> <Parameter type="float"> <Name> u </Name> <Value> |
297 |
|
-10.0 </Value> </Parameter> <Parameter type="float"> <Name> tol </Name> |
298 |
|
<Value> 1e-08 </Value> </Parameter> <Parameter type="float"> <Name> dt |
299 |
|
</Name> <Value> |
300 |
|
0.1 </Value> </Parameter> <Parameter type="str"> <Name> message </Name> <Value> |
301 |
|
current error = 1.904837e+01 </Value> </Parameter> </Model> </Component> |
302 |
|
<Component rank="2"> <Model id="129" type="Messenger"> <Parameter |
303 |
|
type="Link"> <Name> message </Name> <Value> <Link> <Target> 127 </Target> |
304 |
|
<Attribute> message </Attribute> </Link> </Value> </Parameter> </Model> |
305 |
|
</Component> </Simulation> <Model id="150" type="ODETEST"> <Parameter |
306 |
|
type="float"> <Name> a </Name> <Value> |
307 |
|
0.9 </Value> </Parameter> <Parameter type="Link"> <Name> f </Name> <Value> |
308 |
|
<Link> <Target> 127 </Target> <Attribute> u </Attribute> </Link> </Value> |
309 |
|
</Parameter> <Parameter type="float"> <Name> tend </Name> <Value> |
310 |
|
1.0 </Value> </Parameter> <Parameter type="float"> <Name> u </Name> <Value> |
311 |
|
-10.0 </Value> </Parameter> <Parameter type="float"> <Name> tol </Name> |
312 |
|
<Value> 1e-08 </Value> </Parameter> <Parameter type="float"> <Name> dt |
313 |
|
</Name> <Value> |
314 |
|
0.1 </Value> </Parameter> <Parameter type="str"> <Name> message </Name> <Value> |
315 |
|
current error = 1.904837e+01 </Value> </Parameter> </Model> <Model id="130" |
316 |
|
type="ODETEST"> <Parameter type="float"> <Name> a </Name> <Value> |
317 |
|
0.9 </Value> </Parameter> <Parameter type="Link"> <Name> f </Name> <Value> |
318 |
|
<Link> <Target> 128 </Target> <Attribute> u </Attribute> </Link> </Value> |
319 |
|
</Parameter> <Parameter type="float"> <Name> tend </Name> <Value> |
320 |
|
1.0 </Value> </Parameter> <Parameter type="int"> <Name> u </Name> <Value> 10 |
321 |
|
</Value> </Parameter> <Parameter type="float"> <Name> tol </Name> <Value> |
322 |
|
1e-08 </Value> </Parameter> <Parameter type="float"> <Name> dt </Name> |
323 |
|
<Value> |
324 |
|
0.01 </Value> </Parameter> <Parameter type="str"> <Name> message </Name> |
325 |
|
<Value> current error = 9.516258e-01 </Value> </Parameter> </Model> <Model |
326 |
|
id="170" type="ODETEST"> <Parameter type="float"> <Name> a </Name> <Value> |
327 |
|
0.9 </Value> </Parameter> <Parameter type="Link"> <Name> f </Name> <Value> |
328 |
|
<Link> <Target> 128 </Target> <Attribute> u </Attribute> </Link> </Value> |
329 |
|
</Parameter> <Parameter type="float"> <Name> tend </Name> <Value> |
330 |
|
1.0 </Value> </Parameter> <Parameter type="int"> <Name> u </Name> <Value> 10 |
331 |
|
</Value> </Parameter> <Parameter type="float"> <Name> tol </Name> <Value> |
332 |
|
1e-08 </Value> </Parameter> <Parameter type="float"> <Name> dt </Name> |
333 |
|
<Value> |
334 |
|
0.01 </Value> </Parameter> <Parameter type="str"> <Name> message </Name> |
335 |
|
<Value> current error = 9.516258e-01 </Value> </Parameter> </Model> </ESys> |
336 |
|
''' % (modulename, modelname) |
337 |
|
|
338 |
|
def testModuleAttribute(self): |
339 |
|
esysxml=ESySXMLParser(self._xml('run_xml', 'ODETEST')) |
340 |
|
modeldoc=esysxml.parse()[0] |
341 |
|
|
342 |
|
def testModuleAttributeFails(self): |
343 |
|
try: |
344 |
|
esysxml=ESySXMLParser(self._xml('a', 'b')) |
345 |
|
modeldoc=esysxml.parse()[0] |
346 |
|
except ImportError: |
347 |
|
return # correct |
348 |
|
|
349 |
|
assert False, "This test should have resulted in an ImportError" |
350 |
|
|
351 |
class Messenger(Model): |
class Messenger(Model): |
352 |
def __init__(self, *args, **kwargs): |
def __init__(self, *args, **kwargs): |
420 |
def finalize(self): |
def finalize(self): |
421 |
return self.__tn>=self.tend |
return self.__tn>=self.tend |
422 |
|
|
423 |
|
|
424 |
|
|
425 |
if __name__ == "__main__": |
if __name__ == "__main__": |
426 |
unittest.main() |
unittest.main() |
427 |
|
|