dfect 1.1.0 → 2.0.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/CREDITS +2 -2
- data/HISTORY +306 -0
- data/INSTALL +35 -0
- data/README +95 -0
- data/USAGE +393 -0
- data/doc/api/Dfect.html +3179 -0
- data/doc/api/Object.html +107 -0
- data/doc/api/_index.html +107 -0
- data/doc/api/class_list.html +36 -0
- data/doc/api/css/common.css +1 -0
- data/doc/api/css/full_list.css +50 -0
- data/doc/api/css/style.css +268 -0
- data/doc/api/file.LICENSE.html +73 -0
- data/doc/api/file_list.html +38 -0
- data/doc/api/frames.html +13 -0
- data/doc/api/index.html +72 -13
- data/doc/api/js/app.js +99 -0
- data/doc/api/js/full_list.js +106 -0
- data/doc/api/js/{jquery-1.3.2.min.js → jquery.js} +0 -0
- data/doc/api/method_list.html +339 -0
- data/doc/api/top-level-namespace.html +87 -0
- data/doc/index.erb +16 -9
- data/doc/index.html +1057 -726
- data/lib/dfect.rb +431 -284
- data/lib/dfect/auto.rb +2 -6
- data/lib/dfect/inochi.rb +48 -0
- data/lib/dfect/inochi.yaml +75 -0
- data/lib/dfect/mini.rb +1 -5
- data/lib/dfect/spec.rb +6 -13
- data/lib/dfect/unit.rb +21 -33
- data/test/dfect/inochi_test.rb +17 -0
- data/test/{dfect.rb → dfect_test.rb} +167 -7
- data/test/runner +25 -0
- data/test/test_helper.rb +1 -0
- metadata +43 -55
- data/doc/api/apple-touch-icon.png +0 -0
- data/doc/api/classes/Class.html +0 -73
- data/doc/api/classes/Dfect.html +0 -1245
- data/doc/api/classes/Kernel.html +0 -322
- data/doc/api/classes/Object.html +0 -72
- data/doc/api/created.rid +0 -1
- data/doc/api/css/main.css +0 -263
- data/doc/api/css/panel.css +0 -383
- data/doc/api/css/reset.css +0 -53
- data/doc/api/favicon.ico +0 -0
- data/doc/api/files/CREDITS.html +0 -65
- data/doc/api/files/LICENSE.html +0 -76
- data/doc/api/files/lib/dfect/auto_rb.html +0 -80
- data/doc/api/files/lib/dfect/mini_rb.html +0 -77
- data/doc/api/files/lib/dfect/spec_rb.html +0 -73
- data/doc/api/files/lib/dfect/unit_rb.html +0 -73
- data/doc/api/files/lib/dfect_rb.html +0 -74
- data/doc/api/i/arrows.png +0 -0
- data/doc/api/i/results_bg.png +0 -0
- data/doc/api/i/tree_bg.png +0 -0
- data/doc/api/js/jquery-effect.js +0 -593
- data/doc/api/js/main.js +0 -22
- data/doc/api/js/searchdoc.js +0 -628
- data/doc/api/panel/index.html +0 -71
- data/doc/api/panel/search_index.js +0 -1
- data/doc/api/panel/tree.js +0 -1
- data/doc/history.erb +0 -161
- data/doc/intro.erb +0 -104
- data/doc/setup.erb +0 -107
- data/doc/usage.erb +0 -310
- data/rakefile +0 -21
    
        data/lib/dfect/auto.rb
    CHANGED
    
    | @@ -2,10 +2,6 @@ | |
| 2 2 | 
             
            #
         | 
| 3 3 | 
             
            # Simply require() this file and Dfect will be available for use anywhere
         | 
| 4 4 | 
             
            # in your program and will execute all tests before your program exits.
         | 
| 5 | 
            -
            #--
         | 
| 6 | 
            -
            # Copyright protects this work.
         | 
| 7 | 
            -
            # See LICENSE file for details.
         | 
| 8 | 
            -
            #++
         | 
| 9 5 |  | 
| 10 6 | 
             
            require 'dfect'
         | 
| 11 7 |  | 
| @@ -17,8 +13,8 @@ at_exit do | |
| 17 13 | 
             
              Dfect.run
         | 
| 18 14 |  | 
| 19 15 | 
             
              # reflect number of failures in exit status
         | 
