184 lines
6.2 KiB
Python
184 lines
6.2 KiB
Python
###
|
|
# Copyright 2013 Diamond Light Source Ltd.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
###
|
|
|
|
"""
|
|
Test random class
|
|
import unittest
|
|
unittest.TestProgram(argv=["external_test"])
|
|
"""
|
|
import unittest
|
|
|
|
from scisoftpy.external import save_args, load_args, pyenv
|
|
import scisoftpy as dnp
|
|
|
|
import shutil
|
|
|
|
|
|
class Test(unittest.TestCase):
|
|
from os import path
|
|
|
|
epath_list = [expand_path("{script}/scitest")] ###[path.dirname(__file__)]
|
|
|
|
def checkArgs(self, arg):
|
|
d = save_args(arg)
|
|
a = load_args(d)
|
|
shutil.rmtree(d)
|
|
self.assertTrue(self.equals(arg, a), "%s != %s" % (arg, a))
|
|
|
|
def equals(self, a, b):
|
|
if type(a) != type(b):
|
|
return False
|
|
if isinstance(a, dict):
|
|
if a.keys() != b.keys():
|
|
return False
|
|
for k in a:
|
|
if not self.equals(a[k], b[k]):
|
|
return False
|
|
elif isinstance(a, (list, tuple)):
|
|
if len(a) != len(b):
|
|
return False
|
|
for ia, ib in zip(a, b):
|
|
if not self.equals(ia, ib):
|
|
return False
|
|
elif isinstance(a, dnp.ndarray):
|
|
return dnp.all(a == b)
|
|
else:
|
|
return a == b
|
|
return True
|
|
|
|
def testSaveArgs(self):
|
|
self.checkArgs(None)
|
|
self.checkArgs(([None, None], [None]))
|
|
self.checkArgs(([None, 1, 1.5], [None]))
|
|
self.checkArgs(([None, 1, 1.5], (None,)))
|
|
self.checkArgs(([None, 1, 1.5], dnp.arange(12)))
|
|
self.checkArgs(([None, 1, 1.5], {"blah": dnp.arange(12), "foo": dnp.ones((3, 4)), "boo": -2.345}))
|
|
|
|
def testSubprocess(self):
|
|
import subprocess as sub
|
|
|
|
pyexe, pypath, _pyldpath = pyenv()
|
|
import os
|
|
|
|
env = dict(os.environ)
|
|
env["PYTHONPATH"] = ":".join(pypath)
|
|
from pprint import pprint
|
|
|
|
pprint(pypath)
|
|
# p = sub.Popen('echo $PYTHONPATH', shell=True, env=_env, stdin=sub.PIPE, stdout=sub.PIPE, stderr=sub.PIPE)
|
|
# print p.communicate()
|
|
p = sub.Popen([pyexe], env=env, shell=False, stdin=sub.PIPE, stdout=sub.PIPE, stderr=sub.PIPE)
|
|
p.stdin.write('print "Hello World"\n')
|
|
p.stdin.write('print "Hello World2"\n')
|
|
p.stdin.close()
|
|
l = p.stdout.read()
|
|
print l
|
|
|
|
def testDLSmodule(self):
|
|
print dnp.external.get_dls_module()
|
|
|
|
def testPythonInstallation(self):
|
|
print dnp.external.get_python()
|
|
|
|
def testExternal(self):
|
|
from external_functions import fun, funadd, fundec # , funexception
|
|
|
|
a = fun()
|
|
efun = dnp.external.create_function(fun, dls_module=True)
|
|
print a, self.equals(efun(), a)
|
|
efun = dnp.external.create_function("fun", "external_functions", dls_module=True)
|
|
print a, self.equals(efun(), a)
|
|
|
|
a = funadd(dnp.arange(3.0), 1.5)
|
|
efun = dnp.external.create_function(funadd, dls_module=True)
|
|
print a, self.equals(efun(dnp.arange(3.0), 1.5), a)
|
|
efun = dnp.external.create_function("funadd", "external_functions", dls_module=True)
|
|
print a, self.equals(efun(dnp.arange(3.0), 1.5), a)
|
|
|
|
a = fundec(dnp.arange(3.0))
|
|
efun = dnp.external.create_function(fundec, dls_module=True)
|
|
print a, self.equals(efun(dnp.arange(3.0)), a)
|
|
efun = dnp.external.create_function("fundec", "external_functions", dls_module=True)
|
|
print a, self.equals(efun(dnp.arange(3.0)), a)
|
|
|
|
a = fundec(dnp.arange(3.0), b=2.5)
|
|
efun = dnp.external.create_function(fundec, dls_module=True)
|
|
print a, self.equals(efun(dnp.arange(3.0), b=2.5), a)
|
|
efun = dnp.external.create_function("fundec", "external_functions", dls_module=True)
|
|
print a, self.equals(efun(dnp.arange(3.0), b=2.5), a)
|
|
|
|
def testException(self):
|
|
# from external_functions import funexception
|
|
# funexception()
|
|
efunexception = dnp.external.create_function(
|
|
"funexception", "external_functions", extra_path=Test.epath_list, dls_module=True
|
|
)
|
|
self.assertRaises(ValueError, efunexception)
|
|
|
|
# efunexception()
|
|
|
|
def testSciPy(self):
|
|
efun = dnp.external.create_function(
|
|
"funscipy", "external_functions", extra_path=Test.epath_list, dls_module="scipy/0.10.0"
|
|
)
|
|
print "0.10.0",
|
|
self.assertEquals(efun(), "0.10.0")
|
|
print "passed"
|
|
|
|
def testArrayScalar(self):
|
|
efun = dnp.external.create_function(
|
|
"funarrayscalar", "external_functions", extra_path=Test.epath_list, dls_module=True
|
|
)
|
|
a = 2 + 3j, 1.0, 123, True
|
|
print a,
|
|
self.assertEquals(efun(), a)
|
|
print "passed"
|
|
|
|
def testSpeed(self):
|
|
efun = dnp.external.create_function(
|
|
"fun", "external_functions", extra_path=Test.epath_list, dls_module=True, keep=False
|
|
)
|
|
import time
|
|
|
|
t = time.clock()
|
|
for _i in xrange(10):
|
|
efun()
|
|
print time.clock() - t
|
|
efun = dnp.external.create_function(
|
|
"fun", "external_functions", extra_path=Test.epath_list, dls_module=True, keep=True
|
|
)
|
|
t = time.clock()
|
|
for _i in xrange(10):
|
|
efun()
|
|
print time.clock() - t
|
|
|
|
def testHello(self):
|
|
py = dnp.external.PythonSubProcess("python", None)
|
|
print py.communicate('print "Hello World!"\n')
|
|
print py.communicate('print "Hello World2!"\n')
|
|
print py.communicate("for i in range(4): print i\n")
|
|
py.stop()
|
|
|
|
|
|
def suite():
|
|
suite = unittest.TestSuite()
|
|
suite.addTest(unittest.TestLoader().loadTestsFromTestCase(Test))
|
|
return suite
|
|
|
|
|
|
if __name__ == "__main__":
|
|
__import__("__main__").Test = Test
|
|
unittest.TextTestRunner(verbosity=2).run(suite()) |