--- /dev/null
+# Copyright (c) Microsoft Corporation. All rights reserved.
+# Licensed under the MIT License.
+
+from __future__ import print_function
+
+import json
+
+
+def report_discovered(tests, parents, pretty=False, simple=False,
+ _send=print, **_ignored):
+ """Serialize the discovered tests and write to stdout."""
+ if simple:
+ data = [{
+ 'id': test.id,
+ 'name': test.name,
+ 'testroot': test.path.root,
+ 'relfile': test.path.relfile,
+ 'lineno': test.lineno,
+ 'testfunc': test.path.func,
+ 'subtest': test.path.sub or None,
+ 'markers': test.markers or [],
+ } for test in tests]
+ else:
+ byroot = {}
+ for parent in parents:
+ rootdir = parent.name if parent.root is None else parent.root
+ try:
+ root = byroot[rootdir]
+ except KeyError:
+ root = byroot[rootdir] = {
+ 'id': rootdir,
+ 'parents': [],
+ 'tests': [],
+ }
+ if not parent.root:
+ root['id'] = parent.id
+ continue
+ root['parents'].append({
+ 'id': parent.id,
+ 'kind': parent.kind,
+ 'name': parent.name,
+ 'parentid': parent.parentid,
+ })
+ for test in tests:
+ # We are guaranteed that the parent was added.
+ root = byroot[test.path.root]
+ testdata = {
+ 'id': test.id,
+ 'name': test.name,
+ # TODO: Add a "kind" field
+ # (e.g. "unittest", "function", "doctest")
+ 'source': test.source,
+ 'markers': test.markers or [],
+ 'parentid': test.parentid,
+ }
+ root['tests'].append(testdata)
+ data = [{
+ 'rootid': byroot[root]['id'],
+ 'root': root,
+ 'parents': byroot[root]['parents'],
+ 'tests': byroot[root]['tests'],
+ } for root in sorted(byroot)]
+
+ kwargs = {}
+ if pretty:
+ # human-formatted
+ kwargs = dict(
+ sort_keys=True,
+ indent=4,
+ separators=(',', ': '),
+ )
+ serialized = json.dumps(data, **kwargs)
+
+ _send(serialized)