text: # 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" must match what the testing framework recognizes.
                  'id': parent.id,
                  'kind': parent.kind,
                  'name': parent.name,
                  'parentid': parent.parentid,
                  })
              if parent.relpath is not None:
                  root['parents'][-1]['relpath'] = parent.relpath
          for test in tests:
              # We are guaranteed that the parent was added.
              root = byroot[test.path.root]
              testdata = {
                  # "id" must match what the testing framework recognizes.
                  '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)
  
  
  def report_unittest_discovered(suites, parents, pretty=False, simple=False,
                        _send=print, **_ignored):
      """Serialize the discovered tests and write to stdout."""
      data = []
          
      for suite in suites._tests:
          for cls in suite._tests:
              testList = []
              try:
                  for test in cls._tests:
                      testdata = {
                          'id': test.id(),
                          'name': test._testMethodName,
                          'lineno' : test.lineno,
                          'source' : test.source
                          }
                      testList.append(testdata)
              except:
                  pass
              if testList:
                  root = {
                      'tests': testList
                  }
                  data.append(root)
  
      kwargs = {}
      if pretty:
          # human-formatted
          kwargs = dict(
              sort_keys=True,
              indent=4,
              separators=(',', ': '),
              )
      serialized = json.dumps(data, **kwargs)
  
      _send(serialized)