riot 0.12.5 → 0.12.6
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/.travis.yml +10 -0
- data/CHANGELOG +286 -245
- data/Gemfile +4 -0
- data/README.markdown +284 -217
- data/lib/riot/context.rb +14 -3
- data/lib/riot/message.rb +1 -1
- data/lib/riot/middleware.rb +20 -20
- data/lib/riot/reporter.rb +5 -4
- data/lib/riot/reporter/io.rb +6 -14
- data/lib/riot/reporter/pretty_dot_matrix.rb +0 -1
- data/lib/riot/rr.rb +5 -0
- data/lib/riot/runnable.rb +2 -0
- data/lib/riot/situation.rb +1 -1
- data/lib/riot/version.rb +1 -1
- data/test/core/assertion_macros/raises_kind_of_test.rb +1 -1
- data/test/core/assertion_macros/raises_test.rb +1 -1
- data/test/core/middleware/context_middleware_test.rb +20 -0
- data/test/core/reports/basic_reporter_test.rb +6 -0
- data/test/core/reports/dot_matrix_reporter_test.rb +7 -1
- data/test/core/reports/story_reporter_test.rb +4 -6
- data/test/core/runnable/erroring_gracefully_test.rb +47 -0
- data/test/teststrap.rb +3 -1
- metadata +40 -39
    
        data/.gitignore
    CHANGED
    
    
    
        data/.travis.yml
    ADDED
    
    
    
        data/CHANGELOG
    CHANGED
    
    | @@ -1,328 +1,369 @@ | |
| 1 | 
            -
             | 
| 1 | 
            +
            # @markup markdown
         | 
| 2 2 |  | 
| 3 | 
            -
             | 
| 3 | 
            +
            # 0.12.6
         | 
| 4 4 |  | 
| 5 | 
            -
             | 
| 5 | 
            +
            * Catch and report on errors that occur while running middleware. Context with error in middleware will not run.
         | 
| 6 | 
            +
            * Errors that occur during a setup, hookup, or teardown are handled gracefully 
         | 
| 7 | 
            +
            * close #31 - RR seems to carry over some latent varification state between situations 
         | 
| 6 8 |  | 
| 7 | 
            -
             | 
| 9 | 
            +
            # 0.12.5
         | 
| 8 10 |  | 
| 9 | 
            -
             | 
| 11 | 
            +
            * Remove doc for some deprecated macros: not, exists, any [charlietanskley]
         | 
| 12 | 
            +
            * Deprecate two more macros [charlietanskley]
         | 
| 13 | 
            +
            * make riot run -w clean. None of those pesky warnings [achiu]
         | 
| 14 | 
            +
            * Use #inspect for printing arguments in error results [Mon-Ouie]
         | 
| 15 | 
            +
            * Move BlankSlate into Riot namespace [Mon-Ouie]
         | 
| 16 | 
            +
            * Setting options in a sub-context don't leak back into the parent context [skade]
         | 
| 17 | 
            +
            * Remove deprecated `not!` macro [charlietanksley]
         | 
| 18 | 
            +
            * Fix all warnings so riot runs `-w` clean
         | 
| 10 19 |  | 
| 11 | 
            -
             | 
| 20 | 
            +
            # 0.12.4
         | 
| 12 21 |  | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
            ==== Remove deprecated `not!` macro [charlietanksley]
         | 
| 16 | 
            -
             | 
| 17 | 
            -
            ==== Fix all warnings so riot runs `-w` clean
         | 
| 18 | 
            -
             | 
| 19 | 
            -
            == 0.12.4
         | 
| 20 | 
            -
             | 
