class Pretentious::MinitestGenerator
Generator
that outputs minitest specs
Public Class Methods
to_sym()
click to toggle source
# File lib/pretentious/minitest_generator.rb, line 4 def self.to_sym :minitest end
Private Class Methods
helper(output_folder)
click to toggle source
# File lib/pretentious/minitest_generator.rb, line 216 def self.helper(output_folder) filename = File.join(output_folder, 'minitest_helper.rb') unless File.exist?(filename) File.open(filename, 'w') do |f| f.write("# Place your requires here\n") f.write("require 'minitest/stub_any_instance'\n") end puts "#{filename}" end end
location(output_folder)
click to toggle source
# File lib/pretentious/minitest_generator.rb, line 206 def self.location(output_folder) output_folder.nil? ? 'test' : File.join(output_folder, 'test') end
naming(output_folder, klass)
click to toggle source
# File lib/pretentious/minitest_generator.rb, line 210 def self.naming(output_folder, klass) klass_name_parts = klass.name.split('::') last_part = klass_name_parts.pop File.join(output_folder, "test_#{Pretentious::DdtUtils.to_underscore(last_part)}.rb") end
Public Instance Methods
begin_spec(test_class)
click to toggle source
# File lib/pretentious/minitest_generator.rb, line 8 def begin_spec(test_class) @test_class = test_class buffer('# This file was automatically generated by the pretentious gem') buffer("require 'minitest_helper'") buffer("require 'minitest/autorun'") whitespace buffer("class #{test_class.name}Test < Minitest::Test") buffer('end') whitespace end
end_spec()
click to toggle source
# File lib/pretentious/minitest_generator.rb, line 19 def end_spec end
output()
click to toggle source
# File lib/pretentious/minitest_generator.rb, line 22 def output @output_buffer end
Private Instance Methods
generate(test_instance, instance_count)
click to toggle source
# File lib/pretentious/minitest_generator.rb, line 28 def generate(test_instance, instance_count) output_buffer = '' if test_instance.is_a? Class buffer_to_string(output_buffer, "class #{test_instance.test_class.name}Scenario#{instance_count} < #{@test_class.name}Test", 0) # class methods class_method_calls = test_instance.method_calls_by_method context = Pretentious::Context.new(test_instance.let_variables) buffer_inline_to_string(output_buffer, generate_specs(context, "#{test_instance.test_class.name}::", test_instance.test_class.name, class_method_calls)) buffer_to_string(output_buffer, 'end', 0) else buffer_to_string(output_buffer, "class #{test_instance.test_class.name}Scenario#{instance_count} < #{@test_class.name}Test", 0) buffer_to_string(output_buffer, 'def setup', 1) context, declarations = setup_fixture(test_instance) method_calls = test_instance.method_calls_by_method specs_buffer = generate_specs(context.subcontext(declarations[:declaration]), "#{test_instance.test_class.name}#", '@fixture', method_calls) context.declared_names = {} buffer_inline_to_string(output_buffer, @deconstructor.build_output(context, 2 * @_indentation.length, declarations)) buffer_to_string(output_buffer, 'end', 1) buffer_to_string(output_buffer, '') buffer_inline_to_string(output_buffer, specs_buffer) buffer_to_string(output_buffer, 'end', 0) end output_buffer end
generate_expectation(context, fixture, method, params, block, result)
click to toggle source
# File lib/pretentious/minitest_generator.rb, line 70 def generate_expectation(context, fixture, method, params, block, result) str = '' block_source = if !block.nil? && block.is_a?(Pretentious::RecordedProc) get_block_source(context, block) else '' end statement = if params.size > 0 "#{fixture}.#{prettify_method_name method}(#{params_generator(context, params)})#{block_source}" else stmt = [] m_stmt = "#{fixture}.#{method}" m_stmt << "(#{block_source})" unless block_source.empty? stmt << m_stmt stmt.join(' ') end if result.is_a? Exception str << pick_matcher(context, statement, result) else str << pick_matcher(context, statement, result) end str end
generate_minitest_stub(context, mocks_collection, indentation_level, &block)
click to toggle source
# File lib/pretentious/minitest_generator.rb, line 165 def generate_minitest_stub(context, mocks_collection, indentation_level, &block) str = '' current_indentation = indentation_level mocks_collection.each do |_k, values| indentation = '' current_indentation.times { indentation << @_indentation } vals = values.collect { |v| context.value_of(v[:result]) } str << "#{indentation}#{values[0][:class]}.stub_any_instance(:#{values[0][:method]}, #{vals[0]}) do\n" current_indentation += 1 end str << block.call(current_indentation) current_indentation -= 1 mocks_collection.each do indentation = '' current_indentation.times { indentation << @_indentation } str << "#{indentation}end\n" current_indentation -= 1 end str end
generate_specs(context, context_prefix, fixture, method_calls)
click to toggle source
# File lib/pretentious/minitest_generator.rb, line 96 def generate_specs(context, context_prefix, fixture, method_calls) output = '' buffer_to_string(output, 'def test_current_expectation', 1) # collect all params params_collection = [] mocks_collection = {} method_calls.each_key do |k| info_blocks_arr = method_calls[k] info_blocks_arr.each do |block| params_collection |= block[:params] if !Pretentious::Deconstructor.primitive?(block[:result]) && !block[:result].is_a?(Exception) params_collection << block[:result] end params_collection << block[:block] unless block[:block].nil? block[:context][:calls].each do |mock_block| k = "#{mock_block[:class]}_#{mock_block[:method]}" mocks_collection[k] = [] if mocks_collection[k].nil? mocks_collection[k] << mock_block params_collection << mock_block[:result] end if block[:context] end end if method_calls if params_collection.size > 0 deps = declare_dependencies(context, params_collection, 2) buffer_to_string(output, deps) if deps.strip != '' end if mocks_collection.keys.size > 0 minitest_stub = generate_minitest_stub(context, mocks_collection, 2) do |indentation| generate_test_scenarios(context, fixture, method_calls, context_prefix, indentation) end buffer_to_string(output, minitest_stub, 0) else buffer_inline_to_string(output, generate_test_scenarios(context, fixture, method_calls, context_prefix, 2), 0) end buffer_to_string(output, 'end', 1) output end
generate_test_scenarios(context, fixture, method_calls, context_prefix, indentation_level)
click to toggle source
# File lib/pretentious/minitest_generator.rb, line 142 def generate_test_scenarios(context, fixture, method_calls, context_prefix, indentation_level) expectations = [] indentation = '' indentation_level.times { indentation << @_indentation } method_calls.each_key do |k| info_blocks_arr = method_calls[k] info_blocks_arr.each do |block| str = '' params_desc_str = if block[:params].size > 0 "when passed #{desc_params(block)}" else '' end str << "#{indentation}# #{context_prefix}#{k} #{params_desc_str} should return #{context.value_of(block[:result])}\n" str << "#{indentation}#{generate_expectation(context, fixture, k, block[:params], block[:block], block[:result])}\n" expectations << str unless expectations.include? str end end if method_calls expectations.join("\n") end
get_block_source(context, block)
click to toggle source
# File lib/pretentious/minitest_generator.rb, line 66 def get_block_source(context, block) " &#{context.pick_name(block.target_proc.object_id)}" end
pick_matcher(context, statement, result)
click to toggle source
# File lib/pretentious/minitest_generator.rb, line 190 def pick_matcher(context, statement, result) if result.is_a? TrueClass "assert #{statement}" elsif result.is_a? FalseClass "refute #{statement}" elsif result.nil? "assert_nil #{statement}" elsif result.is_a? Exception "assert_raises(#{result.class}) { #{statement} }" elsif context.variable_map[result.object_id] "assert_equal #{context.value_of(result)}, #{statement}" else "assert_equal #{Pretentious.value_ize(Pretentious::Context.new, result)}, #{statement}" end end
proc_function_generator(block, method)
click to toggle source
# File lib/pretentious/minitest_generator.rb, line 62 def proc_function_generator(block, method) "func_#{method}(#{Pretentious::Deconstructor.block_params_generator(block)})" end