cgialib 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/Manifest.txt CHANGED
@@ -5,8 +5,9 @@ README.rdoc
5
5
  Rakefile
6
6
  bin/testgen
7
7
  config/website.yml.sample
8
- features/development.feature
9
- features/steps/common.rb
8
+ examples/ut/mytest1.c
9
+ features/language_parser.feature
10
+ features/steps/language_parser.rb
10
11
  features/steps/env.rb
11
12
  lib/cgialib.rb
12
13
  lib/testgen/cli.rb
@@ -17,6 +18,10 @@ lib/cgialib/lp/Tokenizer.rb
17
18
  lib/cgialib/lp/CLanguageScanner.rb
18
19
  lib/cgialib/lp/CPPLanguageScanner.rb
19
20
  lib/cgialib/lp/CTokenizer.rb
21
+ lib/cgialib/lp/JavaDoc.rb
22
+ lib/cgialib/lp/JavaLanguageScanner.rb
23
+ lib/cgialib/lp/SQLTokenizer.rb
24
+ lib/cgialib/lp/SQLLanguageScanner.rb
20
25
  lib/cgialib/template/ut.rb
21
26
  lib/cgialib/template/ut/c.rb
22
27
  script/console
data/Rakefile CHANGED
@@ -8,9 +8,10 @@ $hoe = Hoe.new('cgialib', Cgialib::VERSION) do |p|
8
8
  p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
9
9
  p.post_install_message = 'PostInstall.txt' # TODO remove if post-install message not required
10
10
  p.rubyforge_name = p.name # TODO this is default value
11
- # p.extra_deps = [
12
- # ['activesupport','>= 2.0.2'],
13
- # ]
11
+ p.extra_deps = [
12
+ ['cucumber','>= 0.1.9'],
13
+ ['rspec','>= 1.1.11']
14
+ ]
14
15
  p.extra_dev_deps = [
15
16
  ['newgem', ">= #{::Newgem::VERSION}"]
16
17
  ]