| 21 | 
            -
            ==== Adding Riot.plain! option for not printing output in color [c00lryguy,
         | 
| 22 | 
            +
            * Adding Riot.plain! option for not printing output in color [c00lryguy,
         | 
| 22 23 | 
             
            jaknowlden]
         | 
| 23 24 |  | 
| 24 | 
            -
             | 
| 25 | 
            +
            # 0.12.3
         | 
| 25 26 |  | 
| 26 | 
            -
             | 
| 27 | 
            +
            * Going nuts with context helpers: should_not, asserts/denies_topic arguments [achiu]
         | 
| 27 28 |  | 
| 28 29 | 
             
            This works now: `should_not("do something")` as an alias for `denies`
         | 
| 29 30 |  | 
| 30 31 | 
             
            You can now pass arguments to `asserts`, `denies`, `should`, and `should_not`.
         | 
| 31 32 |  | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 33 | 
            +
            ```
         | 
| 34 | 
            +
            context "Playing with hashes" do
         | 
| 35 | 
            +
            	setup do
         | 
| 36 | 
            +
            		{ "foo" => "bar" }
         | 
| 37 | 
            +
            	end
         | 
| 36 38 |  | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 40 | 
            -
             | 
| 41 | 
            -
             | 
| 39 | 
            +
            	asserts(:[], "foo").equals("bar")
         | 
| 40 | 
            +
            	should(:[], "foo").equals("bar")
         | 
| 41 | 
            +
            	denies(:[], "foo").equals("goo")
         | 
| 42 | 
            +
            	should_not(:[], "foo").equals("goo")
         | 
| 43 | 
            +
            end # Playing with hashes
         | 
| 44 | 
            +
            ```
         | 
| 42 45 |  | 
| 43 | 
            -
             | 
| 46 | 
            +
            * Exit gracefully if a child process exited with failing status [timgaleckas]
         | 
| 44 47 |  | 
| 45 48 | 
             
            No tests will run in this situation.
         | 
| 46 49 |  | 
| 47 | 
            -
             | 
| 48 | 
            -
             | 
| 49 | 
            -
            ==== Adding a `denies_topic` macro to Context [Mon-Ouie]
         | 
| 50 | 
            -
             | 
| 51 | 
            -
            == 0.12.2
         | 
| 52 | 
            -
             | 
| 53 | 
            -
            ==== RDoc'ed the hell out of everything [jaknowlden]
         | 
| 50 | 
            +
            * No status displayed if no tests run [timgaleckas]
         | 
| 51 | 
            +
            * Adding a `denies_topic` macro to Context [Mon-Ouie]
         | 
| 54 52 |  | 
| 55 | 
            -
             | 
| 53 | 
            +
            # 0.12.2
         | 
| 56 54 |  | 
| 57 | 
            -
             | 
| 55 | 
            +
            * RDoc'ed the hell out of everything [jaknowlden]
         | 
| 56 | 
            +
            * Deprecating the not! assertion macro. It may just be gone by 0.13.0 [jaknowlden]
         | 
| 57 | 
            +
            * Remove ANSI-color dependency [achiu]
         | 
| 58 | 
            +
            * Switch from Jeweler to Bundler [achiu]
         | 
| 59 | 
            +
            * Add PrettyDotMatrixReporter [achiu]
         | 
| 58 60 |  | 
| 59 | 
            -
             | 
| 61 | 
            +
            # 0.12.1
         | 
| 60 62 |  | 
| 61 | 
            -
             | 
| 63 | 
            +
            * Error reporting now filters the backtrace to include only meaningful line items. [mbriggs]
         | 
| 64 | 
            +
            * Added ability to pass method arguments to asserts. [sirupsen]
         | 
| 62 65 |  | 
| 63 | 
            -
             | 
| 66 | 
            +
            # 0.12.0
         | 
| 64 67 |  | 
| 65 | 
            -
             | 
| 68 | 
            +
            * Negative tests are finally here! Added support for `denies` and adjusted macros to care about it with `devaluate`. [jaknowlden, achiu]
         | 
| 66 69 |  | 
| 67 | 
            -
             | 
| 70 | 
            +
            ```
         | 
| 71 | 
            +
            denies("my name") { "Rumplestiltzkin" }.equals("Henry")
         | 
| 72 | 
            +
            ```
         | 
| 68 73 |  | 
| 69 | 
            -
             | 
| 74 | 
            +
            # 0.11.4
         | 
| 70 75 |  | 
| 71 | 
            -
             | 
| 72 | 
            -
             | 
| 73 | 
            -
                denies("my name") { "Rumplestiltzkin" }.equals("Henry")
         | 
| 74 | 
            -
             | 
| 75 | 
            -
            == 0.11.4
         | 
| 76 | 
            -
             | 
| 77 | 
            -
            ==== [skade] Passing Proc's instead of lambdas to `instance_eval` to comply with ruby 1.9.2.
         | 
| 78 | 
            -
             | 
| 79 | 
            -
            ==== [nu7hatch] Added `describe` alias for `context` for easier rspec porting. Useful at the top level and within a context.
         | 
| 76 | 
            +
            * [skade] Passing Proc's instead of lambdas to `instance_eval` to comply with ruby 1.9.2.
         | 
| 77 | 
            +
            * [nu7hatch] Added `describe` alias for `context` for easier rspec porting. Useful at the top level and within a context.
         | 
| 80 78 |  | 
| 81 79 | 
             
            Who can argue with porting from rspec to riot? Not me.
         | 
| 82 80 |  | 
| 83 | 
            -
             | 
| 84 | 
            -
             | 
| 85 | 
            -
             | 
| 81 | 
            +
            ```
         | 
| 82 | 
            +
            describe "My thing" do
         | 
| 83 | 
            +
              asserts(:size).equals(:small)
         | 
| 84 | 
            +
            end # My thing
         | 
| 85 | 
            +
            ```
         | 
| 86 86 |  | 
| 87 87 | 
             
            The following also works:
         | 
| 88 88 |  | 
| 89 | 
            -
             | 
| 90 | 
            -
             | 
| 91 | 
            -
             | 
| 92 | 
            -
             | 
| 93 | 
            -
             | 
| 89 | 
            +
            ```
         | 
| 90 | 
            +
            context "Another thing is"
         | 
| 91 | 
            +
              describe "my" do
         | 
| 92 | 
            +
                asserts_topic.equals("marshmallow") # this test will fail ... because it will ... because it's wrong
         | 
| 93 | 
            +
              end # my
         | 
| 94 | 
            +
            end # Another thing is
         | 
| 95 | 
            +
            ```
         | 
| 94 96 |  | 
| 95 | 
            -
             | 
| 97 | 
            +
            # 0.11.3
         | 
| 96 98 |  | 
| 97 | 
            -
             | 
| 99 | 
            +
            * [jaknowlden] Modified `matches` assertion macro to treat actual as a string before executing regular expression comparison.
         | 
| 98 100 |  | 
| 99 | 
            -
             | 
| 100 | 
            -
             | 
| 101 | 
            -
             | 
| 101 | 
            +
            ```
         | 
| 102 | 
            +
            asserts("a number") { 42 }.matches(/\d+/)
         | 
| 103 | 
            +
            # same as
         | 
| 104 | 
            +
            asserts("a number as string") { "42" }.matches(/\d+/)
         | 
| 105 | 
            +
            ```
         | 
| 102 106 |  | 
| 103 | 
            -
             | 
| 107 | 
            +
            # 0.11.2
         | 
| 104 108 |  | 
| 105 | 
            -
             | 
| 109 | 
            +
            * [jaknowlden] [ISSUE] Options were not nesting. Now fixed.
         | 
| 106 110 |  | 
| 107 | 
            -
             | 
| 111 | 
            +
            # 0.11.1
         | 
| 108 112 |  | 
| 109 | 
            -
             | 
| 113 | 
            +
            * [jaknowlden] Middleware can now acts more like you would expect. Middleware now know the next neighbor in the chain and can do stuff to the context before and after the user-defined context is prepared. Removes support for the handle? method. Now we act more like a Rack app.
         | 
| 110 114 |  | 
| 111 | 
            -
             | 
| 112 | 
            -
             | 
| 113 | 
            -
             | 
| 114 | 
            -
             | 
| 115 | 
            -
             | 
| 115 | 
            +
            ```
         | 
| 116 | 
            +
            class MyMiddleware < Riot::ContextMiddleware
         | 
| 117 | 
            +
              register
         | 
| 118 | 
            +
              
         | 
| 119 | 
            +
              def call(context)
         | 
| 120 | 
            +
                context.setup { "fooberries" }
         | 
| 116 121 |  | 
| 117 | 
            -
             | 
| 122 | 
            +
                middleware.call(context)
         | 
| 118 123 |  | 
| 119 | 
            -
             | 
| 120 | 
            -
             | 
| 121 | 
            -
             | 
| 124 | 
            +
                context.hookup { "furberries" } if context.option(:barns)
         | 
| 125 | 
            +
              end
         | 
| 126 | 
            +
            end
         | 
| 127 | 
            +
            ```
         | 
| 122 128 |  | 
| 123 | 
            -
             | 
| 129 | 
            +
            # 0.11.0
         | 
| 124 130 |  | 
| 125 | 
            -
             | 
| 131 | 
            +
            * [jaknowlden] Added option to Context#setup which puts the specific setup block at the beginning of the setups to be called for a context. Also useful for middlewares.
         | 
| 126 132 |  | 
| 127 | 
            -
             | 
| 128 | 
            -
             | 
| 129 | 
            -
             | 
| 130 | 
            -
             | 
| 131 | 
            -
             | 
| 133 | 
            +
            ```
         | 
| 134 | 
            +
            context "Foo" do
         | 
| 135 | 
            +
              setup { puts "called second" }
         | 
| 136 | 
            +
              setup { puts "called third" }
         | 
| 137 | 
            +
              setup(true) { puts "called first" }
         | 
| 138 | 
            +
            end # Foo
         | 
| 139 | 
            +
            ```
         | 
| 132 140 |  | 
| 133 | 
            -
             | 
| 141 | 
            +
            * [jaknowlden] Added idea of options for a context. This is another feature picked up from riot-rails work.
         | 
| 134 142 |  | 
| 135 143 | 
             
            Essentially, these are useful for middlewares. For instance, if you wanted to tell a middleware that was looking for a "transactional" option before running code in a transaction block, you might do this:
         | 
| 136 144 |  | 
| 137 | 
            -
             | 
| 138 | 
            -
             | 
| 139 | 
            -
             | 
| 145 | 
            +
            ```
         | 
| 146 | 
            +
            context User do
         | 
| 147 | 
            +
              set :transactional, true
         | 
| 148 | 
            +
            end # User
         | 
| 149 | 
            +
            ```
         | 
| 140 150 |  | 
| 141 151 | 
             
            The middleware might do something with it:
         | 
| 142 152 |  | 
| 143 | 
            -
             | 
| 144 | 
            -
             | 
| 153 | 
            +
            ```
         | 
| 154 | 
            +
            class TransactionalMiddleware < Riot::ContextMiddleware
         | 
| 155 | 
            +
              register
         | 
| 145 156 |  | 
| 146 | 
            -
             | 
| 157 | 
            +
              def handle?(context) context.option(:transactional) == true; end
         | 
| 147 158 |  | 
| 148 | 
            -
             | 
| 149 | 
            -
             | 
| 150 | 
            -
             | 
| 151 | 
            -
             | 
| 159 | 
            +
              def prepare(context)
         | 
| 160 | 
            +
                # transactional stuff
         | 
| 161 | 
            +
              end
         | 
| 162 | 
            +
            end # TransactionalMiddleware
         | 
| 163 | 
            +
            ```
         | 
| 152 164 |  | 
| 153 165 | 
             
            You can call set as many times as you like
         | 
| 154 166 |  | 
| 155 | 
            -
             | 
| 156 | 
            -
             | 
| 157 | 
            -
             | 
| 158 | 
            -
             | 
| 167 | 
            +
            ```
         | 
| 168 | 
            +
            context User do
         | 
| 169 | 
            +
              set :transactional, true
         | 
| 170 | 
            +
              set :foo, :bar
         | 
| 171 | 
            +
            end
         | 
| 172 | 
            +
            ```
         | 
| 159 173 |  | 
| 160 | 
            -
             | 
| 174 | 
            +
            * [jaknowlden] ContextMiddleware: a construction pattern that allows for custom code to be applied to any context given that the middleware chooses to.
         | 
| 161 175 |  | 
| 162 176 | 
             
            This is something I started building into riot-rails and decided it was useful enough to just put it into riot itself. If, for instance, you wanted to add a setup with some stuff only if the context description was equal to "Your Mom":
         | 
| 163 177 |  | 
| 164 | 
            -
             | 
| 165 | 
            -
             | 
| 166 | 
            -
             | 
| 167 | 
            -
                  def handle?(context)
         | 
| 168 | 
            -
                    context.description == "Your Mom"
         | 
| 169 | 
            -
                  end
         | 
| 170 | 
            -
             | 
| 171 | 
            -
                  def prepare(context)
         | 
| 172 | 
            -
                    context.setup do
         | 
| 173 | 
            -
                      "your mom is the topic"
         | 
| 174 | 
            -
                    end
         | 
| 175 | 
            -
                  end
         | 
| 176 | 
            -
                end # YourMomMiddleware
         | 
| 177 | 
            -
             | 
| 178 | 
            -
            == 0.10.13
         | 
| 179 | 
            -
             | 
| 180 | 
            -
            ==== [jaknowlden] Helpers are now run with other setups, not separately. Which means you could use a helper in a setup.
         | 
| 181 | 
            -
             | 
| 182 | 
            -
                context "Foo" do
         | 
| 183 | 
            -
                  helper(:user) { User.new }
         | 
| 184 | 
            -
                  setup do
         | 
| 185 | 
            -
                    Baz.new(:user => user) # :)
         | 
| 186 | 
            -
                  end
         | 
| 187 | 
            -
                end # Foo
         | 
| 188 | 
            -
             | 
| 189 | 
            -
            ==== [vandrijevik] Correctly report non-RR assertion failures and errors when RR is used.
         | 
| 190 | 
            -
             | 
| 191 | 
            -
                context "Foo.bar" do
         | 
| 192 | 
            -
                  asserts("baz is called") do
         | 
| 193 | 
            -
                    mock(Foo).baz
         | 
| 194 | 
            -
                    raise RuntimeError.new("oh noes")
         | 
| 195 | 
            -
                  end
         | 
| 196 | 
            -
                end
         | 
| 197 | 
            -
             | 
| 198 | 
            -
              would previously return [:fail, "baz() Called 0 times. Expected 1 times."], and will now
         | 
| 199 | 
            -
              correctly return [:error, #<RuntimeError: oh noes>]
         | 
| 200 | 
            -
             | 
| 201 | 
            -
            ==== [jaknowlden] Recording description as is. Providing #detailed_description for proper behavior
         | 
| 202 | 
            -
             | 
| 203 | 
            -
                foo_context = context(Foo) {}
         | 
| 204 | 
            -
                bar_context = foo_context.context(Bar) {}
         | 
| 205 | 
            -
                bar_context.description
         | 
| 206 | 
            -
                => Bar
         | 
| 207 | 
            -
                bar_context.detailed_description
         | 
| 208 | 
            -
                => "Foo Bar"
         | 
| 209 | 
            -
             | 
| 210 | 
            -
            ==== [jaknowlden] No longer assuming topic when no block provided to an assertion. Instead, assuming block fails by default. Use `asserts_topic` only now.
         | 
| 211 | 
            -
             | 
| 212 | 
            -
                context "foo" do
         | 
| 213 | 
            -
                  setup { "bar" }
         | 
| 214 | 
            -
                  asserts_topic.kind_of(String)
         | 
| 215 | 
            -
                  asserts("topic").kind_of(String) # Will fail since block returns `false`
         | 
| 216 | 
            -
                  asserts("topic").equals(false) # Will actually pass :)
         | 
| 217 | 
            -
                end
         | 
| 218 | 
            -
             | 
| 219 | 
            -
            == 0.10.12
         | 
| 220 | 
            -
             | 
| 221 | 
            -
            ==== [vandrijevik] Recognizing file and line number of an assertion declaration on failure
         | 
| 178 | 
            +
            ```
         | 
| 179 | 
            +
            class YourMomMiddleware < Riot::ContextMiddleware
         | 
| 180 | 
            +
              register
         | 
| 222 181 |  | 
| 223 | 
            -
             | 
| 224 | 
            -
             | 
| 225 | 
            -
             | 
| 226 | 
            -
                require 'riot'
         | 
| 227 | 
            -
                require 'riot/rr'
         | 
| 228 | 
            -
                
         | 
| 229 | 
            -
                # your-test.rb
         | 
| 230 | 
            -
                context "foo" do
         | 
| 231 | 
            -
                  asserts("failure due to not calling hello") { mock!.hello {"world"} } # actually fails
         | 
| 232 | 
            -
                end
         | 
| 182 | 
            +
              def handle?(context)
         | 
| 183 | 
            +
                context.description == "Your Mom"
         | 
| 184 | 
            +
              end
         | 
| 233 185 |  | 
| 234 | 
            -
             | 
| 235 | 
            -
             | 
| 236 | 
            -
             | 
| 237 | 
            -
                  # ...
         | 
| 238 | 
            -
                  expected == actual pass(new_message.received(expected)) ? fail(expected(expected).not(actual))
         | 
| 239 | 
            -
                  # ...
         | 
| 186 | 
            +
              def prepare(context)
         | 
| 187 | 
            +
                context.setup do
         | 
| 188 | 
            +
                  "your mom is the topic"
         | 
| 240 189 | 
             
                end
         | 
| 190 | 
            +
              end
         | 
| 191 | 
            +
            end # YourMomMiddleware
         | 
| 192 | 
            +
            ```
         | 
| 193 | 
            +
             | 
| 194 | 
            +
            # 0.10.13
         | 
| 195 | 
            +
             | 
| 196 | 
            +
            * [jaknowlden] Helpers are now run with other setups, not separately. Which means you could use a helper in a setup.
         | 
| 197 | 
            +
             | 
| 198 | 
            +
            ```
         | 
| 199 | 
            +
            context "Foo" do
         | 
| 200 | 
            +
              helper(:user) { User.new }
         | 
| 201 | 
            +
              setup do
         | 
| 202 | 
            +
                Baz.new(:user => user) # :)
         | 
| 203 | 
            +
              end
         | 
| 204 | 
            +
            end # Foo
         | 
| 205 | 
            +
            ```
         | 
| 206 | 
            +
             | 
| 207 | 
            +
            * [vandrijevik] Correctly report non-RR assertion failures and errors when RR is used.
         | 
| 208 | 
            +
             | 
| 209 | 
            +
            ```
         | 
| 210 | 
            +
            context "Foo.bar" do
         | 
| 211 | 
            +
              asserts("baz is called") do
         | 
| 212 | 
            +
                mock(Foo).baz
         | 
| 213 | 
            +
                raise RuntimeError.new("oh noes")
         | 
| 214 | 
            +
              end
         | 
| 215 | 
            +
            end
         | 
| 216 | 
            +
            ```
         | 
| 217 | 
            +
             | 
| 218 | 
            +
            would previously return [:fail, "baz() Called 0 times. Expected 1 times."], and will now correctly return [:error, #<RuntimeError: oh noes>]
         | 
| 219 | 
            +
             | 
| 220 | 
            +
            * [jaknowlden] Recording description as is. Providing #detailed_description for proper behavior
         | 
| 221 | 
            +
             | 
| 222 | 
            +
            ```
         | 
| 223 | 
            +
            foo_context = context(Foo) {}
         | 
| 224 | 
            +
            bar_context = foo_context.context(Bar) {}
         | 
| 225 | 
            +
            bar_context.description
         | 
| 226 | 
            +
            => Bar
         | 
| 227 | 
            +
            bar_context.detailed_description
         | 
| 228 | 
            +
            => "Foo Bar"
         | 
| 229 | 
            +
            ```
         | 
| 230 | 
            +
             | 
| 231 | 
            +
            * [jaknowlden] No longer assuming topic when no block provided to an assertion. Instead, assuming block fails by default. Use `asserts_topic` only now.
         | 
| 232 | 
            +
             | 
| 233 | 
            +
            ```
         | 
| 234 | 
            +
            context "foo" do
         | 
| 235 | 
            +
              setup { "bar" }
         | 
| 236 | 
            +
              asserts_topic.kind_of(String)
         | 
| 237 | 
            +
              asserts("topic").kind_of(String) # Will fail since block returns `false`
         | 
| 238 | 
            +
              asserts("topic").equals(false) # Will actually pass :)
         | 
| 239 | 
            +
            end
         | 
| 240 | 
            +
            ```
         | 
| 241 | 
            +
             | 
| 242 | 
            +
            # 0.10.12
         | 
| 243 | 
            +
             | 
| 244 | 
            +
            * [vandrijevik] Recognizing file and line number of an assertion declaration on failure
         | 
| 245 | 
            +
            * [vandrijevik,jaknowlden] RR support in Riot
         | 
| 246 | 
            +
             | 
| 247 | 
            +
            ```
         | 
| 248 | 
            +
            # teststrap.rb
         | 
| 249 | 
            +
            require 'riot'
         | 
| 250 | 
            +
            require 'riot/rr'
         | 
| 251 | 
            +
             | 
| 252 | 
            +
            # your-test.rb
         | 
| 253 | 
            +
            context "foo" do
         | 
| 254 | 
            +
              asserts("failure due to not calling hello") { mock!.hello {"world"} } # actually fails
         | 
| 255 | 
            +
            end
         | 
| 256 | 
            +
            ```
         | 
| 257 | 
            +
             | 
| 258 | 
            +
            * [jaknowlden] Added Riot::Message to make messages in macros easier to write
         | 
| 259 | 
            +
             | 
| 260 | 
            +
            ```
         | 
| 261 | 
            +
            def evaluate(actual, expected)
         | 
| 262 | 
            +
              # ...
         | 
| 263 | 
            +
              expected == actual pass(new_message.received(expected)) ? fail(expected(expected).not(actual))
         | 
| 264 | 
            +
              # ...
         | 
| 265 | 
            +
            end
         | 
| 266 | 
            +
            ```
         | 
| 267 | 
            +
             | 
| 268 | 
            +
            * [jaknowlden] Added responds_to as a respond_to alias
         | 
| 269 | 
            +
            * [jaknowlden] Added the equivalent_to macro to compare case equality (===). equals is now (==)
         | 
| 270 | 
            +
            * [jaknowlden] Assuming RootContext if nil parent provided. Added Context#parent to the API
         | 
| 271 | 
            +
             | 
| 272 | 
            +
            ```
         | 
| 273 | 
            +
            Riot::Context.new("Hi", nil) {}.parent.class
         | 
| 274 | 
            +
            => Riot::RootContext
         | 
| 275 | 
            +
            ```
         | 
| 276 | 
            +
             | 
| 277 | 
            +
            # 0.10.11
         | 
| 278 | 
            +
             | 
| 279 | 
            +
            * [gabrielg, jaknowlden] Context#asserts_topic now takes an optional description
         | 
| 280 | 
            +
             | 
| 281 | 
            +
            ```
         | 
| 282 | 
            +
            asserts_topic.exists
         | 
| 283 | 
            +
            asserts_topic("some kind of description").exists
         | 
| 284 | 
            +
            ```
         | 
| 285 | 
            +
             | 
| 286 | 
            +
            * [gabrielg, jaknowlden] Added not! assertion macro
         | 
| 287 | 
            +
             | 
| 288 | 
            +
            ```
         | 
| 289 | 
            +
            setup { User.new(:funny? => false) }
         | 
| 290 | 
            +
            asserts(:funny?).not!
         | 
| 291 | 
            +
            ```
         | 
| 241 292 |  | 
| 242 | 
            -
             | 
| 293 | 
            +
            * [jaknowlden] Added Context#hookup to add some setup code to an already defined topic
         | 
| 294 | 
            +
             | 
| 295 | 
            +
            ```
         | 
| 296 | 
            +
            context "yo mama" do
         | 
| 297 | 
            +
              setup { YoMama.new }
         | 
| 298 | 
            +
              # ...
         | 
| 299 | 
            +
              context "is cool" do
         | 
| 300 | 
            +
                hookup { topic.do_something_involving_state }
         | 
| 301 | 
            +
                asserts_topic.kind_of?(YoMama)
         | 
| 302 | 
            +
              end
         | 
| 303 | 
            +
            end
         | 
| 304 | 
            +
            ```
         | 
| 243 305 |  | 
| 244 | 
            -
             | 
| 306 | 
            +
            * [jaknowlden] Added Riot.alone! mode to ensure Riot.run is not run at-exit
         | 
| 307 | 
            +
             | 
| 308 | 
            +
            ```
         | 
| 309 | 
            +
            Riot.alone!
         | 
| 310 | 
            +
            Riot.run
         | 
| 311 | 
            +
            ```
         | 
| 245 312 |  | 
| 246 | 
            -
             | 
| 313 | 
            +
            This will still print output unless you also Riot.silently!
         | 
| 247 314 |  | 
| 248 | 
            -
             | 
| 249 | 
            -
                => Riot::RootContext
         | 
| 315 | 
            +
            * [gabrielg, jaknowlden] Returning non-zero status at-exit when tests don't pass
         | 
| 250 316 |  | 
| 251 | 
            -
             | 
| 317 | 
            +
            # 0.10.10
         | 
| 252 318 |  | 
| 253 | 
            -
             | 
| 254 | 
            -
             | 
| 255 | 
            -
                asserts_topic.exists
         | 
| 256 | 
            -
                asserts_topic("some kind of description").exists
         | 
| 257 | 
            -
             | 
| 258 | 
            -
            ==== [gabrielg, jaknowlden] Added not! assertion macro
         | 
| 259 | 
            -
             | 
| 260 | 
            -
                setup { User.new(:funny? => false) }
         | 
| 261 | 
            -
                asserts(:funny?).not!
         | 
| 262 | 
            -
             | 
| 263 | 
            -
            ==== [jaknowlden] Added Context#hookup to add some setup code to an already defined topic
         | 
| 264 | 
            -
             | 
| 265 | 
            -
                context "yo mama" do
         | 
| 266 | 
            -
                  setup { YoMama.new }
         | 
| 267 | 
            -
                  # ...
         | 
| 268 | 
            -
                  context "is cool" do
         | 
| 269 | 
            -
                    hookup { topic.do_something_involving_state }
         | 
| 270 | 
            -
                    asserts_topic.kind_of?(YoMama)
         | 
| 271 | 
            -
                  end
         | 
| 272 | 
            -
                end
         | 
| 319 | 
            +
            * [dasch, jaknowlden] Passing assertion macros can now return a custom message
         | 
| 273 320 |  | 
| 274 | 
            -
             | 
| 321 | 
            +
            ```
         | 
| 322 | 
            +
            def evaluate(actual, *expectings)
         | 
| 323 | 
            +
              1 == 1 ? pass("1 does equal 1") : fail("1 does not equal 1 in this universe")
         | 
| 324 | 
            +
            end
         | 
| 325 | 
            +
            ```
         | 
| 275 326 |  | 
| 276 | 
            -
             | 
| 277 | 
            -
             | 
| 327 | 
            +
            * [jaknowlden] Removing Context#extend_assertions and related code
         | 
| 328 | 
            +
            * [dasch] Allow the use of symbolic descriptions as shorthands for sending the message to the topic
         | 
| 278 329 |  | 
| 279 | 
            -
             | 
| 330 | 
            +
            ```
         | 
| 331 | 
            +
            setup { "foo" }
         | 
| 332 | 
            +
            asserts(:upcase).equals("FOO")
         | 
| 333 | 
            +
            ```
         | 
| 280 334 |  | 
| 281 | 
            -
             | 
| 335 | 
            +
            * [jaknowlden, splattael] Added AssertionMacro and #register for macros
         | 
| 282 336 |  | 
| 283 | 
            -
             | 
| 284 | 
            -
             | 
| 285 | 
            -
             | 
| 337 | 
            +
            ```
         | 
| 338 | 
            +
            module My
         | 
| 339 | 
            +
              class CustomThingAssertion < Riot::AssertionMacro
         | 
| 340 | 
            +
                register :custom_thing
         | 
| 341 | 
            +
                expects_exception!
         | 
| 286 342 |  | 
| 287 343 | 
             
                def evaluate(actual, *expectings)
         | 
| 288 | 
            -
                  1 == 1 ? pass("1 does equal 1") : fail("1 does not equal 1 in this universe")
         | 
| 289 | 
            -
                end
         | 
| 290 | 
            -
             | 
| 291 | 
            -
            ==== [jaknowlden] Removing Context#extend_assertions and related code
         | 
| 292 | 
            -
             | 
| 293 | 
            -
            ==== [dasch] Allow the use of symbolic descriptions as shorthands for sending the message to the topic
         | 
| 294 | 
            -
             | 
| 295 | 
            -
                setup { "foo" }
         | 
| 296 | 
            -
                asserts(:upcase).equals("FOO")
         | 
| 297 | 
            -
             | 
| 298 | 
            -
            ==== [jaknowlden, splattael] Added AssertionMacro and #register for macros
         | 
| 299 | 
            -
             | 
| 300 | 
            -
                module My
         | 
| 301 | 
            -
                  class CustomThingAssertion < Riot::AssertionMacro
         | 
| 302 | 
            -
                    register :custom_thing
         | 
| 303 | 
            -
                    expects_exception!
         | 
| 304 | 
            -
             | 
| 305 | 
            -
                    def evaluate(actual, *expectings)
         | 
| 306 | 
            -
                      # ...
         | 
| 307 | 
            -
                    end
         | 
| 308 | 
            -
                  end
         | 
| 309 | 
            -
                  
         | 
| 310 | 
            -
                  Riot::Assertion.register_macro :custom_thing, CustomThingAssertion
         | 
| 311 | 
            -
                end
         | 
| 312 | 
            -
             | 
| 313 | 
            -
            ==== [splattael] Replace IOReporter#say with #puts. Also add #print.
         | 
| 314 | 
            -
             | 
| 315 | 
            -
                class SomeNewReporter < IOReporter
         | 
| 316 | 
            -
                  def pass
         | 
| 317 | 
            -
                    puts "I PASSED"
         | 
| 318 | 
            -
                  end
         | 
| 319 | 
            -
             | 
| 320 | 
            -
                  def fail
         | 
| 321 | 
            -
                    print "F"
         | 
| 322 | 
            -
                  end
         | 
| 323 344 | 
             
                  # ...
         | 
| 324 345 | 
             
                end
         | 
| 325 | 
            -
             | 
| 326 | 
            -
             | 
| 346 | 
            +
              end
         | 
| 347 | 
            +
              
         | 
| 348 | 
            +
              Riot::Assertion.register_macro :custom_thing, CustomThingAssertion
         | 
| 349 | 
            +
            end
         | 
| 350 | 
            +
            ```
         | 
| 351 | 
            +
             | 
| 352 | 
            +
            * [splattael] Replace IOReporter#say with #puts. Also add #print.
         | 
| 353 | 
            +
             | 
| 354 | 
            +
            ```
         | 
| 355 | 
            +
            class SomeNewReporter < IOReporter
         | 
| 356 | 
            +
              def pass
         | 
| 357 | 
            +
                puts "I PASSED"
         | 
| 358 | 
            +
              end
         | 
| 359 | 
            +
             | 
| 360 | 
            +
              def fail
         | 
| 361 | 
            +
                print "F"
         | 
| 362 | 
            +
              end
         | 
| 363 | 
            +
              # ...
         | 
| 364 | 
            +
            end
         | 
| 365 | 
            +
            ```
         | 
| 366 | 
            +
             | 
| 367 | 
            +
            # 0.10.9 and before
         | 
| 327 368 |  | 
| 328 369 | 
             
            See the commit log: http://github.com/thumblemonks/riot/commits/master
         |