2302
2303
return condition
2305
def condition_id_startswith(start):
2306
def condition_id_startswith(starts):
2306
2307
"""Create a condition filter verifying that test's id starts with a string.
2308
:param start: A string.
2309
:return: A callable that returns True if the test's id starts with the
2309
:param starts: A list of string.
2310
:return: A callable that returns True if the test's id starts with one of
2312
2313
def condition(test):
2313
return test.id().startswith(start)
2314
for start in starts:
2315
if test.id().startswith(start):
2314
2318
return condition
2352
2356
:param suite: the source suite
2353
2357
:param pattern: pattern that names must match
2354
2358
:returns: the newly created suite
2356
2360
condition = condition_id_re(pattern)
2357
2361
result_suite = filter_suite_by_condition(suite, condition)
2358
2362
return result_suite
2374
2378
"""Create a test suite by filtering another one.
2376
2380
:param suite: The source suite.
2377
:param start: A string the test id must start with.
2381
:param start: A list of string the test id must start with one of.
2378
2382
:returns: the newly created suite
2380
2384
condition = condition_id_startswith(start)
2671
2675
return self.tests.has_key(test_id)
2678
class TestPrefixAliasRegistry(registry.Registry):
2679
"""A registry for test prefix aliases.
2681
This helps implement shorcuts for the --starting-with selftest
2682
option. Overriding existing prefixes is not allowed but not fatal (a
2683
warning will be emitted).
2686
def register(self, key, obj, help=None, info=None,
2687
override_existing=False):
2688
"""See Registry.register.
2690
Trying to override an existing alias causes a warning to be emitted,
2691
not a fatal execption.
2694
super(TestPrefixAliasRegistry, self).register(
2695
key, obj, help=help, info=info, override_existing=False)
2697
actual = self.get(key)
2698
note('Test prefix alias %s is already used for %s, ignoring %s'
2699
% (key, actual, obj))
2701
def resolve_alias(self, id_start):
2702
"""Replace the alias by the prefix in the given string.
2704
Using an unknown prefix is an error to help catching typos.
2706
parts = id_start.split('.')
2708
parts[0] = self.get(parts[0])
2710
raise errors.BzrCommandError(
2711
'%s is not a known test prefix alias' % parts[0])
2712
return '.'.join(parts)
2715
test_prefix_alias_registry = TestPrefixAliasRegistry()
2716
"""Registry of test prefix aliases."""
2719
# This alias allows to detect typos ('bzrlin.') by making all valid test ids
2720
# appear prefixed ('bzrlib.' is "replaced" by 'bzrlib.').
2721
test_prefix_alias_registry.register('bzrlib', 'bzrlib')
2723
# Obvious higest levels prefixes, feel free to add your own via a plugin
2724
test_prefix_alias_registry.register('bd', 'bzrlib.doc')
2725
test_prefix_alias_registry.register('bu', 'bzrlib.utils')
2726
test_prefix_alias_registry.register('bt', 'bzrlib.tests')
2727
test_prefix_alias_registry.register('bb', 'bzrlib.tests.blackbox')
2728
test_prefix_alias_registry.register('bp', 'bzrlib.plugins')
2674
2731
def test_suite(keep_only=None, starting_with=None):
2675
2732
"""Build and return TestSuite for the whole of bzrlib.
2693
2750
'bzrlib.tests.interrepository_implementations',
2694
2751
'bzrlib.tests.intertree_implementations',
2695
2752
'bzrlib.tests.per_lock',
2696
'bzrlib.tests.repository_implementations',
2753
'bzrlib.tests.per_repository',
2697
2754
'bzrlib.tests.test__dirstate_helpers',
2698
2755
'bzrlib.tests.test_ancestry',
2699
2756
'bzrlib.tests.test_annotate',
2811
2868
'bzrlib.tests.test_transform',
2812
2869
'bzrlib.tests.test_transport',
2813
2870
'bzrlib.tests.test_transport_implementations',
2871
'bzrlib.tests.test_transport_log',
2814
2872
'bzrlib.tests.test_tree',
2815
2873
'bzrlib.tests.test_treebuilder',
2816
2874
'bzrlib.tests.test_tsort',
2838
2896
loader = TestUtil.TestLoader()
2840
if starting_with is not None:
2899
starting_with = [test_prefix_alias_registry.resolve_alias(start)
2900
for start in starting_with]
2841
2901
# We take precedence over keep_only because *at loading time* using
2842
2902
# both options means we will load less tests for the same final result.
2843
2903
def interesting_module(name):
2845
# Either the module name starts with the specified string
2846
name.startswith(starting_with)
2847
# or it may contain tests starting with the specified string
2848
or starting_with.startswith(name)
2904
for start in starting_with:
2906
# Either the module name starts with the specified string
2907
name.startswith(start)
2908
# or it may contain tests starting with the specified string
2909
or start.startswith(name)
2850
2913
loader = TestUtil.FilteredByModuleTestLoader(interesting_module)
2852
2915
elif keep_only is not None:
2921
2984
suite = filter_suite_by_id_list(suite, id_filter)
2922
2985
# Do some sanity checks on the id_list filtering
2923
2986
not_found, duplicates = suite_matches_id_list(suite, keep_only)
2924
if starting_with is not None:
2925
2988
# The tester has used both keep_only and starting_with, so he is
2926
2989
# already aware that some tests are excluded from the list, there
2927
2990
# is no need to tell him which.