@@ -0,0 +1,22 @@
1
+ // Test case for the test case builder
2
+ #include <stdio.h>
3
+
4
+ // <test result="3"><a>1</a><b>2</b></test>
5
+ // <test result="6"><a>2</a><b>4</b></test>
6
+ // <test result="9"><a>3</a><b>6</b></test>
7
+ int add( int a, int b ) { return a + b; }
8
+
9
+ // <test result="3"><a>5</a><b>2</b></test>
10
+ int minus( int a, int b ) { return a - b; }
11
+
12
+ // <test result="30"><a>5</a><b>6</b></test>
13
+ int multiply( int a, int b ) { return a * b; }
14
+
15
+ int main( int argc, char *argv[] )
16
+ {
17
+ run_tests();
18
+ printf( "%d\n", add( 1, 2 ) );
19
+ return 0;
20
+ }
21
+
22
+
@@ -0,0 +1,21 @@
1
+ Feature: Generate Unit Test for C by Language Parser
2
+
3
+ As a C language designer
4
+ I want testgen to generate unit tests for C source
5
+ So that I can spend time on designing code and test, not excessive time on writing test
6
+
7
+ Scenario: Generate Unit Test
8
+ Given this project is active project folder
9
+ And 'examples/ut/mytest1.c' file is existed
10
+ And 'examples/ut/mytest1.c' file is copied to 'tmp' folder
11
+ And file 'tmp/mytest1.c' contains /\/\/ <test.*<\/test>/
12
+ When command 'testgen -s tmp/mytest1.c' is invoked
13
+ Then file 'tmp/mytest1.c.bak' is created
14
+ And file 'tmp/mytest1.c' contains /\/\/ <test_start>.*?\/\/ <\/test_start>/m
15
+ Scenario: Compile and Run the Unit Test
16
+ Given this project is active project folder
17
+ And file 'tmp/mytest1.c' contains /test_start/
18
+ When command 'gcc tmp/mytest1.c -o tmp/mytest1' is invoked
19
+ And command 'tmp/mytest1' is invoked
20
+ Then file 'tmp/tests.out' contains /\(100%\) Unit Test are passed/
21
+
@@ -0,0 +1,84 @@
1
+ def in_project_folder(&block)
2
+ project_folder = @active_project_folder || @tmp_root
3
+ FileUtils.chdir(project_folder, &block)
4
+ end
5
+ Given %r{^this project is active project folder} do
6
+ Given "a safe folder"
7
+ @active_project_folder = File.expand_path(File.dirname(__FILE__) + "/../..")
8
+ end
9
+ Given %r{^a safe folder} do
10
+ #FileUtils.rm_rf @tmp_root = File.dirname(__FILE__) + "/../../tmp"
11
+ @tmp_root = File.dirname(__FILE__) + "/../../tmp"
12
+ FileUtils.mkdir_p @tmp_root
13
+ @lib_path = File.expand_path(File.dirname(__FILE__) + '/../../lib')
14
+ end
15
+ Given %r{^env variable \$([\w_]+) set to '(.*)'} do |env_var, value|
16
+ ENV[env_var] = value
17
+ end
18
+ Given %r{'(.*)' folder is deleted} do |folder|
19
+ in_project_folder do
20
+ FileUtils.rm_rf folder
21
+ end
22
+ end
23
+
24
+ Given %r{'(.*)' file is copied to '(.*)' folder} do |file, folder|
25
+ in_project_folder do
26
+ system "cp #{file} #{folder}"
27
+ end
28
+ end
29
+ Given %r{'(.*)' file is existed} do |file|
30
+ in_project_folder do
31
+ File.exists?(file).should be_true
32
+ end
33
+ end
34
+
35
+ Given %r{'(.*)' file is deleted} do |file|
36
+ in_project_folder do
37
+ FileUtils.rm_rf file
38
+ end
39
+ end
40
+
41
+ When %r{^command 'testgen -s (.*\.c)' is invoked$} do |source_file|
42
+ @stdout = File.expand_path(File.join(@tmp_root, "tests.out"))
43
+ FileUtils.chdir(@active_project_folder) do
44
+ system "testgen -s #{source_file} > #{@stdout} 2> #{@stdout}"
45
+ end
46
+ end
47
+ When %r{^command 'gcc (.*\.c) (.*)' is invoked$} do |source_file,option|
48
+ @stdout = File.expand_path(File.join(@tmp_root, "tests.out"))
49
+ FileUtils.chdir(@active_project_folder) do
50
+ system "gcc #{source_file} #{option}> #{@stdout} 2> #{@stdout}"
51
+ end
52
+ end
53
+ When %r{^command '(tmp.*)' is invoked$} do |command|
54
+ @stdout = File.expand_path(File.join(@tmp_root, "tests.out"))
55
+ FileUtils.chdir(@active_project_folder) do
56
+ system " #{command}> #{@stdout} 2> #{@stdout}"
57
+ end
58
+ end
59
+
60
+ Then %r{^file '(.*)' contains \/(.*)\/$} do |file, regex|
61
+ in_project_folder do
62
+ file_content = File.read(file)
63
+ file_content.to_s.should match(/#{regex}/)
64
+ end
65
+ end
66
+ Then %r{^file '(.*)' contains \/(.*)\/m$} do |file, regex|
67
+ in_project_folder do
68
+ file_content = File.read(file)
69
+ file_content.to_s.should match(/#{regex}/m)
70
+ end
71
+ end
72
+
73
+ Then %r{^folder '(.*)' is created} do |folder|
74
+ in_project_folder do
75
+ File.exists?(folder).should be_true
76
+ end
77
+ end
78
+
79
+ Then %r{^file '(.*)' (is|is not) created} do |file, is|
80
+ in_project_folder do
81
+ File.exists?(file).should(is == 'is' ? be_true : be_false)
82
+ end
83
+ end
84
+
@@ -0,0 +1,220 @@
1
+ # File: JavaDoc.rb
2
+ # Author: Jack Herrington
3
+ # Purpose: Generic class for parsing JavaDoc comments
4
+ # Date: 12/21/02
5
+
6
+ module LanguageParser
7
+ # class : JavaDoc
8
+ #
9
+ # Simple JavaDoc interpreter. This class holds JavaDoc tokens for a series of related JavaDoc
10
+ # comments. You should use one JavaDoc object per method or class. The JavaDoc object parses the
11
+ # comments, and stores the JavaDoc data in structured holders for easy access.
12
+
13
+ class JavaDoc
14
+
15
+ # initialize()
16
+ #
17
+ # Builds the JavaDoc class
18
+
19
+ def initialize()
20
+
21
+ # Hash to hold the @name tags. The default text goes into a tag named
22
+ # '@desc'.
23
+
24
+ @tags = { '@desc' => "" }
25
+
26
+ # Special holder for the @param values
27
+
28
+ @params = {}
29
+
30
+ end
31
+
32
+ attr_reader :tags # The tag contents
33
+
34
+ attr_reader :params # The @param contents
35
+
36
+ # to_s()
37
+ #
38
+ # Pretty prints the current contents of this JavaDoc object
39
+
40
+ def to_s()
41
+
42
+ text = ""
43
+
44
+ @tags.each_key { |k| text += "#{k} : #{@tags[k]}\n" }
45
+
46
+ @params.each_key { |k| text += "param(#{k}) : #{@params[k]}\n" }
47
+
48
+ text
49
+
50
+ end
51
+
52
+ # parse( text )
53
+ #
54
+ # text - The JavaDoc comment
55
+ #
56
+ # Parses the JavaDoc comment and stores the contents
57
+
58
+ def parse( text )
59
+
60
+ # Strip leading and trailing space
61
+
62
+ text.strip!
63
+
64
+ # Return unless we see the distinctive '/**' JavaDoc beginning
65
+ # marker
66
+
67
+ return unless ( text =~ /^\/\*\*/ || text =~ /^\*/ )
68
+
69
+ # This section removes all of the leading stars, the comment lines
70
+ # and anything around the text
71
+
72
+ cleaned = ""
73
+ text.each_line { |line|
74
+
75
+ line.strip!
76
+
77
+ line.sub!( /^\/\*\*/, "" )
78
+ line.sub!( /^\*\//, "" )
79
+ line.sub!( /^\*\s*/, "" )
80
+
81
+ line.strip!
82
+
83
+ next if line.length < 1
84
+
85
+ cleaned += "#{line}\n"
86
+
87
+ }
88
+
89
+ # This section is a mini-tokenizer that splits the content of the string
90
+ # into an array. The delimiter is whitespace. The whitespace is stored
91
+ # in the array as well as it may be important to some tags.
92
+
93
+ in_whitespace = false
94
+ text = ""
95
+ tokens = []
96
+
97
+ cleaned.each_byte { |ch|
98
+
99
+ ch = ch.chr()
100
+
101
+ if ( ch =~ /\s/ )
102
+
103
+ if ( in_whitespace )
104
+
105
+ text += ch
106
+
107
+ else
108
+
109
+ tokens.push( text ) if ( text.length > 0 )
110
+ text = ch
111
+ in_whitespace = true
112
+
113
+ end
114
+
115
+ else
116
+
117
+ if ( in_whitespace )
118
+
119
+ tokens.push( text ) if ( text.length > 0 )
120
+ text = ch
121
+ in_whitespace = false
122
+
123
+ else
124
+
125
+ text += ch
126
+
127
+ end
128
+
129
+ end
130
+
131
+ }
132
+
133
+ tokens.push( text ) if ( text.length > 0 )
134
+
135
+ # Now we use our 'tokenized' array and search for the '@tag' items. As
136
+ # we go through the tokens we are building a buffer. When we reach a
137
+ # new tag we send the buffer on to add_to_tag.
138
+
139
+ cur_name = "@desc"
140
+ buffer = ""
141
+
142
+ tokens.each { |tok|
143
+
144
+ if ( tok =~ /^@/ )
145
+
146
+ add_to_tag( cur_name, buffer ) if ( buffer.length > 0 )
147
+ buffer = ""
148
+
149
+ cur_name = tok
150
+
151
+ else
152
+
153
+ buffer += tok
154
+
155
+ end
156
+
157
+ }
158
+
159
+ # Make sure we get the contents of the buffer at the end
160
+
161
+ add_to_tag( cur_name, buffer ) if ( buffer.length > 0 )
162
+
163
+ # Invoke the tag cleaner
164
+
165
+ clean_tags()
166
+
167
+ end
168
+
169
+ protected
170
+
171
+ # add_to_tag( key, text )
172
+ #
173
+ # key - The tag name (e.g. '@see' )
174
+ # text - The text of the tag
175
+ #
176
+ # This adds some more text to the tag. This is the method you would
177
+ # override if you wanted to add your own JavaDoc tag to a parser, but
178
+ # only if that tag had special parsing requirements.
179
+
180
+ def add_to_tag( key, text )
181
+
182
+ if ( key == "@param" )
183
+
184
+ # If this is a param then we handle it seperately
185
+ # by storing it's contents into a hash
186
+
187
+ text.strip!
188
+
189
+ text =~ /^(.*?)\s/
190
+ name = $1
191
+ text.sub!( /^(.*?)\s/, "" )
192
+
193
+ text.strip!
194
+
195
+ @params[ name ] = text
196
+
197
+ else
198
+
199
+ # Otherwise we just append it to the tag text in the
200
+ # tag hash
201
+
202
+ @tags[ key ] = "" unless ( @tags.has_key?( key ) )
203
+ @tags[ key ] += text
204
+
205
+ end
206
+
207
+ end
208
+
209
+ # clean_tags()
210
+ #
211
+ # A process step method that cleans up the tags after they are read in.
212
+
213
+ def clean_tags()
214
+
215
+ @tags.each_key { |k| @tags[ k ].strip! }
216
+
217
+ end
218
+
219
+ end
220
+ end