tests/test-extensions-wrapfunction.py
author Anton Shestakov <av6@dwimlabs.net>
Tue, 04 Jan 2022 23:38:39 +0300
changeset 48702 053a5bf508da
parent 43076 2372284d9457
child 48966 6000f5b25c9b
permissions -rw-r--r--
discovery: port _postprocessobsolete() changes from evolve, add tests Let's make this function obsolescence-aware as well. Now we check that revisions are not obsolete first, and only then check that they are going to be common after exchange. The tests make sure that rewriting changesets doesn't confuse head computation. They rely on experimental.single-head-per-branch feature to show that remote correctly sees the expected result (i.e. either aborts the push or allows it to succeed). They are ported from evolve as well. Differential Revision: https://phab.mercurial-scm.org/D12098
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
29777
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
     1
from __future__ import absolute_import, print_function
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
     2
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
     3
from mercurial import extensions
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
     4
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37982
diff changeset
     5
29777
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
     6
def genwrapper(x):
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
     7
    def f(orig, *args, **kwds):
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
     8
        return [x] + orig(*args, **kwds)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37982
diff changeset
     9
29777
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
    10
    f.x = x
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
    11
    return f
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
    12
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37982
diff changeset
    13
29777
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
    14
def getid(wrapper):
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
    15
    return getattr(wrapper, 'x', '-')
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
    16
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37982
diff changeset
    17
29777
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
    18
wrappers = [genwrapper(i) for i in range(5)]
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
    19
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37982
diff changeset
    20
29777
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
    21
class dummyclass(object):
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
    22
    def getstack(self):
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
    23
        return ['orig']
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
    24
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37982
diff changeset
    25
29777
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
    26
dummy = dummyclass()
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
    27
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37982
diff changeset
    28
29777
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
    29
def batchwrap(wrappers):
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
    30
    for w in wrappers:
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
    31
        extensions.wrapfunction(dummy, 'getstack', w)
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
    32
        print('wrap %d: %s' % (getid(w), dummy.getstack()))
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
    33
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37982
diff changeset
    34
29777
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
    35
def batchunwrap(wrappers):
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
    36
    for w in wrappers:
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
    37
        result = None
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
    38
        try:
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
    39
            result = extensions.unwrapfunction(dummy, 'getstack', w)
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
    40
            msg = str(dummy.getstack())
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
    41
        except (ValueError, IndexError) as e:
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
    42
            msg = e.__class__.__name__
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
    43
        print('unwrap %s: %s: %s' % (getid(w), getid(result), msg))
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
    44
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37982
diff changeset
    45
29777
19578bb84731 extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff changeset
    46
batchwrap(wrappers + [wrappers[0]])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37982
diff changeset
    47
batchunwrap(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37982
diff changeset
    48
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37982
diff changeset
    49
        (wrappers[i] if i is not None and i >= 0 else None)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37982
diff changeset
    50
        for i in [3, None, 0, 4, 0, 2, 1, None]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37982
diff changeset
    51
    ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37982
diff changeset
    52
)
34032
47e52f079a57 extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents: 29777
diff changeset
    53
47e52f079a57 extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents: 29777
diff changeset
    54
wrap0 = extensions.wrappedfunction(dummy, 'getstack', wrappers[0])
47e52f079a57 extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents: 29777
diff changeset
    55
wrap1 = extensions.wrappedfunction(dummy, 'getstack', wrappers[1])
47e52f079a57 extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents: 29777
diff changeset
    56
47e52f079a57 extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents: 29777
diff changeset
    57
# Use them in a different order from how they were created to check that
47e52f079a57 extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents: 29777
diff changeset
    58
# the wrapping happens in __enter__, not in __init__
47e52f079a57 extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents: 29777
diff changeset
    59
print('context manager', dummy.getstack())
47e52f079a57 extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents: 29777
diff changeset
    60
with wrap1:
47e52f079a57 extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents: 29777
diff changeset
    61
    print('context manager', dummy.getstack())
47e52f079a57 extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents: 29777
diff changeset
    62
    with wrap0:
47e52f079a57 extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents: 29777
diff changeset
    63
        print('context manager', dummy.getstack())
47e52f079a57 extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents: 29777
diff changeset
    64
        # Bad programmer forgets to unwrap the function, but the context
47e52f079a57 extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents: 29777
diff changeset
    65
        # managers still unwrap their wrappings.
47e52f079a57 extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents: 29777
diff changeset
    66
        extensions.wrapfunction(dummy, 'getstack', wrappers[2])
47e52f079a57 extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents: 29777
diff changeset
    67
        print('context manager', dummy.getstack())
47e52f079a57 extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents: 29777
diff changeset
    68
    print('context manager', dummy.getstack())
47e52f079a57 extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents: 29777
diff changeset
    69
print('context manager', dummy.getstack())
34143
82bd4c5a81e5 extensions: fix wrapcommand/function of class instance
Yuya Nishihara <yuya@tcha.org>
parents: 34032
diff changeset
    70
82bd4c5a81e5 extensions: fix wrapcommand/function of class instance
Yuya Nishihara <yuya@tcha.org>
parents: 34032
diff changeset
    71
# Wrap callable object which has no __name__
82bd4c5a81e5 extensions: fix wrapcommand/function of class instance
Yuya Nishihara <yuya@tcha.org>
parents: 34032
diff changeset
    72
class callableobj(object):
82bd4c5a81e5 extensions: fix wrapcommand/function of class instance
Yuya Nishihara <yuya@tcha.org>
parents: 34032
diff changeset
    73
    def __call__(self):
82bd4c5a81e5 extensions: fix wrapcommand/function of class instance
Yuya Nishihara <yuya@tcha.org>
parents: 34032
diff changeset
    74
        return ['orig']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37982
diff changeset
    75
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37982
diff changeset
    76
34143
82bd4c5a81e5 extensions: fix wrapcommand/function of class instance
Yuya Nishihara <yuya@tcha.org>
parents: 34032
diff changeset
    77
dummy.cobj = callableobj()
82bd4c5a81e5 extensions: fix wrapcommand/function of class instance
Yuya Nishihara <yuya@tcha.org>
parents: 34032
diff changeset
    78
extensions.wrapfunction(dummy, 'cobj', wrappers[0])
82bd4c5a81e5 extensions: fix wrapcommand/function of class instance
Yuya Nishihara <yuya@tcha.org>
parents: 34032
diff changeset
    79
print('wrap callable object', dummy.cobj())