test_case_generator 0.2.0 → 0.2.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 348c14e6a2d3ad48077a12777b9b7b63249809fa
4
- data.tar.gz: af4523f2a76a2c1117a398c6c099cc0b58b01369
3
+ metadata.gz: b2fd026581bd0bc429eb04313a282515db6824cd
4
+ data.tar.gz: c6e958fa78801959f64789ca205f3d8d9f48a756
5
5
  SHA512:
6
- metadata.gz: a125211db86819f2da05c418cc4b86eaca1f914b8bcac64f3508124f3ac06db9e9a2789b9fa248f2fb135bab44d160303a3a096221376e17dc3dfe5c1b99134c
7
- data.tar.gz: 479757fbc7eda6e322abd5593d437536b3a61cc2182090c3fced99e771f4de6c1ef21b530bd6377b09dda77987ba017c9bc30362fa65bc8454b38b5333cb4d46
6
+ metadata.gz: 933be1201506bfba53a7ce57482cb216de6df96739125138095ee370e625e59a0ca90e09094c87595f754c7701debb2b0cf18d769d244b35849eeae2d4b39f38
7
+ data.tar.gz: ecb54cdc5bed936199a889d691e0a149335bbc18e4e1753da2f7423b8849e51404a8487f6e20529a864e6bdadd7a59319df8bb7863817165a97d4aa1176baeab
data/README.md CHANGED
@@ -22,7 +22,41 @@ Or install it yourself as:
22
22
 
23
23
  ## Usage
24
24
 
25
- TODO: Write usage instructions here
25
+ Write a .testcase file.
26
+
27
+ Ex. Tests for a TableView in ViewController (YMTableView.testcase)
28
+
29
+ before { |items|
30
+ items << :prepareTarget
31
+ }
32
+
33
+ concat {
34
+ choice { |items|
35
+ items << :emptyList
36
+ items << :oneItemInList
37
+ items << :manyItemsInList
38
+ }
39
+
40
+ choice { |items|
41
+ items << [:viewDidLoad, :viewDidUnload]
42
+ items << [:viewDidLoad, :viewWillAppear, :viewDidAppear, :viewWillDisappear, :viewDidDisappear, :viewDidUnload]
43
+ }
44
+ }
45
+
46
+ after { |items|
47
+ items << :releaseTarget
48
+ }
49
+
50
+ To generate the .m file, run the test_case_generator. (YMTableView.m)
51
+
52
+ bundle exec test_case_generator inject YMTableView.testcase YMTableView.m
53
+
54
+ If the .testcase file is modified after generated, rerun the test_case_generator.
55
+
56
+ bundle exec test_case_generator inject YMTableView.testcase YMTableView.m
57
+
58
+ Do not delete %% marker in the generated .m file because the lines after %% marker is rewritten.
59
+
26
60
 
27
61
  ## Development
28
62
 
@@ -8,10 +8,77 @@ module TestCaseGenerator
8
8
  end
9
9
 
10
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')
11
+ write_skeleton source_fn unless File.exists? source_fn
12
+ write_interface ctx, File.join(File.dirname(source_fn), make_interface_name(source_fn)) + '.java'
12
13
  write_source ctx, source_fn
13
14
  end
14
15
 
