# Tests for the *DSL plugin types

require 'minitest/autorun'
require 'minitest/test'
require 'byebug'

require_relative '../../../../lib/inspec/plugin/v2'

module DslUnitTests

  [
    :outer_profile_dsl,
    :control_dsl,
    :describe_dsl,
    :test_dsl,
    :resource_dsl,
  ].each do |plugin_type_under_test|

    Class.new(MiniTest::Test) do
      # Assign name to anonymous class, so test output is meaningful
      Object.const_set(plugin_type_under_test.to_s.upcase + '_UnitTests', self)

      # One day I will understand Ruby scoping and closures.
      # Until then, re-expose this as class variable.
      @@plugin_type = plugin_type_under_test

      def test_calling_Inspec_dot_plugin_with_plugin_type_returns_the_base_class
        klass = Inspec.plugin(2, @@plugin_type)
        assert_kind_of Class, klass
        assert_equal 'Inspec::Plugin::V2::PluginType::Dsl', klass.name
      end

      def test_plugin_type_base_classes_can_be_accessed_by_name
        klass = Inspec::Plugin::V2::PluginBase.base_class_for_type(@@plugin_type)
        assert_kind_of Class, klass
        assert_equal 'Inspec::Plugin::V2::PluginType::Dsl', klass.name
      end

      def test_plugin_type_registers_an_activation_dsl_method
        klass = Inspec::Plugin::V2::PluginBase
        assert_respond_to klass, @@plugin_type, "Activation method for #{@@plugin_type}"
      end
    end
  end
end