#!/usr/bin/env ruby
# frozen_string_literal: true

require "find"

ALLOWED_LABELS = %w[
  unit
  integration
  benchmark
  transactions
].freeze

test_dir = File.expand_path("../test", __dir__)
tests_missing_label = []
tests_missing_allowed_label = []

Find.find(test_dir) do |path|
  next unless File.file?(path)
  next unless File.basename(path).start_with?("test_")

  content = File.read(path)
  content.delete("\n").scan(/TEST_CASE\(("(.*?)")\)/) do |match|
    test_name = "#{match[0]} (#{path})"
    labels = match[0].scan(/\[(.*?)\]/)
    if labels.empty?
      tests_missing_label << test_name
    elsif !labels.flatten.intersect?(ALLOWED_LABELS)
      tests_missing_allowed_label << test_name
    end
  end
end

unless tests_missing_label.empty?
  puts "Tests missing label:"
  tests_missing_label.each do |test|
    puts "  #{test}"
  end
end

unless tests_missing_allowed_label.empty?
  puts "Tests have labels, but missing allowed ones:"
  tests_missing_allowed_label.each do |label|
    puts "  #{label}"
  end
end

unless tests_missing_label.empty? && tests_missing_allowed_label.empty?
  puts "\nERROR: Missing or unexpected test labels found. This can result in tests not being run in CI."
  exit 1
end
