# vim: set sw=2 sts=2 et tw=80 : require 'rspec' # XXX Super ugly hack to keep from starting beaker nodes module Kernel # make an alias of the original require alias original_require require # rewrite require def require(name) original_require name if name != 'spec_helper_acceptance' end end UNSUPPORTED_PLATFORMS = [].freeze def fact(*_args) [] end # XXX End hax # Get a list of functions for test coverage function_list = Dir[File.join(File.dirname(__FILE__), '..', '..', 'lib', 'puppet', 'parser', 'functions', '*.rb')].map do |function_rb| File.basename(function_rb, '.rb') end ## Configure rspec to parse tests options = RSpec::Core::ConfigurationOptions.new(['spec/acceptance']) configuration = RSpec.configuration world = RSpec.world options.parse_options options.configure(configuration) configuration.load_spec_files ## Collect up tests and example groups into a hash def get_tests(children) children.each_with_object({}) do |c, memo| memo[c.description] = {} memo[c.description]['groups'] = get_tests(c.children) unless c.children.empty? unless c.examples.empty? memo[c.description]['tests'] = c.examples.map { |e| e.description unless e.pending? }.compact end next if c.examples.empty? memo[c.description]['pending_tests'] = c.examples.map { |e| e.description if e.pending? }.compact end end def count_test_types_in(type, group) return 0 if group.nil? group.reduce(0) do |m, (k, v)| m += v.length if k == type m += count_tests_in(v) if v.is_a?(Hash) m end end def count_tests_in(group) count_test_types_in('tests', group) end def count_pending_tests_in(group) count_test_types_in('pending_tests', group) end # Convert tests hash to csv format def to_csv(function_list, tests) function_list.map { |function_name| v = tests["#{function_name} function"] if v positive_tests = count_tests_in(v['groups']['success']) negative_tests = count_tests_in(v['groups']['failure']) pending_tests = count_pending_tests_in(v['groups']['failure']) + count_pending_tests_in(v['groups']['failure']) else positive_tests = 0 negative_tests = 0 pending_tests = 0 end '%-25s, %-9d, %-9d, %-9d' % [function_name, positive_tests, negative_tests, pending_tests] }.compact end tests = get_tests(world.example_groups) csv = to_csv(function_list, tests) percentage_tested = "#{tests.count * 100 / function_list.count}%" printf("%-25s, %-9s, %-9s, %-9s\n", "#{percentage_tested} have tests.", 'Positive', 'Negative', 'Pending') puts csv