first commit
refine codes
add new test cases