blob: 769ad16ebeee24cf6cd7187967f6600b1444c39a [file] [log] [blame]
Alex Lighteb7c1442015-08-31 13:17:42 -07001#!/usr/bin/python3
2#
3# Copyright (C) 2015 The Android Open Source Project
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17"""
18Common functions useful for writing test generators in python
19"""
20
21import itertools
22import os
23import string
24from pathlib import Path
25
26BUILD_TOP = os.getenv("ANDROID_BUILD_TOP")
27if BUILD_TOP is None:
28 print("ANDROID_BUILD_TOP not set. Please run build/envsetup.sh", file=sys.stderr)
29 sys.exit(1)
30
31# An iterator which yields strings made from lowercase letters. First yields
32# all 1 length strings, then all 2 and so on. It does this alphabetically.
33NAME_GEN = itertools.chain.from_iterable(
34 map(lambda n: itertools.product(string.ascii_lowercase, repeat=n),
35 itertools.count(1)))
36
37def gensym():
38 """
39 Returns a new, globally unique, identifier name that is a valid Java symbol
40 on each call.
41 """
42 return ''.join(next(NAME_GEN))
43
44def filter_blanks(s):
45 """
46 Takes a string returns the same string sans empty lines
47 """
48 return "\n".join(a for a in s.split("\n") if a.strip() != "")
49
50def get_copyright(filetype = "java"):
51 """
52 Returns the standard copyright header for the given filetype
53 """
54 if filetype == "smali":
55 return "\n".join(map(lambda a: "# " + a, get_copyright("java").split("\n")))
56 else:
57 fname = filetype + ".txt"
58 with (Path(BUILD_TOP)/"development"/"docs"/"copyright-templates"/fname).open() as template:
59 return "".join(template.readlines())
60
61def subtree_sizes(n):
62 """
63 A generator that yields a tuple containing a possible arrangement of subtree
64 nodes for a tree with a total of 'n' leaf nodes.
65 """
66 if n == 0:
67 return
68 elif n == 1:
69 yield (0,)
70 elif n == 2:
71 yield (1, 1)
72 else:
73 for prevt in subtree_sizes(n - 1):
74 prev = list(prevt)
75 yield tuple([1] + prev)
76 for i in range(len(prev)):
77 prev[i] += 1
78 yield tuple(prev)
79 prev[i] -= 1
80