Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 64 additions & 0 deletions pythonFiles/testing_tools/adapter/discovery.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License.

from __future__ import absolute_import, print_function

import os.path

from .info import ParentInfo



class DiscoveredTests(object):
"""A container for the discovered tests and their parents."""

def __init__(self):
self.reset()

def __len__(self):
return len(self._tests)

def __getitem__(self, index):
return self._tests[index]

@property
def parents(self):
return sorted(self._parents.values(), key=lambda v: (v.root or v.name, v.id))
Comment thread
ericsnowcurrently marked this conversation as resolved.

def reset(self):
"""Clear out any previously discovered tests."""
self._parents = {}
self._tests = []

def add_test(self, test, parents):
"""Add the given test and its parents."""
parentid = self._ensure_parent(test.path, parents)
# Updating the parent ID and the test ID aren't necessary if the
# provided test and parents (from the test collector) are
# properly generated. However, we play it safe here.
test = test._replace(parentid=parentid)
if not test.id.startswith('.' + os.path.sep):
test = test._replace(id=os.path.join('.', test.id))
self._tests.append(test)

def _ensure_parent(self, path, parents):
rootdir = path.root

_parents = iter(parents)
nodeid, name, kind = next(_parents)
# As in add_test(), the node ID *should* already be correct.
if nodeid != '.' and not nodeid.startswith('.' + os.path.sep):
nodeid = os.path.join('.', nodeid)
_parentid = nodeid
for parentid, parentname, parentkind in _parents:
# As in add_test(), the parent ID *should* already be correct.
if parentid != '.' and not parentid.startswith('.' + os.path.sep):
parentid = os.path.join('.', parentid)
info = ParentInfo(nodeid, kind, name, rootdir, parentid)
self._parents[(rootdir, nodeid)] = info
nodeid, name, kind = parentid, parentname, parentkind
assert nodeid == '.'
info = ParentInfo(nodeid, kind, name=rootdir)
self._parents[(rootdir, nodeid)] = info

return _parentid
119 changes: 6 additions & 113 deletions pythonFiles/testing_tools/adapter/pytest/_discovery.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,7 @@

import pytest

from .. import util
from ..info import ParentInfo
from .. import util, discovery
from ._pytest_item import parse_item


Expand Down Expand Up @@ -63,7 +62,7 @@ class TestCollector(object):

def __init__(self, tests=None):
if tests is None:
tests = DiscoveredTests()
tests = discovery.DiscoveredTests()
self._tests = tests
self._started = False

Expand All @@ -74,8 +73,8 @@ def pytest_collection_modifyitems(self, session, config, items):
self._started = True
self._tests.reset()
for item in items:
test, suiteids = parse_item(item, self.NORMCASE, self.PATHSEP)
self._tests.add_test(test, suiteids)
test, parents = parse_item(item, self.NORMCASE, self.PATHSEP)
self._tests.add_test(test, parents)

# This hook is not specified in the docs, so we also provide
# the "modifyitems" hook just in case.
Expand All @@ -88,111 +87,5 @@ def pytest_collection_finish(self, session):
return
self._tests.reset()
for item in items:
test, suiteids = parse_item(item, self.NORMCASE, self.PATHSEP)
self._tests.add_test(test, suiteids)


class DiscoveredTests(object):
"""A container for the discovered tests and their parents."""

def __init__(self):
self.reset()

def __len__(self):
return len(self._tests)

def __getitem__(self, index):
return self._tests[index]

@property
def parents(self):
return sorted(self._parents.values(), key=lambda v: (v.root or v.name, v.id))

def reset(self):
"""Clear out any previously discovered tests."""
self._parents = {}
self._tests = []

def add_test(self, test, suiteids):
"""Add the given test and its parents."""
parentid = self._ensure_parent(test.path, test.parentid, suiteids)
test = test._replace(parentid=parentid)
if not test.id.startswith('.' + os.path.sep):
test = test._replace(id=os.path.join('.', test.id))
self._tests.append(test)

def _ensure_parent(self, path, parentid, suiteids):
if not parentid.startswith('.' + os.path.sep):
parentid = os.path.join('.', parentid)
fileid = self._ensure_file(path.root, path.relfile)
rootdir = path.root

if not path.func:
return parentid

fullsuite, _, funcname = path.func.rpartition('.')
suiteid = self._ensure_suites(fullsuite, rootdir, fileid, suiteids)
parent = suiteid if suiteid else fileid

if path.sub:
if (rootdir, parentid) not in self._parents:
funcinfo = ParentInfo(parentid, 'function', funcname,
rootdir, parent)
self._parents[(rootdir, parentid)] = funcinfo
elif parent != parentid:
print(parent, parentid)
# TODO: What to do?
raise NotImplementedError
return parentid

def _ensure_file(self, rootdir, relfile):
if (rootdir, '.') not in self._parents:
self._parents[(rootdir, '.')] = ParentInfo('.', 'folder', rootdir)
if relfile.startswith('.' + os.path.sep):
fileid = relfile
else:
fileid = relfile = os.path.join('.', relfile)

if (rootdir, fileid) not in self._parents:
folderid, filebase = os.path.split(fileid)
fileinfo = ParentInfo(fileid, 'file', filebase, rootdir, folderid)
self._parents[(rootdir, fileid)] = fileinfo

while folderid != '.' and (rootdir, folderid) not in self._parents:
parentid, name = os.path.split(folderid)
folderinfo = ParentInfo(folderid, 'folder', name, rootdir, parentid)
self._parents[(rootdir, folderid)] = folderinfo
folderid = parentid
return relfile

def _ensure_suites(self, fullsuite, rootdir, fileid, suiteids):
if not fullsuite:
if suiteids:
print(suiteids)
# TODO: What to do?
raise NotImplementedError
return None
if len(suiteids) != fullsuite.count('.') + 1:
print(suiteids)
# TODO: What to do?
raise NotImplementedError

suiteid = suiteids.pop()
if not suiteid.startswith('.' + os.path.sep):
suiteid = os.path.join('.', suiteid)
final = suiteid
while '.' in fullsuite and (rootdir, suiteid) not in self._parents:
parentid = suiteids.pop()
if not parentid.startswith('.' + os.path.sep):
parentid = os.path.join('.', parentid)
fullsuite, _, name = fullsuite.rpartition('.')
suiteinfo = ParentInfo(suiteid, 'suite', name, rootdir, parentid)
self._parents[(rootdir, suiteid)] = suiteinfo

suiteid = parentid
else:
name = fullsuite
suiteinfo = ParentInfo(suiteid, 'suite', name, rootdir, fileid)
if (rootdir, suiteid) not in self._parents:
self._parents[(rootdir, suiteid)] = suiteinfo
return final
test, parents = parse_item(item, self.NORMCASE, self.PATHSEP)
self._tests.add_test(test, parents)
Loading