lib/tryouts/expectation_evaluators/registry.rb



# lib/tryouts/expectation_evaluators/registry.rb

require_relative 'expectation_result'
require_relative 'base'
require_relative 'regular'
require_relative 'exception'
require_relative 'boolean'
require_relative 'true'
require_relative 'false'
require_relative 'result_type'
require_relative 'regex_match'
require_relative 'performance_time'
require_relative 'intentional_failure'
require_relative 'output'

class Tryouts
  module ExpectationEvaluators
    class Registry
      @evaluators = []

      class << self
        attr_reader :evaluators

        def evaluator_for(expectation, test_case, context)
          evaluator_class = find_evaluator_class(expectation.type)

          unless evaluator_class
            raise ArgumentError, "No evaluator found for expectation type: #{expectation.type}"
          end

          evaluator_class.new(expectation, test_case, context)
        end

        def register(evaluator_class)
          unless evaluator_class < Base
            raise ArgumentError, 'Evaluator must inherit from ExpectationEvaluators::Base'
          end

          @evaluators << evaluator_class unless @evaluators.include?(evaluator_class)
        end

        def registered_evaluators
          @evaluators.dup
        end

        private

        def find_evaluator_class(expectation_type)
          @evaluators.find { |evaluator_class| evaluator_class.handles?(expectation_type) }
        end
      end

      # Auto-register built-in evaluators
      register(Regular)
      register(Exception)
      register(Boolean)
      register(True)
      register(False)
      register(ResultType)
      register(RegexMatch)
      register(PerformanceTime)
      register(IntentionalFailure)
      register(Output)
    end
  end
end