## This class consists of helper methods for regexing logs
##
## TODO - clean up the style. looks like it was written in the early 90s
##
## $Id$

class Regexr

	def initialize(verbose=false, case_insensitive=true)
		@verbose = verbose
		@case_insensitive = case_insensitive
	end

	# Check for the beginning and end lines. Handy when you need to ensure a log has started & completed
	def verify_start_and_end(data,the_start,the_end)
		return false unless data
		
		data_lines = data.split("\n")
		regex_start   = Regexp.new(the_start, @case_insensitive)
		regex_end = Regexp.new(the_end, @case_insensitive)

		if regex_start =~ data_lines.first
			return regex_end =~ data_lines.last
		end
		
		return false
	end

	# Scan for any number of success lines. In order to pass, all successes must match.
	def find_strings_that_dont_exist_in_data(data,regexes=[])
		return false unless data

		data_lines = data.split("\n")
		
		return nil unless regexes ## count as a pass
		
		if regexes
			target_successes = regexes.size
			success_count = 0
			regexes.each { |condition|

				## assume we haven't got it
				found = false
				 
				re = Regexp.new(condition, @case_insensitive)
				
				## for each of our data lines
				data_lines.each {|line|
				
					## if it's a match
					if line =~ re
						found = true
						break ## success!
					end
				}
				
				if !found
					return condition ## return this string, it wasn't found.
				end
			}
		end
		
		nil ## got all successes, woot!
	end

	# Scan for failures -- if any single failure matches, the test returns true.
	def find_strings_that_exist_in_data_except(data,regexes=[],exceptions=[])

		return false unless data

		data_lines = data.split("\n")
		
		return nil unless regexes ## count as a pass

		regexes.each { |condition|

			## for each failure condition that we've been passed 
			re = Regexp.new(condition, @case_insensitive)

			## assume we're okay
			found = false				

			data_lines.each { |line|
				if re =~ line
					found = true # oh, we found a match
					
					# but let's check the exceptions
					exceptions.map { |exception|
						reg_exception = Regexp.new(exception, @case_insensitive)

						# If the exception matches here, we'll spare it
						if reg_exception =~ line
							found = false
							break
						end
					}

					# If we didn't find an exception, we have to fail it. do not pass go. 
					return condition if found
				end
			}
		}
		
		nil ## no failures found!
	end
end
