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