16
+
17
+ def make_class_name(filename)
18
+ # File.join(File.dirname(source_fn), File.basename(source_fn, File.extname(source_fn))
19
+ File.basename filename, ".*"
20
+ end
21
+
22
+ def make_interface_name(filename)
23
+ make_class_name(filename) + 'Generated'
24
+ end
25
+
26
+ def make_package_name(filename)
27
+ parts = []
28
+ java_seen = false
29
+ File.absolute_path(File.dirname(filename)).split('/').each do |x|
30
+ if java_seen
31
+ parts << x
32
+ end
33
+ if x == 'java'
34
+ java_seen = true
35
+ end
36
+ end
37
+
38
+ if parts.empty?
39
+ 'com.example'
40
+ else
41
+ parts.join '.'
42
+ end
43
+ end
44
+
45
+ def write_skeleton(source_fn)
46
+ class_name = make_class_name(source_fn)
47
+ File.open(source_fn, 'w') do |f|
48
+ writer = IndentedWriter.new f
49
+ writer.puts <<EOS
50
+ package #{make_package_name source_fn};
51
+
52
+ import android.content.Context;
53
+
54
+ import org.junit.After;
55
+ import org.junit.Before;
56
+ import org.junit.Test;
57
+ import org.junit.runner.RunWith;
58
+ import org.robolectric.Robolectric;
59
+ import org.robolectric.RobolectricTestRunner;
60
+ import org.robolectric.annotation.Config;
61
+
62
+ import static org.junit.Assert.*;
63
+
64
+ @RunWith(RobolectricTestRunner.class)
65
+ @Config(emulateSdk = 18)
66
+ public class #{class_name} implements #{make_interface_name source_fn} {
67
+
68
+ @Before
69
+ public void setUp() {
70
+ }
71
+
72
+ @After
73
+ public void tearDown() {
74
+ }
75
+
76
+ // %%
77
+ }
78
+ EOS
79
+ end
80
+ end
81
+
15
82
  def write_interface(dsl_context, header_fn)
16
83
  interface_name = File.basename(header_fn, File.extname(header_fn))
17
84
  tmp_fn = header_fn + '.tmp'
@@ -46,6 +113,15 @@ module TestCaseGenerator
46
113
  end
47
114
 
48
115
  writer = IndentedWriter.new f
116
+ writer.blank
117
+ writer.block_indent ' ' do
118
+ writer.puts '//'
119
+ writer.puts '// 以下の行は自動生成されているので直接編集しないでください。'
120
+ writer.puts '//'
121
+ writer.puts '// Generated by Test Case Generator'
122
+ writer.puts '// https://rubygems.org/gems/test_case_generator'
123
+ writer.puts '//'
124
+ end
49
125
 
50
126
  dsl_context.each do |pattern|
51
127
  method_name = pattern.join '_'
@@ -65,7 +141,7 @@ module TestCaseGenerator
65
141
  end
66
142
 
67
143
  writer.blank
68
- writer.puts '@end'
144
+ writer.puts '}'
69
145
  end
70
146
 
71
147
  FileUtils.move tmp_fn, source_fn
@@ -8,10 +8,48 @@ module TestCaseGenerator
8
8
  end
9
9
 
10
10
  def write(ctx, source_fn)
11
+ write_skeleton source_fn unless File.exists? source_fn
11
12
  write_header ctx, File.join(File.dirname(source_fn), File.basename(source_fn, File.extname(source_fn)) + 'Generated.h')
12
13
  write_source ctx, source_fn
13
14
  end
14
15
 
16
+ def make_class_name(filename)
17
+ File.basename filename, ".*"
18
+ end
19
+
20
+ def write_skeleton(source_fn)
21
+ class_name = make_class_name(source_fn)
22
+ File.open(source_fn, 'w') do |f|
23
+ writer = IndentedWriter.new f
24
+ writer.puts <<EOS
25
+ #import <UIKit/UIKit.h>
26
+ #import <XCTest/XCTest.h>
27
+ #import "#{class_name}Generated.h"
28
+
29
+ #pragma mark - #{class_name}
30
+
31
+ @interface #{class_name} : XCTestCase <#{class_name}Generated>
32
+ @end
33
+
34
+ @implementation #{class_name}
35
+
36
+ - (void)setUp {
37
+ [super setUp];
38
+ }
39
+
40
+ - (void)tearDown {
41
+ [super tearDown];
42
+ }
43
+
44
+ #pragma mark #{class_name}Generated
45
+
46
+ // TODO: ここにアクションを書いてください
47
+
48
+ // %%
49
+ EOS
50
+ end
51
+ end
52
+
15
53
  def write_header(dsl_context, header_fn)
