import functools from lib.test import run_scenario # from srcgen.lock_controller import LockController from srcgen.solution import Solution as LockController # Teacher's solution # For each test scenario, sends a sequence of timed input events to the statechart, and checks if the expected sequence of timed output events occurs. # Each timed event is a tuple (timestamp, event_name, parameter_value) # For events that don't have a parameter, the parameter value is always 'None'. # Timestamps are in nanoseconds since simulation start! SCENARIOS = [ { "name": "normal operation, serve two requests", "input_events": [ (0, "water_lvl", 508), (2393556604, "request_lvl_change", None), (4493556604, "water_lvl", 675), (4593556604, "water_lvl", 811), (4693556604, "water_lvl", 926), (4793556604, "water_lvl", 1025), (4893556604, "water_lvl", 1105), (4993556604, "water_lvl", 1176), (5093556604, "water_lvl", 1228), (5193556604, "water_lvl", 1276), (5293556604, "water_lvl", 1316), (5393556604, "water_lvl", 1352), (5493556604, "water_lvl", 1375), (5593556604, "water_lvl", 1395), (5693556604, "water_lvl", 1419), (5793556604, "water_lvl", 1433), (5893556604, "water_lvl", 1443), (5993556604, "water_lvl", 1460), (6093556604, "water_lvl", 1470), (6193556604, "water_lvl", 1476), (6293556604, "water_lvl", 1483), (6393556604, "water_lvl", 1482), (6493556604, "water_lvl", 1491), (6593556604, "water_lvl", 1496), (6693556604, "water_lvl", 1497), (6793556604, "water_lvl", 1498), (6893556604, "water_lvl", 1496), (6993556604, "water_lvl", 1501), (7093556604, "water_lvl", 1504), (7193556604, "water_lvl", 1509), (9193747734, "request_lvl_change", None), (11293747734, "water_lvl", 1341), (11393747734, "water_lvl", 1197), (11493747734, "water_lvl", 1084), (11593747734, "water_lvl", 981), (11693747734, "water_lvl", 906), (11793747734, "water_lvl", 836), (11893747734, "water_lvl", 774), (11993747734, "water_lvl", 735), (12093747734, "water_lvl", 692), (12193747734, "water_lvl", 664), (12293747734, "water_lvl", 636), (12393747734, "water_lvl", 606), (12493747734, "water_lvl", 592), (12593747734, "water_lvl", 581), (12693747734, "water_lvl", 561), (12793747734, "water_lvl", 551), (12893747734, "water_lvl", 548), (12993747734, "water_lvl", 533), (13093747734, "water_lvl", 531), (13193747734, "water_lvl", 522), (13293747734, "water_lvl", 525), (13393747734, "water_lvl", 520), (13493747734, "water_lvl", 513), (13593747734, "water_lvl", 507), (13693747734, "water_lvl", 507), (13793747734, "water_lvl", 507), (13893747734, "water_lvl", 510), (13993747734, "water_lvl", 501), (14093747734, "water_lvl", 504), ], "output_events": [ (0, "open_doors", 0), (0, "green_light", 0), (2393556604, "red_light", 0), (2393556604, "set_request_pending", True), (4393556604, "close_doors", 0), (4393556604, "open_flow", 1), (7193556604, "close_flow", 1), (7193556604, "set_request_pending", False), (7193556604, "open_doors", 1), (7193556604, "green_light", 1), (9193747734, "red_light", 1), (9193747734, "set_request_pending", True), (11193747734, "close_doors", 1), (11193747734, "open_flow", 0), (14193747734, "close_flow", 0), (14193747734, "set_request_pending", False), (14193747734, "open_doors", 0), (14193747734, "green_light", 0), ], }, { "name": "break sensor, fix sensor, then change water lvl", "input_events": [ (0, "water_lvl", 508), (2084169493, "water_lvl", 99007), (4084274216, "water_lvl", 504), (5420871976, "resume", None), (7100735485, "request_lvl_change", None), (9200735485, "water_lvl", 670), (9300735485, "water_lvl", 812), (9400735485, "water_lvl", 927), (9500735485, "water_lvl", 1028), (9600735485, "water_lvl", 1104), (9700735485, "water_lvl", 1173), (9800735485, "water_lvl", 1231), (9900735485, "water_lvl", 1281), (10000735485, "water_lvl", 1316), (10100735485, "water_lvl", 1346), (10200735485, "water_lvl", 1378), (10300735485, "water_lvl", 1399), (10400735485, "water_lvl", 1414), (10500735485, "water_lvl", 1436), (10600735485, "water_lvl", 1450), (10700735485, "water_lvl", 1459), (10800735485, "water_lvl", 1469), (10900735485, "water_lvl", 1471), (11000735485, "water_lvl", 1481), (11100735485, "water_lvl", 1488), (11200735485, "water_lvl", 1490), (11300735485, "water_lvl", 1492), (11400735485, "water_lvl", 1491), (11500735485, "water_lvl", 1497), (11600735485, "water_lvl", 1501), (11700735485, "water_lvl", 1506), (11800735485, "water_lvl", 1508), (11900735485, "water_lvl", 1504), ], "output_events": [ (0, "open_doors", 0), (0, "green_light", 0), (2084169493, "red_light", 0), (2084169493, "close_doors", 0), (2084169493, "set_sensor_broken", None), (5420871976, "open_doors", 0), (5420871976, "green_light", 0), (7100735485, "red_light", 0), (7100735485, "set_request_pending", True), (9100735485, "close_doors", 0), (9100735485, "open_flow", 1), (11900735485, "close_flow", 1), (11900735485, "set_request_pending", False), (11900735485, "open_doors", 1), (11900735485, "green_light", 1), ], }, { "name": "break sensor DURING water lvl change, then fix and resume", "input_events": [ (0, "water_lvl", 508), (2661508910, "request_lvl_change", None), (4761508910, "water_lvl", 675), (4861508910, "water_lvl", 811), (4961508910, "water_lvl", 926), (5061508910, "water_lvl", 1025), (5093300938, "water_lvl", 99004), (7821829184, "water_lvl", 1028), (9213791769, "resume", None), (9313791769, "water_lvl", 1104), (9413791769, "water_lvl", 1173), (9513791769, "water_lvl", 1231), (9613791769, "water_lvl", 1281), (9713791769, "water_lvl", 1316), (9813791769, "water_lvl", 1346), (9913791769, "water_lvl", 1378), (10013791769, "water_lvl", 1399), (10113791769, "water_lvl", 1414), (10213791769, "water_lvl", 1436), (10313791769, "water_lvl", 1450), (10413791769, "water_lvl", 1459), (10513791769, "water_lvl", 1469), (10613791769, "water_lvl", 1471), (10713791769, "water_lvl", 1481), (10813791769, "water_lvl", 1488), (10913791769, "water_lvl", 1490), (11013791769, "water_lvl", 1492), (11113791769, "water_lvl", 1491), (11213791769, "water_lvl", 1497), (11313791769, "water_lvl", 1501), (11413791769, "water_lvl", 1506), (11513791769, "water_lvl", 1508), (11613791769, "water_lvl", 1504), ], "output_events": [ (0, "open_doors", 0), (0, "green_light", 0), (2661508910, "red_light", 0), (2661508910, "set_request_pending", True), (4661508910, "close_doors", 0), (4661508910, "open_flow", 1), (5093300938, "close_flow", 1), (5093300938, "set_sensor_broken", None), (9213791769, "open_flow", 1), (11613791769, "close_flow", 1), (11613791769, "set_request_pending", False), (11613791769, "open_doors", 1), (11613791769, "green_light", 1), ], } ] # The following output events are safe to repeat: (with same value) # This will be taken into account while comparing traces. # Do not change this: IDEMPOTENT = [ "open_doors", "close_doors", "red_light", "green_light", "set_request_pending", "open_flow", "close_flow", ] # We pretend that initially, these events occur: # Do not change this: INITIAL = [ ("open_doors", 0), ("close_doors", 1), ("green_light", 0), ("red_light", 1), ("set_request_pending", False) ] if __name__ == "__main__": ok = True for scenario in SCENARIOS: print(f"Running scenario: {scenario["name"]}") ok = run_scenario(scenario["input_events"], scenario["output_events"], LockController, INITIAL, IDEMPOTENT, verbose=False) and ok print("--------") if ok: print("All scenarios passed.") else: print("Some scenarios failed.")