add tests & fixed bugs