bacon-expect 0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +12 -0
  6. data/Rakefile +1 -0
  7. data/bacon-expect.gemspec +22 -0
  8. data/lib/bacon-expect.rb +9 -0
  9. data/lib/bacon-expect/bacon_context.rb +4 -0
  10. data/lib/bacon-expect/expectation.rb +39 -0
  11. data/lib/bacon-expect/failed_expectation.rb +3 -0
  12. data/lib/bacon-expect/matchers/be_false.rb +11 -0
  13. data/lib/bacon-expect/matchers/be_generic.rb +19 -0
  14. data/lib/bacon-expect/matchers/be_nil.rb +11 -0
  15. data/lib/bacon-expect/matchers/be_true.rb +11 -0
  16. data/lib/bacon-expect/matchers/change.rb +29 -0
  17. data/lib/bacon-expect/matchers/end_with.rb +15 -0
  18. data/lib/bacon-expect/matchers/eql.rb +15 -0
  19. data/lib/bacon-expect/matchers/have_generic.rb +19 -0
  20. data/lib/bacon-expect/matchers/have_items.rb +22 -0
  21. data/lib/bacon-expect/matchers/include.rb +15 -0
  22. data/lib/bacon-expect/matchers/match.rb +15 -0
  23. data/lib/bacon-expect/matchers/match_array.rb +21 -0
  24. data/lib/bacon-expect/matchers/matchers.rb +78 -0
  25. data/lib/bacon-expect/matchers/raise_error.rb +31 -0
  26. data/lib/bacon-expect/matchers/respond_to.rb +28 -0
  27. data/lib/bacon-expect/matchers/satisfy.rb +15 -0
  28. data/lib/bacon-expect/matchers/start_with.rb +15 -0
  29. data/spec_app/.repl_history +0 -0
  30. data/spec_app/Gemfile +5 -0
  31. data/spec_app/Rakefile +14 -0
  32. data/spec_app/app/app_delegate.rb +5 -0
  33. data/spec_app/resources/Default-568h@2x.png +0 -0
  34. data/spec_app/spec/helpers/bacon_context.rb +5 -0
  35. data/spec_app/spec/matchers/be_false_spec.rb +21 -0
  36. data/spec_app/spec/matchers/be_generic_spec.rb +27 -0
  37. data/spec_app/spec/matchers/be_nil_spec.rb +17 -0
  38. data/spec_app/spec/matchers/be_true_spec.rb +21 -0
  39. data/spec_app/spec/matchers/change_spec.rb +39 -0
  40. data/spec_app/spec/matchers/end_with_spec.rb +9 -0
  41. data/spec_app/spec/matchers/eql_spec.rb +19 -0
  42. data/spec_app/spec/matchers/have_generic_spec.rb +19 -0
  43. data/spec_app/spec/matchers/have_items_spec.rb +9 -0
  44. data/spec_app/spec/matchers/include_spec.rb +27 -0
  45. data/spec_app/spec/matchers/match_array_spec.rb +17 -0
  46. data/spec_app/spec/matchers/match_spec.rb +17 -0
  47. data/spec_app/spec/matchers/raise_error_spec.rb +57 -0
  48. data/spec_app/spec/matchers/respond_to_spec.rb +23 -0
  49. data/spec_app/spec/matchers/satisfy_spec.rb +13 -0
  50. data/spec_app/spec/matchers/start_with_spec.rb +9 -0
  51. metadata +121 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 05eb77e0be35a5f75668dea3a280d7c092c0f3af
