add tests & fix bugs