add almost all of the test, but also I need to add more comments.