with test and doc