@@ -3049,3 +3049,110 @@ class ProgramBuilderTests: XCTestCase {
30493049 }
30503050 }
30513051}
3052+
3053+ class ProgramBuilderRuntimeDataTests : XCTestCase {
3054+ func runFuzzerWithGenerator( _ generator: CodeGenerator ) -> String {
3055+ let fuzzer = makeMockFuzzer ( overwriteGenerators: WeightedList ( [ ( generator, 1 ) ] ) )
3056+ let b = fuzzer. makeBuilder ( )
3057+
3058+ let syntheticGenerator = b. assembleSyntheticGenerator ( for: generator)
3059+ XCTAssertNotNil ( syntheticGenerator)
3060+ let numInstructions = b. complete ( generator: syntheticGenerator!, withBudget: 3 )
3061+ XCTAssertGreaterThan ( numInstructions, 0 )
3062+
3063+ let program = b. finalize ( )
3064+ return fuzzer. lifter. lift ( program)
3065+ }
3066+
3067+ func testNested( ) {
3068+ let loopGenerator = CodeGenerator ( " TestDoWhileLoop " , [
3069+ GeneratorStub ( " BeginLoop " ) { b in
3070+ let loopVar = b. loadInt ( 0 )
3071+ b. runtimeData. push ( " loopVar " , loopVar)
3072+ b. emit ( BeginDoWhileLoopBody ( ) )
3073+ } ,
3074+ GeneratorStub ( " EndLoop " ) { b in
3075+ let loopVar = b. runtimeData. pop ( " loopVar " )
3076+ b. unary ( . PreInc, loopVar)
3077+ b. emit ( BeginDoWhileLoopHeader ( ) )
3078+ let cond = b. compare ( loopVar, with: b. loadInt ( 3 ) , using: . lessThan)
3079+ b. emit ( EndDoWhileLoop ( ) , withInputs: [ cond] )
3080+ }
3081+ ] )
3082+ XCTAssertEqual (
3083+ runFuzzerWithGenerator ( loopGenerator) ,
3084+ """
3085+ let v0 = 0;
3086+ do {
3087+ let v1 = 0;
3088+ do {
3089+ ++v1;
3090+ } while (v1 < 3)
3091+ ++v0;
3092+ } while (v0 < 3)
3093+
3094+ """ )
3095+ }
3096+
3097+ func testMultiLabel( ) {
3098+ var counter : Int64 = 0
3099+ let defineAndAddGenerator = CodeGenerator ( " TestMultiLabel " , [
3100+ GeneratorStub ( " Define " ) { b in
3101+ b. runtimeData. push ( " first " , b. loadInt ( counter) )
3102+ counter += 1
3103+ b. runtimeData. push ( " second " , b. loadInt ( counter) )
3104+ counter += 1
3105+ b. runtimeData. push ( " third " , b. loadInt ( counter) )
3106+ counter += 1
3107+ } ,
3108+ GeneratorStub ( " Add " ) { b in
3109+ // The order in which the different lables are popped doesn't matter.
3110+ let third = b. runtimeData. pop ( " third " )
3111+ let first = b. runtimeData. pop ( " first " )
3112+ let second = b. runtimeData. pop ( " second " )
3113+ b. binary ( b. binary ( first, second, with: . Add) , third, with: . Add)
3114+ }
3115+ ] )
3116+ XCTAssertEqual (
3117+ runFuzzerWithGenerator ( defineAndAddGenerator) ,
3118+ """
3119+ (3 + 4) + 5;
3120+ (0 + 1) + 2;
3121+
3122+ """ )
3123+ }
3124+
3125+ func testPassOn( ) {
3126+ var counter : Int64 = 10
3127+ let defineAndAddGenerator = CodeGenerator ( " TestPassOn " , [
3128+ GeneratorStub ( " Define " ) { b in
3129+ let value = b. loadInt ( counter)
3130+ b. runtimeData. push ( " value " , value)
3131+ b. binary ( value, b. loadInt ( 0 ) , with: . Add)
3132+ counter += 1
3133+ } ,
3134+ GeneratorStub ( " AddOne " ) { b in
3135+ let value = b. runtimeData. popAndPush ( " value " )
3136+ b. binary ( value, b. loadInt ( 1 ) , with: . Add)
3137+ } ,
3138+ GeneratorStub ( " SubOne " ) { b in
3139+ let value = b. runtimeData. pop ( " value " )
3140+ b. binary ( value, b. loadInt ( 1 ) , with: . Sub)
3141+ } ,
3142+ ] )
3143+ XCTAssertEqual (
3144+ runFuzzerWithGenerator ( defineAndAddGenerator) ,
3145+ """
3146+ 10 + 0;
3147+ 11 + 0;
3148+ 11 + 1;
3149+ 11 - 1;
3150+ 10 + 1;
3151+ 12 + 0;
3152+ 12 + 1;
3153+ 12 - 1;
3154+ 10 - 1;
3155+
3156+ """ )
3157+ }
3158+ }
0 commit comments