add unit test
optimize