add unit test and etc