lib/rantly/property.rb in rantly-1.2.0 vs lib/rantly/property.rb in rantly-2.0.0

- old
+ new

@@ -1,14 +1,14 @@ require 'rantly' require 'pp' require 'stringio' class Rantly::Property - attr_reader :failed_data, :shrunk_failed_data, :io + attr_reader :failed_data, :shrunk_failed_data - VERBOSITY = ENV.fetch('RANTLY_VERBOSE'){ 1 }.to_i - RANTLY_COUNT = ENV.fetch('RANTLY_COUNT'){ 100 }.to_i + VERBOSITY = ENV.fetch('RANTLY_VERBOSE') { 1 }.to_i + RANTLY_COUNT = ENV.fetch('RANTLY_COUNT') { 100 }.to_i def io @io ||= if VERBOSITY >= 1 STDOUT else @@ -22,50 +22,47 @@ def initialize(property) @property = property end - def check(n=RANTLY_COUNT,limit=10,&assertion) + def check(n = RANTLY_COUNT, limit = 10, &assertion) i = 0 test_data = nil begin - Rantly.singleton.generate(n,limit,@property) do |val| + Rantly.singleton.generate(n, limit, @property) do |val| test_data = val - assertion.call(val) if assertion - io.puts "" if i % 100 == 0 - io.print "." if i % 10 == 0 + yield(val) if assertion + io.puts '' if (i % 100).zero? + io.print '.' if (i % 10).zero? i += 1 end io.puts - io.puts "success: #{i} tests" + io.puts "SUCCESS - #{i} successful tests" rescue Rantly::TooManyTries => e io.puts - io.puts "too many tries: #{e.tries}" - raise e + io.puts "FAILURE - #{i} successful tests, too many tries: #{e.tries}" + raise e.exception("#{i} successful tests, too many tries: #{e.tries} (limit: #{e.limit})") rescue Exception => boom io.puts - io.puts "failure: #{i} tests, on:" + io.puts "FAILURE - #{i} successful tests, failed on:" pretty_print test_data @failed_data = test_data if @failed_data.respond_to?(:shrink) @shrunk_failed_data, @depth = shrinkify(assertion, @failed_data) - io.puts "minimal failed data (depth #{@depth}) is:" + io.puts "Minimal failed data (depth #{@depth}) is:" pretty_print @shrunk_failed_data end - raise $!, "failure: #{i} tests, on:\n#{test_data}\n\n#{boom}\n", $@ + raise boom.exception("#{i} successful tests, failed on:\n#{test_data}\n\n#{boom}\n") end end # Explore the failures tree - def shrinkify(assertion, data, depth=0, iteration=0) - io.puts "Shrinking at depth #{depth}:" - pretty_print data - + def shrinkify(assertion, data, depth = 0, iteration = 0) min_data = data max_depth = depth if data.shrinkable? - while iteration < 1024 do + while iteration < 1024 # We assume that data.shrink is non-destructive shrunk_data = data.shrink begin assertion.call(shrunk_data) rescue Exception @@ -74,11 +71,11 @@ if branch_depth > max_depth min_data = branch_data max_depth = branch_depth end end - break if !data.retry? + break unless data.retry? end end - return min_data, max_depth, iteration + [min_data, max_depth, iteration] end end