44 typesFolderPath =
"./../types"
45 typesFolderPath = os.path.abspath(
46 os.path.join(os.path.dirname(__file__), typesFolderPath)
50 genTestsFolderPath =
"./generated_tests"
51 genTestsFolderPath = os.path.abspath(
52 os.path.join(os.path.dirname(__file__), genTestsFolderPath)
56 allTypes = os.listdir(genTestsFolderPath)
57 if (nTypes > len(allTypes)):
58 print(f
"Error: n cannot be larger than amount of types in generated_tests. Retry with n < {len(allTypes)}.")
64 opts, args = getopt.getopt(sys.argv[1:],
"n:e:s:f:")
65 except getopt.GetoptError:
71 print(f
"Error: entropy {arg} provided is not an integer.")
76 print(f
"Error: number {arg} provided is not an integer.")
81 print(f
"Error: random seed {arg} provided is not an integer.")
87 desiredTypes = [f
"{x.strip()}_generated_tests.cpp" for x
in arg.split(
",")]
90 for dType
in desiredTypes:
91 if dType
not in allTypes:
92 print(f
"Error: there is not a generated test type for requested type '{dType[:dType.index("_generated_tests.cpp
")]}'")
99 env = jinja2.Environment(
100 loader = jinja2.FileSystemLoader(searchpath=
"./")
102 env.trim_blocks =
True
103 env.lstrip_blocks =
True
104 testTemplate = env.get_template(
"entropyTestTemplate.jinja2")
109 if nTypes < len(desiredTypes):
110 print(f
"Error: n={nTypes} is less than desired flatlog types: {desiredTypes}. Please select n >= number of desired types.")
115 for dType
in desiredTypes:
116 assert(dType
in allTypes)
117 testTypes.append(dType)
118 allTypes.remove(dType)
121 for _
in range(nTypes - len(desiredTypes)):
123 randomIdx = random.randint(0, len(allTypes) - 1)
124 testTypes.append(allTypes[randomIdx])
126 del allTypes[randomIdx]
130 baseTypesDict = dict()
132 for type
in testTypes:
135 if "_generated_tests.cpp" not in type:
137 typeName = type[:type.index(
"_generated_tests.cpp")]
138 typePath = os.path.join(typesFolderPath, f
"{typeName}.hpp")
145 for baseType, inheritedTypes
in baseTypesDict.items():
146 for inheritedType
in inheritedTypes:
147 if inheritedType
in type:
150 assert(info
is not None)
151 typesInfoList.append(info)
159 for _
in range(entropy):
161 for type
in typesInfoList:
163 objName = f
"{type["classVarName
"]}_{objCount}"
164 initObjStr = f
"{type["className
"]}_0 {objName} = {type["className
"]}_0("
166 for field
in type[
"messageTypes"][0]:
169 testValName = f
"{type["classVarName
"]}{field["name
"].capitalize()}_{str(totalFieldCount).rjust(8, '0')}"
171 initObjStr += f
"(char *) {testValName}, " if "char *" in field[
"type"]
else f
"{testValName}, "
172 if field == type[
"messageTypes"][0][-1]:
173 initObjStr = initObjStr[:-2] +
");"
175 constVarStr = f
"const {field["type
"]} {testValName} = {makeTestVal(field)};"
176 testVariables.append(constVarStr)
179 if "char *" in field[
"type"]:
180 catchAssertStr = f
"REQUIRE(strcmp({objName}.m_{field["name
"]}, {testValName}) == 0);"
182 catchAssertStr = f
"REQUIRE({objName}.m_{field["name
"]} == {testValName});"
183 catchAsserts.append(catchAssertStr)
187 catchAsserts.append(f
"REQUIRE({objName}.m_verify);")
188 initObjStr = initObjStr[:-2]
if (len(type[
"messageTypes"][0]) != 0)
else initObjStr
190 objectCtors.append(initObjStr)
194 jinjaDict[
"types"] = typesInfoList
195 jinjaDict[
"seedOpt"] = seed
196 jinjaDict[
"dTypesOpt"] = desiredTypes
197 jinjaDict[
"nTypesOpt"] = nTypes
198 jinjaDict[
"entropyOpt"] = entropy
199 jinjaDict[
"objectCtors"] = objectCtors
200 jinjaDict[
"catchAsserts"] = catchAsserts
201 jinjaDict[
"testVariables"] = testVariables
207 renderedTest = testTemplate.render(jinjaDict)
210 outFolderPath =
"./gen_entropy_tests/"
211 outFolderPath = os.path.abspath(
212 os.path.join(os.path.dirname(__file__), outFolderPath)
216 pathlib.Path(outFolderPath).mkdir(exist_ok=
True)
219 outFilename = f
"generated_test_e{entropy}_n{nTypes}.cpp"
220 outPath = os.path.abspath(
221 os.path.join(outFolderPath, outFilename)
223 with open(outPath,
"w")
as outfile:
224 print(renderedTest,file=outfile)