view test/test.py @ 73:077a44d23b54

Work-around the locale problem by running temporarily in C locale.
author David Grundberg <individ@acc.umu.se>
date Wed, 01 Jul 2009 14:37:29 +0200
parents e3de0f6f1552
children 4e7307dd52a2
line wrap: on
line source

#!/usr/bin/python
# -*- coding:utf-8 -*-

import pytave
from pytave import Numeric
import traceback

print "No messages indicates test pass."

arr0_0 = Numeric.zeros((0,0));
arr0_1 = Numeric.zeros((0,1));
arr1_0 = Numeric.zeros((1,0));
number = Numeric.array([[1.32]], Numeric.Float32)
arr1fT = Numeric.array([[1.32], [2], [3], [4]], Numeric.Float32)
arr1fT2 = Numeric.array([[1.32, 2, 3, 4]], Numeric.Float32)
arr1f = Numeric.array([[1.32, 2, 3, 4]], Numeric.Float32)
arr1b = Numeric.array([[8, 2, 3, 256]], Numeric.Int8)
arr1i = Numeric.array([[17, 2, 3, 4]], Numeric.Int)
arr1i32 = Numeric.array([[32, 2, 3, 4]], Numeric.Int32)
arr1a = Numeric.array([[1, 2, 3, 4]])
arr2f = Numeric.array([[1.32, 2, 3, 4],[5,6,7,8]], Numeric.Float32)
arr2d = Numeric.array([[1.17, 2, 3, 4],[5,6,7,8]], Numeric.Float)
arr3f = Numeric.array([[[1.32, 2, 3, 4],[5,6,7,8]],[[9, 10, 11, 12],[13,14,15,16]]], Numeric.Float32)
arr1c = Numeric.array([[1+2j, 3+4j, 5+6j, 7+0.5j]], Numeric.Complex)
arr1fc = Numeric.array([[1+2j, 3+4j, 5+6j, 7+0.5j]], Numeric.Complex32)
arr1ch = Numeric.array(["abc"],Numeric.Character)
arr2ch = Numeric.array(["abc","def"],Numeric.Character)
arr1o = Numeric.array([[1.0,"abc",2+3j]],Numeric.PyObject)
arr2o = Numeric.array([[1.0,"abc",2+3j],[4.0,arr1i,"def"]],Numeric.PyObject)

alimit_int32 = Numeric.array([[-2147483648, 2147483647]], Numeric.Int32);
alimit_int16 = Numeric.array([[-32768, 32767, -32769, 32768]], Numeric.Int16);
alimit_int8 = Numeric.array([[-128, 127, -129, 128]], Numeric.Int8);
alimit_uint8 = Numeric.array([[0, 255, -1, 256]], Numeric.UnsignedInt8);


# This eval call is not to be seen as a encouragement to use Pytave
# like this. Create a separate .m-file with your complex Octave code.
pytave.eval(0, "function [result] = test_return(arg); result = arg; endfunction")

pytave.feval(1, "test_return", 1)

def equals(a,b):
    return Numeric.alltrue(Numeric.ravel(a == b))

def fail(msg, exc=None):
	print "FAIL:", msg
	traceback.print_stack()
	if exc is not None:
		traceback.print_exc(exc)
	print ""

def testequal(value):
	try:
		nvalue, = pytave.feval(1, "test_return", value)
		if not equals(value, nvalue):
			fail("as %s != %s" % (value, nvalue))
	except TypeError, e:
		fail(value, e)

def testexpect(value, expected):
	try:
		nvalue, = pytave.feval(1, "test_return", value)
		if not equals(value, nvalue):
			fail("sent in %s, expecting %s, got %s", (value, expected, nvalue))
	except TypeError, e:
		fail(value, e)

