d0df704d8a
added python.path vm arg to startup script fixed infinite loop in unwrap() when displaying sequences of sequences git-svn-id: http://google-refine.googlecode.com/svn/trunk@509 7d457c2a-affb-35e4-300a-418c747d4874
89 lines
2.7 KiB
Python
89 lines
2.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
import java.io.StringWriter
|
|
import sys
|
|
import traceback
|
|
import unittest
|
|
import test.test_support
|
|
|
|
|
|
def exec_code_in_pi(function, out, err, locals=None):
|
|
"""Runs code in a separate context: (thread, PySystemState, PythonInterpreter)"""
|
|
|
|
def function_context():
|
|
from org.python.core import Py
|
|
from org.python.util import PythonInterpreter
|
|
from org.python.core import PySystemState
|
|
|
|
ps = PySystemState()
|
|
pi = PythonInterpreter({}, ps)
|
|
if locals:
|
|
pi.setLocals(locals)
|
|
pi.setOut(out)
|
|
pi.setErr(err)
|
|
try:
|
|
pi.exec(function.func_code)
|
|
except:
|
|
print '-'*60
|
|
traceback.print_exc(file=sys.stdout)
|
|
print '-'*60
|
|
|
|
|
|
import threading
|
|
context = threading.Thread(target=function_context)
|
|
context.start()
|
|
context.join()
|
|
|
|
|
|
class InterpreterTest(unittest.TestCase):
|
|
|
|
# in these tests, note the promotion to unicode by java.io.Writer,
|
|
# because these are character-oriented streams. caveat emptor!
|
|
|
|
def test_pi_out_unicode(self):
|
|
source_text = [
|
|
u'Some text',
|
|
'Plain text',
|
|
u'\u1000\u2000\u3000\u4000',
|
|
# Some language names from wikipedia
|
|
u'Català · Česky · Dansk · Deutsch · English · Español · Esperanto · Français · Bahasa Indonesia · Italiano · Magyar · Nederlands · 日本語 · Norsk (bokmål) · Polski · Português · Русский · Română · Slovenčina · Suomi · Svenska · Türkçe · Українська · Volapük · 中文',
|
|
]
|
|
|
|
def f():
|
|
global text
|
|
for x in text:
|
|
print x
|
|
out = java.io.StringWriter()
|
|
err = java.io.StringWriter()
|
|
exec_code_in_pi(f, out, err, {'text': source_text})
|
|
output_text = out.toString().splitlines()
|
|
for source, output in zip(source_text, output_text):
|
|
self.assertEquals(source, output)
|
|
|
|
def test_pi_out(self):
|
|
def f():
|
|
print 42
|
|
out = java.io.StringWriter()
|
|
err = java.io.StringWriter()
|
|
exec_code_in_pi(f, out, err)
|
|
self.assertEquals(u"42\n", out.toString())
|
|
|
|
def test_more_output(self):
|
|
def f():
|
|
for i in xrange(42):
|
|
print "*" * i
|
|
out = java.io.StringWriter()
|
|
err = java.io.StringWriter()
|
|
exec_code_in_pi(f, out, err)
|
|
output = out.toString().splitlines()
|
|
for i, line in enumerate(output):
|
|
self.assertEquals(line, u'*' * i)
|
|
self.assertEquals(42, len(output))
|
|
|
|
|
|
|
|
def test_main():
|
|
test.test_support.run_unittest(InterpreterTest)
|
|
|
|
if __name__ == "__main__":
|
|
test_main()
|