#!/usr/bin/env python3
import sys
import os
import unittest
import logging
# Extend PYTHONPATH with local 'lib' folder
if __name__ == "__main__":
jasyroot = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]), os.pardir, os.pardir, os.pardir, os.pardir))
sys.path.insert(0, jasyroot)
print("Running from %s..." % jasyroot)
import jasy.script.parse.Parser as Parser
import jasy.script.output.Compressor as Compressor
import jasy.script.optimize.CryptPrivates as CryptPrivates
[docs]class Tests(unittest.TestCase):
[docs] def process(self, code, contextId=""):
node = Parser.parse(code)
CryptPrivates.optimize(node, contextId)
return Compressor.Compressor().compress(node)
[docs] def test_assign(self):
self.assertEqual(self.process(
'''
this.__field1 = 123;
''', 1),
'this.__mJ02j=123;'
)
[docs] def test_assign_long(self):
self.assertEqual(self.process(
'''
this.__titleBarBackgroundColor = "red";
''', 1),
'this.__clbJJO="red";'
)
[docs] def test_global_obj_file1(self):
self.assertEqual(self.process(
'''
var obj = {
__x : 123,
__y : 456
};
alert(obj.__x + ":" + obj.__y);
''', 1),
'var obj={__bLHVk:123,__bLYYn:456};alert(obj.__bLHVk+":"+obj.__bLYYn);'
)
[docs] def test_global_obj_file2(self):
self.assertEqual(self.process(
'''
var obj = {
__x : 123,
__y : 456
};
alert(obj.__x + ":" + obj.__y);
''', 2),
'var obj={__bMw4r:123,__bMN7u:456};alert(obj.__bMw4r+":"+obj.__bMN7u);'
)
[docs] def test_remote(self):
self.assertRaises(CryptPrivates.Error, self.process,
'''
alert(RemoteObj.__x);
''')
[docs] def test_localvar(self):
self.assertEqual(self.process(
'''
var __x = 4;
alert(__x);
'''),
'var __x=4;alert(__x);'
)
[docs] def test_localvar_undeclared(self):
self.assertEqual(self.process(
'''
alert(__y);
'''),
'alert(__y);'
)
[docs] def test_local_deep(self):
self.assertEqual(self.process(
'''
var obj = {
__field : {
__sub : true
}
};
alert(obj.__field.__sub);
'''),
'var obj={__ihERj:{__dZ1y9:true}};alert(obj.__ihERj.__dZ1y9);'
)
[docs] def test_access_same_named_external(self):
"""
Is is somehow an unsupported edge case which is not supported correctly yet.
Normally one would expect that the access to __field on RemoteObj would raise an error. At least it breaks this
wrong access because this field is renamed based on file name as well.
"""
self.assertEqual(self.process(
'''
var obj = {
__field : true
};
alert(RemoteObj.__field);
'''),
'var obj={__ihERj:true};alert(RemoteObj.__ihERj);'
)
[docs] def test_mixin(self):
self.assertEqual(self.process(
'''
var source = {
__field1 : 123,
__field2 : 456
};
var target = {
__field1 : 789
};
for (var key in source) {
target[key] = source[key];
}
'''),
'var source={__kZWNQ:123,__k0dQT:456};var target={__kZWNQ:789};for(var key in source){target[key]=source[key]}'
)
if __name__ == '__main__':
logging.getLogger().setLevel(logging.ERROR)
suite = unittest.TestLoader().loadTestsFromTestCase(Tests)
unittest.TextTestRunner(verbosity=2).run(suite)