16
54
  protocol_name = File.basename(header_fn, File.extname(header_fn))
17
55
  tmp_fn = header_fn + '.tmp'
@@ -23,7 +61,7 @@ module TestCaseGenerator
23
61
  writer.puts "@protocol #{protocol_name} <NSObject>"
24
62
 
25
63
  dsl_context.labels.each do |label|
26
- method_name = label
64
+ method_name = Utils.make_method_name label
27
65
  writer.puts "- (void)#{method_name};"
28
66
  end
29
67
 
@@ -43,6 +81,13 @@ module TestCaseGenerator
43
81
  end
44
82
 
45
83
  writer = IndentedWriter.new f
84
+ writer.blank
85
+ writer.puts '//'
86
+ writer.puts '// 以下の行は自動生成されているので直接編集しないでください。'
87
+ writer.puts '//'
88
+ writer.puts '// Generated by Test Case Generator'
89
+ writer.puts '// https://rubygems.org/gems/test_case_generator'
90
+ writer.puts '//'
46
91
 
47
92
  dsl_context.each do |pattern|
48
93
  method_name = pattern.join '_'
@@ -8,10 +8,40 @@ module TestCaseGenerator
8
8
  end
9
9
 
10
10
  def write(ctx, source_fn)
11
+ write_skeleton source_fn unless File.exists? source_fn
11
12
  write_source ctx, source_fn
12
13
  end
13
14
 
15
+ def make_class_name(filename)
16
+ File.basename filename, ".*"
17
+ end
18
+
19
+ def write_skeleton(source_fn)
20
+ class_name = make_class_name(source_fn)
21
+ File.open(source_fn, 'w') do |f|
22
+ writer = IndentedWriter.new f
23
+ writer.puts <<EOS
24
+ #!/usr/bin/env python
25
+ # -*- coding: utf-8 -*-
26
+ import os
27
+ import sys
28
+ import unittest
29
+
30
+
31
+ class #{class_name}(unittest.TestCase):
32
+ def setUp(self):
33
+ super(#{class_name}, self).setUp()
34
+
35
+ def tearDown(self):
36
+ super(#{class_name}, self).tearDown()
37
+
38
+ # %%
39
+ EOS
40
+ end
41
+ end
42
+
14
43
  def write_source(dsl_context, source_fn)
44
+ class_name = make_class_name(source_fn)
15
45
  tmp_fn = source_fn + '.tmp'
16
46
  source = File.open(source_fn).read
17
47
  File.open(tmp_fn, 'w') do |f|
@@ -45,46 +75,33 @@ module TestCaseGenerator
45
75
  end
46
76
  end
47
77
 
78
+ method_list = dsl_context.labels.map { |m| "'#{m}'" }.join(', ')
48
79
  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
80
+ writer.puts <<EOS
81
+ @classmethod
82
+ def checkSanity(cls):
83
+ sane = True
84
+ msg = []
85
+ for method in [#{method_list}]:
86
+ if not hasattr(cls, method):
87
+ msg += [
88
+ ' def %s(self):' % method,
89
+ ' pass',
90
+ '',
91
+ ]
92
+ sane = False
69
93
 
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
94
+ if not sane:
95
+ print cls.__name__ + ' must implement following method(s):'
96
+ print
97
+ print "\\n".join(msg)
98
+ raise SystemExit(1)
80
99
 
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
100
+
101
+ if __name__ == '__main__':
102
+ #{class_name}.checkSanity()
103
+ unittest.main()
104
+ EOS
88
105
  end
89
106
 
90
107
  FileUtils.move tmp_fn, source_fn
@@ -1,3 +1,3 @@
1
1
  module TestCaseGenerator
2
- VERSION = '0.2.0'
2
+ VERSION = '0.2.1'
3
3
  end
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.2.0
4
+ version: 0.2.1
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-27 00:00:00.000000000 Z
11
+ date: 2015-08-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor