fix bugs
add tests