1 #!/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 """ 18 Common functions useful for writing test generators in python 19 """ 20 21 import itertools 22 import os 23 import string 24 from pathlib import Path 25 26 BUILD_TOP = os.getenv("ANDROID_BUILD_TOP") 27 if 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. 33 NAME_GEN = itertools.chain.from_iterable( 34 map(lambda n: itertools.product(string.ascii_lowercase, repeat=n), 35 itertools.count(1))) 36 37 def 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 44 def 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 50 def 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 61 def 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 81