File: context.rb

package info (click to toggle)
ruby-test-unit-context 0.5.0-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 188 kB
  • sloc: ruby: 810; makefile: 2
file content (86 lines) | stat: -rw-r--r-- 2,937 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
module Test::Unit::Context
  module Context

    PREFIX = 'Context'.freeze # :nodoc:
    SUFFIX = nil # :nodoc:

    # Add a context to a set of tests.
    #
    #   context "A new account" do
    #     test "does not have users" do
    #       assert Account.new.users.empty?
    #     end
    #   end
    #
    # The context name is prepended to the test name, so failures look like this:
    #
    #   1) Failure:
    #   test_a_new_account_does_not_have_users() [./test/test_accounts.rb:4]:
    #   <false> is not true.
    #
    # Contexts can also be nested like so:
    #
    #   context "A new account" do
    #     context "created from the web application" do
    #       test "has web as its vendor" do
    #         assert_equal "web", users(:web_user).vendor
    #       end
    #     end
    #   end
    #
    # Context should have unique names within a given scope, otherwise they
    # end-up being merged as if it where one single context declaration.
    # Anonymous (un-named) contexts are supported as well - contrary they
    # never get merged (a unique name is generated for each such context).
    #
    def context(name = nil, &block)
      name ||= Helpers.generate_uuid
      # context "created with defaults" ... 'ContextCreatedWithDefaults'
      class_name = Helpers.to_const_name(name.to_s, PREFIX, SUFFIX)
      if const_defined?(class_name)
        klass = const_get(class_name)
        if ( klass.superclass == self rescue nil )
          warn "duplicate context definition with the name #{name.inspect} " <<
                "found at #{caller.first} it is going to be merged with " <<
                "the previous context definition"
        else
          raise "could not create a context with the name #{name.inspect} " <<
                "as a constant #{class_name} is already defined and is not " <<
                "another context definition"
        end
      else
        klass = Class.new(self)
        klass.extend Test::Unit::Context
        klass.context_name = name
        # NOTE: make sure by default we run "inherited" setup/teardown hooks
        # unless context code does re-define the hook method e.g. `def setup`
        # instead of using the `setup do` or the setup method marker syntax :
        klass.class_eval do
          def setup; super; end
          def cleanup; super; end
          def teardown; super; end
        end
        const_set(class_name, klass)
      end
      context_definitions << klass
      klass.class_eval(&block)
      klass
    end

    %w( contexts group ).each { |m| alias_method m, :context }

    def context_definitions(nested = false)
      @_context_definitions ||= []
      if nested
        contexts = @_context_definitions.dup
        @_context_definitions.each do |context|
          contexts.concat context.context_definitions(nested)
        end
        contexts
      else
        @_context_definitions
      end
    end

  end
end