tu-context 0.5.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,65 @@
1
+
2
+ def extract_path(argv)
3
+ if argv[1].nil?
4
+ if argv[0] =~ /-a/
5
+ return "/**/*.rb"
6
+ elsif argv[0]
7
+ if argv[0] =~ /\.rb$/
8
+ return argv[0]
9
+ end
10
+ return argv[0] + "/**/*.rb"
11
+ else
12
+ return "/**/*.rb"
13
+ end
14
+ elsif argv[1] =~ /\.rb$/
15
+ return argv[1]
16
+ else
17
+ return argv[1] + "/**/*.rb"
18
+ end
19
+ end
20
+
21
+ def all?
22
+ ARGV.join =~ /-a/
23
+ end
24
+
25
+ def comment?(line)
26
+ line =~ /^\s*#/
27
+ end
28
+
29
+ def blank?(line)
30
+ line =~ /^\s*$/
31
+ end
32
+
33
+ def puke(header, locs, comments, blanks)
34
+ puts header + ":"
35
+ puts "#{locs} loc"
36
+ puts "#{comments} lines of comments"
37
+ puts "#{blanks} blank lines"
38
+ end
39
+
40
+ dir = File.dirname(__FILE__)
41
+ full_path = File.join(dir,extract_path(ARGV))
42
+ gloc = gcmts = gblanks = 0
43
+ Dir[File.expand_path("#{full_path}")].uniq.each do |file|
44
+ if file =~ /.*\.rb$/
45
+
46
+ loc = cmts = blanks = 0
47
+
48
+ File.open(file, "r") do |f|
49
+ while f.gets
50
+ if comment?($_)
51
+ cmts += 1
52
+ elsif blank?($_)
53
+ blanks += 1
54
+ else
55
+ loc += 1
56
+ end
57
+ end
58
+ end
59
+ gcmts += cmts
60
+ gloc += loc
61
+ gblanks += blanks
62
+ puke(file, loc, cmts, blanks) if all?
63
+ end
64
+ end
65
+ puke("Total", gloc, gcmts, gblanks)
@@ -0,0 +1,19 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ require 'rubygems'
5
+ require 'test/unit'
6
+
7
+ require 'context/core_ext/string'
8
+ require 'context/core_ext/rails_hacks'
9
+
10
+ require 'context/version'
11
+ require 'context/suite'
12
+ require 'context/test'
13
+ require 'context/lifecycle'
14
+ require 'context/context'
15
+ require 'context/shared_behavior'
16
+
17
+ class Test::Unit::TestCase
18
+ extend Context::Context
19
+ end
@@ -0,0 +1,64 @@
1
+ module Context
2
+ module Context
3
+ # Test::Unit uses ObjectSpace to figure out what Test::Unit:TestCase instances are running
4
+ # Contexts are not named and therefore sometimes get garbage collected.
5
+ # Think of #context_list as the shelter for nameless contexts
6
+ attr_accessor :context_list
7
+
8
+ def context_name #:nodoc:
9
+ @context_name ||= ""
10
+ if superclass.respond_to?(:context_name)
11
+ return "#{superclass.context_name} #{@context_name}".gsub(/^\s+/, "")
12
+ end
13
+ end
14
+
15
+ def context_name=(val) #:nodoc:
16
+ @context_name = val
17
+ end
18
+
19
+ # Add a context to a set of tests.
20
+ #
21
+ # context "A new account" do
22
+ # it "should not have users"
23
+ # assert Account.new.users.empty?
24
+ # end
25
+ # end
26
+ #
27
+ # The context name is prepended to the test name, so failures look like this:
28
+ #
29
+ # 1) Failure:
30
+ # test_a_new_account_should_not_have_users() [./test/test_accounts.rb:4]:
31
+ # <false> is not true.
32
+ #
33
+ # Contexts can also be nested like so:
34
+ #
35
+ # context "A new account" do
36
+ # context "created by the web application" do
37
+ # it "should have web as its vendor" do
38
+ # assert_equal "web", users(:web_user).vendor
39
+ # end
40
+ # end
41
+ # end
42
+ #
43
+ # Since contexts create a singleton instance of a class, each one must have its own before/after blocks. This
44
+ # will be tweaked in future releases to allow you to chain these blocks from its parent contexts.
45
+ #
46
+ def context(name, &block)
47
+ cls = Class.new(self)
48
+ cls.context_name = name
49
+ # puts "Creating context #{cls.context_name}"
50
+
51
+ # Care about Rails tests in nested contexts
52
+ cls.tests($1.constantize) if defined?(Rails) &&
53
+ self.name =~ /^(.*(Controller|Helper|Mailer))Test/ &&
54
+ self < ActiveSupport::TestCase
55
+
56
+ cls.class_eval(&block)
57
+ (self.context_list ||= []) << cls
58
+ const_set("Test#{name.to_class_name}#{cls.object_id.abs}", cls)
59
+ cls
60
+ end
61
+
62
+ %w(contexts describe describes group specify specifies).each {|m| alias_method m, :context}
63
+ end
64
+ end
@@ -0,0 +1,10 @@
1
+ class Test::Unit::TestCase
2
+ class << self
3
+ def setup_for_shoulda
4
+ self.instance_eval do
5
+ alias :setup :before
6
+ alias :teardown :after
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,17 @@
1
+ class String
2
+ # Replaces spaces and tabs with _ so we can use the string as a method name
3
+ # Also replace dangerous punctuation
4
+ def to_method_name
5
+ self.downcase.gsub(/[\s:',\.~;!#=\(\)&\?]+/, '_')
6
+ end
7
+
8
+ # Borrowed from +camelize+ in ActiveSupport
9
+ def to_module_name
10
+ self.to_method_name.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
11
+ end
12
+
13
+ # Borrowed from +camelize+ in ActiveSupport
14
+ def to_class_name
15
+ self.to_method_name.gsub(/\/(.?)/) { "#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
16
+ end
17
+ end
@@ -0,0 +1,103 @@
1
+ class Test::Unit::TestCase
2
+ class << self
3
+ attr_accessor :before_each_callbacks, :before_all_callbacks, :after_each_callbacks, :after_all_callbacks, :before_should_callbacks
4
+
5
+ # Add logic to run before the tests (i.e., a +setup+ method)
6
+ #
7
+ # before do
8
+ # @user = User.first
9
+ # end
10
+ #
11
+ def before(period = :each, &block)
12
+ unless block_given?
13
+ block = period
14
+ period = :each
15
+ end
16
+
17
+ send("before_#{period}_callbacks") << block
18
+ end
19
+
20
+ alias :setup :before
21
+
22
+ # Add logic to run after the tests (i.e., a +teardown+ method)
23
+ #
24
+ # after do
25
+ # User.delete_all
26
+ # end
27
+ #
28
+ def after(period = :each, &block)
29
+ unless block_given?
30
+ block = period
31
+ period = :each
32
+ end
33
+
34
+ send("after_#{period}_callbacks") << block
35
+ end
36
+
37
+ alias :teardown :after
38
+
39
+ def gather_callbacks(callback_type, period) # :nodoc:
40
+ callbacks = superclass.respond_to?(:gather_callbacks) ? superclass.gather_callbacks(callback_type, period) : []
41
+ callbacks.push(*send("#{callback_type}_#{period}_callbacks"))
42
+ end
43
+ end
44
+
45
+ self.before_all_callbacks = []
46
+ self.before_each_callbacks = []
47
+ self.after_each_callbacks = []
48
+ self.after_all_callbacks = []
49
+ self.before_should_callbacks = {}
50
+
51
+ def self.inherited(child) # :nodoc:
52
+ super
53
+ child.before_all_callbacks = []
54
+ child.before_each_callbacks = []
55
+ child.after_each_callbacks = []
56
+ child.after_all_callbacks = []
57
+ child.before_should_callbacks = {}
58
+
59
+ child.class_eval do
60
+ def setup(&block)
61
+ super
62
+
63
+ unless self.class.before_should_callbacks[method_name].nil?
64
+ instance_eval(&self.class.before_should_callbacks[method_name])
65
+ end
66
+
67
+ run_each_callbacks :before
68
+ end
69
+
70
+ def teardown
71
+ super
72
+
73
+ run_each_callbacks :after
74
+ end
75
+ end if self == Test::Unit::TestCase
76
+ end
77
+
78
+ def run_each_callbacks(callback_type) # :nodoc:
79
+ self.class.gather_callbacks(callback_type, :each).each do |c|
80
+ c.is_a?(Proc) ? instance_eval(&c) : send(c)
81
+ end
82
+ end
83
+
84
+ def run_all_callbacks(callback_type) # :nodoc:
85
+ previous_ivars = instance_variables
86
+ self.class.gather_callbacks(callback_type, :all).each { |c| instance_eval(&c) if c }
87
+ (instance_variables - previous_ivars).inject({}) do |hash, ivar|
88
+ hash.update ivar => instance_variable_get(ivar)
89
+ end
90
+ rescue Object => exception
91
+ raise <<-BANG
92
+ Error running the #{callback_type}(:all) callback for #{name}
93
+ #{exception.class.name}: #{exception.message}
94
+ #{exception.backtrace.join("\n")}
95
+ BANG
96
+ end
97
+
98
+ def set_values_from_callbacks(values) # :nodoc:
99
+ values.each do |name, value|
100
+ instance_variable_set name, value
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,97 @@
1
+ module Context
2
+ class SharedBehavior < Module
3
+ def self.create_from_behavior(beh) # :nodoc:
4
+ mod = self.new
5
+ mod._behavior = beh
6
+ mod
7
+ end
8
+
9
+ def _behavior=(beh) # :nodoc:
10
+ @_behavior = beh
11
+ end
12
+
13
+ def included(including_module) # :nodoc:
14
+ including_module.class_eval(&@_behavior)
15
+ end
16
+ end
17
+ end
18
+
19
+ class Test::Unit::TestCase
20
+ class << self
21
+ # Share behavior among different contexts. This creates a module (actually, a Module subclass)
22
+ # that is included using the +use+ method (or one of its aliases) provided by context or +include+
23
+ # if you know the module's constant name.
24
+ #
25
+ # ==== Examples
26
+ #
27
+ # shared "other things" do
28
+ # it "should do things but not some things" do
29
+ # # behavior is fun
30
+ # end
31
+ # end
32
+ #
33
+ # use "other things"
34
+ # # or...
35
+ # it_should_behave_like "other things"
36
+ #
37
+ # shared :client do
38
+ # it "should be a client to our server" do
39
+ # # TODO: client behavior here
40
+ # end
41
+ # end
42
+ #
43
+ # use :client
44
+ # # or...
45
+ # uses "client"
46
+ # behaves_like "client"
47
+ #
48
+ def shared(name, &block)
49
+ case name.class.name
50
+ when "String"
51
+ name = name.to_module_name
52
+ when "Symbol"
53
+ name = name.to_s.to_module_name
54
+ else
55
+ raise ArgumentError, "Provide a String or Symbol as the name of the shared behavior group"
56
+ end
57
+
58
+ Object.const_set(name, Context::SharedBehavior.create_from_behavior(block))
59
+ end
60
+
61
+ %w(shared_behavior share_as share_behavior_as shared_examples_for).each {|m| alias_method m, :shared}
62
+
63
+ # Pull in behavior shared by +shared+ or a module.
64
+ #
65
+ # ==== Examples
66
+ #
67
+ # shared "other things" do
68
+ # it "should do things but not some things" do
69
+ # # behavior is fun
70
+ # end
71
+ # end
72
+ #
73
+ # use "other things"
74
+ # # or...
75
+ # it_should_behave_like "other things"
76
+ #
77
+ # module Things
78
+ # end
79
+ #
80
+ # uses Things
81
+ #
82
+ def use(shared_name)
83
+ case shared_name.class.name
84
+ when "Context::SharedBehavior", "Module"
85
+ include shared_name
86
+ when "String"
87
+ include Object.const_get(shared_name.to_module_name)
88
+ when "Symbol"
89
+ include Object.const_get(shared_name.to_s.to_module_name)
90
+ else
91
+ raise ArgumentError, "Provide a String or Symbol as the name of the shared behavior group or the module name"
92
+ end
93
+ end
94
+
95
+ %w(uses it_should_behave_like behaves_like uses_examples_from).each {|m| alias_method m, :use}
96
+ end
97
+ end
@@ -0,0 +1,39 @@
1
+ module Test
2
+ module Unit
3
+ class TestCase
4
+ class << self
5
+ # Tweaks to standard method so we don't get superclass methods and we don't
6
+ # get weird default tests
7
+ def suite # :nodoc:
8
+ method_names = public_instance_methods - superclass.public_instance_methods
9
+
10
+ tests = method_names.delete_if {|method_name| method_name !~ /^test./}
11
+ suite = Test::Unit::TestSuite.new(name)
12
+
13
+ tests.sort.each do |test|
14
+ catch(:invalid_test) do
15
+ suite << new(test)
16
+ end
17
+ end
18
+
19
+ suite
20
+ end
21
+ end
22
+ end
23
+
24
+ class TestSuite
25
+ # Runs the tests and/or suites contained in this
26
+ # TestSuite.
27
+ def run(result, &progress_block) # :nodoc:
28
+ yield(STARTED, name)
29
+ ivars_from_callback = @tests.first.run_all_callbacks(:before) if @tests.first.is_a?(Test::Unit::TestCase)
30
+ @tests.each do |test|
31
+ test.set_values_from_callbacks(ivars_from_callback) if ivars_from_callback
32
+ test.run(result, &progress_block)
33
+ end
34
+ ivars_from_callback = @tests.first.run_all_callbacks(:after) if ivars_from_callback
35
+ yield(FINISHED, name)
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,37 @@
1
+ class Test::Unit::TestCase
2
+ class << self
3
+ # Create a test method. +name+ is a native-language string to describe the test
4
+ # (e.g., no more +test_this_crazy_thing_with_underscores+).
5
+ #
6
+ # test "A user should not be able to delete another user" do
7
+ # assert_false @user.can?(:delete, @other_user)
8
+ # end
9
+ #
10
+ def test(name, opts={}, &block)
11
+ test_name = ["test:", context_name, name].reject { |n| n == "" }.join(' ')
12
+ # puts "running test #{test_name}"
13
+ defined = instance_method(test_name) rescue false
14
+ raise "#{test_name} is already defined in #{self}" if defined
15
+
16
+ unless opts[:before].nil?
17
+ before_should_callbacks[test_name] = opts[:before]
18
+ end
19
+
20
+ if block_given?
21
+ define_method(test_name, &block)
22
+ else
23
+ define_method(test_name) do
24
+ flunk "No implementation provided for #{name}"
25
+ end
26
+ end
27
+ end
28
+
29
+ %w(it should tests).each {|m| alias_method m, :test}
30
+
31
+ def before_test(name, &block)
32
+ test(name, :before => block) {}
33
+ end
34
+
35
+ %w(before_it before_should before_tests).each {|m| alias_method m, :before_test}
36
+ end
37
+ end