class TestCaseGenerator::GeneratorJava

Public Instance Methods

can_handle?(source_fn) click to toggle source
# File lib/test_case_generator/generator_java.rb, line 6
def can_handle?(source_fn)
  File.extname(source_fn).eql? '.java'
end
make_class_name(filename) click to toggle source
# File lib/test_case_generator/generator_java.rb, line 16
def make_class_name(filename)
  # File.join(File.dirname(source_fn), File.basename(source_fn, File.extname(source_fn))
  File.basename filename, '.*'
end
make_interface_name(filename) click to toggle source
# File lib/test_case_generator/generator_java.rb, line 21
def make_interface_name(filename)
  make_class_name(filename) + 'Generated'
end
make_package_name(filename) click to toggle source
# File lib/test_case_generator/generator_java.rb, line 25
def make_package_name(filename)
  parts = []
  java_seen = false
  File.absolute_path(File.dirname(filename)).split('/').each do |x|
    parts << x if java_seen
    java_seen = true if x == 'java'
  end

  if parts.empty?
    'com.example'
  else
    parts.join '.'
  end
end
write(ctx, source_fn) click to toggle source
# File lib/test_case_generator/generator_java.rb, line 10
def write(ctx, source_fn)
  write_skeleton source_fn unless File.exist? source_fn
  write_interface ctx, File.join(File.dirname(source_fn), make_interface_name(source_fn)) + '.java', make_package_name(source_fn)
  write_source ctx, source_fn
end
write_interface(dsl_context, header_fn, package_name) click to toggle source
# File lib/test_case_generator/generator_java.rb, line 107
    def write_interface(dsl_context, header_fn, package_name)
      interface_name = File.basename(header_fn, File.extname(header_fn))
      tmp_fn = header_fn + '.tmp'
      File.open(tmp_fn, 'w') do |f|
        writer = IndentedWriter.new f
        writer.puts <<EOS
package #{package_name};

public interface #{interface_name} {
EOS
        writer.block_indent '    ' do
          dsl_context.labels.each do |label|
            method_name = label
            writer.puts "void #{method_name}();"
          end
        end

        writer.puts <<EOS
}
EOS
      end

      FileUtils.move tmp_fn, header_fn
    end
write_skeleton(source_fn) click to toggle source
# File lib/test_case_generator/generator_java.rb, line 40
    def write_skeleton(source_fn)
      class_name = make_class_name(source_fn)
      File.open(source_fn, 'w') do |f|
        writer = IndentedWriter.new f
        writer.puts <<EOS
package #{make_package_name source_fn};

import android.content.Context;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricGradleTestRunner;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;

import java.util.ArrayList;

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;

@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 18)
public class #{class_name} implements #{make_interface_name source_fn} {

    @Before
    public void setUp() {
        Robolectric.getForegroundThreadScheduler().reset();
        Robolectric.getForegroundThreadScheduler().pause();
        Robolectric.getBackgroundThreadScheduler().reset();
        Robolectric.getBackgroundThreadScheduler().pause();

        // Auto import 機能でimport文が削除されないようにするためのダミー
        assertEquals("dummy", "dummy");
        mock(String.class);
    }

    @After
    public void tearDown() {
        Robolectric.getForegroundThreadScheduler().reset();
        Robolectric.getForegroundThreadScheduler().unPause();
        Robolectric.getBackgroundThreadScheduler().reset();
        Robolectric.getBackgroundThreadScheduler().unPause();
    }

    // TODO: Please implement custom actions here.

    private void printPatterns(String patterns) {
        System.err.println("<<TEST>> " + patterns);
    }

    private void runPendingTasks() {
        Robolectric.getForegroundThreadScheduler().advanceBy(1);
    }

    private void runTimerTasks() {
        Robolectric.getForegroundThreadScheduler().advanceBy(30 * 1000);
    }

    // %%
}
EOS
      end
    end
write_source(dsl_context, source_fn) click to toggle source
# File lib/test_case_generator/generator_java.rb, line 132
def write_source(dsl_context, 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 '@Test'
        writer.puts "public void test_#{method_name}() {"
        writer.block_indent '    ' do
          writer.puts "printPatterns(\"#{pattern.map{|p| "#{p}"}.join(', ')}\");"
          pattern.each do |ptn|
            writer.puts "#{ptn}();"
          end
        end

        writer.puts '}'
      end
    end

    writer.blank
    writer.puts '}'
  end

  FileUtils.move tmp_fn, source_fn
end