Index: infra_libs/test/memoize_test.py |
diff --git a/infra_libs/test/memoize_test.py b/infra_libs/test/memoize_test.py |
deleted file mode 100755 |
index ad2f54dcbafbb3978b6db9da6c3b17a19468a67d..0000000000000000000000000000000000000000 |
--- a/infra_libs/test/memoize_test.py |
+++ /dev/null |
@@ -1,474 +0,0 @@ |
-#!/usr/bin/env python |
-# Copyright 2014 The Chromium Authors. All rights reserved. |
-# Use of this source code is governed by a BSD-style license that can be |
-# found in the LICENSE file. |
- |
-""" |
-Collection of unit tests for 'infra.libs.memoize' library. |
-""" |
- |
-import unittest |
- |
-from infra_libs import memoize |
- |
-class MemoTestCase(unittest.TestCase): |
- |
- def setUp(self): |
- self.tagged = set() |
- |
- def tag(self, tag=None): |
- self.assertNotIn(tag, self.tagged) |
- self.tagged.add(tag) |
- |
- def assertTagged(self, *tags): |
- if len(tags) == 0: |
- tags = (None,) |
- self.assertEqual(set(tags), self.tagged) |
- |
- def clearTagged(self): |
- self.tagged.clear() |
- |
- |
-class FunctionTestCase(MemoTestCase): |
- |
- def testFuncNoArgs(self): |
- @memoize.memo() |
- def func(): |
- self.tag() |
- return 'foo' |
- |
- for _ in xrange(10): |
- self.assertEqual(func(), 'foo') |
- self.assertTagged() |
- |
- def testFuncAllArgs(self): |
- @memoize.memo() |
- def func(a, b): |
- self.tag((a, b)) |
- return a + b |
- |
- # Execute multiple rounds of two unique function executions. |
- for _ in xrange(10): |
- self.assertEqual(func(1, 2), 3) |
- self.assertEqual(func(3, 4), 7) |
- self.assertTagged( |
- (1, 2), |
- (3, 4), |
- ) |
- |
- def testFuncIgnoreArgs(self): |
- @memoize.memo(ignore=('b')) |
- def func(a, b): |
- self.tag(a) |
- return a + b |
- |
- # Execute multiple rounds of two unique function executions. |
- for _ in xrange(10): |
- self.assertEqual(func(1, 1), 2) |
- self.assertEqual(func(1, 2), 2) |
- self.assertEqual(func(2, 1), 3) |
- self.assertEqual(func(2, 2), 3) |
- self.assertTagged( |
- 1, |
- 2, |
- ) |
- |
- def testOldClassMethod(self): |
- class Test: |
- # Disable 'no __init__ method' warning | pylint: disable=W0232 |
- # pylint: disable=old-style-class |
- |
- @classmethod |
- @memoize.memo() |
- def func(cls, a): |
- self.tag(a) |
- return a |
- |
- # Execute multiple rounds of two unique function executions. |
- for _ in xrange(10): |
- self.assertEqual(Test.func(1), 1) |
- self.assertEqual(Test.func(2), 2) |
- self.assertTagged( |
- 1, |
- 2, |
- ) |
- |
- def testNewClassMethod(self): |
- class Test(object): |
- # Disable 'no __init__ method' warning | pylint: disable=W0232 |
- |
- @classmethod |
- @memoize.memo() |
- def func(cls, a): |
- self.tag(a) |
- return a |
- |
- # Execute multiple rounds of two unique function executions. |
- for _ in xrange(10): |
- self.assertEqual(Test.func(1), 1) |
- self.assertEqual(Test.func(2), 2) |
- self.assertTagged( |
- 1, |
- 2, |
- ) |
- |
- def testOldClassStaticMethod(self): |
- class Test: |
- # Disable 'no __init__ method' warning | pylint: disable=W0232 |
- # pylint: disable=old-style-class |
- |
- @staticmethod |
- @memoize.memo() |
- def func(a): |
- self.tag(a) |
- return a |
- |
- # Execute multiple rounds of two unique function executions. |
- for _ in xrange(10): |
- self.assertEqual(Test.func(1), 1) |
- self.assertEqual(Test.func(2), 2) |
- self.assertTagged( |
- 1, |
- 2, |
- ) |
- |
- def testNewClassStaticMethod(self): |
- class Test(object): |
- # Disable 'no __init__ method' warning | pylint: disable=W0232 |
- |
- @staticmethod |
- @memoize.memo() |
- def func(a): |
- self.tag(a) |
- return a |
- |
- # Execute multiple rounds of two unique function executions. |
- for _ in xrange(10): |
- self.assertEqual(Test.func(1), 1) |
- self.assertEqual(Test.func(2), 2) |
- self.assertTagged( |
- 1, |
- 2, |
- ) |
- |
- def testClearAllArgs(self): |
- @memoize.memo() |
- def func(a, b=10): |
- self.tag((a, b)) |
- return a + b |
- |
- # First round |
- self.assertEqual(func(1), 11) |
- self.assertEqual(func(1, b=0), 1) |
- self.assertTagged( |
- (1, 10), |
- (1, 0), |
- ) |
- |
- # Clear (1) |
- self.clearTagged() |
- func.memo_clear(1) |
- |
- self.assertEqual(func(1), 11) |
- self.assertEqual(func(1, b=0), 1) |
- self.assertTagged( |
- (1, 10), |
- ) |
- |
- # Clear (1, b=0) |
- self.clearTagged() |
- func.memo_clear(1, b=0) |
- |
- self.assertEqual(func(1), 11) |
- self.assertEqual(func(1, b=0), 1) |
- self.assertTagged( |
- (1, 0), |
- ) |
- |
- |
-class MemoInstanceMethodTestCase(MemoTestCase): |
- |
- class TestBaseOld: |
- # pylint: disable=old-style-class |
- def __init__(self, test_case, name): |
- self.test_case = test_case |
- self.name = name |
- |
- def __hash__(self): |
- # Prevent this instance from being used as a memo key |
- raise NotImplementedError() |
- |
- |
- class TestBaseNew(object): |
- def __init__(self, test_case, name): |
- self.test_case = test_case |
- self.name = name |
- |
- def __hash__(self): |
- # Prevent this instance from being used as a memo key |
- raise NotImplementedError() |
- |
- |
- class TestHash(object): |
- |
- def __init__(self): |
- self._counter = 0 |
- |
- @memoize.memo() |
- def __hash__(self): |
- assert self._counter == 0 |
- self._counter += 1 |
- return self._counter |
- |
- |
- def testOldClassNoArgs(self): |
- class Test(self.TestBaseOld): |
- # Disable 'hash not overridden' warning | pylint: disable=W0223 |
- |
- @memoize.memo() |
- def func(self): |
- self.test_case.tag(self.name) |
- return 'foo' |
- |
- t0 = Test(self, 't0') |
- t1 = Test(self, 't1') |
- for _ in xrange(10): |
- self.assertEqual(t0.func(), 'foo') |
- self.assertEqual(t1.func(), 'foo') |
- self.assertTagged( |
- 't0', |
- 't1', |
- ) |
- |
- def testNewClassNoArgs(self): |
- class Test(self.TestBaseNew): |
- # Disable 'hash not overridden' warning | pylint: disable=W0223 |
- |
- @memoize.memo() |
- def func(self): |
- self.test_case.tag(self.name) |
- return 'foo' |
- |
- t0 = Test(self, 't0') |
- t1 = Test(self, 't1') |
- for _ in xrange(10): |
- self.assertEqual(t0.func(), 'foo') |
- self.assertEqual(t1.func(), 'foo') |
- self.assertTagged( |
- 't0', |
- 't1', |
- ) |
- |
- def testOldClassArgs(self): |
- class Test(self.TestBaseOld): |
- # Disable 'hash not overridden' warning | pylint: disable=W0223 |
- |
- @memoize.memo() |
- def func(self, a, b): |
- self.test_case.tag((self.name, a, b)) |
- return a + b |
- |
- t0 = Test(self, 't0') |
- t1 = Test(self, 't1') |
- for _ in xrange(10): |
- self.assertEqual(t0.func(1, 2), 3) |
- self.assertEqual(t0.func(1, 3), 4) |
- self.assertEqual(t1.func(1, 2), 3) |
- self.assertEqual(t1.func(1, 3), 4) |
- self.assertTagged( |
- ('t0', 1, 2), |
- ('t0', 1, 3), |
- ('t1', 1, 2), |
- ('t1', 1, 3), |
- ) |
- |
- def testNewClassArgs(self): |
- class Test(self.TestBaseNew): |
- # Disable 'hash not overridden' warning | pylint: disable=W0223 |
- |
- @memoize.memo() |
- def func(self, a, b): |
- self.test_case.tag((self.name, a, b)) |
- return a + b |
- |
- t0 = Test(self, 't0') |
- t1 = Test(self, 't1') |
- for _ in xrange(10): |
- self.assertEqual(t0.func(1, 2), 3) |
- self.assertEqual(t0.func(1, 3), 4) |
- self.assertEqual(t1.func(1, 2), 3) |
- self.assertEqual(t1.func(1, 3), 4) |
- self.assertTagged( |
- ('t0', 1, 2), |
- ('t0', 1, 3), |
- ('t1', 1, 2), |
- ('t1', 1, 3), |
- ) |
- |
- def testNewClassDirectCall(self): |
- class Test(self.TestBaseNew): |
- # Disable 'hash not overridden' warning | pylint: disable=W0223 |
- |
- @memoize.memo() |
- def func(self, a, b): |
- self.test_case.tag((self.name, a, b)) |
- return a + b |
- |
- t0 = Test(self, 't0') |
- for _ in xrange(10): |
- self.assertEqual(t0.func.__get__(t0)(1,2), 3) |
- self.assertTagged( |
- ('t0', 1, 2), |
- ) |
- |
- def testClear(self): |
- class Test(self.TestBaseNew): |
- # Disable 'hash not overridden' warning | pylint: disable=W0223 |
- |
- @memoize.memo() |
- def func(self, a): |
- self.test_case.tag((self.name, a)) |
- return a |
- |
- # Call '10' and '20' |
- t = Test(self, 'test') |
- t.func(10) |
- self.assertTagged( |
- ('test', 10), |
- ) |
- |
- # Clear |
- self.clearTagged() |
- t.func.memo_clear(10) |
- |
- # Call '10'; it should be tagged |
- t.func(10) |
- self.assertTagged( |
- ('test', 10), |
- ) |
- |
- |
- def testOverrideHash(self): |
- t = self.TestHash() |
- self.assertEquals(hash(t), 1) |
- self.assertEquals(hash(t), 1) |
- |
- |
-class MemoClassMethodTestCase(MemoTestCase): |
- """Tests handling of the 'cls' and 'self' parameters""" |
- |
- class Test(object): |
- |
- def __init__(self, test_case, name): |
- self.test_case = test_case |
- self.name = name |
- self._value = 0 |
- |
- @memoize.memo(ignore=('tag',)) |
- def func(self, a, tag): |
- self.test_case.tag(tag) |
- return a |
- |
- @classmethod |
- @memoize.memo(ignore=('test_case', 'tag')) |
- def class_func(cls, test_case, memo_value, tag): |
- test_case.tag(tag) |
- return memo_value |
- |
- @property |
- @memoize.memo() |
- def prop(self): |
- self.test_case.tag(self.name) |
- return self._value |
- |
- @prop.setter |
- def prop(self, value): |
- self._value = value |
- |
- @prop.deleter |
- def prop(self): |
- self._value = 0 |
- |
- |
- class TestWithEquals(Test): |
- |
- def __hash__(self): |
- return 7 |
- |
- def __eq__(self, other): |
- return type(other) == type(self) |
- |
- |
- def testClassMethodNoEquals(self): |
- self.assertEqual(self.Test.class_func(self, 1, 't0'), 1) |
- self.assertEqual(self.Test.class_func(self, 1, 't1'), 1) |
- self.assertEqual(self.Test.class_func(self, 2, 't2'), 2) |
- |
- self.Test.class_func.memo_clear(self.Test, self, 2, None) |
- self.assertEqual(self.Test.class_func(self, 1, 't3'), 1) |
- self.assertEqual(self.Test.class_func(self, 2, 't4'), 2) |
- |
- self.Test.class_func.memo_clear() |
- self.assertEqual(self.Test.class_func(self, 1, 't5'), 1) |
- |
- self.assertTagged( |
- 't0', |
- 't2', |
- 't4', |
- 't5', |
- ) |
- |
- def testInstanceMethodNoEquals(self): |
- t0 = self.Test(self, 't0') |
- t1 = self.Test(self, 't1') |
- |
- self.assertEqual(t0.func(1, 't0.0'), 1) |
- self.assertEqual(t1.func(1, 't1.0'), 1) |
- |
- t1.func.memo_clear(1, None) |
- self.assertEqual(t0.func(1, 't0.1'), 1) |
- self.assertEqual(t1.func(1, 't1.1'), 1) |
- self.assertTagged( |
- 't0.0', |
- 't1.0', |
- 't1.1', |
- ) |
- |
- def testInstanceMethodWithEquals(self): |
- t0 = self.TestWithEquals(self, 't0') |
- t1 = self.TestWithEquals(self, 't1') |
- |
- self.assertEqual(hash(t0), 7) |
- self.assertTrue(t0 == t1) |
- self.assertEqual(t0.func(1, 't0.0'), 1) |
- self.assertEqual(t1.func(1, 't1.0'), 1) |
- |
- t1.func.memo_clear(1, None) |
- self.assertEqual(t0.func(1, 't0.1'), 1) |
- self.assertEqual(t1.func(1, 't1.1'), 1) |
- self.assertTagged( |
- 't0.0', |
- 't1.0', |
- 't1.1', |
- ) |
- |
- def testProperty(self): |
- t0 = self.Test(self, 't0') |
- t1 = self.Test(self, 't1') |
- |
- # The property can be set. |
- t0.prop = 1024 |
- t1.prop = 1337 |
- del(t1.prop) |
- for _ in xrange(10): |
- self.assertEqual(t0.prop, 1024) |
- self.assertEqual(t1.prop, 0) |
- |
- self.assertTagged( |
- 't0', |
- 't1', |
- ) |
- |
- |
-if __name__ == '__main__': |
- unittest.main() |