add more tests, and trait impl on enum states