def testmatrix(value):
	try:
		nvalue, = pytave.feval(1, "test_return", value)
		class1, = pytave.feval(1, "class", value)
		class1 = class1.tostring()
		class2, = pytave.feval(1, "class", nvalue)
		class2 = class2.tostring()
		if not equals(value, nvalue):
			fail("as %s != %s" % (value, nvalue))
		if value.shape != nvalue.shape:
			fail("Size check failed for: %s. Expected shape %s, got %s  with shape %s" \
			%(value, value.shape, nvalue, nvalue.shape))
		if class1 != class2:
			fail( "Type check failed for: %s. Expected %s. Got %s."
			%(value, class1, class2))
	except TypeError, e:
		fail("Execute failed: %s" % value, e)

def testobjecterror(value):
	try:
		pytave.feval(1, "test_return", value);
		print "FAIL:", (value,)
	except pytave.ObjectConvertError:
		pass
	except Exception, e:
		print "FAIL", (value,), e

def testvalueerror(*value):
	try:
		pytave.feval(1, *value);
		fail(value)
	except pytave.ValueConvertError:
		pass
	except Exception, e:
		fail(value, e)

def testparseerror(*value):
	try:
		pytave.eval(*value);
		print "FAIL:", (value,)
	except pytave.ParseError:
		pass
	except Exception, e:
		print "FAIL", (value,), e

def testvalueok(*value):
	try:
		pytave.feval(1, *value);
	except Exception, e:
		print "FAIL", (value,), e

def testevalexpect(numargout, code, expectations):
	try:
		results = pytave.eval(numargout, code);
		if not equals(results, expectations):
			fail("eval: %s : because %s != %s" % (code, results, expectations))
	except Exception, e:
		fail("eval: %s" % code, e)

def testsetget(variables, name, value):
	try:
		variables[name] = value
		if name not in variables:
			fail("set/get: %s: Should exist, not there." % name)
		result, = pytave.feval(1, "isequal", value, variables[name])
		if not result:
			fail("set/get: %s -> %s: results diverged" % (name, value))
	except Exception, e:
		fail("set/get: %s" % name, e)

def testexception(exception, func):
	try:
		func()
		fail("Expecting %s but nothing was raised." % repr(exception))
	except Exception, e:
		if not isinstance(e, exception):
			fail("Expecting %s but got %s instead" % (repr(exception), repr(e)), e)

def testlocalscope(x):

    @pytave.local_scope
    def sloppy_factorial(x):
	pytave.locals["x"] = x
	xm1, = pytave.eval(1,"x-1")
	xm1 = xm1.toscalar()
	if xm1 > 0:
	    fxm1 = sloppy_factorial(xm1)
	else:
	    fxm1 = 1
	pytave.locals["fxm1"] = fxm1
	fx, = pytave.eval(1,"x * fxm1")
	fx = fx.toscalar()
	return fx

    try:
	fx = sloppy_factorial(x)
	fx1 = 1.0
	for k in range(1,x+1):
	    fx1 = k * fx1
	if fx != fx1:
	    fail('testlocalscope: result incorrect')
    except Exception, e:
	fail("testlocalscope: %s" % (x,), e)

def objarray(obj):
    return Numeric.array(obj,Numeric.PyObject)

def charray(obj):
    return Numeric.array(obj,Numeric.Character)


testmatrix(alimit_int32)
testmatrix(alimit_int16)
testmatrix(alimit_int8)

# Strings

testequal(["mystring"])
testequal(["mystringåäöÅÄÖ"])

testexpect(1,Numeric.array([[1]],Numeric.Int))
if "Int64" in Numeric.__dict__:
    testexpect(1L,Numeric.array([[1]],Numeric.Int64))
testexpect(1.0,Numeric.array([[1]],Numeric.Float))

# Vector arrays
testmatrix(arr1a)
testmatrix(arr1f)
testmatrix(arr1fT)
testmatrix(arr1fT2)
testmatrix(arr1i)
testmatrix(arr1b)
testmatrix(arr1fc)

# 2d arrays
testmatrix(arr2f)
testmatrix(arr2d)
testmatrix(arr2ch)

# 3d arrays
testmatrix(arr3f)

