test_case_generator 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/test_case_generator/cli.rb +14 -4
- data/lib/test_case_generator/generator_factory.rb +20 -0
- data/lib/test_case_generator/generator_java.rb +74 -0
- data/lib/test_case_generator/generator_objective_c.rb +7 -28
- data/lib/test_case_generator/generator_php.rb +71 -0
- data/lib/test_case_generator/generator_python.rb +93 -0
- data/lib/test_case_generator/indented_writer.rb +32 -0
- data/lib/test_case_generator/version.rb +1 -1
- data/test_case_generator.gemspec +1 -1
- metadata +8 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 348c14e6a2d3ad48077a12777b9b7b63249809fa
|
4
|
+
data.tar.gz: af4523f2a76a2c1117a398c6c099cc0b58b01369
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a125211db86819f2da05c418cc4b86eaca1f914b8bcac64f3508124f3ac06db9e9a2789b9fa248f2fb135bab44d160303a3a096221376e17dc3dfe5c1b99134c
|
7
|
+
data.tar.gz: 479757fbc7eda6e322abd5593d437536b3a61cc2182090c3fced99e771f4de6c1ef21b530bd6377b09dda77987ba017c9bc30362fa65bc8454b38b5333cb4d46
|
@@ -2,19 +2,29 @@
|
|
2
2
|
|
3
3
|
require 'thor'
|
4
4
|
require 'test_case_generator/dsl_context'
|
5
|
+
require 'test_case_generator/generator_factory'
|
5
6
|
require 'test_case_generator/generator_objective_c'
|
7
|
+
require 'test_case_generator/generator_java'
|
8
|
+
require 'test_case_generator/generator_php'
|
9
|
+
require 'test_case_generator/generator_python'
|
6
10
|
|
7
11
|
module TestCaseGenerator
|
8
12
|
class CLI < Thor
|
9
|
-
desc '
|
13
|
+
desc 'inject TEST_CASE TARGET_FILE', 'Injects test-cases into source file '
|
10
14
|
def inject(testcase_fn, source_fn)
|
11
15
|
puts "Injects #{testcase_fn} into #{source_fn}"
|
12
16
|
|
13
17
|
loader = TestCaseGenerator::DSLContextLoader.new
|
14
18
|
ctx = loader.load testcase_fn
|
15
|
-
|
16
|
-
|
17
|
-
|
19
|
+
|
20
|
+
factory = TestCaseGenerator::GeneratorFactory.new
|
21
|
+
factory.register TestCaseGenerator::GeneratorObjectiveC.new
|
22
|
+
factory.register TestCaseGenerator::GeneratorJava.new
|
23
|
+
factory.register TestCaseGenerator::GeneratorPHP.new
|
24
|
+
factory.register TestCaseGenerator::GeneratorPython.new
|
25
|
+
|
26
|
+
gen = factory.query source_fn
|
27
|
+
gen.write ctx, source_fn
|
18
28
|
end
|
19
29
|
end
|
20
30
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'test_case_generator/dsl_context'
|
2
|
+
require 'test_case_generator/indented_writer'
|
3
|
+
|
4
|
+
module TestCaseGenerator
|
5
|
+
class GeneratorFactory
|
6
|
+
def initialize
|
7
|
+
@generators = []
|
8
|
+
end
|
9
|
+
|
10
|
+
def register(generator)
|
11
|
+
@generators << generator
|
12
|
+
end
|
13
|
+
|
14
|
+
def query(source_fn)
|
15
|
+
@generators.each do |g|
|
16
|
+
return g if g.can_handle? source_fn
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'test_case_generator/dsl_context'
|
2
|
+
require 'test_case_generator/indented_writer'
|
3
|
+
|
4
|
+
module TestCaseGenerator
|
5
|
+
class GeneratorJava
|
6
|
+
def can_handle?(source_fn)
|
7
|
+
File.extname(source_fn).eql? '.java'
|
8
|
+
end
|
9
|
+
|
10
|
+
def write(ctx, source_fn)
|
11
|
+
write_interface ctx, File.join(File.dirname(source_fn), File.basename(source_fn, File.extname(source_fn)) + 'Generated.java')
|
12
|
+
write_source ctx, source_fn
|
13
|
+
end
|
14
|
+
|
15
|
+
def write_interface(dsl_context, header_fn)
|
16
|
+
interface_name = File.basename(header_fn, File.extname(header_fn))
|
17
|
+
tmp_fn = header_fn + '.tmp'
|
18
|
+
File.open(tmp_fn, 'w') do |f|
|
19
|
+
writer = IndentedWriter.new f
|
20
|
+
|
21
|
+
writer.blank
|
22
|
+
writer.puts '//'
|
23
|
+
writer.blank
|
24
|
+
writer.puts "public interface #{interface_name} {"
|
25
|
+
|
26
|
+
writer.block_indent ' ' do
|
27
|
+
dsl_context.labels.each do |label|
|
28
|
+
method_name = label
|
29
|
+
writer.puts "void #{method_name}();"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
writer.puts '}'
|
34
|
+
end
|
35
|
+
|
36
|
+
FileUtils.move tmp_fn, header_fn
|
37
|
+
end
|
38
|
+
|
39
|
+
def write_source(dsl_context, source_fn)
|
40
|
+
tmp_fn = source_fn + '.tmp'
|
41
|
+
source = File.open(source_fn).read
|
42
|
+
File.open(tmp_fn, 'w') do |f|
|
43
|
+
source.each_line do |line|
|
44
|
+
f.puts line
|
45
|
+
break if line =~ /^\s*\/\/\s*%%\s*$/
|
46
|
+
end
|
47
|
+
|
48
|
+
writer = IndentedWriter.new f
|
49
|
+
|
50
|
+
dsl_context.each do |pattern|
|
51
|
+
method_name = pattern.join '_'
|
52
|
+
writer.block_indent ' ' do
|
53
|
+
writer.blank
|
54
|
+
writer.puts '@Test'
|
55
|
+
writer.puts "public void test_#{method_name}() {"
|
56
|
+
|
57
|
+
pattern.each do |ptn|
|
58
|
+
writer.block_indent ' ' do
|
59
|
+
writer.puts "#{ptn}();"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
writer.puts '}'
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
writer.blank
|
68
|
+
writer.puts '@end'
|
69
|
+
end
|
70
|
+
|
71
|
+
FileUtils.move tmp_fn, source_fn
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -1,38 +1,17 @@
|
|
1
1
|
require 'test_case_generator/dsl_context'
|
2
|
+
require 'test_case_generator/indented_writer'
|
2
3
|
|
3
4
|
module TestCaseGenerator
|
4
|
-
class
|
5
|
-
def
|
6
|
-
|
7
|
-
@indent = []
|
8
|
-
@current_indent = ''
|
9
|
-
end
|
10
|
-
|
11
|
-
def puts(line)
|
12
|
-
@out.puts @current_indent + line
|
13
|
-
end
|
14
|
-
|
15
|
-
def blank
|
16
|
-
@out.puts
|
17
|
-
end
|
18
|
-
|
19
|
-
def indent(txt)
|
20
|
-
@indent.push @current_indent
|
21
|
-
@current_indent += txt
|
5
|
+
class GeneratorObjectiveC
|
6
|
+
def can_handle?(source_fn)
|
7
|
+
File.extname(source_fn).eql? '.m'
|
22
8
|
end
|
23
9
|
|
24
|
-
def
|
25
|
-
|
10
|
+
def write(ctx, source_fn)
|
11
|
+
write_header ctx, File.join(File.dirname(source_fn), File.basename(source_fn, File.extname(source_fn)) + 'Generated.h')
|
12
|
+
write_source ctx, source_fn
|
26
13
|
end
|
27
14
|
|
28
|
-
def block_indent(txt)
|
29
|
-
indent txt
|
30
|
-
yield
|
31
|
-
unindent
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
class GeneratorObjectiveC
|
36
15
|
def write_header(dsl_context, header_fn)
|
37
16
|
protocol_name = File.basename(header_fn, File.extname(header_fn))
|
38
17
|
tmp_fn = header_fn + '.tmp'
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'test_case_generator/dsl_context'
|
2
|
+
require 'test_case_generator/indented_writer'
|
3
|
+
|
4
|
+
module TestCaseGenerator
|
5
|
+
class GeneratorPHP
|
6
|
+
def can_handle?(source_fn)
|
7
|
+
File.extname(source_fn).eql? '.php'
|
8
|
+
end
|
9
|
+
|
10
|
+
def write(ctx, source_fn)
|
11
|
+
write_header ctx, File.join(File.dirname(source_fn), File.basename(source_fn, File.extname(source_fn)) + 'Generated.php')
|
12
|
+
write_source ctx, source_fn
|
13
|
+
end
|
14
|
+
|
15
|
+
def write_header(dsl_context, header_fn)
|
16
|
+
protocol_name = File.basename(header_fn, File.extname(header_fn))
|
17
|
+
tmp_fn = header_fn + '.tmp'
|
18
|
+
File.open(tmp_fn, 'w') do |f|
|
19
|
+
writer = IndentedWriter.new f
|
20
|
+
|
21
|
+
writer.blank
|
22
|
+
writer.puts "interface #{protocol_name} {"
|
23
|
+
|
24
|
+
writer.block_indent ' ' do
|
25
|
+
dsl_context.labels.each do |label|
|
26
|
+
method_name = label
|
27
|
+
writer.puts "function #{method_name}();"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
writer.puts '}'
|
32
|
+
end
|
33
|
+
|
34
|
+
FileUtils.move tmp_fn, header_fn
|
35
|
+
end
|
36
|
+
|
37
|
+
def write_source(dsl_context, source_fn)
|
38
|
+
tmp_fn = source_fn + '.tmp'
|
39
|
+
source = File.open(source_fn).read
|
40
|
+
File.open(tmp_fn, 'w') do |f|
|
41
|
+
source.each_line do |line|
|
42
|
+
f.puts line
|
43
|
+
break if line =~ /^\s*\/\/\s*%%\s*$/
|
44
|
+
end
|
45
|
+
|
46
|
+
writer = IndentedWriter.new f
|
47
|
+
|
48
|
+
dsl_context.each do |pattern|
|
49
|
+
method_name = pattern.join '_'
|
50
|
+
writer.block_indent ' ' do
|
51
|
+
writer.blank
|
52
|
+
writer.puts "public function test_#{method_name}() {"
|
53
|
+
|
54
|
+
pattern.each do |ptn|
|
55
|
+
writer.block_indent ' ' do
|
56
|
+
writer.puts "$this->#{ptn}();"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
writer.puts '}'
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
writer.blank
|
65
|
+
writer.puts '}'
|
66
|
+
end
|
67
|
+
|
68
|
+
FileUtils.move tmp_fn, source_fn
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'test_case_generator/dsl_context'
|
2
|
+
require 'test_case_generator/indented_writer'
|
3
|
+
|
4
|
+
module TestCaseGenerator
|
5
|
+
class GeneratorPython
|
6
|
+
def can_handle?(source_fn)
|
7
|
+
File.extname(source_fn).eql? '.py'
|
8
|
+
end
|
9
|
+
|
10
|
+
def write(ctx, source_fn)
|
11
|
+
write_source ctx, source_fn
|
12
|
+
end
|
13
|
+
|
14
|
+
def write_source(dsl_context, source_fn)
|
15
|
+
tmp_fn = source_fn + '.tmp'
|
16
|
+
source = File.open(source_fn).read
|
17
|
+
File.open(tmp_fn, 'w') do |f|
|
18
|
+
source.each_line do |line|
|
19
|
+
f.puts line
|
20
|
+
break if line =~ /^\s*#\s*%%\s*$/
|
21
|
+
end
|
22
|
+
|
23
|
+
writer = IndentedWriter.new f
|
24
|
+
writer.blank
|
25
|
+
writer.block_indent ' ' do
|
26
|
+
writer.puts '#'
|
27
|
+
writer.puts '# 以下の行は自動生成されているので直接編集しないでください。'
|
28
|
+
writer.puts '#'
|
29
|
+
writer.puts '# Generated by Test Case Generator'
|
30
|
+
writer.puts '# https://rubygems.org/gems/test_case_generator'
|
31
|
+
writer.puts '#'
|
32
|
+
end
|
33
|
+
|
34
|
+
dsl_context.each do |pattern|
|
35
|
+
method_name = pattern.join '_'
|
36
|
+
writer.block_indent ' ' do
|
37
|
+
writer.blank
|
38
|
+
writer.puts "def test_#{method_name}(self):"
|
39
|
+
|
40
|
+
pattern.each do |ptn|
|
41
|
+
writer.block_indent ' ' do
|
42
|
+
writer.puts "self.#{ptn}()"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
writer.blank
|
49
|
+
writer.block_indent ' ' do
|
50
|
+
writer.puts '@classmethod'
|
51
|
+
writer.puts 'def checkSanity(cls):'
|
52
|
+
writer.block_indent ' ' do
|
53
|
+
writer.puts 'sane = True'
|
54
|
+
writer.puts 'msg = []'
|
55
|
+
writer.puts "for method in [#{dsl_context.labels.map { |m| "'#{m}'" }.join(', ')}]:"
|
56
|
+
writer.block_indent ' ' do
|
57
|
+
writer.puts 'if not hasattr(cls, method):'
|
58
|
+
writer.block_indent ' ' do
|
59
|
+
writer.puts 'msg += ['
|
60
|
+
writer.block_indent ' ' do
|
61
|
+
writer.puts "' def %s(self):' % method,"
|
62
|
+
writer.puts "' pass',"
|
63
|
+
writer.puts "'',"
|
64
|
+
end
|
65
|
+
writer.puts ']'
|
66
|
+
writer.puts 'sane = False'
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
writer.blank
|
71
|
+
writer.puts 'if not sane:'
|
72
|
+
writer.block_indent ' ' do
|
73
|
+
writer.puts "print cls.__name__ + ' must implement following method(s):'"
|
74
|
+
writer.puts 'print'
|
75
|
+
writer.puts "print \"\\n\".join(msg)"
|
76
|
+
writer.puts 'raise SystemExit(1)'
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
writer.blank
|
82
|
+
writer.blank
|
83
|
+
writer.puts "if __name__ == '__main__':"
|
84
|
+
writer.block_indent ' ' do
|
85
|
+
writer.puts 'CommandLineArgumentsTestCase.checkSanity()'
|
86
|
+
writer.puts 'unittest.main()'
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
FileUtils.move tmp_fn, source_fn
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module TestCaseGenerator
|
2
|
+
class IndentedWriter
|
3
|
+
def initialize(out)
|
4
|
+
@out = out
|
5
|
+
@indent = []
|
6
|
+
@current_indent = ''
|
7
|
+
end
|
8
|
+
|
9
|
+
def puts(line)
|
10
|
+
@out.puts @current_indent + line
|
11
|
+
end
|
12
|
+
|
13
|
+
def blank
|
14
|
+
@out.puts
|
15
|
+
end
|
16
|
+
|
17
|
+
def indent(txt)
|
18
|
+
@indent.push @current_indent
|
19
|
+
@current_indent += txt
|
20
|
+
end
|
21
|
+
|
22
|
+
def unindent
|
23
|
+
@current_indent = @indent.pop
|
24
|
+
end
|
25
|
+
|
26
|
+
def block_indent(txt)
|
27
|
+
indent txt
|
28
|
+
yield
|
29
|
+
unindent
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/test_case_generator.gemspec
CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.authors = ['Kaoru Yanase']
|
10
10
|
spec.email = ['kaoru@yumemi.co.jp']
|
11
11
|
|
12
|
-
spec.summary = 'Generates test-cases for Objective-C
|
12
|
+
spec.summary = 'Generates test-cases for Objective-C, python and etc..'
|
13
13
|
# spec.description = %q{TODO: Write a longer description or delete this line.}
|
14
14
|
spec.homepage = 'https://github.com/ym-kaoru/test_case_generator'
|
15
15
|
spec.license = 'MIT'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: test_case_generator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kaoru Yanase
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-08-
|
11
|
+
date: 2015-08-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -103,7 +103,12 @@ files:
|
|
103
103
|
- lib/test_case_generator.rb
|
104
104
|
- lib/test_case_generator/cli.rb
|
105
105
|
- lib/test_case_generator/dsl_context.rb
|
106
|
+
- lib/test_case_generator/generator_factory.rb
|
107
|
+
- lib/test_case_generator/generator_java.rb
|
106
108
|
- lib/test_case_generator/generator_objective_c.rb
|
109
|
+
- lib/test_case_generator/generator_php.rb
|
110
|
+
- lib/test_case_generator/generator_python.rb
|
111
|
+
- lib/test_case_generator/indented_writer.rb
|
107
112
|
- lib/test_case_generator/utils.rb
|
108
113
|
- lib/test_case_generator/version.rb
|
109
114
|
- test_case_generator.gemspec
|
@@ -131,5 +136,5 @@ rubyforge_project:
|
|
131
136
|
rubygems_version: 2.4.5.1
|
132
137
|
signing_key:
|
133
138
|
specification_version: 4
|
134
|
-
summary: Generates test-cases for Objective-C
|
139
|
+
summary: Generates test-cases for Objective-C, python and etc..
|
135
140
|
test_files: []
|