comment_tester 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README +42 -0
  4. data/bin/ruby_comment_tester +145 -0
  5. metadata +48 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 434c90a0584ec6c3ee606397de58c52db244dbcd
4
+ data.tar.gz: 4ee6fbc6a304e54052f6b6c2bb4ee1c352c04b6d
5
+ SHA512:
6
+ metadata.gz: d569191b50f972b1b6d10e36ffc4361d0542cc116ee0509aaf60993c135055eedce02d155fae27fe167aa39e3cf32d75342f4b7575fded706ad5f15b845e52e8
7
+ data.tar.gz: e0781e070b027bd05ad850aac33a3ab14c4ed2782cc8aa3189c2c1573a08a9c974064905f6d91ff8b2f91df69984ed8feda5f998fc093aa7e6e09cf95df39b70
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ Copyright (c) 2013, Michael H. Buselli
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are met:
6
+ * Redistributions of source code must retain the above copyright
7
+ notice, this list of conditions and the following disclaimer.
8
+ * Redistributions in binary form must reproduce the above copyright
9
+ notice, this list of conditions and the following disclaimer in the
10
+ documentation and/or other materials provided with the distribution.
11
+
12
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ''AS IS'' AND ANY
13
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
14
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
15
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY
16
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
17
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
18
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
19
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
20
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
21
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README ADDED
@@ -0,0 +1,42 @@
1
+ # Copyright (c) 2013, Michael H. Buselli
2
+ # See LICENSE for details. All other rights reserved.
3
+ #
4
+ # ruby_comment_tester works by auto-generating Ruby test-unit files from
5
+ # the comments of a Ruby program. The idea is that you mimic what you
6
+ # would type into irb that could provide a test. In doing so, you write
7
+ # both a test and document the behavior of your program or method in the
8
+ # same place. Some example test comments are as follows:
9
+
10
+ # Code and assertions in the same comment block are grouped into
11
+ # a single test.
12
+ #
13
+ # irb> a = "123"
14
+ # irb> b = a.split(/2/)
15
+ # => ["1", "3"]
16
+ #
17
+ # irb> b.map(&:to_i).inject(0) { |s, x| s + x } + 38
18
+ # => 42
19
+
20
+ # Variables are not sticky between tests, and you can also test for
21
+ # exceptions or thrown objects with raises=> and throws=>.
22
+ #
23
+ # irb> a
24
+ # raises=> NameError
25
+ # irb> throw :catch_me
26
+ # throws=> :catch_me
27
+
28
+ # Sometimes you have to initialize something for your code or tests to
29
+ # work. Use irb-setup> for that.
30
+ #
31
+ # irb-setup> puts "This runs outside the tests before code or tests are loaded."
32
+ # irb> [:hello, :world].map { |s| s.to_s.capitalize }.join(" ")
33
+ # => "Hello World"
34
+
35
+ # You can comment out tests with double hashes of any sort.
36
+ #
37
+ # # irb> this won't run
38
+ # # => foo
39
+ ## irb> neither does this
40
+ ## => bar
41
+
42
+ # You can run the above tests by running this program on itself.
@@ -0,0 +1,145 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Copyright (c) 2013, Michael H. Buselli
4
+ # See LICENSE for details. All other rights reserved.
5
+ #
6
+ # ruby_comment_tester works by auto-generating Ruby test-unit files from
7
+ # the comments of a Ruby program. The idea is that you mimic what you
8
+ # would type into irb that could provide a test. In doing so, you write
9
+ # both a test and document the behavior of your program or method in the
10
+ # same place. Some example test comments are as follows:
11
+
12
+ # Code and assertions in the same comment block are grouped into
13
+ # a single test.
14
+ #
15
+ # irb> a = "123"
16
+ # irb> b = a.split(/2/)
17
+ # => ["1", "3"]
18
+ #
19
+ # irb> b.map(&:to_i).inject(0) { |s, x| s + x } + 38
20
+ # => 42
21
+
22
+ # Variables are not sticky between tests, and you can also test for
23
+ # exceptions or thrown objects with raises=> and throws=>.
24
+ #
25
+ # irb> a
26
+ # raises=> NameError
27
+ # irb> throw :catch_me
28
+ # throws=> :catch_me
29
+
30
+ # Sometimes you have to initialize something for your code or tests to
31
+ # work. Use irb-setup> for that.
32
+ #
33
+ # irb-setup> puts "This runs outside the tests before code or tests are loaded."
34
+ # irb> [:hello, :world].map { |s| s.to_s.capitalize }.join(" ")
35
+ # => "Hello World"
36
+
37
+ # You can comment out tests with double hashes of any sort.
38
+ #
39
+ # # irb> this won't run
40
+ # # => foo
41
+ ## irb> neither does this
42
+ ## => bar
43
+
44
+ # You can run the above tests by running this program on itself.
45
+
46
+ require "pp" if ENV["DEBUG"]
47
+
48
+ class CommentTester
49
+ class << self
50
+ def run (argv)
51
+ argv.each { |filename| run_one(filename) }
52
+ end
53
+
54
+ private
55
+
56
+ def run_one (filename)
57
+ eval(make_test_file(filename))
58
+ load(filename) unless filename == $0
59
+ end
60
+
61
+ def make_test_file (filename)
62
+ comment_groups = comment_extraction(filename)
63
+ test_file = %'require "test/unit"\nclass CommentTesterTestClass < Test::Unit::TestCase\n'
64
+
65
+ test_file << comment_groups.map do |cg|
66
+ comment_group_to_test_case(cg)
67
+ end.join
68
+
69
+ (test_file << "end\n").tap { |x| puts x if ENV["DEBUG"] }
70
+ end
71
+
72
+ def comment_extraction (filename)
73
+ comment_groups = []
74
+ last_line = :code
75
+ # or :comment, :test_setup, :test_code, :assertion, :assert_raise, :assert_throw
76
+
77
+ # Read the Ruby code file.
78
+ File.open(filename, "r") do |fh|
79
+ fh.each_line do |line|
80
+ if line =~ /\A\s*#/
81
+ if last_line == :code
82
+ comment_groups << []
83
+ end
84
+
85
+ if line =~ /\A\s*#\s*irb-setup>\s*(.*)\Z/
86
+ comment_groups[-1] << {test_setup: $1.chomp}
87
+ last_line = :test_setup
88
+ elsif line =~ /\A\s*#\s*irb>\s*(.*)\Z/
89
+ comment_groups[-1] << {test_code: $1.chomp}
90
+ last_line = :test_code
91
+ elsif line =~ /\A\s*#\s*=>\s*(.*)\Z/
92
+ raise "you can only use => after irb>" if last_line != :test_code
93
+ comment_groups[-1] << {assertion: $1.chomp}
94
+ last_line = :assertion
95
+ elsif line =~ /\A\s*#\s*raises=>\s*(.*)\Z/
96
+ raise "you can only use raises=> after irb>" if last_line != :test_code
97
+ comment_groups[-1][-1][:assert_raise] = $1.chomp
98
+ last_line = :assert_raise
99
+ elsif line =~ /\A\s*#\s*throws=>\s*(.*)\Z/
100
+ raise "you can only use throws=> after irb>" if last_line != :test_code
101
+ comment_groups[-1][-1][:assert_throw] = $1.chomp
102
+ last_line = :assert_throw
103
+ else
104
+ last_line = :comment
105
+ end
106
+ else
107
+ last_line = :code
108
+ end
109
+ end
110
+ end
111
+
112
+ comment_groups.reject { |a| a.size == 0 }.tap { |x| pp x if ENV["DEBUG"] }
113
+ end
114
+
115
+ def comment_group_to_test_case (comment_group)
116
+ @test_cases_made ||= 0
117
+ @test_cases_made += 1
118
+
119
+ test_body = comment_group.map do |comment_line_data|
120
+ raise_code = comment_line_data.delete(:assert_raise)
121
+ throw_code = comment_line_data.delete(:assert_throw)
122
+ line_type = comment_line_data.keys[0]
123
+ code = comment_line_data.values[0]
124
+
125
+ if line_type == :test_setup
126
+ Object.class_eval(code)
127
+ elsif line_type == :test_code
128
+ if raise_code
129
+ "assert_raise(#{raise_code}) { #{code} }"
130
+ elsif throw_code
131
+ "assert_throws(#{throw_code}) { #{code} }"
132
+ else
133
+ "@result_for_assertion = #{code}"
134
+ end
135
+ else
136
+ "assert_equal(#{code}, @result_for_assertion)"
137
+ end
138
+ end.join("\n ")
139
+
140
+ " def test_#{@test_cases_made}\n #{test_body}\n end\n"
141
+ end
142
+ end
143
+ end
144
+
145
+ CommentTester.run(ARGV)
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: comment_tester
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
5
+ platform: ruby
6
+ authors:
7
+ - Michael H. Buselli
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-09-10 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: |
14
+ Write and run tests from your code comments
15
+ email: cosine@cosine.org
16
+ executables:
17
+ - ruby_comment_tester
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - README
22
+ - LICENSE
23
+ - bin/ruby_comment_tester
24
+ homepage: http://github.com/cosine/ruby_comment_tester
25
+ licenses:
26
+ - BSD
27
+ metadata: {}
28
+ post_install_message:
29
+ rdoc_options: []
30
+ require_paths:
31
+ - lib
32
+ required_ruby_version: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - '>='
35
+ - !ruby/object:Gem::Version
36
+ version: '0'
37
+ required_rubygems_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ requirements: []
43
+ rubyforge_project: comment_tester
44
+ rubygems_version: 2.0.3
45
+ signing_key:
46
+ specification_version: 4
47
+ summary: Write and run tests from your code comments
48
+ test_files: []