# Note, both arr0_0 == arr0_0 and arr0_0 != arr0_0 are false!
if (arr0_0 != arr0_0) or (arr0_0 == arr0_0):
	print "FAIL: Zero test", 

testmatrix(arr0_0)
testmatrix(arr0_1)
testmatrix(arr1_0)

# Lists
testexpect([1, 2],objarray([[1,2]]))
testexpect([],objarray([[]]))

# Return cells with OK dimensions
testvalueok("cell", 1, 3);
testvalueok("cell", 1, 0)
testvalueok("cell", 0, 0)
testvalueok("cell", 3, 1)
testvalueok("cell", 0, 1)

# Dictionaries


# Simple dictionary tests
testexpect({"foo": 1, "bar": 2},
	   {"foo": objarray([[1]]), "bar": objarray([[2]])})
testexpect({"x": [1, 3], "y": [2, 4]},
	   {"x": objarray([[1,3]]), "y": objarray([[2,4]])})
# just constructing the second value with Numeric 24.2!
#testexpect({"x": [1, "baz"], "y": [2, "foobar"]},
#          {"x": objarray([[1, charray(["baz"])]]), 
#	   "y": objarray([[2, charray(["foobar"])]])})

testequal({"x": objarray([[arr1f]]), "y": objarray([[arr1i]])})
testequal({})
testequal({"foo": arr2o,    "bar": arr2o})

# Try some invalid keys
testobjecterror({"this is not an Octave identifier": 1})
testobjecterror({1.22: 1})

# These should fail: No object conversion defined.
testobjecterror(None)
testobjecterror((1, ))
testobjecterror(())

result, = pytave.feval(1, "eval", "[1, 1, 1]")
if result.shape != (1,3):
	print "FAIL: expected length-3 vector"

result, = pytave.feval(1, "eval", "[1; 2; 3]");
if result.shape != (3, 1):
	print "FAIL: expected 3x1 matrix"

testparseerror(1, "endfunction")
testevalexpect(1, "2 + 2", (4,))
testevalexpect(1, "{2}", (objarray([[2]]),))
testevalexpect(1, "struct('foo', 2)", ({'foo': objarray([[2]])},))

testsetget(pytave.locals, "xxx", arr1f)
testsetget(pytave.globals, "xxx", arr2o)

def func():
	pytave.locals["this is not a valid Octave identifier"] = 1
testexception(pytave.VarNameError, func)

def func():
	pytave.locals["nonexistentvariable"]
testexception(KeyError, func)

def func(key):
	pytave.locals[key] = 1
testexception(TypeError, lambda: func(0.1))
testexception(TypeError, lambda: func(1))
testexception(TypeError, lambda: func([]))

def func(key):
	pytave.locals[key]
testexception(TypeError, lambda: func(0.1))
testexception(TypeError, lambda: func(1))
testexception(TypeError, lambda: func([]))

testlocalscope(5)

testexception(KeyError, lambda: pytave.locals["localvariable"])
pytave.locals["localvariable"] = 1
if "localvariable" in pytave.globals:
	fail("Local variable in globals")
del pytave.locals["localvariable"]
if "localvariable" in pytave.locals:
	fail("Could not clear local variable")
testexception(KeyError, lambda: pytave.locals["localvariable"])
def func():
	del pytave.locals["localvariable"]
testexception(KeyError, lambda: func())

testexception(KeyError, lambda: pytave.globals["globalvariable"])
pytave.globals["globalvariable"] = 1
if "globalvariable" in pytave.locals:
	fail("Global variable in locals")
del pytave.globals["globalvariable"]
if "globalvariable" in pytave.globals:
	fail("Could not clear global variable")
testexception(KeyError, lambda: pytave.globals["globalvariable"])
def func():
	del pytave.globals["globalvariable"]
testexception(KeyError, lambda: func())

# Emacs
#	Local Variables:
#	fill-column:70
#	coding:utf-8
#	indent-tabs-mode:t
#	tab-width:8
#	python-indent:8
#	End:
# vim: set textwidth=70 noexpandtab tabstop=8 :