def METHOD_NAME(self, groups: Optional[List[str]] = None,
               exclude_groups: Optional[List[str]] = None,
               tests: Optional[List[str]] = None,
               start_from: Optional[str] = None) -> List[str]:
    """Find tests
    Algorithm:
    1. a. if some @groups specified
         a.1 Take all tests from @groups
         a.2 Drop tests, which are in at least one of @exclude_groups or in
             'disabled' group (if 'disabled' is not listed in @groups)
         a.3 Add tests from @tests (don't exclude anything from them)
       b. else, if some @tests specified:
         b.1 exclude_groups must be not specified, so just take @tests
       c. else (only @exclude_groups list is non-empty):
         c.1 Take all tests
         c.2 Drop tests, which are in at least one of @exclude_groups or in
             'disabled' group
    2. sort
    3. If start_from specified, drop tests from first one to @start_from
       (not inclusive)
    """
    if groups is None:
        groups = []
    if exclude_groups is None:
        exclude_groups = []
    if tests is None:
        tests = []
    res: Set[str] = set()
    if groups:
        # Some groups specified. exclude_groups supported, additionally
        # selecting some individual tests supported as well.
        res.update(*(self.groups[g] for g in groups))
    elif tests:
        # Some individual tests specified, but no groups. In this case
        # we don't support exclude_groups.
        if exclude_groups:
            raise ValueError("Can't exclude from individually specified "
                             "tests.")
    else:
        # No tests no groups: start from all tests, exclude_groups
        # supported.
        res.update(self.all_tests)
    if 'disabled' not in groups and 'disabled' not in exclude_groups:
        # Don't want to modify function argument, so create new list.
        exclude_groups = exclude_groups + ['disabled']
    res = res.difference(*(self.groups[g] for g in exclude_groups))
    # We want to add @tests. But for compatibility with old test names,
    # we should convert any number < 100 to number padded by
    # leading zeroes, like 1 -> 001 and 23 -> 023.
    for t in tests:
        res.add(self.parse_test_name(t))
    sequence = sorted(res)
    if start_from is not None:
        del sequence[:sequence.index(self.parse_test_name(start_from))]
    return sequence