# this is a simple script that checks if all About* classes are called
# from the main method, and that all about* methods in these files
# are called from the meditate method.

sourcedirname = "CPPKoans"

dirname =  File.dirname(File.realpath(__FILE__))
puts dirname
Dir.chdir(File.join(dirname,"..",sourcedirname))
aboutfiles = Dir.glob("About*.cpp") 
aboutnames = aboutfiles.map{ |f| f.gsub(/.cpp/,"")}

file = File.open("CPPKoans.cpp", "rb")
main = file.read
file.close

aboutnames.each do | about |
  unless main.include? about+"::meditate" 
    puts "!!! Warning: " +about + " is missing in main!!!"
  end 
end

aboutfiles.each do | filename |
  f = File.open(filename,'rb')
  content = f.read
  f.close
  aboutmethods = content.scan /void about.*\(\)/
  aboutmethods = aboutmethods.map{|m| m.gsub(/ *void *(\w*).*/,"\\1")}  
  aboutmethods.each do | aboutmethod |
    
    unless content.match "\s*#{aboutmethod}\\(\\);\s*"
      puts "!!! Missing call to " + aboutmethod +" in "+filename +" !!!"
    end 
  end
end
