vigilant 0.1.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.
- data/.gitignore +2 -0
- data/bin/vigilant +28 -0
- data/lib/vigilant.rb +130 -0
- data/lib/vigilant/cli.rb +19 -0
- data/lib/vigilant/test.rb +37 -0
- data/test/.gitignore +0 -0
- data/test/fixtures/foo.test +13 -0
- data/test/fixtures/vigilant.options +3 -0
- data/test/generate_test.rb +13 -0
- data/test/helpers.rb +28 -0
- data/vigilant.gemspec +21 -0
- metadata +68 -0
data/.gitignore
ADDED
data/bin/vigilant
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
$LOAD_PATH.unshift File.dirname(__FILE__) + "/../lib"
|
3
|
+
|
4
|
+
require "rubygems"
|
5
|
+
require "gli"
|
6
|
+
require "vigilant"
|
7
|
+
require "vigilant/cli"
|
8
|
+
|
9
|
+
version Vigilant::version
|
10
|
+
|
11
|
+
desc "Generate unit test file"
|
12
|
+
long_desc "Generate C/C++ unit testing file from a Vigilant config file"
|
13
|
+
command :gen do |c|
|
14
|
+
c.action do |global_options, options, args|
|
15
|
+
file = args.first
|
16
|
+
Vigilant::CLI.gen(file, options)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
pre { |global, command, options, args| true }
|
21
|
+
post {|global, command, options, args| true }
|
22
|
+
|
23
|
+
on_error do |exception|
|
24
|
+
puts exception
|
25
|
+
puts exception.backtrace
|
26
|
+
end
|
27
|
+
|
28
|
+
exit GLI.run(ARGV)
|
data/lib/vigilant.rb
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'vigilant/test'
|
3
|
+
|
4
|
+
class Vigilant
|
5
|
+
VERSION = '0.1.0'
|
6
|
+
|
7
|
+
attr_reader :num_tests
|
8
|
+
|
9
|
+
def initialize( test_dir )
|
10
|
+
raise "You need to specify a tests directory" unless test_dir
|
11
|
+
raise "You need to specify a valid tests directory" unless valid_test_dir(test_dir)
|
12
|
+
end
|
13
|
+
|
14
|
+
def generate_tests()
|
15
|
+
raise "You need to specify an output path" unless @options['output']
|
16
|
+
includes = [] unless @options['includes']
|
17
|
+
|
18
|
+
puts "Generating tests..."
|
19
|
+
@num_tests = 0
|
20
|
+
|
21
|
+
Dir.chdir(@project_dir) do
|
22
|
+
File.open(@options['output'].dup.untaint, "w") do |out|
|
23
|
+
out.write(PROLOGUE)
|
24
|
+
includes.each { |include| out.write("#include <#{include}>\n") }
|
25
|
+
|
26
|
+
tests = []
|
27
|
+
Dir.glob("**/*.test") do |test|
|
28
|
+
next if !File.file?(test)
|
29
|
+
tests << test
|
30
|
+
end
|
31
|
+
|
32
|
+
@num_tests = tests.length
|
33
|
+
|
34
|
+
run_tests = ""
|
35
|
+
tests.each do |file|
|
36
|
+
puts "#{file}"
|
37
|
+
|
38
|
+
test = Vigilant::Test.load(file)
|
39
|
+
raise "[#{file}] isn't a Vigilant::Test." unless test
|
40
|
+
|
41
|
+
suite = File.dirname(file).split('/').join('_')
|
42
|
+
name = File.basename(file, ".test")
|
43
|
+
prefix = ""
|
44
|
+
|
45
|
+
if suite.empty?
|
46
|
+
prefix = "test_#{name}"
|
47
|
+
else
|
48
|
+
prefix = "test_#{suite}_#{name}"
|
49
|
+
end
|
50
|
+
|
51
|
+
prior_to = "static void " << suite << "_" << name << "__prior_to( void ) {\n"
|
52
|
+
prior_to += test.prior_to.untaint
|
53
|
+
prior_to += "}\n\n"
|
54
|
+
out.write(prior_to)
|
55
|
+
|
56
|
+
run = "static void " << suite << "_" << name << "__run( void ) {\n"
|
57
|
+
run += test.run.untaint
|
58
|
+
run += "}\n\n"
|
59
|
+
out.write(run)
|
60
|
+
|
61
|
+
after = "static void " << suite << "_" << name << "__after( void ) {\n"
|
62
|
+
after += test.after.untaint
|
63
|
+
after += "}\n\n"
|
64
|
+
out.write(after)
|
65
|
+
|
66
|
+
run_tests = run_tests << "
|
67
|
+
fprintf(stdout, \"Running #{prefix}\\n\");
|
68
|
+
#{prefix}__prior_to();
|
69
|
+
if( !setjmp(__vigilant_jb) ) {
|
70
|
+
#{prefix}__run();
|
71
|
+
++passed;
|
72
|
+
} else {
|
73
|
+
ret = EXIT_FAILURE;
|
74
|
+
fprintf(stdout, \" Failed: %s\\n\", &__test_msg[0]);
|
75
|
+
}
|
76
|
+
#{prefix}__after();\n"
|
77
|
+
end
|
78
|
+
|
79
|
+
out.write("
|
80
|
+
int main( int argc, char** argv ) {
|
81
|
+
int ret = EXIT_SUCCESS;
|
82
|
+
unsigned passed = 0;
|
83
|
+
fprintf(stdout, \"Running test suite...\\n\");
|
84
|
+
|
85
|
+
#{run_tests}
|
86
|
+
|
87
|
+
fprintf(stdout, \"\\n%u/%u passed (%%%u).\\n\", passed, (#{@num_tests}), (passed * 100) / (#{@num_tests}));
|
88
|
+
return ret;
|
89
|
+
}\n")
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
puts "Generated #{num_tests} tests."
|
94
|
+
end
|
95
|
+
|
96
|
+
def valid_test_dir( dir )
|
97
|
+
return false if !File.directory?(dir)
|
98
|
+
path = File.expand_path(dir)
|
99
|
+
@project_dir = File.dirname(path)
|
100
|
+
@options = JSON.parse(File.read(File.join(dir, "vigilant.options")))
|
101
|
+
true
|
102
|
+
end
|
103
|
+
|
104
|
+
PROLOGUE = <<-PROLOGUE
|
105
|
+
// DO NOT MODIFY
|
106
|
+
// This file was auto-generated by Vigilant.
|
107
|
+
|
108
|
+
#include <stdio.h>
|
109
|
+
#include <stdlib.h>
|
110
|
+
#include <setjmp.h>
|
111
|
+
|
112
|
+
static jmpbuf __vigilant_jb;
|
113
|
+
static char __vigilant_msg_buffer[4096];
|
114
|
+
|
115
|
+
#define ___vigilant_stringfy( x ) #x
|
116
|
+
#define __vigilant_stringfy( x ) ___vigilant_stringfy(x)
|
117
|
+
|
118
|
+
#undef assert
|
119
|
+
#define assert( condition ) \
|
120
|
+
do { if (!(_condition)) { sprintf(&__vigilant_msg_buffer[0], "'" #_condition "' failed on " __vigilant_stringfy(__LINE__) " in '" __vigilant_stringfy(__FILE__) "'"); longjmp(__vigilant_jb, 0); }} while (0, 0)
|
121
|
+
|
122
|
+
#define assert_equal( a, b ) \
|
123
|
+
assert((a) == (b))
|
124
|
+
|
125
|
+
#define assert_not_equal( a, b ) \
|
126
|
+
assert((a) != (b))
|
127
|
+
|
128
|
+
|
129
|
+
PROLOGUE
|
130
|
+
end
|
data/lib/vigilant/cli.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
class Vigilant
|
2
|
+
class CLI
|
3
|
+
def self.doc( file, options )
|
4
|
+
Vigilant.new(file).generate_tests
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.gen( file )
|
8
|
+
temp = <<-TEMPLATE
|
9
|
+
{
|
10
|
+
"output": "run_tests.c"
|
11
|
+
}
|
12
|
+
TEMPLATE
|
13
|
+
puts "Writing to #{file}"
|
14
|
+
File.open(file, 'w+') do |f|
|
15
|
+
f.write(temp)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
class Vigilant
|
2
|
+
class Test
|
3
|
+
attr_accessor :prior_to
|
4
|
+
attr_accessor :run
|
5
|
+
attr_accessor :after
|
6
|
+
|
7
|
+
def initialize()
|
8
|
+
@prior_to = ""
|
9
|
+
@run = ""
|
10
|
+
@after = ""
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.load file
|
14
|
+
return unless file
|
15
|
+
file = file.dup.untaint
|
16
|
+
return unless File.file?(file)
|
17
|
+
|
18
|
+
code = File.read(file).untaint
|
19
|
+
|
20
|
+
begin
|
21
|
+
test = eval(code, binding, file)
|
22
|
+
|
23
|
+
if Vigilant::Test === test
|
24
|
+
return test
|
25
|
+
end
|
26
|
+
|
27
|
+
warn "[#{file}] isn't a Vigilant::Test (#{test.class} instead)."
|
28
|
+
rescue SignalException, SystemExit
|
29
|
+
raise
|
30
|
+
rescue SyntaxError, Exception => e
|
31
|
+
warn "Invalid test in [#{file}]: #{e}"
|
32
|
+
end
|
33
|
+
|
34
|
+
nil
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/test/.gitignore
ADDED
File without changes
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require File.expand_path "../helpers", __FILE__
|
2
|
+
|
3
|
+
context "Vigilant Test Generation" do
|
4
|
+
setup do
|
5
|
+
@path = File.join(File.dirname(__FILE__), "fixtures")
|
6
|
+
@generator = Vigilant.new(@path)
|
7
|
+
@generator.generate_tests
|
8
|
+
end
|
9
|
+
|
10
|
+
test "can parse tests" do
|
11
|
+
assert_equal 1, @generator.num_tests
|
12
|
+
end
|
13
|
+
end
|
data/test/helpers.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
$LOAD_PATH.unshift File.dirname(File.expand_path(__FILE__)) + "/../lib"
|
2
|
+
$TESTING = true
|
3
|
+
|
4
|
+
require 'test/unit'
|
5
|
+
require 'rubygems'
|
6
|
+
require 'vigilant'
|
7
|
+
|
8
|
+
##
|
9
|
+
# test/spec/mini 3
|
10
|
+
# http://gist.github.com/25455
|
11
|
+
# chris@ozmm.org
|
12
|
+
#
|
13
|
+
def context(*args, &block)
|
14
|
+
return super unless (name = args.first) && block
|
15
|
+
require 'test/unit'
|
16
|
+
klass = Class.new(defined?(ActiveSupport::TestCase) ? ActiveSupport::TestCase : Test::Unit::TestCase) do
|
17
|
+
def self.test(name, &block)
|
18
|
+
define_method("test_#{name.gsub(/\W/,'_')}", &block) if block
|
19
|
+
end
|
20
|
+
def self.xtest(*args) end
|
21
|
+
def self.setup(&block) define_method(:setup, &block) end
|
22
|
+
def self.teardown(&block) define_method(:teardown, &block) end
|
23
|
+
end
|
24
|
+
(class << klass; self end).send(:define_method, :name) { name.gsub(/\W/,'_') }
|
25
|
+
klass.class_eval &block
|
26
|
+
($contexts ||= []) << klass # make sure klass doesn't get GC'd
|
27
|
+
klass
|
28
|
+
end
|
data/vigilant.gemspec
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
$:.push File.expand_path("../lib", __FILE__)
|
2
|
+
require 'vigilant'
|
3
|
+
|
4
|
+
Gem::Specification.new do |spec|
|
5
|
+
spec.name = "vigilant"
|
6
|
+
spec.version = Vigilant::VERSION
|
7
|
+
spec.platform = Gem::Platform::RUBY
|
8
|
+
spec.authors = ["Michael Williams"]
|
9
|
+
spec.email = ["devbug@bitbyte.ca"]
|
10
|
+
spec.homepage = "http://github.com/mtwilliams/vigilant"
|
11
|
+
spec.summary = "A simple C/C++ unit test generator."
|
12
|
+
spec.description = spec.summary
|
13
|
+
|
14
|
+
spec.rubyforge_project = "vigilant"
|
15
|
+
|
16
|
+
spec.add_development_dependency "bundler", "~>1.0"
|
17
|
+
|
18
|
+
spec.files = `git ls-files`.split("\n")
|
19
|
+
spec.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
spec.require_paths = ["lib"]
|
21
|
+
end
|
metadata
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: vigilant
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Michael Williams
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-12-19 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: bundler
|
16
|
+
requirement: &16148640 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '1.0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *16148640
|
25
|
+
description: A simple C/C++ unit test generator.
|
26
|
+
email:
|
27
|
+
- devbug@bitbyte.ca
|
28
|
+
executables:
|
29
|
+
- vigilant
|
30
|
+
extensions: []
|
31
|
+
extra_rdoc_files: []
|
32
|
+
files:
|
33
|
+
- .gitignore
|
34
|
+
- bin/vigilant
|
35
|
+
- lib/vigilant.rb
|
36
|
+
- lib/vigilant/cli.rb
|
37
|
+
- lib/vigilant/test.rb
|
38
|
+
- test/.gitignore
|
39
|
+
- test/fixtures/foo.test
|
40
|
+
- test/fixtures/vigilant.options
|
41
|
+
- test/generate_test.rb
|
42
|
+
- test/helpers.rb
|
43
|
+
- vigilant.gemspec
|
44
|
+
homepage: http://github.com/mtwilliams/vigilant
|
45
|
+
licenses: []
|
46
|
+
post_install_message:
|
47
|
+
rdoc_options: []
|
48
|
+
require_paths:
|
49
|
+
- lib
|
50
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
requirements: []
|
63
|
+
rubyforge_project: vigilant
|
64
|
+
rubygems_version: 1.8.16
|
65
|
+
signing_key:
|
66
|
+
specification_version: 3
|
67
|
+
summary: A simple C/C++ unit test generator.
|
68
|
+
test_files: []
|