A comparison of three verification techniques: directed testing, pseudo-random testing and property checking