| 20 | 
            -
              stats = Dfect.report[: | 
| 21 | 
            -
              fails = stats[: | 
| 16 | 
            +
              stats = Dfect.report[:stats]
         | 
| 17 | 
            +
              fails = stats[:fail] + stats[:error]
         | 
| 22 18 |  | 
| 23 19 | 
             
              exit [fails, 255].min
         | 
| 24 20 | 
             
            end
         | 
    
        data/lib/dfect/inochi.rb
    ADDED
    
    | @@ -0,0 +1,48 @@ | |
| 1 | 
            +
            module Dfect
         | 
| 2 | 
            +
             | 
| 3 | 
            +
              INSTDIR = File.expand_path('../../..', __FILE__)
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              # load inochi configuration
         | 
| 6 | 
            +
              inochi_file = __FILE__.sub(/rb$/, 'yaml')
         | 
| 7 | 
            +
              begin
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                configs = File.open(inochi_file) do |f|
         | 
| 10 | 
            +
                  require 'yaml'
         | 
| 11 | 
            +
                  YAML.load_stream(f).documents
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                INOCHI = configs.shift.to_hash
         | 
| 15 | 
            +
                INOCHI[:runtime] ||= {}
         | 
| 16 | 
            +
                INOCHI[:devtime] ||= {}
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                INOCHI2 = (configs.shift || {}).to_hash
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              rescue => error
         | 
| 21 | 
            +
                error.message.insert 0,
         | 
| 22 | 
            +
                  "Could not load Inochi configuration file: #{inochi_file.inspect}\n"
         | 
| 23 | 
            +
                raise error
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              # make values available as constants
         | 
| 27 | 
            +
              INOCHI.each do |param, value|
         | 
| 28 | 
            +
                const_set param.to_s.upcase, value
         | 
| 29 | 
            +
              end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
              def self.inspect
         | 
| 32 | 
            +
                "#{PROJECT} #{VERSION} (#{RELEASE})"
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
              # establish gem version dependencies
         | 
| 36 | 
            +
              if respond_to? :gem
         | 
| 37 | 
            +
                [:runtime, :devtime].each do |key|
         | 
| 38 | 
            +
                  INOCHI[key].each do |gem_name, gem_version|
         | 
| 39 | 
            +
                    begin
         | 
| 40 | 
            +
                      gem gem_name, *Array(gem_version)
         | 
| 41 | 
            +
                    rescue LoadError => error
         | 
| 42 | 
            +
                      warn "#{inspect} #{key}: #{error}"
         | 
| 43 | 
            +
                    end
         | 
| 44 | 
            +
                  end
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
              end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
            end
         | 
| @@ -0,0 +1,75 @@ | |
| 1 | 
            +
            --- # information about your project -----------------------------------------
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            # Name of your project.
         | 
| 4 | 
            +
            :project: Dfect
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            # Name of your project when packaged as a directory.
         | 
| 7 | 
            +
            :package: dfect
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            # Name of Ruby module that namespaces your project.
         | 
| 10 | 
            +
            :library: Dfect
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            # A short, single-line description of your project.
         | 
| 13 | 
            +
            :tagline: Assertion testing library for Ruby
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            # Address of your project's published website.
         | 
| 16 | 
            +
            :website: http://snk.tuxfamily.org/lib/dfect/
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            # A list of the core developers of your project.
         | 
| 19 | 
            +
            #
         | 
| 20 | 
            +
            # :authors:
         | 
| 21 | 
            +
            #   - An Example <an@example.com>  # with email
         | 
| 22 | 
            +
            #   - Another Example              # without email
         | 
| 23 | 
            +
            #
         | 
| 24 | 
            +
            :authors:
         | 
| 25 | 
            +
              - Suraj N. Kurapati <sunaku@gmail.com>
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            # Number of the current release of your project.
         | 
| 28 | 
            +
            :version: 2.0.0
         | 
| 29 | 
            +
             | 
| 30 | 
            +
            # Date of the current release of your project.
         | 
| 31 | 
            +
            :release: 2010-03-21
         | 
| 32 | 
            +
             | 
| 33 | 
            +
            # A list of gems required by your project during runtime.
         | 
| 34 | 
            +
            #
         | 
| 35 | 
            +
            # :runtime:
         | 
| 36 | 
            +
            #   # your project needs exactly version 1.2.3 of the "an_example" gem
         | 
| 37 | 
            +
            #   an_example: 1.2.3
         | 
| 38 | 
            +
            #
         | 
| 39 | 
            +
            #   # your project needs at least version 1.2 (but not
         | 
| 40 | 
            +
            #   # version 1.2.4 or newer) of the "another_example" gem
         | 
| 41 | 
            +
            #   another_example: [ >= 1.2 , < 1.2.4 ]
         | 
| 42 | 
            +
            #
         | 
| 43 | 
            +
            #   # your project needs any version of the "yet_another_example" gem
         | 
| 44 | 
            +
            #   yet_another_example:
         | 
| 45 | 
            +
            #
         | 
| 46 | 
            +
            :runtime:
         | 
| 47 | 
            +
             | 
| 48 | 
            +
            # A list of gems required by your project during development.
         | 
| 49 | 
            +
            #
         | 
| 50 | 
            +
            # :devtime:
         | 
| 51 | 
            +
            #   # your project needs exactly version 1.2.3 of the "an_example" gem
         | 
| 52 | 
            +
            #   an_example: 1.2.3
         | 
| 53 | 
            +
            #
         | 
| 54 | 
            +
            #   # your project needs at least version 1.2 (but not
         | 
| 55 | 
            +
            #   # version 1.2.4 or newer) of the "another_example" gem
         | 
| 56 | 
            +
            #   another_example: [ >= 1.2 , < 1.2.4 ]
         | 
| 57 | 
            +
            #
         | 
| 58 | 
            +
            #   # your project needs any version of the "yet_another_example" gem
         | 
| 59 | 
            +
            #   yet_another_example:
         | 
| 60 | 
            +
            #
         | 
| 61 | 
            +
            :devtime:
         | 
| 62 | 
            +
             | 
| 63 | 
            +
            --- # parameters for the `inochi` command ------------------------------------
         | 
| 64 | 
            +
             | 
| 65 | 
            +
            # Location where project documentation will be uploaded by `inochi pub:doc`.
         | 
| 66 | 
            +
            :pub_doc_target: ~/www/lib/dfect/
         | 
| 67 | 
            +
             | 
| 68 | 
            +
            # Options for the `rsync` command used to upload your project's documentation.
         | 
| 69 | 
            +
            :pub_doc_options: --verbose --compress --archive --update --delete
         | 
| 70 | 
            +
             | 
| 71 | 
            +
            # Path to YAML file containing login information for publishing announcements.
         | 
| 72 | 
            +
            :pub_ann_logins: ~/.config/inochi/pub_ann_logins.yaml
         | 
| 73 | 
            +
             | 
| 74 | 
            +
            # Your project's unique identifier in the RAA (Ruby Application Archive).
         | 
| 75 | 
            +
            :pub_ann_raa_id: dfect
         | 
    
        data/lib/dfect/mini.rb
    CHANGED
    
    | @@ -1,14 +1,10 @@ | |
| 1 1 | 
             
            # MiniTest emulation layer.
         | 
| 2 | 
            -
            #--
         | 
| 3 | 
            -
            # Copyright protects this work.
         | 
| 4 | 
            -
            # See LICENSE file for details.
         | 
| 5 | 
            -
            #++
         | 
| 6 2 |  | 
| 7 3 | 
             
            require 'dfect'
         | 
| 8 4 | 
             
            require 'dfect/unit'
         | 
| 9 5 | 
             
            require 'dfect/spec'
         | 
| 10 6 |  | 
| 11 | 
            -
            module  | 
| 7 | 
            +
            module Dfect
         | 
| 12 8 | 
             
              instance_methods(false).each do |meth|
         | 
| 13 9 | 
             
                if meth =~ /^assert_not/
         | 
| 14 10 | 
             
                  alias_method 'refute' + $', meth
         | 
    
        data/lib/dfect/spec.rb
    CHANGED
    
    | @@ -1,18 +1,11 @@ | |
| 1 1 | 
             
            # RSpec emulation layer.
         | 
| 2 | 
            -
            #--
         | 
| 3 | 
            -
            # Copyright protects this work.
         | 
| 4 | 
            -
            # See LICENSE file for details.
         | 
| 5 | 
            -
            #++
         | 
| 6 2 |  | 
| 7 3 | 
             
            require 'dfect'
         | 
| 8 4 |  | 
| 9 | 
            -
            module  | 
| 10 | 
            -
               | 
| 11 | 
            -
             | 
| 12 | 
            -
               | 
| 13 | 
            -
             | 
| 14 | 
            -
              alias context describe
         | 
| 15 | 
            -
              alias it      describe
         | 
| 5 | 
            +
            module Dfect
         | 
| 6 | 
            +
              alias describe D
         | 
| 7 | 
            +
              alias context  D
         | 
| 8 | 
            +
              alias it       D
         | 
| 16 9 |  | 
| 17 10 | 
             
              def before what, &block
         | 
| 18 11 | 
             
                meth =
         | 
| @@ -22,7 +15,7 @@ module Kernel | |
| 22 15 | 
             
                  else raise ArgumentError, what
         | 
| 23 16 | 
             
                  end
         | 
| 24 17 |  | 
| 25 | 
            -
                 | 
| 18 | 
            +
                send meth, &block
         | 
| 26 19 | 
             
              end
         | 
| 27 20 |  | 
| 28 21 | 
             
              def after what, &block
         | 
| @@ -33,6 +26,6 @@ module Kernel | |
| 33 26 | 
             
                  else raise ArgumentError, what
         | 
| 34 27 | 
             
                  end
         | 
| 35 28 |  | 
| 36 | 
            -
                 | 
| 29 | 
            +
                send meth, &block
         | 
| 37 30 | 
             
              end
         | 
| 38 31 | 
             
            end
         | 
    
        data/lib/dfect/unit.rb
    CHANGED
    
    | @@ -1,19 +1,12 @@ | |
| 1 1 | 
             
            # Test::Unit emulation layer.
         | 
| 2 | 
            -
            #--
         | 
| 3 | 
            -
            # Copyright protects this work.
         | 
| 4 | 
            -
            # See LICENSE file for details.
         | 
| 5 | 
            -
            #++
         | 
| 6 2 |  | 
| 7 3 | 
             
            require 'dfect'
         | 
| 8 4 |  | 
| 9 | 
            -
            module  | 
| 10 | 
            -
               | 
| 11 | 
            -
                 | 
| 12 | 
            -
               | 
| 13 | 
            -
             | 
| 14 | 
            -
              def teardown &block
         | 
| 15 | 
            -
                Dfect.>(&block)
         | 
| 16 | 
            -
              end
         | 
| 5 | 
            +
            module Dfect
         | 
| 6 | 
            +
              alias setup     <
         | 
| 7 | 
            +
              alias setup!    <<
         | 
| 8 | 
            +
              alias teardown  >
         | 
| 9 | 
            +
              alias teardown! >>
         | 
| 17 10 |  | 
| 18 11 | 
             
              [
         | 
| 19 12 | 
             
                [:assert,     nil,  nil   ],
         | 
| @@ -26,29 +19,24 @@ module Kernel | |
| 26 19 | 
             
                #      block parameters in define_method()
         | 
| 27 20 | 
             
                #
         | 
| 28 21 | 
             
                file, line = __FILE__, __LINE__ ; eval %{
         | 
| 29 | 
            -
                   | 
| 30 | 
            -
             | 
| 31 | 
            -
                  end
         | 
| 32 | 
            -
             | 
| 33 | 
            -
                  def #{prefix}_block message = nil, &block
         | 
| 34 | 
            -
                    Dfect.T#{polarity}(&block)
         | 
| 35 | 
            -
                  end
         | 
| 22 | 
            +
                  alias #{prefix} T#{polarity}
         | 
| 23 | 
            +
                  alias #{prefix} T#{polarity}
         | 
| 36 24 |  | 
| 37 25 | 
             
                  def #{prefix}_empty collection, message = nil
         | 
| 38 26 | 
             
                    message ||= 'collection must #{action}be empty'
         | 
| 39 | 
            -
                     | 
| 27 | 
            +
                    T#{polarity}(message) { collection.empty? }
         | 
| 40 28 | 
             
                  end
         | 
| 41 29 |  | 
| 42 30 | 
             
                  def #{prefix}_equal expected, actual, message = nil
         | 
| 43 31 | 
             
                    message ||= 'actual must #{action}equal expected'
         | 
| 44 | 
            -
                     | 
| 32 | 
            +
                    T#{polarity}(message) { actual == expected }
         | 
| 45 33 | 
             
                  end
         | 
| 46 34 |  | 
| 47 35 | 
             
                  def #{prefix}_in_delta expected, actual, delta = nil, message = nil
         | 
| 48 36 | 
             
                    message ||= 'actual must #{action}be within delta of expected'
         | 
| 49 37 | 
             
                    delta   ||= 0.001
         | 
| 50 38 |  | 
| 51 | 
            -
                     | 
| 39 | 
            +
                    T#{polarity}(message) do
         | 
| 52 40 | 
             
                      Math.abs(expected - actual) <= Math.abs(delta)
         | 
| 53 41 | 
             
                    end
         | 
| 54 42 | 
             
                  end
         | 
| @@ -57,55 +45,55 @@ module Kernel | |
| 57 45 |  | 
| 58 46 | 
             
                  def #{prefix}_include item, collection, message = nil
         | 
| 59 47 | 
             
                    message ||= 'collection must #{action}include item'
         | 
| 60 | 
            -
                     | 
| 48 | 
            +
                    T#{polarity}(messsage) { collection.include? item }
         | 
| 61 49 | 
             
                  end
         | 
| 62 50 |  | 
| 63 51 | 
             
                  def #{prefix}_instance_of _class, object, message = nil
         | 
| 64 52 | 
             
                    message ||= 'object must #{action}be an instance of class'
         | 
| 65 | 
            -
                     | 
| 53 | 
            +
                    T#{polarity}(message) { object.instance_of? _class }
         | 
| 66 54 | 
             
                  end
         | 
| 67 55 |  | 
| 68 56 | 
             
                  def #{prefix}_kind_of _class, object, message = nil
         | 
| 69 57 | 
             
                    message ||= 'object must #{action}be a kind of class'
         | 
| 70 | 
            -
                     | 
| 58 | 
            +
                    T#{polarity}(message) { object.kind_of? _class }
         | 
| 71 59 | 
             
                  end
         | 
| 72 60 |  | 
| 73 61 | 
             
                  def #{prefix}_nil object, message = nil
         | 
| 74 62 | 
             
                    message ||= 'object must #{action}be nil'
         | 
| 75 | 
            -
                     | 
| 63 | 
            +
                    T#{polarity}(message) { object == nil }
         | 
| 76 64 | 
             
                  end
         | 
| 77 65 |  | 
| 78 66 | 
             
                  def #{prefix}_match pattern, string, message = nil
         | 
| 79 67 | 
             
                    message ||= 'string must #{action}match pattern'
         | 
| 80 | 
            -
                     | 
| 68 | 
            +
                    T#{polarity}(message) { string =~ pattern }
         | 
| 81 69 | 
             
                  end
         | 
| 82 70 |  | 
| 83 71 | 
             
                  def #{prefix}_same expected, actual, message = nil
         | 
| 84 72 | 
             
                    message ||= 'actual must #{action}be same as expected'
         | 
| 85 | 
            -
                     | 
| 73 | 
            +
                    T#{polarity}(message) { actual.equal? expected }
         | 
| 86 74 | 
             
                  end
         | 
| 87 75 |  | 
| 88 76 | 
             
                  def #{prefix}_operator object, operator, operand, message = nil
         | 
| 89 77 | 
             
                    message ||= 'object must #{action}support operator with operand'
         | 
| 90 | 
            -
                     | 
| 78 | 
            +
                    T#{polarity} { object.__send__ operator, operand }
         | 
| 91 79 | 
             
                  end
         | 
| 92 80 |  | 
| 93 81 | 
             
                  def #{prefix}_raise *args, &block
         | 
| 94 | 
            -
                     | 
| 82 | 
            +
                    E#{polarity}(args.pop, *args, &block)
         | 
| 95 83 | 
             
                  end
         | 
| 96 84 |  | 
| 97 85 | 
             
                  def #{prefix}_respond_to object, query, message = nil
         | 
| 98 86 | 
             
                    message ||= 'object must #{action}respond to query'
         | 
| 99 | 
            -
                     | 
| 87 | 
            +
                    T#{polarity}(message) { object.respond_to? query }
         | 
| 100 88 | 
             
                  end
         | 
| 101 89 |  | 
| 102 90 | 
             
                  def #{prefix}_throw symbol, message = nil, &block
         | 
| 103 | 
            -
                     | 
| 91 | 
            +
                    C#{polarity}(message, symbol, &block)
         | 
| 104 92 | 
             
                  end
         | 
| 105 93 |  | 
| 106 94 | 
             
                  def #{prefix}_send object, query, *args
         | 
| 107 95 | 
             
                    response = object.__send__(query, *args)
         | 
| 108 | 
            -
                     | 
| 96 | 
            +
                    T#{polarity} { response }
         | 
| 109 97 | 
             
                  end
         | 
| 110 98 | 
             
                }, binding, file, line
         | 
| 111 99 | 
             
              end
         | 
| @@ -0,0 +1,17 @@ | |
| 1 | 
            +
            require 'dfect/inochi'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            unless defined? Dfect::INOCHI
         | 
| 4 | 
            +
              fail "Dfect module must be established by Inochi"
         | 
| 5 | 
            +
            end
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            Dfect::INOCHI.each do |param, value|
         | 
| 8 | 
            +
              const = param.to_s.upcase
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              unless Dfect.const_defined? const
         | 
| 11 | 
            +
                fail "Dfect::#{const} must be established by Inochi"
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              unless Dfect.const_get(const) == value
         | 
| 15 | 
            +
                fail "Dfect::#{const} is not what Inochi established"
         | 
| 16 | 
            +
              end
         | 
| 17 | 
            +
            end
         | 
| @@ -1,10 +1,3 @@ | |
| 1 | 
            -
            #--
         | 
| 2 | 
            -
            # Copyright protects this work.
         | 
| 3 | 
            -
            # See LICENSE file for details.
         | 
| 4 | 
            -
            #++
         | 
| 5 | 
            -
             | 
| 6 | 
            -
            require 'dfect/auto'
         | 
| 7 | 
            -
             | 
| 8 1 | 
             
            D 'T()' do
         | 
| 9 2 | 
             
              T { true   }
         | 
| 10 3 | 
             
              T { !false }
         | 
| @@ -72,6 +65,7 @@ end | |
| 72 65 |  | 
| 73 66 | 
             
            D 'E()' do
         | 
| 74 67 | 
             
              E(SyntaxError) { raise SyntaxError }
         | 
| 68 | 
            +
              E(SyntaxError, 'must raise SyntaxError') { raise SyntaxError }
         | 
| 75 69 |  | 
| 76 70 | 
             
              D 'forbids block to not raise anything' do
         | 
| 77 71 | 
             
                F { E? {} }
         | 
| @@ -106,6 +100,7 @@ end | |
| 106 100 |  | 
| 107 101 | 
             
            D 'E!()' do
         | 
| 108 102 | 
             
              E!(SyntaxError) { raise ArgumentError }
         | 
| 103 | 
            +
              E!(SyntaxError, 'must not raise SyntaxError') { raise ArgumentError }
         | 
| 109 104 |  | 
| 110 105 | 
             
              D 'allows block to not raise anything' do
         | 
| 111 106 | 
             
                E!(SyntaxError) {}
         | 
| @@ -137,8 +132,16 @@ D 'E!()' do | |
| 137 132 | 
             
              end
         | 
| 138 133 | 
             
            end
         | 
| 139 134 |  | 
| 135 | 
            +
            D 'E?()' do
         | 
| 136 | 
            +
              T E?(SyntaxError) { raise SyntaxError }
         | 
| 137 | 
            +
              T E?(SyntaxError, 'must raise SyntaxError') { raise SyntaxError }
         | 
| 138 | 
            +
              F E?(SyntaxError) { raise ArgumentError }
         | 
| 139 | 
            +
              F E?(SyntaxError, 'must not raise SyntaxError') { raise ArgumentError }
         | 
| 140 | 
            +
            end
         | 
| 141 | 
            +
             | 
| 140 142 | 
             
            D 'C()' do
         | 
| 141 143 | 
             
              C(:foo) { throw :foo }
         | 
| 144 | 
            +
              C(:foo, 'must throw :foo') { throw :foo }
         | 
| 142 145 |  | 
| 143 146 | 
             
              D 'forbids block to not throw anything' do
         | 
| 144 147 | 
             
                F { C?(:bar) {} }
         | 
| @@ -168,6 +171,7 @@ end | |
| 168 171 |  | 
| 169 172 | 
             
            D 'C!()' do
         | 
| 170 173 | 
             
              C!(:bar) { throw :foo }
         | 
| 174 | 
            +
              C!(:bar, 'must not throw :bar') { throw :foo }
         | 
| 171 175 |  | 
| 172 176 | 
             
              D 'allows block to not throw anything' do
         | 
| 173 177 | 
             
                C!(:bar) {}
         | 
| @@ -196,6 +200,13 @@ D 'C!()' do | |
| 196 200 | 
             
              end
         | 
| 197 201 | 
             
            end
         | 
| 198 202 |  | 
| 203 | 
            +
            D 'C?()' do
         | 
| 204 | 
            +
              T C?(:foo) { throw :foo }
         | 
| 205 | 
            +
              T C?(:foo, 'must throw :foo') { throw :foo }
         | 
| 206 | 
            +
              F C?(:bar) { throw :foo }
         | 
| 207 | 
            +
              F C?(:bar, 'must not throw :bar') { throw :foo }
         | 
| 208 | 
            +
            end
         | 
| 209 | 
            +
             | 
| 199 210 | 
             
            D 'D()' do
         | 
| 200 211 | 
             
              history = []
         | 
| 201 212 |  | 
| @@ -281,6 +292,155 @@ D 'YAML must be able to serialize a class' do | |
| 281 292 | 
             
              T { SyntaxError.to_yaml == "--- SyntaxError\n" }
         | 
| 282 293 | 
             
            end
         | 
| 283 294 |  | 
| 295 | 
            +
            D 'insulated root-level describe' do
         | 
| 296 | 
            +
              @insulated = :insulated
         | 
| 297 | 
            +
              non_closured = :non_closured
         | 
| 298 | 
            +
            end
         | 
| 299 | 
            +
             | 
| 300 | 
            +
            closured = :closured
         | 
| 301 | 
            +
             | 
| 302 | 
            +
            D 'another insulated root-level describe' do
         | 
| 303 | 
            +
              # without insulation, instance variables
         | 
| 304 | 
            +
              # from previous root-level describe
         | 
| 305 | 
            +
              # environments will spill into this one
         | 
| 306 | 
            +
              F { defined? @insulated }
         | 
| 307 | 
            +
              F { @insulated == :insulated }
         | 
| 308 | 
            +
             | 
| 309 | 
            +
              # however, this insulation must
         | 
| 310 | 
            +
              # not prevent closure access to
         | 
| 311 | 
            +
              # surrounding local variables
         | 
| 312 | 
            +
              T { defined? closured }
         | 
| 313 | 
            +
              T { closured == :closured }
         | 
| 314 | 
            +
             | 
| 315 | 
            +
              # except local variables defined
         | 
| 316 | 
            +
              # within another insulated environment
         | 
| 317 | 
            +
              F { defined? non_closured }
         | 
| 318 | 
            +
              E(NameError) { non_closured }
         | 
| 319 | 
            +
             | 
| 320 | 
            +
              @insulated_again = :insulated_again
         | 
| 321 | 
            +
             | 
| 322 | 
            +
              D 'non-insulated nested describe' do
         | 
| 323 | 
            +
                D 'inherits instance variables' do
         | 
| 324 | 
            +
                  T { defined? @insulated_again }
         | 
| 325 | 
            +
                  T { @insulated_again == :insulated_again }
         | 
| 326 | 
            +
                end
         | 
| 327 | 
            +
             | 
| 328 | 
            +
                D 'inherits instance methods' do
         | 
| 329 | 
            +
                  E!(NoMethodError) { instance_level_helper_method }
         | 
| 330 | 
            +
                  T { instance_level_helper_method == :instance_level_helper_method }
         | 
| 331 | 
            +
                end
         | 
| 332 | 
            +
             | 
| 333 | 
            +
                D 'inherits class methods' do
         | 
| 334 | 
            +
                  E!(NoMethodError) { self.class_level_helper_method }
         | 
| 335 | 
            +
                  T { self.class_level_helper_method == :class_level_helper_method }
         | 
| 336 | 
            +
             | 
| 337 | 
            +
                  E!(NoMethodError) { class_level_helper_method }
         | 
| 338 | 
            +
                  T { class_level_helper_method == self.class_level_helper_method }
         | 
| 339 | 
            +
                end
         | 
| 340 | 
            +
             | 
| 341 | 
            +
                @non_insulated_from_nested = :non_insulated_from_nested
         | 
| 342 | 
            +
              end
         | 
| 343 | 
            +
             | 
| 344 | 
            +
              D! 'nested but explicitly insulated describe' do
         | 
| 345 | 
            +
                D 'does not inherit instance variables' do
         | 
| 346 | 
            +
                  F { defined? @insulated_again }
         | 
| 347 | 
            +
                  F { @insulated_again == :insulated_again }
         | 
| 348 | 
            +
                end
         | 
| 349 | 
            +
             | 
| 350 | 
            +
                D 'does not inherit instance methods' do
         | 
| 351 | 
            +
                  E(NameError) { instance_level_helper_method }
         | 
| 352 | 
            +
                end
         | 
| 353 | 
            +
             | 
| 354 | 
            +
                D 'does not inherit class methods' do
         | 
| 355 | 
            +
                  E(NoMethodError) { self.class_level_helper_method }
         | 
| 356 | 
            +
                  E(NameError) { class_level_helper_method }
         | 
| 357 | 
            +
                end
         | 
| 358 | 
            +
             | 
| 359 | 
            +
                @non_insulated_from_nested = 123
         | 
| 360 | 
            +
              end
         | 
| 361 | 
            +
             | 
| 362 | 
            +
              D 'another non-insulated nested describe' do
         | 
| 363 | 
            +
                T { defined? @non_insulated_from_nested }
         | 
| 364 | 
            +
                T { @non_insulated_from_nested == :non_insulated_from_nested }
         | 
| 365 | 
            +
              end
         | 
| 366 | 
            +
             | 
| 367 | 
            +
              def instance_level_helper_method
         | 
| 368 | 
            +
                :instance_level_helper_method
         | 
| 369 | 
            +
              end
         | 
| 370 | 
            +
             | 
| 371 | 
            +
              def self.class_level_helper_method
         | 
| 372 | 
            +
                :class_level_helper_method
         | 
| 373 | 
            +
              end
         | 
| 374 | 
            +
            end
         | 
| 375 | 
            +
             | 
| 376 | 
            +
            D 'yet another insulated root-level describe' do
         | 
| 377 | 
            +
              F { defined? @insulated_again }
         | 
| 378 | 
            +
              F { @insulated_again == :insulated_again }
         | 
| 379 | 
            +
             | 
| 380 | 
            +
              F { defined? @non_insulated_from_nested }
         | 
| 381 | 
            +
              F { @non_insulated_from_nested == :non_insulated_from_nested }
         | 
| 382 | 
            +
            end
         | 
| 383 | 
            +
             | 
| 384 | 
            +
            S :knowledge do
         | 
| 385 | 
            +
              @sharing_is_fun = :share_knowledge
         | 
| 386 | 
            +
            end
         | 
| 387 | 
            +
             | 
| 388 | 
            +
            S :money do
         | 
| 389 | 
            +
              @sharing_is_fun = :share_money
         | 
| 390 | 
            +
            end
         | 
| 391 | 
            +
             | 
| 392 | 
            +
            D 'share knowledge' do
         | 
| 393 | 
            +
              F { defined? @sharing_is_fun }
         | 
| 394 | 
            +
              S :knowledge
         | 
| 395 | 
            +
              T { defined? @sharing_is_fun }
         | 
| 396 | 
            +
              T { @sharing_is_fun == :share_knowledge }
         | 
| 397 | 
            +
             | 
| 398 | 
            +
              F { S? :power }
         | 
| 399 | 
            +
              S! :power do
         | 
| 400 | 
            +
                @sharing_is_fun = :share_power
         | 
| 401 | 
            +
              end
         | 
| 402 | 
            +
              T { S? :power }
         | 
| 403 | 
            +
            end
         | 
| 404 | 
            +
             | 
| 405 | 
            +
            D 'share money' do
         | 
| 406 | 
            +
              F { defined? @sharing_is_fun }
         | 
| 407 | 
            +
              S :money
         | 
| 408 | 
            +
              T { defined? @sharing_is_fun }
         | 
| 409 | 
            +
              T { @sharing_is_fun == :share_money }
         | 
| 410 | 
            +
             | 
| 411 | 
            +
              S :power
         | 
| 412 | 
            +
              T { defined? @sharing_is_fun }
         | 
| 413 | 
            +
              T { @sharing_is_fun == :share_power }
         | 
| 414 | 
            +
             | 
| 415 | 
            +
              D! 'share knowledge inside nested but explicitly insulated describe' do
         | 
| 416 | 
            +
                F { defined? @sharing_is_fun }
         | 
| 417 | 
            +
                S :knowledge
         | 
| 418 | 
            +
                T { defined? @sharing_is_fun }
         | 
| 419 | 
            +
                T { @sharing_is_fun == :share_knowledge }
         | 
| 420 | 
            +
              end
         | 
| 421 | 
            +
            end
         | 
| 422 | 
            +
             | 
| 423 | 
            +
            D 're-sharing under a previously shared identifier' do
         | 
| 424 | 
            +
              E ArgumentError, 'must raise an error' do
         | 
| 425 | 
            +
                S :knowledge do
         | 
| 426 | 
            +
                  @sharing_is_fun = :overwrite_previous_share
         | 
| 427 | 
            +
                end
         | 
| 428 | 
            +
              end
         | 
| 429 | 
            +
             | 
| 430 | 
            +
              F { defined? @sharing_is_fun }
         | 
| 431 | 
            +
              F { @sharing_is_fun == :overwrite_previous_share }
         | 
| 432 | 
            +
            end
         | 
| 433 | 
            +
             | 
| 434 | 
            +
            D 'injecting an unshared code block' do
         | 
| 435 | 
            +
              E ArgumentError, 'must raise an error' do
         | 
| 436 | 
            +
                S :foobar
         | 
| 437 | 
            +
              end
         | 
| 438 | 
            +
            end
         | 
| 439 | 
            +
             | 
| 440 | 
            +
            E 'injecting shared block outside of a test' do
         | 
| 441 | 
            +
              S :knowledge
         | 
| 442 | 
            +
            end
         | 
| 443 | 
            +
             | 
| 284 444 | 
             
            D 'stoping #run' do
         | 
| 285 445 | 
             
              Dfect.stop
         | 
| 286 446 | 
             
              raise 'this must not be reached!'
         |