| Index: tools/telemetry/third_party/rope/ropetest/refactor/change_signature_test.py
|
| diff --git a/tools/telemetry/third_party/rope/ropetest/refactor/change_signature_test.py b/tools/telemetry/third_party/rope/ropetest/refactor/change_signature_test.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..944ffb5482f6c2c0cb2289aac309f8143b510830
|
| --- /dev/null
|
| +++ b/tools/telemetry/third_party/rope/ropetest/refactor/change_signature_test.py
|
| @@ -0,0 +1,446 @@
|
| +try:
|
| + import unittest2 as unittest
|
| +except ImportError:
|
| + import unittest
|
| +
|
| +import rope.base.exceptions
|
| +from rope.refactor import change_signature
|
| +from ropetest import testutils
|
| +
|
| +
|
| +class ChangeSignatureTest(unittest.TestCase):
|
| +
|
| + def setUp(self):
|
| + super(ChangeSignatureTest, self).setUp()
|
| + self.project = testutils.sample_project()
|
| + self.pycore = self.project.pycore
|
| + self.mod = testutils.create_module(self.project, 'mod')
|
| +
|
| + def tearDown(self):
|
| + testutils.remove_project(self.project)
|
| + super(ChangeSignatureTest, self).tearDown()
|
| +
|
| + def test_normalizing_parameters_for_trivial_case(self):
|
| + code = 'def a_func():\n pass\na_func()'
|
| + self.mod.write(code)
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + self.project.do(signature.get_changes(
|
| + [change_signature.ArgumentNormalizer()]))
|
| + self.assertEquals(code, self.mod.read())
|
| +
|
| + def test_normalizing_parameters_for_trivial_case2(self):
|
| + code = 'def a_func(param):\n pass\na_func(2)'
|
| + self.mod.write(code)
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + self.project.do(signature.get_changes(
|
| + [change_signature.ArgumentNormalizer()]))
|
| + self.assertEquals(code, self.mod.read())
|
| +
|
| + def test_normalizing_parameters_for_unneeded_keyword(self):
|
| + self.mod.write('def a_func(param):\n pass\na_func(param=1)')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + self.project.do(signature.get_changes(
|
| + [change_signature.ArgumentNormalizer()]))
|
| + self.assertEquals('def a_func(param):\n pass\na_func(1)',
|
| + self.mod.read())
|
| +
|
| + def test_normalizing_parameters_for_unneeded_keyword_for_methods(self):
|
| + code = 'class A(object):\n' \
|
| + ' def a_func(self, param):\n' \
|
| + ' pass\n' \
|
| + 'a_var = A()\n' \
|
| + 'a_var.a_func(param=1)\n'
|
| + self.mod.write(code)
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + self.project.do(signature.get_changes(
|
| + [change_signature.ArgumentNormalizer()]))
|
| + expected = 'class A(object):\n' \
|
| + ' def a_func(self, param):\n' \
|
| + ' pass\n' \
|
| + 'a_var = A()\n' \
|
| + 'a_var.a_func(1)\n'
|
| + self.assertEquals(expected, self.mod.read())
|
| +
|
| + def test_normalizing_parameters_for_unsorted_keyword(self):
|
| + self.mod.write('def a_func(p1, p2):\n pass\na_func(p2=2, p1=1)')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + self.project.do(signature.get_changes(
|
| + [change_signature.ArgumentNormalizer()]))
|
| + self.assertEquals('def a_func(p1, p2):\n pass\na_func(1, 2)',
|
| + self.mod.read())
|
| +
|
| + def test_raising_exceptions_for_non_functions(self):
|
| + self.mod.write('a_var = 10')
|
| + with self.assertRaises(rope.base.exceptions.RefactoringError):
|
| + change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_var') + 1)
|
| +
|
| + def test_normalizing_parameters_for_args_parameter(self):
|
| + self.mod.write('def a_func(*arg):\n pass\na_func(1, 2)\n')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + self.project.do(signature.get_changes(
|
| + [change_signature.ArgumentNormalizer()]))
|
| + self.assertEquals('def a_func(*arg):\n pass\na_func(1, 2)\n',
|
| + self.mod.read())
|
| +
|
| + def test_normalizing_parameters_for_args_parameter_and_keywords(self):
|
| + self.mod.write(
|
| + 'def a_func(param, *args):\n pass\na_func(*[1, 2, 3])\n')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + self.project.do(signature.get_changes(
|
| + [change_signature.ArgumentNormalizer()]))
|
| + self.assertEquals('def a_func(param, *args):\n pass\n'
|
| + 'a_func(*[1, 2, 3])\n', self.mod.read())
|
| +
|
| + def test_normalizing_functions_from_other_modules(self):
|
| + mod1 = testutils.create_module(self.project, 'mod1')
|
| + mod1.write('def a_func(param):\n pass\n')
|
| + self.mod.write('import mod1\nmod1.a_func(param=1)\n')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, mod1, mod1.read().index('a_func') + 1)
|
| + self.project.do(signature.get_changes(
|
| + [change_signature.ArgumentNormalizer()]))
|
| + self.assertEquals('import mod1\nmod1.a_func(1)\n', self.mod.read())
|
| +
|
| + def test_normalizing_parameters_for_keyword_parameters(self):
|
| + self.mod.write('def a_func(p1, **kwds):\n pass\n'
|
| + 'a_func(p2=2, p1=1)\n')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + self.project.do(signature.get_changes(
|
| + [change_signature.ArgumentNormalizer()]))
|
| + self.assertEquals('def a_func(p1, **kwds):\n pass\n'
|
| + 'a_func(1, p2=2)\n', self.mod.read())
|
| +
|
| + def test_removing_arguments(self):
|
| + self.mod.write('def a_func(p1):\n pass\na_func(1)\n')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + self.project.do(signature.get_changes(
|
| + [change_signature.ArgumentRemover(0)]))
|
| + self.assertEquals('def a_func():\n pass\na_func()\n',
|
| + self.mod.read())
|
| +
|
| + def test_removing_arguments_with_multiple_args(self):
|
| + self.mod.write('def a_func(p1, p2):\n pass\na_func(1, 2)\n')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + self.project.do(signature.get_changes(
|
| + [change_signature.ArgumentRemover(0)]))
|
| + self.assertEquals('def a_func(p2):\n pass\na_func(2)\n',
|
| + self.mod.read())
|
| +
|
| + def test_removing_arguments_passed_as_keywords(self):
|
| + self.mod.write('def a_func(p1):\n pass\na_func(p1=1)\n')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + self.project.do(signature.get_changes(
|
| + [change_signature.ArgumentRemover(0)]))
|
| + self.assertEquals('def a_func():\n pass\na_func()\n',
|
| + self.mod.read())
|
| +
|
| + def test_removing_arguments_with_defaults(self):
|
| + self.mod.write('def a_func(p1=1):\n pass\na_func(1)\n')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + self.project.do(signature.get_changes(
|
| + [change_signature.ArgumentRemover(0)]))
|
| + self.assertEquals('def a_func():\n pass\na_func()\n',
|
| + self.mod.read())
|
| +
|
| + def test_removing_arguments_star_args(self):
|
| + self.mod.write('def a_func(p1, *args):\n pass\na_func(1)\n')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + self.project.do(signature.get_changes(
|
| + [change_signature.ArgumentRemover(1)]))
|
| + self.assertEquals('def a_func(p1):\n pass\na_func(1)\n',
|
| + self.mod.read())
|
| +
|
| + def test_removing_keyword_arg(self):
|
| + self.mod.write('def a_func(p1, **kwds):\n pass\na_func(1)\n')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + self.project.do(signature.get_changes(
|
| + [change_signature.ArgumentRemover(1)]))
|
| + self.assertEquals('def a_func(p1):\n pass\na_func(1)\n',
|
| + self.mod.read())
|
| +
|
| + def test_removing_keyword_arg2(self):
|
| + self.mod.write('def a_func(p1, *args, **kwds):\n pass\na_func(1)\n')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + self.project.do(signature.get_changes(
|
| + [change_signature.ArgumentRemover(2)]))
|
| + self.assertEquals('def a_func(p1, *args):\n pass\na_func(1)\n',
|
| + self.mod.read())
|
| +
|
| + # XXX: What to do here for star args?
|
| + @unittest.skip("How to deal with start args?")
|
| + def xxx_test_removing_arguments_star_args2(self):
|
| + self.mod.write('def a_func(p1, *args):\n pass\n'
|
| + 'a_func(2, 3, p1=1)\n')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + self.project.do(signature.get_changes(
|
| + [change_signature.ArgumentRemover(1)]))
|
| + self.assertEquals('def a_func(p1):\n pass\na_func(p1=1)\n',
|
| + self.mod.read())
|
| +
|
| + # XXX: What to do here for star args?
|
| + def xxx_test_removing_arguments_star_args3(self):
|
| + self.mod.write('def a_func(p1, *args):\n pass\n'
|
| + 'a_func(*[1, 2, 3])\n')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + self.project.do(signature.get_changes(
|
| + [change_signature.ArgumentRemover(1)]))
|
| + self.assertEquals('def a_func(p1):\n pass\na_func(*[1, 2, 3])\n',
|
| + self.mod.read())
|
| +
|
| + def test_adding_arguments_for_normal_args_changing_definition(self):
|
| + self.mod.write('def a_func():\n pass\n')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + self.project.do(signature.get_changes(
|
| + [change_signature.ArgumentAdder(0, 'p1')]))
|
| + self.assertEquals('def a_func(p1):\n pass\n', self.mod.read())
|
| +
|
| + def test_adding_arguments_for_normal_args_with_defaults(self):
|
| + self.mod.write('def a_func():\n pass\na_func()\n')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + adder = change_signature.ArgumentAdder(0, 'p1', 'None')
|
| + self.project.do(signature.get_changes([adder]))
|
| + self.assertEquals('def a_func(p1=None):\n pass\na_func()\n',
|
| + self.mod.read())
|
| +
|
| + def test_adding_arguments_for_normal_args_changing_calls(self):
|
| + self.mod.write('def a_func():\n pass\na_func()\n')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + adder = change_signature.ArgumentAdder(0, 'p1', 'None', '1')
|
| + self.project.do(signature.get_changes([adder]))
|
| + self.assertEquals('def a_func(p1=None):\n pass\na_func(1)\n',
|
| + self.mod.read())
|
| +
|
| + def test_adding_arguments_for_norm_args_chang_calls_with_kwords(self):
|
| + self.mod.write('def a_func(p1=0):\n pass\na_func()\n')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + adder = change_signature.ArgumentAdder(1, 'p2', '0', '1')
|
| + self.project.do(signature.get_changes([adder]))
|
| + self.assertEquals('def a_func(p1=0, p2=0):\n pass\na_func(p2=1)\n',
|
| + self.mod.read())
|
| +
|
| + def test_adding_arguments_for_norm_args_chang_calls_with_no_value(self):
|
| + self.mod.write('def a_func(p2=0):\n pass\na_func(1)\n')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + adder = change_signature.ArgumentAdder(0, 'p1', '0', None)
|
| + self.project.do(signature.get_changes([adder]))
|
| + self.assertEquals('def a_func(p1=0, p2=0):\n pass\na_func(p2=1)\n',
|
| + self.mod.read())
|
| +
|
| + def test_adding_duplicate_parameter_and_raising_exceptions(self):
|
| + self.mod.write('def a_func(p1):\n pass\n')
|
| + with self.assertRaises(rope.base.exceptions.RefactoringError):
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + self.project.do(signature.get_changes(
|
| + [change_signature.ArgumentAdder(1, 'p1')]))
|
| +
|
| + def test_inlining_default_arguments(self):
|
| + self.mod.write('def a_func(p1=0):\n pass\na_func()\n')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + self.project.do(signature.get_changes(
|
| + [change_signature.ArgumentDefaultInliner(0)]))
|
| + self.assertEquals('def a_func(p1=0):\n pass\n'
|
| + 'a_func(0)\n', self.mod.read())
|
| +
|
| + def test_inlining_default_arguments2(self):
|
| + self.mod.write('def a_func(p1=0):\n pass\na_func(1)\n')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + self.project.do(signature.get_changes(
|
| + [change_signature.ArgumentDefaultInliner(0)]))
|
| + self.assertEquals('def a_func(p1=0):\n pass\n'
|
| + 'a_func(1)\n', self.mod.read())
|
| +
|
| + def test_preserving_args_and_keywords_order(self):
|
| + self.mod.write('def a_func(*args, **kwds):\n pass\n'
|
| + 'a_func(3, 1, 2, a=1, c=3, b=2)\n')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + self.project.do(signature.get_changes(
|
| + [change_signature.ArgumentNormalizer()]))
|
| + self.assertEquals('def a_func(*args, **kwds):\n pass\n'
|
| + 'a_func(3, 1, 2, a=1, c=3, b=2)\n', self.mod.read())
|
| +
|
| + def test_change_order_for_only_one_parameter(self):
|
| + self.mod.write('def a_func(p1):\n pass\na_func(1)\n')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + self.project.do(signature.get_changes(
|
| + [change_signature.ArgumentReorderer([0])]))
|
| + self.assertEquals('def a_func(p1):\n pass\na_func(1)\n',
|
| + self.mod.read())
|
| +
|
| + def test_change_order_for_two_parameter(self):
|
| + self.mod.write('def a_func(p1, p2):\n pass\na_func(1, 2)\n')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + self.project.do(signature.get_changes(
|
| + [change_signature.ArgumentReorderer([1, 0])]))
|
| + self.assertEquals('def a_func(p2, p1):\n pass\na_func(2, 1)\n',
|
| + self.mod.read())
|
| +
|
| + def test_reordering_multi_line_function_headers(self):
|
| + self.mod.write('def a_func(p1,\n p2):\n pass\na_func(1, 2)\n')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + self.project.do(signature.get_changes(
|
| + [change_signature.ArgumentReorderer([1, 0])]))
|
| + self.assertEquals('def a_func(p2, p1):\n pass\na_func(2, 1)\n',
|
| + self.mod.read())
|
| +
|
| + def test_changing_order_with_static_params(self):
|
| + self.mod.write('def a_func(p1, p2=0, p3=0):\n pass\na_func(1, 2)\n')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + self.project.do(signature.get_changes(
|
| + [change_signature.ArgumentReorderer([0, 2, 1])]))
|
| + self.assertEquals('def a_func(p1, p3=0, p2=0):\n pass\n'
|
| + 'a_func(1, p2=2)\n', self.mod.read())
|
| +
|
| + def test_doing_multiple_changes(self):
|
| + changers = []
|
| + self.mod.write('def a_func(p1):\n pass\na_func(1)\n')
|
| + changers.append(change_signature.ArgumentRemover(0))
|
| + changers.append(change_signature.ArgumentAdder(0, 'p2', None, None))
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + signature.get_changes(changers).do()
|
| + self.assertEquals('def a_func(p2):\n pass\na_func()\n',
|
| + self.mod.read())
|
| +
|
| + def test_doing_multiple_changes2(self):
|
| + changers = []
|
| + self.mod.write('def a_func(p1, p2):\n pass\na_func(p2=2)\n')
|
| + changers.append(change_signature.ArgumentAdder(2, 'p3', None, '3'))
|
| + changers.append(change_signature.ArgumentReorderer([1, 0, 2]))
|
| + changers.append(change_signature.ArgumentRemover(1))
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + signature.get_changes(changers).do()
|
| + self.assertEquals('def a_func(p2, p3):\n pass\na_func(2, 3)\n',
|
| + self.mod.read())
|
| +
|
| + def test_changing_signature_in_subclasses(self):
|
| + self.mod.write(
|
| + 'class A(object):\n def a_method(self):\n pass\n'
|
| + 'class B(A):\n def a_method(self):\n pass\n')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_method') + 1)
|
| + signature.get_changes([change_signature.ArgumentAdder(1, 'p1')],
|
| + in_hierarchy=True).do()
|
| + self.assertEquals(
|
| + 'class A(object):\n def a_method(self, p1):\n pass\n'
|
| + 'class B(A):\n def a_method(self, p1):\n pass\n',
|
| + self.mod.read())
|
| +
|
| + def test_differentiating_class_accesses_from_instance_accesses(self):
|
| + self.mod.write(
|
| + 'class A(object):\n def a_func(self, param):\n pass\n'
|
| + 'a_var = A()\nA.a_func(a_var, param=1)')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('a_func') + 1)
|
| + self.project.do(signature.get_changes(
|
| + [change_signature.ArgumentRemover(1)]))
|
| + self.assertEquals(
|
| + 'class A(object):\n def a_func(self):\n pass\n'
|
| + 'a_var = A()\nA.a_func(a_var)', self.mod.read())
|
| +
|
| + def test_changing_signature_for_constructors(self):
|
| + self.mod.write(
|
| + 'class C(object):\n def __init__(self, p):\n pass\n'
|
| + 'c = C(1)\n')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('C') + 1)
|
| + signature.get_changes([change_signature.ArgumentRemover(1)]).do()
|
| + self.assertEquals(
|
| + 'class C(object):\n def __init__(self):\n pass\n'
|
| + 'c = C()\n',
|
| + self.mod.read())
|
| +
|
| + def test_changing_signature_for_constructors2(self):
|
| + self.mod.write(
|
| + 'class C(object):\n def __init__(self, p):\n pass\n'
|
| + 'c = C(1)\n')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('__init__') + 1)
|
| + signature.get_changes([change_signature.ArgumentRemover(1)]).do()
|
| + self.assertEquals(
|
| + 'class C(object):\n def __init__(self):\n pass\n'
|
| + 'c = C()\n',
|
| + self.mod.read())
|
| +
|
| + def test_changing_signature_for_constructors_when_using_super(self):
|
| + self.mod.write(
|
| + 'class A(object):\n def __init__(self, p):\n pass\n'
|
| + 'class B(A):\n '
|
| + 'def __init__(self, p):\n super(B, self).__init__(p)\n')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().index('__init__') + 1)
|
| + signature.get_changes([change_signature.ArgumentRemover(1)]).do()
|
| + self.assertEquals(
|
| + 'class A(object):\n def __init__(self):\n pass\n'
|
| + 'class B(A):\n '
|
| + 'def __init__(self, p):\n super(B, self).__init__()\n',
|
| + self.mod.read())
|
| +
|
| + def test_redordering_arguments_reported_by_mft(self):
|
| + self.mod.write('def f(a, b, c):\n pass\nf(1, 2, 3)\n')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, self.mod.read().rindex('f'))
|
| + signature.get_changes(
|
| + [change_signature.ArgumentReorderer([1, 2, 0])]).do()
|
| + self.assertEquals('def f(b, c, a):\n pass\nf(2, 3, 1)\n',
|
| + self.mod.read())
|
| +
|
| + def test_resources_parameter(self):
|
| + mod1 = testutils.create_module(self.project, 'mod1')
|
| + mod1.write('def a_func(param):\n pass\n')
|
| + self.mod.write('import mod1\nmod1.a_func(1)\n')
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, mod1, mod1.read().index('a_func') + 1)
|
| + signature.get_changes([change_signature.ArgumentRemover(0)],
|
| + resources=[mod1]).do()
|
| + self.assertEquals('import mod1\nmod1.a_func(1)\n', self.mod.read())
|
| + self.assertEquals('def a_func():\n pass\n', mod1.read())
|
| +
|
| + def test_reordering_and_automatic_defaults(self):
|
| + code = 'def f(p1, p2=2):\n' \
|
| + ' pass\n' \
|
| + 'f(1, 2)\n'
|
| + self.mod.write(code)
|
| + signature = change_signature.ChangeSignature(
|
| + self.project, self.mod, code.index('f('))
|
| + reorder = change_signature.ArgumentReorderer([1, 0], autodef='1')
|
| + signature.get_changes([reorder]).do()
|
| + expected = 'def f(p2=2, p1=1):\n' \
|
| + ' pass\n' \
|
| + 'f(2, 1)\n'
|
| + self.assertEquals(expected, self.mod.read())
|
| +
|
| +
|
| +if __name__ == '__main__':
|
| + unittest.main()
|
|
|