class TestCaseGenerator::GeneratorPython
Public Instance Methods
can_handle?(source_fn)
click to toggle source
# File lib/test_case_generator/generator_python.rb, line 6 def can_handle?(source_fn) File.extname(source_fn).eql? '.py' end
make_class_name(filename)
click to toggle source
# File lib/test_case_generator/generator_python.rb, line 15 def make_class_name(filename) File.basename filename, '.*' end
write(ctx, source_fn)
click to toggle source
# File lib/test_case_generator/generator_python.rb, line 10 def write(ctx, source_fn) write_skeleton ctx, source_fn unless File.exist? source_fn write_source ctx, source_fn end
write_skeleton(dsl_context, source_fn)
click to toggle source
# File lib/test_case_generator/generator_python.rb, line 19 def write_skeleton(dsl_context, source_fn) class_name = dsl_context.class_name || make_class_name(source_fn) File.open(source_fn, 'w') do |f| writer = IndentedWriter.new f writer.puts <<EOS #!/usr/bin/env python import os import sys import unittest # from assets.stub_android import stub_api_model # from assets.stub_android import stub_android def print_patterns(patterns): def wrapper(fn): def _(self): print print "<<TEST>> %s" % (", ".join(patterns)) fn(self) return _ return wrapper def run_pending_tasks(fn): def _(self): fn(self) while len(self.pending_tasks) > 0: # http://stackoverflow.com/questions/2612802/how-to-clone-or-copy-a-list-in-python # Use instead of a weird syntax new_list = old_list[:] pending_tasks = list(self.pending_tasks) self.pending_tasks[:] = [] for task in pending_tasks: task() # Maybe added into self.pending_tasks return _ class #{class_name}(unittest.TestCase): def setUp(self): super(#{class_name}, self).setUp() self.pending_tasks = [] self.timer_tasks = [] def tearDown(self): super(#{class_name}, self).tearDown() def _run_timer_tasks(self): timer_tasks = list(self.timer_tasks) self.timer_tasks[:] = [] for task in timer_tasks: task() # Maybe added into self.timer_tasks # %% EOS end end
write_source(dsl_context, source_fn)
click to toggle source
# File lib/test_case_generator/generator_python.rb, line 80 def write_source(dsl_context, source_fn) class_name = dsl_context.class_name || make_class_name(source_fn) tmp_fn = source_fn + '.tmp' source = File.open(source_fn).read File.open(tmp_fn, 'w') do |f| source.each_line do |line| f.puts line break if line =~ /^\s*#\s*%%\s*$/ end writer = IndentedWriter.new f writer.blank writer.block_indent ' ' do writer.puts '#' writer.puts '# 以下の行は自動生成されているので直接編集しないでください。' writer.puts '#' writer.puts '# Generated by Test Case Generator' writer.puts '# https://rubygems.org/gems/test_case_generator' writer.puts '#' end dsl_context.each do |pattern| method_name = pattern.join '_' writer.block_indent ' ' do writer.blank writer.puts "@print_patterns([#{pattern.map{|p| "'#{p}'"}.join(', ')}])" writer.puts "def test_#{method_name}(self):" pattern.each do |ptn| writer.block_indent ' ' do writer.puts "self.#{ptn}()" end end end end method_list = dsl_context.labels.map { |m| "'#{m}'" }.join(', ') writer.blank writer.puts <<EOS @classmethod def checkSanity(cls): sane = True msg = [] for method in [#{method_list}]: if not hasattr(cls, method): msg += [ ' def %s(self):' % method, ' pass', '', ] sane = False if not sane: print cls.__name__ + ' must implement following method(s):' print print "\\n".join(msg) raise SystemExit(1) if __name__ == '__main__': #{class_name}.checkSanity() unittest.main() EOS end FileUtils.move tmp_fn, source_fn end