4
+ data.tar.gz: ce71a32ac878eada88cf6a9a663c7112e62e7319
5
+ SHA512:
6
+ metadata.gz: bb866f01221e58378e2b17d0b861eefc27bab43271c2b40e6d738c981bc91fd831e190cc8ee26dcce4ab9eed4dffc182a86c9a7558c8b0395a411987505238e5
7
+ data.tar.gz: 94cd5f2aca9adb79aa019303f6eb99a3319a07462951ca896ab6fefc8091964877c9b712d213a2373b7c29fab66faec49b6be075f2e5e7307420b265764cd40a
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ spec_app/build/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in bacon-expect-wizard.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Ignacio Piantanida
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,12 @@
1
+ # BaconExpect
2
+
3
+ Bring RSpec 3.0 expect syntax to MacBacon
4
+
5
+ #Installation
6
+ ```
7
+ gem install bacon-expect
8
+
9
+ # or in Gemfile
10
+ gem 'bacon-expect'
11
+ ```
12
+
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,22 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "bacon-expect"
7
+ spec.version = "0.1"
8
+ spec.authors = ["Ignacio Piantanida"]
9
+ spec.email = ["ijpiantanida@gmail.com"]
10
+ spec.description = "RSpec's expect syntax in MacBacon"
11
+ spec.summary = "Bring RSpec 3.0 expect syntax to MacBacon"
12
+ spec.homepage = "https://github.com/ijpiantanida/bacon-expect"
13
+ spec.license = "MIT"
14
+
15
+ spec.files = `git ls-files`.split($/)
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_development_dependency "bundler", "~> 1.3"
21
+ spec.add_development_dependency "rake"
22
+ end
@@ -0,0 +1,9 @@
1
+ unless defined?(Motion::Project::Config)
2
+ raise "This file must be required within a RubyMotion project Rakefile."
3
+ end
4
+
5
+ Motion::Project::App.setup do |app|
6
+ Dir.glob(File.join(File.dirname(__FILE__), 'bacon-expect/**/*.rb')).reverse.each do |file|
7
+ app.spec_files << file
8
+ end
9
+ end
@@ -0,0 +1,4 @@
1
+ class Bacon::Context
2
+ include BaconExpect::Expectation::BaconContext
3
+ include BaconExpect::Matcher::BaconContext
4
+ end
@@ -0,0 +1,39 @@
1
+ module BaconExpect
2
+ class Expectation
3
+ module BaconContext
4
+ def expect(subject = nil, &block)
5
+ Expectation.new(subject, &block)
6
+ end
7
+ end
8
+
9
+ def initialize(subject, &subject_block)
10
+ @subject = subject
11
+ @subject_block = subject_block
12
+ end
13
+
14
+ def to(matcher)
15
+ unless matcher.matches?(@subject, &@subject_block)
16
+ raise matcher.fail!(@subject, &@subject_block)
17
+ end
18
+ assert
19
+ end
20
+
21
+ def not_to(matcher)
22
+ if matcher.matches?(@subject, &@subject_block)
23
+ raise matcher.fail!(@subject, &@subject_block)
24
+ end
25
+ assert
26
+ end
27
+ alias_method :to_not, :not_to
28
+
29
+ def assert
30
+ true.should == true
31
+ end
32
+ end
33
+ end
34
+
35
+ module Spector
36
+
37
+
38
+
39
+ end
@@ -0,0 +1,3 @@
1
+ module BaconExpect
2
+ class FailedExpectation < RuntimeError; end
3
+ end
@@ -0,0 +1,11 @@
1
+ module BaconExpect; module Matcher
2
+ class BeFalse
3
+ def matches?(value)
4
+ !value
5
+ end
6
+
7
+ def fail!(subject)
8
+ raise FailedExpectation.new("#{subject} expected to be false but wasn't")
9
+ end
10
+ end
11
+ end; end
@@ -0,0 +1,19 @@
1
+ module BaconExpect; module Matcher
2
+ class BeGeneric
3
+ def initialize(method_name, *args)
4
+ @method_name = method_name
5
+ @args = args
6
+ end
7
+
8
+ def matches?(value)
9
+ value.send("#{@method_name}?", *@args)
10
+ end
11
+
12
+ def fail!(subject)
13
+ message = "#{subject} expected to be #{@method_name}"
14
+ message += " with #{@args}" unless @args.empty?
15
+ message += " to return true"
16
+ raise FailedExpectation.new(message)
17
+ end
18
+ end
19
+ end; end
@@ -0,0 +1,11 @@
1
+ module BaconExpect; module Matcher
2
+ class BeNil
3
+ def matches?(value)
4
+ value == nil
5
+ end
6
+
7
+ def fail!(subject)
8
+ raise FailedExpectation.new("#{subject} expected to be nil but wasn't")
9
+ end
10
+ end
11
+ end; end
@@ -0,0 +1,11 @@
1
+ module BaconExpect; module Matcher
2
+ class BeTrue
3
+ def matches?(value)
4
+ value == true
5
+ end
6
+
7
+ def fail!(subject)
8
+ raise FailedExpectation.new("#{subject} expected to be true but wasn't")
9
+ end
10
+ end
11
+ end; end
@@ -0,0 +1,29 @@
1
+ module BaconExpect; module Matcher
2
+ class Change
3
+ def initialize(change_block)
4
+ @change_block = change_block
5
+ end
6
+
7
+ def by(amount)
8
+ @change_amount = amount
9
+ self
10
+ end
11
+
12
+ def matches?(subject, &expectation_block)
13
+ old_value = @change_block.call
14
+ expectation_block.call
15
+ new_value = @change_block.call
16
+ if @change_amount
17
+ new_value - @change_amount == old_value
18
+ else
19
+ new_value != old_value
20
+ end
21
+ end
22
+
23
+ def fail!(subject)
24
+ message = "Block expected to change value"
25
+ message += " by #{@change_amount}" if @change_amount
26
+ raise FailedExpectation.new(message)
27
+ end
28
+ end
29
+ end; end
@@ -0,0 +1,15 @@
1
+ module BaconExpect; module Matcher
2
+ class EndWith
3
+ def initialize(end_string)
4
+ @end_string = end_string
5
+ end
6
+
7
+ def matches?(subject)
8
+ subject[-@end_string.size..-1] == @end_string
9
+ end
10
+
11
+ def fail!(subject)
12
+ raise FailedExpectation.new("#{subject} expected to end with #{@start_string}")
13
+ end
14
+ end
15
+ end; end
@@ -0,0 +1,15 @@
1
+ module BaconExpect; module Matcher
2
+ class Eql
3
+ def initialize(value)
4
+ @value = value
5
+ end
6
+
7
+ def matches?(subject)
8
+ subject == @value
9
+ end
10
+
11
+ def fail!(subject)
12
+ raise FailedExpectation.new("#{subject} expected to be == to #{@value}")
13
+ end
14
+ end
15
+ end; end
@@ -0,0 +1,19 @@
1
+ module BaconExpect; module Matcher
2
+ class HaveGeneric
3
+ def initialize(method_name, *args)
4
+ @method_name = method_name
5
+ @args = args
6
+ end
7
+
8
+ def matches?(subject)
9
+ subject.send("has_#{@method_name}?", *@args)
10
+ end
11
+
12
+ def fail!(subject)
13
+ message = "#{subject} has_#{@method_name}?"
14
+ message += " with #{@args}" unless @args.empty?
15
+ message += " to return true"
16
+ raise FailedExpectation.new(message)
17
+ end
18
+ end
19
+ end; end
@@ -0,0 +1,22 @@
1
+ module BaconExpect; module Matcher
2
+ class HaveItems
3
+ def initialize(number_of_items)
4
+ @number_of_items = number_of_items
5
+ end
6
+
7
+ def matches?(value)
8
+ value.size == @number_of_items
9
+ end
10
+
11
+ def items
12
+ self
13
+ end
14
+
15
+ alias_method :keys, :items
16
+ alias_method :values, :items
17
+
18
+ def fail!(subject)
19
+ raise FailedExpectation.new("#{subject} expected to have #{@number_of_items} items")
20
+ end
21
+ end
22
+ end; end
@@ -0,0 +1,15 @@
1
+ module BaconExpect; module Matcher
2
+ class Include
3
+ def initialize(*values)
4
+ @values = *values
5
+ end
6
+
7
+ def matches?(subject)
8
+ @values.all?{|v| subject.include?(v)}
9
+ end
10
+
11
+ def fail!(subject)
12
+ raise FailedExpectation.new("\"#{subject}\" expected to include #{@values}")
13
+ end
14
+ end
15
+ end; end
@@ -0,0 +1,15 @@
1
+ module BaconExpect; module Matcher
2
+ class Match
3
+ def initialize(regex)
4
+ @regex = regex
5
+ end
6
+
7
+ def matches?(subject)
8
+ subject.match(@regex)
9
+ end
10
+
11
+ def fail!(subject)
12
+ raise FailedExpectation.new("\"#{subject}\" expected to match #{@regex}")
13
+ end
14
+ end
15
+ end; end
@@ -0,0 +1,21 @@
1
+ module BaconExpect; module Matcher
2
+ class MatchArray
3
+ def initialize(array)
4
+ @array = array
5
+ end
6
+
7
+ def matches?(subject_array)
8
+ return false unless subject_array.size == @array.size
9
+ array_copy = subject_array.dup
10
+ @array.all? do |item|
11
+ has = array_copy.include?(item)
12
+ array_copy.delete(item) if has
13
+ has
14
+ end
15
+ end
16
+
17
+ def fail!(subject_array)
18
+ raise FailedExpectation.new("\"#{subject_array}\" expected to have same items as #{@array}")
19
+ end
20
+ end
21
+ end; end
@@ -0,0 +1,78 @@
1
+ module BaconExpect
2
+ module Matcher
3
+ module BaconContext
4
+ def be_nil
5
+ BeNil.new
6
+ end
7
+
8
+ def be_true
9
+ BeTrue.new
10
+ end
11
+
12
+ def be_false
13
+ BeFalse.new
14
+ end
15
+
16
+ def raise_error(exception_class = Exception, message = "")
17
+ RaiseError.new(exception_class, message)
18
+ end
19
+
20
+ def eql(value)
21
+ Eql.new(value)
22
+ end
23
+ alias_method :be, :eql
24
+
25
+ def match(regex)
26
+ Match.new(regex)
27
+ end
28
+
29
+ def match_array(array)
30
+ MatchArray.new(array)
31
+ end
32
+ alias_method :contain_exactly, :match_array
33
+
34
+ def include(*values)
35
+ Include.new(*values)
36
+ end
37
+
38
+ def have(number)
39
+ HaveItems.new(number)
40
+ end
41
+
42
+ def satisfy(&block)
43
+ Satisfy.new(&block)
44
+ end
45
+
46
+ def respond_to(method_name)
47
+ RespondTo.new(method_name)
48
+ end
49
+
50
+ def start_with(substring)
51
+ StartWith.new(substring)
52
+ end
53
+
54
+ def end_with(substring)
55
+ EndWith.new(substring)
56
+ end
57
+
58
+ def change(&change_block)
59
+ Change.new(change_block)
60
+ end
61
+
62
+ def method_missing(method_name, *args, &block)
63
+ string_method_name = method_name.to_s
64
+ match_be = string_method_name.match(/^be_(.*)/)
65
+ if match_be
66
+ BeGeneric.new(match_be[1], *args)
67
+ else
68
+ match_have = string_method_name.match(/^have_(.*)/)
69
+ if match_have
70
+ HaveGeneric.new(match_have[1], *args)
71
+ else
72
+ super
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,31 @@
1
+ module BaconExpect; module Matcher
2
+ class RaiseError
3
+ def initialize(error_class = Exception, message = "")
4
+ @error_class = error_class.is_a?(Class) ? error_class : Exception
5
+ @error_message = (error_class.is_a?(String) || error_class.is_a?(Regexp)) ? error_class : message
6
+ end
7
+
8
+ def matches?(value, &block)
9
+ begin
10
+ block.call
11
+ false
12
+ rescue Exception => e
13
+ @rescued_exception = e
14
+ exception_matches(e)
15
+ end
16
+ end
17
+
18
+ def exception_matches(e)
19
+ e.is_a?(@error_class) && (
20
+ (@error_message.is_a?(String) && e.message.include?(@error_message)) ||
21
+ (@error_message.is_a?(Regexp) && @error_message.match(e.message))
22
+ )
23
+ end
24
+
25
+ def fail!(subject)
26
+ message = "Block expected to raise exception of type #{@error_class}"
27
+ message += " but was #{@rescued_exception.class} #{@rescued_exception}" if @rescued_exception
28
+ raise FailedExpectation.new(message)
29
+ end
30
+ end
31
+ end; end
@@ -0,0 +1,28 @@
1
+ module BaconExpect; module Matcher
2
+ class RespondTo
3
+ def initialize(method_name)
4
+ @method_name = method_name
5
+ end
6
+
7
+ def with(number_of_args)
8
+ @number_of_args = number_of_args
9
+ self
10
+ end
11
+
12
+ def arguments
13
+ self
14
+ end
15
+ alias_method :argument, :arguments
16
+
17
+ def matches?(subject)
18
+ valid = true
19
+ valid &&= subject.respond_to?(@method_name)
20
+ valid &&= subject.method(@method_name).arity == @number_of_args if valid && @number_of_args
21
+ valid
22
+ end
23
+
24
+ def fail!(subject)
25
+ raise FailedExpectation.new("\"#{subject}\" expected to respond_to? #{@method_name}")
26
+ end
27
+ end
28
+ end; end
@@ -0,0 +1,15 @@
1
+ module BaconExpect; module Matcher
2
+ class Satisfy
3
+ def initialize(&condition_block)
4
+ @condition_block = condition_block
5
+ end
6
+
7
+ def matches?(*values)
8
+ @condition_block.call(*values)
9
+ end
10
+
11
+ def fail!(subject)
12
+ raise FailedExpectation.new("\"#{subject}\" expected to satisfy condition")
13
+ end
14
+ end
15
+ end; end
@@ -0,0 +1,15 @@
1
+ module BaconExpect; module Matcher
2
+ class StartWith
3
+ def initialize(start_string)
4
+ @start_string = start_string
5
+ end
6
+
7
+ def matches?(subject)
8
+ subject[0...@start_string.size] == @start_string
9
+ end
10
+
11
+ def fail!(subject)
12
+ raise FailedExpectation.new("#{subject} expected to start with #{@start_string}")
13
+ end
14
+ end
15
+ end; end
File without changes
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rake'
4
+ # Add your dependencies here:
5
+ gem 'bacon-expect', :path => ".."
@@ -0,0 +1,14 @@
1
+ # -*- coding: utf-8 -*-
2
+ $:.unshift("/Library/RubyMotion/lib")
3
+ require 'motion/project/template/ios'
4
+
5
+ begin
6
+ require 'bundler'
7
+ Bundler.require
8
+ rescue LoadError
9
+ end
10
+
11
+ Motion::Project::App.setup do |app|
12
+ # Use `rake config' to see complete project settings.
13
+ app.name = 'sample'
14
+ end
@@ -0,0 +1,5 @@
1
+ class AppDelegate
2
+ def application(application, didFinishLaunchingWithOptions:launchOptions)
3
+ true
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class Bacon::Context
2
+ def expect_failure(&block)
3
+ expect(&block).to raise_error(BaconExpect::FailedExpectation)
4
+ end
5
+ end
@@ -0,0 +1,21 @@
1
+ describe "Matcher::BeFalse" do
2
+ it 'be_false passes when value is false' do
3
+ expect(false).to be_false
4
+ end
5
+
6
+ it "be_false fails when value is true" do
7
+ expect_failure{ expect(true).to be_false }
8
+ end
9
+
10
+ it "be_false fails when value is an Object" do
11
+ expect_failure{ expect(Object.new).to be_false }
12
+ end
13
+
14
+ it "be_false fails when value is false but asked for not_to" do
15
+ expect_failure{ expect(false).not_to be_false }
16
+ end
17
+
18
+ it "be_false passes when value is true but asked for not_to" do
19
+ expect(true).not_to be_false
20
+ end
21
+ end
@@ -0,0 +1,27 @@
1
+ describe "Matcher::BeGeneric" do
2
+ it 'be_empty passes when value is empty' do
3
+ expect([]).to be_empty
4
+ end
5
+
6
+ it "be_empty fails when value is not empty" do
7
+ expect_failure{ expect([2, 3]).to be_empty }
8
+ end
9
+
10
+ it "be_kind_of passes when value is of the given type" do
11
+ expect("i'm a string").to be_kind_of(String)
12
+ end
13
+
14
+ it "be_kind_of fails when value is not of the given type" do
15
+ expect_failure{ expect("i'm a string").to be_kind_of(TrueClass) }
16
+ end
17
+
18
+ it "be_amazing passes when the value responds to amazing? and returns true" do
19
+ class TestClass; def amazing?; true; end; end
20
+ expect(TestClass.new).to be_amazing
21
+ end
22
+
23
+ it "be_amazing fails when the value responds to amazing? and returns false" do
24
+ class TestClass; def amazing?; false; end; end
25
+ expect_failure{ expect(TestClass.new).to be_amazing }
26
+ end
27
+ end
@@ -0,0 +1,17 @@
1
+ describe "Matcher::BeNil" do
2
+ it 'be_nil passes when value is nil' do
3
+ expect(nil).to be_nil
4
+ end
5
+
6
+ it "be_nil fails when value is true" do
7
+ expect_failure{ expect(true).to be_nil }
8
+ end
9
+
10
+ it "be_nil fails when value is false" do
11
+ expect_failure{ expect(false).to be_nil }
12
+ end
13
+
14
+ it "be_nil fails when value is an Object" do
15
+ expect_failure{ expect(Object.new).to be_nil }
16
+ end
17
+ end
@@ -0,0 +1,21 @@
1
+ describe "Matcher::BeTrue" do
2
+ it 'be_true passes when value is true' do
3
+ expect(true).to be_true
4
+ end
5
+
6
+ it "be_true fails when value is false" do
7
+ expect_failure{ expect(false).to be_true }
8
+ end
9
+
10
+ it "be_true fails when value is an Object" do
11
+ expect_failure{ expect(Object.new).to be_true }
12
+ end
13
+
14
+ it "be_true fails when value is true but asked for not_to" do
15
+ expect_failure{ expect(true).not_to be_true }
16
+ end
17
+
18
+ it "be_true passes when value is false but asked for not_to" do
19
+ expect(false).to_not be_true
20
+ end
21
+ end
@@ -0,0 +1,39 @@
1
+ describe "Matcher::Change" do
2
+ class TestClass
3
+ attr_reader :counter
4
+ def initialize
5
+ @counter = 0
6
+ end
7
+
8
+ def add
9
+ @counter += 1
10
+ end
11
+
12
+ def dont_add; end
13
+ end
14
+
15
+ it 'change passes when the expected block changes the result of the argument block' do
16
+ test_object = TestClass.new
17
+ expect{ test_object.add }.to change{ test_object.counter }
18
+ end
19
+
20
+ it "change fails when the expected block doesn't change the result of the argument block" do
21
+ test_object = TestClass.new
22
+ expect_failure{ expect{ test_object.dont_add }.to change{ test_object.counter } }
23
+ end
24
+
25
+ it "change passes when the expected block doesn't change the result of the argument block but asked not_to" do
26
+ test_object = TestClass.new
27
+ expect{ test_object.dont_add }.not_to change{ test_object.counter }
28
+ end
29
+
30
+ it "change when specified 'by' passes when the expected block changes the result of the argument block by the given amount" do
31
+ test_object = TestClass.new
32
+ expect{ test_object.add; test_object.add }.to change{ test_object.counter }.by(2)
33
+ end
34
+
35
+ it "change when specified 'by' fails when the expected block changes the result of the argument block by a different amount" do
36
+ test_object = TestClass.new
37
+ expect_failure{ expect{ test_object.add; test_object.add }.to change{ test_object.counter }.by(6) }
38
+ end
39
+ end
@@ -0,0 +1,9 @@
1
+ describe "Matcher::EndWith" do
2
+ it 'end_with passes when the subject ends with the given string' do
3
+ expect("super").to end_with("per")
4
+ end
5
+
6
+ it "end_with fails when the subject doesn't end with the given string" do
7
+ expect_failure{ expect("super").to end_with("key") }
8
+ end
9
+ end
@@ -0,0 +1,19 @@
1
+ describe "Matcher::Eql" do
2
+ it 'eql passes when value is == to subject' do
3
+ obj = Object.new
4
+ expect(obj).to eql(obj)
5
+ end
6
+
7
+ it "eql fails when value is not == subject" do
8
+ expect_failure{ expect(Object.new).to eql(Object.new) }
9
+ end
10
+
11
+ it "eql fails when value is nil and subject an Object" do
12
+ expect_failure{ expect(Object.new).to eql(nil) }
13
+ end
14
+
15
+ it "be is an alias of eql" do
16
+ obj = Object.new
17
+ expect(obj).to be(obj)
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ describe "Matcher::HaveGeneric" do
2
+ it "have_key passes if the hash includes the given key" do
3
+ expect({a: 1, b: 2, c: 3}).to have_key(:c)
4
+ end
5
+
6
+ it "have_key fails if the hash doesn't include the given key" do
7
+ expect_failure{ expect({a: 1, b: 2, c: 3}).to have_key(:h) }
8
+ end
9
+
10
+ it "have_color passes when the value responds to has_color? and returns true" do
11
+ class TestClass; def has_color?(color); color == :red; end; end
12
+ expect(TestClass.new).to have_color(:red)
13
+ end
14
+
15
+ it "have_color fails when the value responds to has_color? and returns false" do
16
+ class TestClass; def has_color?(color); color == :red; end; end
17
+ expect_failure{ expect(TestClass.new).to have_color(:blue) }
18
+ end
19
+ end
@@ -0,0 +1,9 @@
1
+ describe "Matcher::HaveItems" do
2
+ it 'have passes when subject has the same number of items' do
3
+ expect([1,2,3]).to have(3).items
4
+ end
5
+
6
+ it 'have fails when subject has the a different number of items' do
7
+ expect_failure{ expect([1,2,3]).to have(10).items }
8
+ end
9
+ end
@@ -0,0 +1,27 @@
1
+ describe "Matcher::Include" do
2
+ it 'include passes when subject include? responds true' do
3
+ expect([1,2,3,4]).to include(4)
4
+ end
5
+
6
+ it 'include fails when subject include? responds false' do
7
+ expect_failure{ expect([1,2,3,4]).to include("asd") }
8
+ end
9
+
10
+ it 'include passes when an object responds true to include?' do
11
+ class TestClass; def include?(value); true; end; end
12
+ expect(TestClass.new).to include(3)
13
+ end
14
+
15
+ it 'include passes when an object responds false to include?' do
16
+ class TestClass; def include?(value); false; end; end
17
+ expect_failure{ expect(TestClass.new).to include(3) }
18
+ end
19
+
20
+ it "include passes when all values are included in subject" do
21
+ expect([1,2,3,4]).to include(2,3,4)
22
+ end
23
+
24
+ it "include fails when some values are not included in subject" do
25
+ expect_failure{ expect([1,2,3,4]).to include(2,3,4, 6) }
26
+ end
27
+ end
@@ -0,0 +1,17 @@
1
+ describe "Matcher::MatchArray" do
2
+ it 'match_array passes when subject has the same items as value' do
3
+ expect([1,2,3,4]).to match_array([4,2,1,3])
4
+ end
5
+
6
+ it "match_array fails when subject has less items than value" do
7
+ expect_failure{ expect([1,2,3]).to match_array([1,2,3,4]) }
8
+ end
9
+
10
+ it "match_array fails when subject has more items than value" do
11
+ expect_failure{ expect([1,2,3,4]).to match_array([1,2,4,4,3]) }
12
+ end
13
+
14
+ it "match_array fails when subject has different items" do
15
+ expect_failure{ expect([1,2,3,4]).to match_array([Object.new, "a", 2, 3]) }
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ describe "Matcher::Match" do
2
+ it 'match passes when subject is a string and matches the regex' do
3
+ expect("asd asd asd").to match(/asd/)
4
+ end
5
+
6
+ it "match fails when subject is a string and doesn't match the regex" do
7
+ expect_failure{ expect("qwerty qwerty").to match(/asd/) }
8
+ end
9
+
10
+ it "match passes when subject is a regex and matches the given string" do
11
+ expect(/foo/).to match("food")
12
+ end
13
+
14
+ it "match fails when subject is a regex and doesn't matche the given string" do
15
+ expect_failure{ expect(/foo/).to match("drink") }
16
+ end
17
+ end
@@ -0,0 +1,57 @@
1
+ describe "Matcher::RaiseError" do
2
+ it 'raise_error without argument passes when the block raises any exception' do
3
+ expect{ 1/0 }.to raise_error
4
+ end
5
+
6
+ it "raise_error without argument failes when the block doesn't raise any exception" do
7
+ expect_failure{ expect{ Object.new }.to raise_error }
8
+ end
9
+
10
+ it "raise_error with a class argument passes when the block raises an exception of the argument class" do
11
+ expect{ 1/0 }.to raise_error(ZeroDivisionError)
12
+ end
13
+
14
+ it "raise_error with a class argument fails when the block raises an exception of a different class" do
15
+ expect_failure{ expect{ 1/0 }.to raise_error(ArgumentError) }
16
+ end
17
+
18
+ it "raise_error with a string argument passes when the block raises an exception with a message that includes the string" do
19
+ expect{ raise "one message" }.to raise_error("one message")
20
+ end
21
+
22
+ it "raise_error with a string argument fails when the block raises an exception with a message that doesn't include the string" do
23
+ expect_failure{ expect{ raise "one message" }.to raise_error("different") }
24
+ end
25
+
26
+ it "raise_error with a Regex argument passes when the block raises an exception with a message that matches the Regex" do
27
+ expect{ raise "one message" }.to raise_error(/message/)
28
+ end
29
+
30
+ it "raise_error with a Regex argument fails when the block raises an exception with a message that doesn't match the Regex" do
31
+ expect_failure{ expect{ raise "one message" }.to raise_error(/different/) }
32
+ end
33
+
34
+ it "raise_error with a class and a string argument passes if the block raises an exception of the same class and includes the string in its message" do
35
+ expect{ raise ArgumentError.new("with a message") }.to raise_error(ArgumentError, "message")
36
+ end
37
+
38
+ it "raise_error with a class and a string argument fails if the block raises an exception of the same class and but doesn't include the string in its message" do
39
+ expect_failure{ expect{ raise ArgumentError.new("with a message") }.to raise_error(ArgumentError, "different") }
40
+ end
41
+
42
+ it "raise_error with a class and a string argument fails if the block raises an exception of a different class" do
43
+ expect_failure{ expect{ raise ArgumentError.new("with a message") }.to raise_error(ZeroDivisionError, "message") }
44
+ end
45
+
46
+ it "raise_error with a class and a regex argument passes if the block raises an exception of the same class and includes the string in its message" do
47
+ expect{ raise ArgumentError.new("with a message") }.to raise_error(ArgumentError, /message/)
48
+ end
49
+
50
+ it "raise_error with a class and a regex argument fails if the block raises an exception of the same class and but doesn't include the string in its message" do
51
+ expect_failure{ expect{ raise ArgumentError.new("with a message") }.to raise_error(ArgumentError, /different/) }
52
+ end
53
+
54
+ it "raise_error with a class and a regex argument fails if the block raises an exception of a different class" do
55
+ expect_failure{ expect{ raise ArgumentError.new("with a message") }.to raise_error(ZeroDivisionError, /message/) }
56
+ end
57
+ end
@@ -0,0 +1,23 @@
1
+ describe "Matcher::RespondTo" do
2
+ it 'respond_to passes when subject responds to method name' do
3
+ expect("string").to respond_to(:upcase)
4
+ end
5
+
6
+ it "respond_to fails when subject doesn't respond to method name" do
7
+ expect_failure{ expect("string").to respond_to(:floor) }
8
+ end
9
+
10
+ it "respond_to when given number of arguments fails when subject doesn't respond to method name" do
11
+ expect_failure{ expect("string").to respond_to(:floor).with(2).arguments }
12
+ end
13
+
14
+ it "respond_to when given number of arguments passes when subject responds to method name with exactly the same number of arguments" do
15
+ class TestCase; def call_me(a,b,c); end; end
16
+ expect(TestCase.new).to respond_to(:call_me).with(3).arguments
17
+ end
18
+
19
+ it "respond_to when given number of arguments fails when subject responds to method name with different number of arguments" do
20
+ class TestCase; def call_me(a,b,c); end; end
21
+ expect_failure{ expect(TestCase.new).to respond_to(:call_me).with(1).argument }
22
+ end
23
+ end
@@ -0,0 +1,13 @@
1
+ describe "Matcher::Satisfy" do
2
+ it 'satisfy passes when the block returns true' do
3
+ expect(1).to satisfy{|v| v == 1}
4
+ end
5
+
6
+ it 'satisfy fails when the block returns false' do
7
+ expect_failure{ expect(1).to satisfy{|v| v == 3} }
8
+ end
9
+
10
+ it 'satisfy fails when the block raises an exception' do
11
+ expect{ expect(1).to satisfy{|v| 1/0 } }.to raise_error(ZeroDivisionError)
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ describe "Matcher::StartWith" do
2
+ it 'start_with passes when the subject starts with the given string' do
3
+ expect("super").to start_with("sup")
4
+ end
5
+
6
+ it "start_with fails when the subject doesn't start with the given string" do
7
+ expect_failure{ expect("super").to start_with("key") }
8
+ end
9
+ end
metadata ADDED
@@ -0,0 +1,121 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bacon-expect
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ platform: ruby
6
+ authors:
7
+ - Ignacio Piantanida
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-06-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: RSpec's expect syntax in MacBacon
42
+ email:
43
+ - ijpiantanida@gmail.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - .gitignore
49
+ - Gemfile
50
+ - LICENSE.txt
51
+ - README.md
52
+ - Rakefile
53
+ - bacon-expect.gemspec
54
+ - lib/bacon-expect.rb
55
+ - lib/bacon-expect/bacon_context.rb
56
+ - lib/bacon-expect/expectation.rb
57
+ - lib/bacon-expect/failed_expectation.rb
58
+ - lib/bacon-expect/matchers/be_false.rb
59
+ - lib/bacon-expect/matchers/be_generic.rb
60
+ - lib/bacon-expect/matchers/be_nil.rb
61
+ - lib/bacon-expect/matchers/be_true.rb
62
+ - lib/bacon-expect/matchers/change.rb
63
+ - lib/bacon-expect/matchers/end_with.rb
64
+ - lib/bacon-expect/matchers/eql.rb
65
+ - lib/bacon-expect/matchers/have_generic.rb
66
+ - lib/bacon-expect/matchers/have_items.rb
67
+ - lib/bacon-expect/matchers/include.rb
68
+ - lib/bacon-expect/matchers/match.rb
69
+ - lib/bacon-expect/matchers/match_array.rb
70
+ - lib/bacon-expect/matchers/matchers.rb
71
+ - lib/bacon-expect/matchers/raise_error.rb
72
+ - lib/bacon-expect/matchers/respond_to.rb
73
+ - lib/bacon-expect/matchers/satisfy.rb
74
+ - lib/bacon-expect/matchers/start_with.rb
75
+ - spec_app/.repl_history
76
+ - spec_app/Gemfile
77
+ - spec_app/Rakefile
78
+ - spec_app/app/app_delegate.rb
79
+ - spec_app/resources/Default-568h@2x.png
80
+ - spec_app/spec/helpers/bacon_context.rb
81
+ - spec_app/spec/matchers/be_false_spec.rb
82
+ - spec_app/spec/matchers/be_generic_spec.rb
83
+ - spec_app/spec/matchers/be_nil_spec.rb
84
+ - spec_app/spec/matchers/be_true_spec.rb
85
+ - spec_app/spec/matchers/change_spec.rb
86
+ - spec_app/spec/matchers/end_with_spec.rb
87
+ - spec_app/spec/matchers/eql_spec.rb
88
+ - spec_app/spec/matchers/have_generic_spec.rb
89
+ - spec_app/spec/matchers/have_items_spec.rb
90
+ - spec_app/spec/matchers/include_spec.rb
91
+ - spec_app/spec/matchers/match_array_spec.rb
92
+ - spec_app/spec/matchers/match_spec.rb
93
+ - spec_app/spec/matchers/raise_error_spec.rb
94
+ - spec_app/spec/matchers/respond_to_spec.rb
95
+ - spec_app/spec/matchers/satisfy_spec.rb
96
+ - spec_app/spec/matchers/start_with_spec.rb
97
+ homepage: https://github.com/ijpiantanida/bacon-expect
98
+ licenses:
99
+ - MIT
100
+ metadata: {}
101
+ post_install_message:
102
+ rdoc_options: []
103
+ require_paths:
104
+ - lib
105
+ required_ruby_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ required_rubygems_version: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - '>='
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ requirements: []
116
+ rubyforge_project:
117
+ rubygems_version: 2.1.5
118
+ signing_key:
119
+ specification_version: 4
120
+ summary: Bring RSpec 3.0 expect syntax to MacBacon
121
+ test_files: []