add tests and fix a bug