make not.have() work correctly by breaking out iteration and testing logic to discrete functions