| 1 |
schorsch |
1.1 |
# -*- coding: utf-8 -*- |
| 2 |
|
|
from __future__ import division, print_function, unicode_literals |
| 3 |
|
|
|
| 4 |
|
|
import struct |
| 5 |
|
|
import operator |
| 6 |
|
|
import unittest |
| 7 |
|
|
from functools import reduce |
| 8 |
|
|
|
| 9 |
|
|
import testsupport as ts |
| 10 |
|
|
from pyradlib import lcompare |
| 11 |
|
|
from pyradlib.pyrad_proc import PIPE, Error, ProcMixin |
| 12 |
|
|
|
| 13 |
|
|
|
| 14 |
|
|
class PyradprocTestCase(unittest.TestCase, ProcMixin): |
| 15 |
|
|
|
| 16 |
|
|
def _runit(self, cmdl, actstrl, _in=None, indata=None, nl=False): |
| 17 |
|
|
try: |
| 18 |
|
|
procs = [] |
| 19 |
|
|
if isinstance(cmdl[0], (type(b''), type(u''))): |
| 20 |
|
|
proc = self.call_one(cmdl, actstrl, _in=_in, out=PIPE, |
| 21 |
|
|
universal_newlines=nl) |
| 22 |
|
|
procs = [proc] |
| 23 |
|
|
elif len(cmdl) == 2: |
| 24 |
|
|
procs = self.call_two(cmdl[0], cmdl[1], actstrl[0], actstrl[1], |
| 25 |
|
|
_in=_in, out=PIPE, universal_newlines=nl) |
| 26 |
|
|
else: |
| 27 |
|
|
procs = self.call_many(cmdl, actstrl, _in=_in, out=PIPE, |
| 28 |
|
|
universal_newlines=nl) |
| 29 |
|
|
if indata: # only for small amounts of data |
| 30 |
|
|
procs[0].stdin.write(indata) |
| 31 |
|
|
procs[0].stdin.close() |
| 32 |
|
|
res = procs[-1].stdout.read() |
| 33 |
|
|
else: |
| 34 |
|
|
res, eres = procs[-1].communicate() |
| 35 |
|
|
if eres: print('Errors', eres) # XXX |
| 36 |
|
|
except Error as e: |
| 37 |
|
|
raise |
| 38 |
|
|
self.fail('%s [%s]' % (str(e), self.qjoin(cmdl))) |
| 39 |
|
|
finally: |
| 40 |
|
|
for proc in procs: |
| 41 |
|
|
proc.wait() |
| 42 |
|
|
if nl: return filter(None, lcompare.split_rad(res)) |
| 43 |
|
|
return res |
| 44 |
|
|
|
| 45 |
|
|
|
| 46 |
|
|
def test_call_1_text(self): |
| 47 |
|
|
for n in (5, 10, 55, 200,1328,1329,1330,1331,1332, 2000, 5000,99999): |
| 48 |
|
|
exp = range(n) |
| 49 |
|
|
cntcmd = ['cnt', str(n)] |
| 50 |
|
|
res = self._runit(cntcmd, 'run one process', nl=True) |
| 51 |
|
|
resl = [r[0] for r in res] |
| 52 |
|
|
try: lcompare.lcompare(resl, exp) |
| 53 |
|
|
except lcompare.error as e: |
| 54 |
|
|
print(resl, exp) |
| 55 |
|
|
self.fail(('call_one_text n=%d -- ' % n) +str(e)) |
| 56 |
|
|
|
| 57 |
|
|
def test_call_1_bin(self): |
| 58 |
|
|
exp = (2160, 8640, 4320, 1080, 7560) |
| 59 |
|
|
cntcmd = ['total', '-of'] |
| 60 |
|
|
tfn = ts.datafile('histo.dat') |
| 61 |
|
|
res = self._runit(cntcmd, 'run one process', _in=tfn, nl=False) |
| 62 |
|
|
resl = struct.unpack('f'*len(exp), res) |
| 63 |
|
|
try: lcompare.lcompare(resl, exp) |
| 64 |
|
|
except lcompare.error as e: |
| 65 |
|
|
self.fail(('call_one_text n=%d -- ' % n) +str(e)) |
| 66 |
|
|
|
| 67 |
|
|
def test_call_1_noexe(self): |
| 68 |
|
|
# let's hope a program with that name doesn't exist |
| 69 |
|
|
cmd = ['iswaxubdzkcgrhmltqvyfepojn', '-x', '-y', '-z'] |
| 70 |
|
|
self.assertRaises(Error, self._runit, cmd, 'run one process') |
| 71 |
|
|
|
| 72 |
|
|
def test_call_2_text(self): |
| 73 |
|
|
# with values higher than 44721, total will return a float in e-format. |
| 74 |
|
|
for n in (5, 10, 55, 200,1328,1329,1330,1331,1332, 2000, 5000, |
| 75 |
|
|
44721, 44722, 99999): |
| 76 |
|
|
exp = [reduce(operator.add, range(n))] |
| 77 |
|
|
cntcmd = ['cnt', str(n)] |
| 78 |
|
|
totcmd = ['total'] |
| 79 |
|
|
resl = self._runit([cntcmd, totcmd], ['run p1','run p2'], nl=True) |
| 80 |
|
|
try: lcompare.lcompare(resl, [exp]) |
| 81 |
|
|
except lcompare.error as e: |
| 82 |
|
|
self.fail(('call_one_text n=%d -- ' % n) +str(e)) |
| 83 |
|
|
|
| 84 |
|
|
def test_call_2_bin(self): |
| 85 |
|
|
for nn in ((1,1,1), (5,5,5), (3,9,5,2,8)): |
| 86 |
|
|
totalrows = reduce(operator.mul, nn) |
| 87 |
|
|
exp = [reduce(operator.add, range(n))*(totalrows/n) for n in nn] |
| 88 |
|
|
cntcmd = ['cnt'] + [str(n) for n in nn] |
| 89 |
|
|
totcmd = ['total', '-of'] |
| 90 |
|
|
res = self._runit([cntcmd, totcmd], ['run p1','run p2']) |
| 91 |
|
|
resl = struct.unpack('f'*len(exp), res) |
| 92 |
|
|
try: lcompare.lcompare(resl, exp) |
| 93 |
|
|
except lcompare.error as e: |
| 94 |
|
|
self.fail(('call_one_text n=%d -- ' % n) +str(e)) |
| 95 |
|
|
|
| 96 |
|
|
def test_call_many_text(self): |
| 97 |
|
|
data = b'''void polygon test 0 0 9 0 0 0 1 0 0 0 1 0''' |
| 98 |
|
|
exp = (['#', 'xform', '-s', 0.5], |
| 99 |
|
|
['#', 'xform', '-t', 0, 0, 2], |
| 100 |
|
|
['#', 'xform', '-ry', -20], |
| 101 |
|
|
['#', 'xform', '-rx', 30], |
| 102 |
|
|
['void', 'polygon', 'test'], |
| 103 |
|
|
[0], [0], [9], |
| 104 |
|
|
[0, 0, 1], |
| 105 |
|
|
[0.469846310393, 0, 1.17101007167], |
| 106 |
|
|
[-0.0855050358315, 0.433012701892, 1.23492315519]) |
| 107 |
|
|
cmd0 = ['xform', '-rx', '30'] |
| 108 |
|
|
cmd1 = ['xform', '-ry', '-20'] |
| 109 |
|
|
cmd2 = ['xform', '-t', '0', '0', '2'] |
| 110 |
|
|
cmd3 = ['xform', '-s', '0.5'] |
| 111 |
|
|
cmdl = [cmd0, cmd1, cmd2, cmd3] |
| 112 |
|
|
resl = self._runit(cmdl, 'run many processes', indata=data, |
| 113 |
|
|
_in=PIPE, nl=True) |
| 114 |
|
|
try: lcompare.lcompare(resl, exp) |
| 115 |
|
|
except lcompare.error as e: |
| 116 |
|
|
print(resl, exp) |
| 117 |
|
|
self.fail(('call_one_text n=%d -- ' % n) +str(e)) |
| 118 |
|
|
|
| 119 |
|
|
def test_call_many_bin(self): |
| 120 |
|
|
exp = (15, 40, 45, 48, 0) |
| 121 |
|
|
cmd0 = ['cnt', '3', '4', '5', '1'] |
| 122 |
|
|
cmd1 = ['histo', '1', '5'] |
| 123 |
|
|
cmd2 = ['total', '-of'] |
| 124 |
|
|
cmdl = [cmd0, cmd1, cmd2] |
| 125 |
|
|
res = self._runit(cmdl, 'run many processes') |
| 126 |
|
|
resl = struct.unpack('f'*len(exp), res) |
| 127 |
|
|
try: lcompare.lcompare(resl, exp) |
| 128 |
|
|
except lcompare.error as e: |
| 129 |
|
|
print(resl, exp) |
| 130 |
|
|
self.fail(('call_one_text -- ') +str(e)) |
| 131 |
|
|
|
| 132 |
|
|
|
| 133 |
|
|
# vi: set ts=4 sw=4 : |