add more test case
add an implemetation