parent
67264ca941
commit
d498ae8d6a
@ -0,0 +1,23 @@ |
|||||||
|
import traceback |
||||||
|
|
||||||
|
class DBCError(Exception): pass |
||||||
|
class CheckError(DBCError): pass |
||||||
|
class PreError(DBCError): pass |
||||||
|
class PostError(DBCError): pass |
||||||
|
class SentinelError(DBCError): pass |
||||||
|
|
||||||
|
def check(test, msg, cls=CheckError): |
||||||
|
print(">>> ", msg) |
||||||
|
traceback.print_stack(limit=-1) |
||||||
|
if not test: |
||||||
|
raise cls(msg) |
||||||
|
|
||||||
|
def pre(test, msg): |
||||||
|
check(test, msg, PreError) |
||||||
|
|
||||||
|
def post(test, msg): |
||||||
|
check(test, msg, PostError) |
||||||
|
|
||||||
|
def sentinel(): |
||||||
|
traceback.print_stack(limit=-1) |
||||||
|
raise SentinelError() |
@ -0,0 +1,26 @@ |
|||||||
|
import dbc |
||||||
|
import traceback |
||||||
|
|
||||||
|
print("---- CHECK ---") |
||||||
|
try: |
||||||
|
dbc.check(1 == 2, "Check Failed!") |
||||||
|
except dbc.CheckError as e: |
||||||
|
print("Check failure:", e) |
||||||
|
|
||||||
|
print("---- SENTINEL ---") |
||||||
|
try: |
||||||
|
dbc.sentinel() |
||||||
|
except dbc.SentinelError as e: |
||||||
|
print("Sentinel failure:", e) |
||||||
|
|
||||||
|
print("---- PRECOND ---") |
||||||
|
try: |
||||||
|
dbc.pre(1 == 2, "Pre Failed!") |
||||||
|
except dbc.PreError as e: |
||||||
|
print("Pre condition failure: ", e) |
||||||
|
|
||||||
|
print("---- POSTCOND ---") |
||||||
|
try: |
||||||
|
dbc.post(1 == 2, "Post Failed!") |
||||||
|
except dbc.PostError as e: |
||||||
|
print("Post condition failure:", e) |
@ -0,0 +1,55 @@ |
|||||||
|
|
||||||
|
def START(): |
||||||
|
return LISTENING |
||||||
|
|
||||||
|
def LISTENING(event): |
||||||
|
if event == "connect": |
||||||
|
return CONNECTED |
||||||
|
elif event == "error": |
||||||
|
return LISTENING |
||||||
|
else: |
||||||
|
return ERROR |
||||||
|
|
||||||
|
def CONNECTED(event): |
||||||
|
if event == "accept": |
||||||
|
return ACCEPTED |
||||||
|
elif event == "close": |
||||||
|
return CLOSED |
||||||
|
else: |
||||||
|
return ERROR |
||||||
|
|
||||||
|
def ACCEPTED(event): |
||||||
|
if event == "close": |
||||||
|
return CLOSED |
||||||
|
elif event == "read": |
||||||
|
return READING(event) |
||||||
|
elif event == "write": |
||||||
|
return WRITING(event) |
||||||
|
else: |
||||||
|
return ERROR |
||||||
|
|
||||||
|
def READING(event): |
||||||
|
if event == "read": |
||||||
|
return READING |
||||||
|
elif event == "write": |
||||||
|
return WRITING(event) |
||||||
|
elif event == "close": |
||||||
|
return CLOSED |
||||||
|
else: |
||||||
|
return ERROR |
||||||
|
|
||||||
|
def WRITING(event): |
||||||
|
if event == "read": |
||||||
|
return READING(event) |
||||||
|
elif event == "write": |
||||||
|
return WRITING |
||||||
|
elif event == "close": |
||||||
|
return CLOSED |
||||||
|
else: |
||||||
|
return ERROR |
||||||
|
|
||||||
|
def CLOSED(event): |
||||||
|
return LISTENING(event) |
||||||
|
|
||||||
|
def ERROR(event): |
||||||
|
return ERROR |
@ -0,0 +1,8 @@ |
|||||||
|
import fsm |
||||||
|
|
||||||
|
state = fsm.START() |
||||||
|
script = ["connect", "accept", "read", "read", "write", "close", "connect"] |
||||||
|
|
||||||
|
for event in script: |
||||||
|
print(event, ">>>", state) |
||||||
|
state = state(event) |
@ -0,0 +1,3 @@ |
|||||||
|
Welcome! |
||||||
|
|
||||||
|
Working on a blog post about Finite State Machines and Design-by-Contract. Feel free to ask for advice about anything programming or art related. |
Loading…
Reference in new issue