mirror of
https://github.com/Sei-Lisa/LSL-PyOptimizer
synced 2025-07-01 15:48:21 +00:00
Add the unit testing files.
testfuncs.py uses custom testing functions. testparser.py uses the unittest standard module.
This commit is contained in:
parent
07176278f8
commit
4ee320ace1
3 changed files with 2884 additions and 0 deletions
1112
builtins.txt.dat
Normal file
1112
builtins.txt.dat
Normal file
File diff suppressed because it is too large
Load diff
1556
testfuncs.py
Normal file
1556
testfuncs.py
Normal file
File diff suppressed because it is too large
Load diff
216
testparser.py
Normal file
216
testparser.py
Normal file
|
@ -0,0 +1,216 @@
|
|||
from lslopt.lslparse import parser,EParseSyntax,EParseUEOF,EParseAlreadyDefined,\
|
||||
EParseUndefined,EParseTypeMismatch,EParseReturnShouldBeEmpty,EParseReturnIsEmpty,\
|
||||
EParseInvalidField,EParseFunctionMismatch,EParseDeclarationScope,EParseUnexpected,\
|
||||
fieldpos
|
||||
from lslopt.lsloutput import outscript
|
||||
from lslopt import lslfuncs
|
||||
import unittest
|
||||
import os
|
||||
|
||||
class UnitTestCase(unittest.TestCase):
|
||||
pass
|
||||
|
||||
class TestCompiler(UnitTestCase):
|
||||
def setUp(self):
|
||||
self.parser = parser()
|
||||
self.outscript = outscript()
|
||||
|
||||
def test_coverage(self):
|
||||
try:
|
||||
os.remove('overwritten.lsl')
|
||||
except OSError:
|
||||
pass
|
||||
f = open('overwritten.lsl', 'wb')
|
||||
f.write('/*Autogenerated*/default{timer(){}}')
|
||||
f.close()
|
||||
del f
|
||||
self.parser.parsefile('overwritten.lsl')
|
||||
self.outscript.output(self.parser.parse("""default{touch(integer n){jump n;@n;}}"""))
|
||||
self.assertRaises(EParseUndefined, self.parser.parse, """default{touch(integer n){jump k;n;}}""")
|
||||
self.outscript.output(self.parser.parse("""default{touch(integer n){n;}}"""))
|
||||
print self.outscript.output(self.parser.parse(r"""string x="";
|
||||
vector V=ZERO_VECTOR;
|
||||
vector W = <1,2,3>;
|
||||
quaternion Q = <1,2,3,4>;
|
||||
float f;
|
||||
float ff = f;
|
||||
list L = [];
|
||||
list L2 = [2,3,4,5,6];
|
||||
integer fn(integer x){
|
||||
if (1) for (f=3,f=4,f=5;3;f++,f++) do while(0); while(0); else if (2) return 2; else;
|
||||
fn(3);
|
||||
integer j = 3||4&&5|6^7&8.==9!=10.e+01f<11<=12>13.>=14<<15>>16== ++f+-f++;
|
||||
j *= 3.0; // LSL allows this
|
||||
1+((float)2+(integer)(1+1));
|
||||
12345678901;0x000000012345678901;0x000;
|
||||
2*(V*V/4)*V*--V.x*V.x++;
|
||||
L+L2;L+1;1+L;
|
||||
<0,0,0.>0>0>*<0,0,0==0>2,3>>3>3.>%<3,4,5>;
|
||||
f -= TRUE-(integer)-1;
|
||||
f *= !FALSE;
|
||||
V %= ZERO_VECTOR*ZERO_ROTATION;
|
||||
1e37;1.1e22;1.;
|
||||
print(V *= 3);
|
||||
fwd("","","");
|
||||
L"\n\t\rxxxx";
|
||||
{f;}
|
||||
[1,2,3];
|
||||
}
|
||||
fwd(string a,string b,string c){}
|
||||
default{touch(integer n){n;state default;state another;return;}timer(){}}
|
||||
state another{timer(){}}//"""))
|
||||
self.assertRaises(EParseUEOF, self.parser.parse, '')
|
||||
self.assertRaises(EParseUEOF, self.parser.parse, 'default')
|
||||
self.assertRaises(EParseSyntax, self.parser.parse, 'x')
|
||||
self.outscript.output(self.parser.parse('integer x=TRUE;integer y=x;integer j=FALSE;default{timer(){}}'))
|
||||
self.assertRaises(EParseSyntax, self.parser.parse, ';')
|
||||
self.assertRaises(EParseSyntax, self.parser.parse, 'f(){}g(integer x,key y){{}}h(;){}')
|
||||
self.assertRaises(EParseSyntax, self.parser.parse, 'f(){}g(integer x,key y){}h()}')
|
||||
self.assertRaises(EParseUEOF, self.parser.parse, 'integer "')
|
||||
self.assertRaises(EParseSyntax, self.parser.parse, 'default{timer(){}}state blah{timer(){}}state ;')
|
||||
self.assertRaises(EParseSyntax, self.parser.parse, 'default{timer(integer x){}}')
|
||||
self.assertRaises(EParseSyntax, self.parser.parse, 'default{timer(integer x){(integer)x=0}}')
|
||||
self.assertRaises(EParseSyntax, self.parser.parse, 'default{timer(){state;}}')
|
||||
self.assertRaises(EParseAlreadyDefined, self.parser.parse, 'default{timer(integer x,integer x){}}')
|
||||
self.assertRaises(EParseSyntax, self.parser.parse, 'x;')
|
||||
self.assertRaises(EParseSyntax, self.parser.parse, '1e;')
|
||||
self.assertRaises(EParseSyntax, self.parser.parse, 'integer x=-TRUE;')
|
||||
self.assertRaises(EParseSyntax, self.parser.parse, 'integer x=-3;integer y=-x;')
|
||||
self.assertRaises(EParseAlreadyDefined, self.parser.parse, '''float x=3;float x;''')
|
||||
self.assertRaises(EParseAlreadyDefined, self.parser.parse, '''default{timer(){}}
|
||||
state blah{timer(){}}
|
||||
state blah{}''')
|
||||
self.assertRaises(EParseAlreadyDefined, self.parser.parse, '''default{timer(){@x;@x;}}''')
|
||||
self.assertRaises(EParseAlreadyDefined, self.parser.parse, '''default{timer(){integer x;@x;}}''')
|
||||
self.assertRaises(EParseAlreadyDefined, self.parser.parse, '''default{timer(){@x;integer x;}}''')
|
||||
self.assertRaises(EParseUEOF, self.parser.parse, 'float x=3+3;', set(('extendedglobalexpr',)))
|
||||
self.assertRaises(EParseUndefined, self.parser.parse, '''float x=-2147483648;float y=z;''')
|
||||
self.assertRaises(EParseUndefined, self.parser.parse, '''float z(){;}float y=z;''')
|
||||
self.assertRaises(EParseUndefined, self.parser.parse, '''float y=z;float z;''')
|
||||
self.assertRaises(EParseUndefined, self.parser.parse, '''default{timer(){state blah;}}''')
|
||||
self.assertRaises(EParseUndefined, self.parser.parse, '''f(){k;}''')
|
||||
self.assertRaises(EParseReturnShouldBeEmpty, self.parser.parse, '''default{timer(){return 1;}}''')
|
||||
self.assertRaises(EParseReturnIsEmpty, self.parser.parse, '''integer f(){return;}''')
|
||||
self.assertRaises(EParseFunctionMismatch, self.parser.parse, '''f(integer i){f("");}''')
|
||||
self.assertRaises(EParseFunctionMismatch, self.parser.parse, '''f(integer i){f(1,2);}''')
|
||||
self.assertRaises(EParseFunctionMismatch, self.parser.parse, '''f(integer i){f(f(1));}''')
|
||||
self.assertRaises(EParseFunctionMismatch, self.parser.parse, '''f(integer i){f();}''')
|
||||
self.assertRaises(EParseDeclarationScope, self.parser.parse, '''f(){if (1) integer i;}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){[f()];}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){3.||2;}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){3||2.;}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){3.|2;}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){3|2.;}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){3.&2;}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){3&2.;}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){3.^2;}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){3^2.;}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){f()!=2;}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){2!=f();}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){3.<"";}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){""<"".;}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){3.<<2;}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){3>>2.;}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){""-(key)"";}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){""+f();}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){""+(key)"";}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){key k;k+k;}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){3/<1,2,3>;}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){3/<1,2,3,4>;}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){""*3;}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){""%4;}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){3%<2,3,4>;}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){""%4;}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){(vector)4;}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){key k;k+=k;}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){string i;i++;}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){string i;(i-=i);}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){string i;(i*=i);}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){string i;-i;}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){string i;~i;}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){string i;!i;}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){string i;++i;}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''g(){integer k;k=g();}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''g(){@x;x;}state x{}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''g(){print(g());}state x{}''')
|
||||
self.assertRaises(EParseUndefined, self.parser.parse, '''g(){integer k;k();}''')
|
||||
self.assertRaises(EParseUndefined, self.parser.parse, '''g(){++x;}state x{}''')
|
||||
self.assertRaises(EParseUndefined, self.parser.parse, '''g(){print(x);}state x{}''')
|
||||
self.assertRaises(EParseUEOF, self.parser.parse, '''f(){(integer)''')
|
||||
self.assertRaises(EParseInvalidField, self.parser.parse, '''f(){vector v;v.s;}''')
|
||||
self.assertRaises(EParseSyntax, self.parser.parse, '''f(){<1,2,3,4==5>;}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){<1,2,3,4>"">;}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){<1,2,3,"">"">;}''')
|
||||
self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){string i;(i&=i);}''',
|
||||
set(('extendedassignment')))
|
||||
|
||||
# Force a list constant down its throat, to test coverage of LIST_VALUE
|
||||
self.parser.constants['LISTCONST']=[1,2,3]
|
||||
print self.outscript.output(self.parser.parse('default{timer(){LISTCONST;}}'))
|
||||
|
||||
print self.outscript.output(self.parser.parse('''
|
||||
float f=2+2;
|
||||
default{timer(){
|
||||
1+([]+(integer)~1);
|
||||
list a;
|
||||
float f;
|
||||
a = 3; a += 3;
|
||||
f += 4;
|
||||
integer i;
|
||||
i |= i;
|
||||
i>>=i;
|
||||
}}''',
|
||||
set(('explicitcast','extendedtypecast','extendedassignment',
|
||||
'extendedglobalexpr'))))
|
||||
print self.parser.scopeindex
|
||||
self.assertRaises(EParseUnexpected, self.parser.PopScope)
|
||||
|
||||
self.assertEqual(fieldpos("a,b",",",3),-1)
|
||||
self.assertRaises(lslfuncs.ELSLTypeMismatch, self.outscript.Value2LSL, lslfuncs.Key(u''))
|
||||
self.assertRaises(lslfuncs.ELSLTypeMismatch, self.outscript.Value2LSL, '')
|
||||
|
||||
def tearDown(self):
|
||||
del self.parser
|
||||
del self.outscript
|
||||
|
||||
class TestLibraryLoader(UnitTestCase):
|
||||
def test_coverage(self):
|
||||
try:
|
||||
os.remove('builtins.txt')
|
||||
except OSError:
|
||||
pass
|
||||
f = open('builtins.txt', 'wb')
|
||||
f.write(r'''const key a="\t"
|
||||
event ev(integer i)
|
||||
event ev(integer i)
|
||||
quaternion x(integer i)
|
||||
void x(integer i)
|
||||
blah
|
||||
const vector a = <4,5,3,2>
|
||||
const vector a = <4,5,3,2
|
||||
const vector a = <x,4,3>
|
||||
const vector a = <4,x,3>
|
||||
const vector a = <3,4,x>
|
||||
const rotation a = <3,4,4,x>
|
||||
const list l = []
|
||||
const quaternion q=<1,2,3,4>
|
||||
const string v="
|
||||
const string q="\t"
|
||||
''')
|
||||
f.close()
|
||||
parser()
|
||||
f = open('builtins.txt.dat', 'rb')
|
||||
b = f.read()
|
||||
f.close()
|
||||
try:
|
||||
os.remove('builtins.txt')
|
||||
except OSError:
|
||||
pass
|
||||
f = open('builtins.txt', 'wb')
|
||||
f.write(b)
|
||||
f.close()
|
||||
parser()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
Loading…
Add table
Add a link
Reference in a new issue