summaryrefslogtreecommitdiff
path: root/tests/py2win_doctests_mercurial_extension_utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/py2win_doctests_mercurial_extension_utils.py')
-rw-r--r--tests/py2win_doctests_mercurial_extension_utils.py351
1 files changed, 351 insertions, 0 deletions
diff --git a/tests/py2win_doctests_mercurial_extension_utils.py b/tests/py2win_doctests_mercurial_extension_utils.py
new file mode 100644
index 0000000..a9faaf4
--- /dev/null
+++ b/tests/py2win_doctests_mercurial_extension_utils.py
@@ -0,0 +1,351 @@
+# -*- coding: utf-8 -*-
+#
+# mercurial extension utils: Windows doctests
+#
+# Copyright (c) 2015 Marcin Kasperski <Marcin.Kasperski@mekk.waw.pl>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# 3. The name of the author may not be used to endorse or promote products
+# derived from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# See README.txt for more details.
+
+r'''
+This module exists solely to give some examples (and doctest)
+of mercurial_extension_utils behaviour on Windows. Structure
+mimics that of mercurial_extension_utils.
+
+
+
+ >>> normalize_path("~/src")
+ 'C:/Users/lordvader/src'
+ >>> normalize_path("/some/where")
+ 'c:/some/where'
+ >>> normalize_path("/some/where/")
+ 'c:/some/where'
+ >>> normalize_path("../../../some/where")
+ 'c:/Users/lordvader/some/where'
+ >>> normalize_path(r'C:\Users\Joe\source files')
+ 'C:/Users/Joe/source files'
+
+
+
+ >>> belongs_to_tree("/tmp/sub/dir", "/tmp")
+ 'c:/tmp'
+ >>> belongs_to_tree("/tmp", "/tmp")
+ 'c:/tmp'
+ >>> belongs_to_tree("/tmp/sub", "/tmp/sub/dir/../..")
+ 'c:/tmp'
+
+ >>> belongs_to_tree("/usr/sub", "/tmp")
+
+ >>> home_work_src = os.path.join(os.environ["HOME"], "work", "src")
+ >>> belongs_to_tree(home_work_src, "~/work")
+ 'C:/Users/lordvader/work'
+ >>> belongs_to_tree("/home/lordvader/devel/webapps" if os.name != 'nt' else "c:/users/lordvader/devel/webapps",
+ ... "~lordvader/devel")
+ 'C:/Users/lordvader/devel'
+
+
+
+ >>> belongs_to_tree_group("/tmp/sub/dir", ["/bin", "/tmp"])
+ 'c:/tmp'
+ >>> belongs_to_tree_group("/tmp", ["/tmp"])
+ 'c:/tmp'
+ >>> belongs_to_tree_group("/tmp/sub/dir", ["/bin", "~/src"])
+
+ >>> belongs_to_tree_group("/tmp/sub/dir", ["/tmp", "/bin", "/tmp", "/tmp/sub"])
+ 'c:/tmp/sub'
+
+ >>> belongs_to_tree_group("C:/Users/lordvader/src/apps", ["~/src", "C:/Users/lordvader"])
+ 'C:/Users/lordvader/src'
+
+
+
+ >>> pat = DirectoryPattern('~/src/{suffix}')
+ >>> pat.is_valid()
+ True
+ >>> pat.search("/opt/repos/abcd")
+ >>> pat.search("~/src/repos/in/tree")
+ {'suffix': 'repos/in/tree'}
+ >>> pat.search("c:/users/lordvader/src/repos/here")
+ {'suffix': 'repos/here'}
+ >>> pat.search("C:/Users/lordvader/src/repos/here")
+ {'suffix': 'repos/here'}
+ >>> pat.search("/home/lordvader/src")
+
+ >>> pat = DirectoryPattern('~lordvader/devel/(item)')
+ >>> pat.search("/opt/repos/abcd")
+ >>> pat.search("~/devel/libxuza")
+ {'item': 'libxuza'}
+ >>> pat.search("~/devel/libs/libxuza")
+ >>> pat.search("C:/Users/lordvader/devel/webapp")
+ {'item': 'webapp'}
+ >>> pat.search("/users/lordvader/devel/webapp")
+ {'item': 'webapp'}
+ >>> pat.search("/home/lordvader/devel")
+
+ >>> pat = DirectoryPattern('/opt/repos/(group)/{suffix}')
+ >>> pat.search("/opt/repos/abcd")
+ >>> pat.search("/opt/repos/libs/abcd")
+ {'group': 'libs', 'suffix': 'abcd'}
+ >>> pat.search("/opt/repos/apps/mini/webby")
+ {'group': 'apps', 'suffix': 'mini/webby'}
+
+ >>> pat = DirectoryPattern('/opt/repos/(group/{suffix}')
+ >>> pat.is_valid()
+ False
+ >>> pat.search('/opt/repos/some/where')
+
+
+
+ >>> tf = TextFiller('{some}/text/to/{fill}')
+ >>> tf.fill(some='prefix', fill='suffix')
+ 'prefix/text/to/suffix'
+ >>> tf.fill(some='/ab/c/d', fill='x')
+ '/ab/c/d/text/to/x'
+
+ >>> tf = TextFiller('{some}/text/to/{some}')
+ >>> tf.is_valid()
+ True
+ >>> tf.fill(some='val')
+ 'val/text/to/val'
+ >>> tf.fill(some='ab/c/d', fill='x')
+ 'ab/c/d/text/to/ab/c/d'
+
+ >>> tf = TextFiller('{prefix:_=___}/goto/{suffix:/=-}')
+ >>> tf.fill(prefix='some_prefix', suffix='some/long/suffix')
+ 'some___prefix/goto/some-long-suffix'
+
+ >>> tf = TextFiller('{prefix:/home/=}/docs/{suffix:.txt=.html}')
+ >>> tf.fill(prefix='/home/joe', suffix='some/document.txt')
+ 'joe/docs/some/document.html'
+
+ >>> tf = TextFiller(r'/goto/{item:/=-:\=_}/')
+ >>> tf.fill(item='this/is/slashy')
+ '/goto/this-is-slashy/'
+ >>> tf.fill(item=r'this\is\back')
+ '/goto/this_is_back/'
+ >>> tf.fill(item=r'this/is\mixed')
+ '/goto/this-is_mixed/'
+
+ >>> tf = TextFiller(r'http://go.to/{item:/=-}, G:{item:/=\}, name: {item}')
+ >>> print tf.fill(item='so/me/thing')
+ http://go.to/so-me-thing, G:so\me\thing, name: so/me/thing
+
+ >>> tf = TextFiller('{some}/text/to/{fill}')
+ >>> tf.fill(some='prefix', badfill='suffix')
+
+ >>> tf = TextFiller('{some/text/to/{fill}')
+ >>> tf.is_valid()
+ False
+ >>> tf.fill(some='prefix', fill='suffix')
+
+ >>> tf = TextFiller('{some}/text/to/{fill:}')
+ >>> tf.is_valid()
+ False
+ >>> tf.fill(some='prefix', fill='suffix')
+
+
+
+ >>> import mercurial.ui; ui = mercurial.ui.ui()
+ >>> setconfig_dict(ui, "sect1", {'a': 7, 'bbb': 'xxx', 'c': '-'})
+ >>> setconfig_dict(ui, "sect2", {'v': 'vvv'})
+ >>> ui.config("sect1", 'a')
+ 7
+ >>> ui.config("sect2", 'v')
+ 'vvv'
+
+
+ >>> import mercurial.ui; ui = mercurial.ui.ui()
+ >>> setconfig_dict(ui, "foo", {
+ ... "pfx-some-sfx": "ala, ma kota",
+ ... "some.nonitem": "bela nie",
+ ... "x": "yes",
+ ... "pfx-other-sfx": 4})
+ >>> setconfig_dict(ui, "notfoo", {
+ ... "pfx-some-sfx": "bad",
+ ... "pfx-also-sfx": "too",
+ ... })
+ >>>
+ >>> for name, value in rgxp_config_items(
+ ... ui, "foo", re.compile(r'^pfx-(\w+)-sfx$')):
+ ... print name, value
+ some ala, ma kota
+ other 4
+
+
+ >>> import mercurial.ui; ui = mercurial.ui.ui()
+ >>> setconfig_dict(ui, "foo", {
+ ... "pfx-some-sfx": "ala, ma kota",
+ ... "some.nonitem": "bela nie",
+ ... "x": "yes",
+ ... "pfx-other-sfx": "sth"})
+ >>> setconfig_dict(ui, "notfoo", {
+ ... "pfx-some-sfx": "bad",
+ ... "pfx-also-sfx": "too",
+ ... })
+ >>>
+ >>> for name, value in rgxp_configlist_items(
+ ... ui, "foo", re.compile(r'^pfx-(\w+)-sfx$')):
+ ... print name, value
+ some ['ala', 'ma', 'kota']
+ other ['sth']
+
+
+ >>> import mercurial.ui; ui = mercurial.ui.ui()
+ >>> setconfig_dict(ui, "foo", {
+ ... "pfx-some-sfx": "true",
+ ... "some.nonitem": "bela nie",
+ ... "x": "yes",
+ ... "pfx-other-sfx": "false"})
+ >>> setconfig_dict(ui, "notfoo", {
+ ... "pfx-some-sfx": "1",
+ ... "pfx-also-sfx": "0",
+ ... })
+ >>>
+ >>> for name, value in rgxp_configbool_items(
+ ... ui, "foo", re.compile(r'^pfx-(\w+)-sfx$')):
+ ... print name, value
+ some True
+ other False
+
+
+ >>> import mercurial.ui; ui = mercurial.ui.ui()
+ >>> setconfig_dict(ui, "foo", {
+ ... "some.item": "ala, ma kota",
+ ... "some.nonitem": "bela nie",
+ ... "x": "yes",
+ ... "other.item": 4})
+ >>> setconfig_dict(ui, "notfoo", {
+ ... "some.item": "bad",
+ ... "also.item": "too",
+ ... })
+ >>>
+ >>> for name, value in suffix_config_items(
+ ... ui, "foo", 'item'):
+ ... print name, value
+ some ala, ma kota
+ other 4
+
+
+ >>> import mercurial.ui; ui = mercurial.ui.ui()
+ >>> setconfig_dict(ui, "foo", {
+ ... "some.item": "ala, ma kota",
+ ... "some.nonitem": "bela nie",
+ ... "x": "yes",
+ ... "other.item": "kazimira"})
+ >>> setconfig_dict(ui, "notfoo", {
+ ... "some.item": "bad",
+ ... "also.item": "too",
+ ... })
+ >>>
+ >>> for name, value in suffix_configlist_items(
+ ... ui, "foo", "item"):
+ ... print name, value
+ some ['ala', 'ma', 'kota']
+ other ['kazimira']
+
+
+ >>> import mercurial.ui; ui = mercurial.ui.ui()
+ >>> setconfig_dict(ui, "foo", {
+ ... "true.item": "true",
+ ... "false.item": "false",
+ ... "one.item": "1",
+ ... "zero.item": "0",
+ ... "yes.item": "yes",
+ ... "no.item": "no",
+ ... "some.nonitem": "1",
+ ... "x": "yes"})
+ >>> setconfig_dict(ui, "notfoo", {
+ ... "some.item": "0",
+ ... "also.item": "too",
+ ... })
+ >>>
+ >>> for name, value in suffix_configbool_items(
+ ... ui, "foo", "item"):
+ ... print name, str(value)
+ zero False
+ yes True
+ one True
+ true True
+ no False
+ false False
+ >>>
+ >>> ui.setconfig("foo", "text.item", "something")
+ >>> for name, value in suffix_configbool_items(
+ ... ui, "foo", "item"):
+ ... print name, str(value)
+ Traceback (most recent call last):
+ File "/usr/lib/python2.7/dist-packages/mercurial/ui.py", line 237, in configbool
+ % (section, name, v))
+ ConfigError: foo.text.item is not a boolean ('something')
+
+
+ >>> class SomeClass(object):
+ ... def meth(self, arg):
+ ... return "Original: " + arg
+ >>>
+ >>> @monkeypatch_method(SomeClass)
+ ... def meth(self, arg):
+ ... return "Patched: " + meth.orig(self, arg)
+ >>>
+ >>> obj = SomeClass()
+ >>> print obj.meth("some param")
+ Patched: Original: some param
+
+
+ >>> class SomeClass(object):
+ ... def meth(self, arg):
+ ... return "Original: " + arg
+ >>>
+ >>> @monkeypatch_method(SomeClass, "meth")
+ ... def another_meth(self, arg):
+ ... return "Patched: " + another_meth.orig(self, arg)
+ >>>
+ >>> obj = SomeClass()
+ >>> print obj.meth("some param")
+ Patched: Original: some param
+
+
+ >>> import random
+ >>> @monkeypatch_function(random)
+ ... def seed(x=None):
+ ... print "Forcing random to seed with 0 instead of", x
+ ... return seed.orig(0)
+ >>>
+ >>> random.seed()
+ Forcing random to seed with 0 instead of None
+ >>> random.randint(0, 10)
+ 9
+
+ >>> import random
+ >>> @monkeypatch_function(random, 'choice')
+ ... def choice_first(sequence):
+ ... return sequence[0]
+ >>> for x in range(0, 4): print random.choice("abcdefgh")
+ a
+ a
+ a
+ a
+
+'''