class Riddler::TestGenerator

Attributes

input_filename[R]
project_root[R]
test_case[R]

Public Class Methods

new(project_root, input_filename) click to toggle source
# File lib/riddler/test_generator.rb, line 8
def initialize project_root, input_filename
  @project_root = project_root
  @input_filename = input_filename
  @test_case = YAML.safe_load File.read input_filename
end

Public Instance Methods

class_name() click to toggle source
# File lib/riddler/test_generator.rb, line 18
def class_name
  classify test_case_name
end
definition() click to toggle source
# File lib/riddler/test_generator.rb, line 22
def definition
  test_case["definition"]
end
generate() click to toggle source
# File lib/riddler/test_generator.rb, line 30
def generate
  folder = input_filename.dirname.basename.to_s
  output_filename = project_root.join *%W[ test cases #{folder} #{test_case_name}_test.rb ]
  puts "Generating #{output_filename.relative_path_from(project_root)}"
  output_filename.dirname.mkdir unless output_filename.dirname.exist?
  File.write output_filename, render
end
test_case_name() click to toggle source
# File lib/riddler/test_generator.rb, line 14
def test_case_name
  test_case["name"]
end
tests() click to toggle source
# File lib/riddler/test_generator.rb, line 26
def tests
  test_case["tests"]
end

Private Instance Methods

classify(string) click to toggle source
# File lib/riddler/test_generator.rb, line 44
def classify string
  string.split('_').collect!{ |w| w.capitalize }.join
end
render() click to toggle source
# File lib/riddler/test_generator.rb, line 40
def render
  ERB.new(test_class_template).result(binding)
end
test_class_template() click to toggle source
# File lib/riddler/test_generator.rb, line 48
    def test_class_template
      <<~TEMPLATE
        require "test_helper"

        class <%= class_name %>Test < ::Minitest::Test
          attr_reader :definition

          def setup
            @definition = <%= definition %>
          end
        <% tests.each do |test| %>
          def test_<%= test["name"] %>
            expected_result = <% if test["result"].nil? %>nil<% else %><%= test["result"] %><% end %>
            context = <% if test["context"].nil? %>nil<% else %><%= test["context"] %><% end %>

            result = ::Riddler.render definition, context
            result&.transform_keys! { |k| k.to_s }

            assert_equal_hash expected_result, result
          end
        <% end %>
        end
      TEMPLATE
    end