Files
swift-mirror/utils/fuzzer/fuzzer.py
2014-08-01 04:40:25 +00:00

99 lines
3.7 KiB
Python

import random
from random import randint
"""
A simple python script for generating lots of Swift code. This code should compile but not necessarily run successfully.
"""
inLoop = False
NUMFUNC = 30
def getptvar(): return random.choice(["pt2", "pt1"])
def maybe(): return random.random() > 0.5
def getexpr():
global inLoop
if (maybe() and maybe()): return random.choice([getifexpr, getifexpr, getifexpr, getrangeexpr])()
if (maybe()): return getvarvalue(True) + " += " + getvarvalue(False)
if (maybe()): return getvarvalue(True) + " -= " + getvarvalue(False)
if (maybe()): return getvarvalue(True) + " *= " + getvarvalue(False)
if (maybe()): return "assert(" + getCond() + ")"
if (maybe() and inLoop): return "break"
if (maybe() and inLoop): return "continue"
var1 = getvarvalue(True)
var2 = var1
while (var1 == var2): var2 = getvarvalue(True)
if (maybe()): return "swap(&" + var1 +",&" + var2 + ")"
if (maybe()):
ptObj = getptvar()
funcNum = str(randint(0, NUMFUNC - 1))
randDir = random.choice(["d", "Direction.Up"])
barcode = random.choice(["b", "Barcode.Num(" + getvarvalue() + ")", "Barcode.Str(\"bar\")"])
closure = random.choice(["cb", "{ return " + getvarvalue() + "}", "{1}"])
return "foo" + funcNum + "(" + getvarvalue() + "," + getvarvalue() + "," + randDir + "," + barcode + ",&" + ptObj + "," + closure + ")"
if (maybe()): return "print(\"\(" + getvarvalue(True) + ")\")"
if (maybe()): return "k += \"3\""
if (maybe()): return "return ;"
return "assert(true)"
def getCond():
if (maybe()): return getvarvalue(False) + " > " + getvarvalue(False)
if (maybe()): return getvarvalue(False) + " < " + getvarvalue(False)
if (maybe()): return getvarvalue(False) + " != "+ getvarvalue(False)
if (maybe()): return "d == Direction." + random.choice(["Up","Down"])
if (maybe()): return getCond() + " && " + getCond()
if (maybe()): return getCond() + " || " + getCond()
return "true"
def getifexpr():
return "if (" + getCond() + ") {\n" + getexpr() + "\n} else {\n" + getexpr() + "\n}"
def getvarvalue(needToBeWritable = False):
values = ["glob", "x2", "y2", "arr[" + str(randint(0,10)) + "]", "pt2.X", "pt2.Y", "pt1.X", "pt1.Y"]
if not needToBeWritable: values += ["x!", "y", "cb()", str(randint(0, 100))]
return random.choice(values)
def getrangeexpr():
global inLoop
if (maybe()): return "switch " + getvarvalue(True) + " {\n case 0: " + getexpr() + "\n\n case 1: \n" + getexpr() + "\n\n default: \n" + getexpr() + "\n\n}\n"
if (maybe()): return "switch d {\n case .Up: \n" + getexpr() + "\n\n case .Down: \n" + getexpr() + "\n\n}\n"
if (maybe()): return "switch b {\n case let .Str(ss): \n" + " k += ss " + "\n\n case let .Num(ii): \n" + " y2 = ii\n" + "\n case .None:\n" + getexpr() + "\n}\n"
nextOperator = "..<" if maybe() else "..."
oldInLoop = inLoop
inLoop = True
loopStr = "for i in 0" + nextOperator + getvarvalue(True) + " {\n" + getexpr() + "\n}\n"
inLoop = oldInLoop
return loopStr
def gen_func(name):
sb = """
func """ + name + """(x : Int?, y: Int, d : Direction, b : Barcode, inout pt2 : Point, cb : () -> Int) {
var x2 : Int = 0
var y2 : Int = 0
var arr = [1,2,3,4,5,6,7,8,9,10]
var pt1 = pt2
var k : String = "hi"
"""
for i in range(randint(0,90)):
sb += getexpr() + "\n"
return sb + "}\n"
decl = random.choice(["struct ","final class ", "class "])
print decl + """ Point { init(_ x : Int, _ y : Int) {\nX=x\nY=y\n}\nvar X : Int\nvar Y: Int}
enum Barcode {\ncase Str(String)\ncase Num(Int)\ncase None}
enum Direction {\ncase Up\ncase Down\n}
var glob : Int = 9
"""
for i in xrange(NUMFUNC):
print (gen_func("foo" + str(i)))
print("var tmp = Point(0,0)\nfoo0(1,2, Direction.Down, Barcode.None, &tmp, {return 0})")