spectus 1.0.0.pre
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.
- checksums.yaml +7 -0
- data/.coveralls.yml +1 -0
- data/.gitignore +14 -0
- data/.travis.yml +6 -0
- data/.yardopts +1 -0
- data/Gemfile +2 -0
- data/LICENSE.md +22 -0
- data/README.md +239 -0
- data/Rakefile +18 -0
- data/VERSION.semver +1 -0
- data/lib/spectus.rb +6 -0
- data/lib/spectus/dsl.rb +14 -0
- data/lib/spectus/expectation_target.rb +27 -0
- data/lib/spectus/matcher.rb +35 -0
- data/lib/spectus/matcher/capture_stderr.rb +31 -0
- data/lib/spectus/matcher/capture_stdout.rb +31 -0
- data/lib/spectus/matcher/eql.rb +21 -0
- data/lib/spectus/matcher/equal.rb +21 -0
- data/lib/spectus/matcher/match.rb +21 -0
- data/lib/spectus/matcher/raise_exception.rb +27 -0
- data/lib/spectus/reporter.rb +45 -0
- data/lib/spectus/version.rb +9 -0
- data/spectus.gemspec +20 -0
- data/test/helper_test.rb +4 -0
- data/test/spectus/helper_test.rb +1 -0
- data/test/spectus/matcher/built_in/helper_test.rb +1 -0
- data/test/spectus/matcher/built_in/test_capture_stderr.rb +21 -0
- data/test/spectus/matcher/built_in/test_capture_stdout.rb +21 -0
- data/test/spectus/matcher/built_in/test_eql.rb +21 -0
- data/test/spectus/matcher/built_in/test_equal.rb +21 -0
- data/test/spectus/matcher/built_in/test_match.rb +21 -0
- data/test/spectus/matcher/built_in/test_raise_exception.rb +21 -0
- data/test/spectus/matcher/custom/be_prime/helper_test.rb +13 -0
- data/test/spectus/matcher/custom/be_prime/test_be_prime.rb +21 -0
- data/test/spectus/matcher/custom/be_the_answer/helper_test.rb +11 -0
- data/test/spectus/matcher/custom/be_the_answer/test_be_the_answer.rb +21 -0
- data/test/spectus/matcher/custom/helper_test.rb +1 -0
- data/test/spectus/matcher/custom/start_with/helper_test.rb +15 -0
- data/test/spectus/matcher/custom/start_with/test_start_with.rb +21 -0
- data/test/spectus/matcher/helper_test.rb +1 -0
- data/test/spectus/test_dsl.rb +9 -0
- data/test/spectus/test_expectation_target.rb +17 -0
- data/test/spectus/test_matcher.rb +34 -0
- data/test/spectus/test_reporter.rb +97 -0
- data/test/spectus/test_version.rb +11 -0
- data/test/support.rb +3 -0
- data/test/support/coverage.rb +3 -0
- data/test/support/env.rb +4 -0
- data/test/support/presenter.rb +23 -0
- metadata +175 -0
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'stringio'
|
2
|
+
|
3
|
+
module Spectus
|
4
|
+
module Matcher
|
5
|
+
|
6
|
+
# @api private
|
7
|
+
# Provides the implementation for `capture_stdout`.
|
8
|
+
class CaptureStdout
|
9
|
+
|
10
|
+
# @api private
|
11
|
+
def initialize expected
|
12
|
+
@expected = expected
|
13
|
+
|
14
|
+
freeze
|
15
|
+
end
|
16
|
+
|
17
|
+
# @return [Boolean] Comparison between actual and expected values.
|
18
|
+
def matches?
|
19
|
+
begin
|
20
|
+
orig_std = $stdout
|
21
|
+
$stdout = StringIO.new
|
22
|
+
|
23
|
+
yield
|
24
|
+
$stdout.string.eql? @expected
|
25
|
+
ensure
|
26
|
+
$stdout = orig_std
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Spectus
|
2
|
+
module Matcher
|
3
|
+
|
4
|
+
# @api private
|
5
|
+
# Provides the implementation for `eql`.
|
6
|
+
class Eql
|
7
|
+
|
8
|
+
# @api private
|
9
|
+
def initialize expected
|
10
|
+
@expected = expected
|
11
|
+
|
12
|
+
freeze
|
13
|
+
end
|
14
|
+
|
15
|
+
# @return [Boolean] Comparison between actual and expected values.
|
16
|
+
def matches?
|
17
|
+
@expected.eql? yield
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Spectus
|
2
|
+
module Matcher
|
3
|
+
|
4
|
+
# @api private
|
5
|
+
# Provides the implementation for `equal`.
|
6
|
+
class Equal
|
7
|
+
|
8
|
+
# @api private
|
9
|
+
def initialize expected
|
10
|
+
@expected = expected
|
11
|
+
|
12
|
+
freeze
|
13
|
+
end
|
14
|
+
|
15
|
+
# @return [Boolean] Comparison between actual and expected values.
|
16
|
+
def matches?
|
17
|
+
@expected.equal? yield
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Spectus
|
2
|
+
module Matcher
|
3
|
+
|
4
|
+
# @api private
|
5
|
+
# Provides the implementation for `match`.
|
6
|
+
class Match
|
7
|
+
|
8
|
+
# @api private
|
9
|
+
def initialize expected
|
10
|
+
@expected = expected
|
11
|
+
|
12
|
+
freeze
|
13
|
+
end
|
14
|
+
|
15
|
+
# @return [Boolean] Comparison between actual and expected values.
|
16
|
+
def matches?
|
17
|
+
!@expected.match(yield).nil?
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Spectus
|
2
|
+
module Matcher
|
3
|
+
|
4
|
+
# @api private
|
5
|
+
# Provides the implementation for `raise_exception`.
|
6
|
+
class RaiseException
|
7
|
+
|
8
|
+
# @api private
|
9
|
+
def initialize expected
|
10
|
+
@expected = expected
|
11
|
+
|
12
|
+
freeze
|
13
|
+
end
|
14
|
+
|
15
|
+
# @return [Boolean] Comparison between actual and expected values.
|
16
|
+
def matches?
|
17
|
+
begin
|
18
|
+
yield
|
19
|
+
rescue @expected
|
20
|
+
true
|
21
|
+
else
|
22
|
+
false
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Spectus
|
2
|
+
|
3
|
+
# This class is responsible for reporting the result of the expectation.
|
4
|
+
class Reporter
|
5
|
+
attr_reader :negated, :matcher, :expected, :exception
|
6
|
+
|
7
|
+
# @api private
|
8
|
+
def initialize negated, matcher, expected, result
|
9
|
+
@negated = negated
|
10
|
+
@matcher = matcher
|
11
|
+
@expected = expected
|
12
|
+
@pass = result.equal? true
|
13
|
+
@exception = ([ true, false ].include?(result) ? nil : result)
|
14
|
+
|
15
|
+
freeze
|
16
|
+
end
|
17
|
+
|
18
|
+
# Returns true if the expectation is true. False otherwise.
|
19
|
+
def pass?
|
20
|
+
@pass
|
21
|
+
end
|
22
|
+
|
23
|
+
# Returns the state of the expectation.
|
24
|
+
def state
|
25
|
+
if pass?
|
26
|
+
:success
|
27
|
+
elsif @exception.nil?
|
28
|
+
:failure
|
29
|
+
else
|
30
|
+
:error
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# Returns a char as the result of the expectation.
|
35
|
+
def to_s
|
36
|
+
if pass?
|
37
|
+
'.'
|
38
|
+
elsif @exception.nil?
|
39
|
+
'F'
|
40
|
+
else
|
41
|
+
'E'
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/spectus.gemspec
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Gem::Specification.new do |spec|
|
2
|
+
spec.name = 'spectus'
|
3
|
+
spec.version = File.read('VERSION.semver')
|
4
|
+
spec.authors = ['Cyril Wack']
|
5
|
+
spec.email = ['cyril@sashite.com']
|
6
|
+
spec.summary = %q{Expectation library.}
|
7
|
+
spec.description = %q{An expectation library with some matchers for Ruby.}
|
8
|
+
spec.homepage = 'https://github.com/cyril/spectus.rb'
|
9
|
+
spec.license = 'MIT'
|
10
|
+
|
11
|
+
spec.files = `git ls-files -z`.split("\x0")
|
12
|
+
spec.test_files = spec.files.grep(%r{^test/})
|
13
|
+
spec.require_paths = ['lib']
|
14
|
+
spec.required_ruby_version = '>= 2.0.0'
|
15
|
+
|
16
|
+
spec.add_development_dependency 'bundler', '~> 1.7'
|
17
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
18
|
+
spec.add_development_dependency 'yard', '~> 0.8'
|
19
|
+
spec.add_development_dependency 'coveralls', '~> 0.7'
|
20
|
+
end
|
data/test/helper_test.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require_relative File.join '..', 'helper_test'
|
@@ -0,0 +1 @@
|
|
1
|
+
require_relative File.join '..', 'helper_test'
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative 'helper_test'
|
2
|
+
|
3
|
+
subject 'capture standard error built-in matcher' do
|
4
|
+
Spectus::Matcher::CaptureStderr.new "foo\n"
|
5
|
+
end
|
6
|
+
|
7
|
+
it 'must return the expected value' do
|
8
|
+
expect { subject.instance_variable_get(:@expected) }.to eql: "foo\n"
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'must match the captured standard error' do
|
12
|
+
expect { subject.matches? { warn 'foo' } }.to equal: true
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'must not match the captured standard error' do
|
16
|
+
expect { subject.matches? { warn 'bar' } }.to equal: false
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'must return the raised exception' do
|
20
|
+
expect { raise subject.matches? { BOOM } }.to raise_exception: NameError
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative 'helper_test'
|
2
|
+
|
3
|
+
subject 'capture standard output built-in matcher' do
|
4
|
+
Spectus::Matcher::CaptureStdout.new "foo\n"
|
5
|
+
end
|
6
|
+
|
7
|
+
it 'must return the expected value' do
|
8
|
+
expect { subject.instance_variable_get(:@expected) }.to eql: "foo\n"
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'must match the captured standard output' do
|
12
|
+
expect { subject.matches? { puts 'foo' } }.to equal: true
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'must not match the captured standard output' do
|
16
|
+
expect { subject.matches? { puts 'bar' } }.to equal: false
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'must return the raised exception' do
|
20
|
+
expect { raise subject.matches? { BOOM } }.to raise_exception: NameError
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative 'helper_test'
|
2
|
+
|
3
|
+
subject 'eql built-in matcher' do
|
4
|
+
Spectus::Matcher::Eql.new 'foo'
|
5
|
+
end
|
6
|
+
|
7
|
+
it 'must return the expected value' do
|
8
|
+
expect { subject.instance_variable_get(:@expected) }.to eql: 'foo'
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'must be eql' do
|
12
|
+
expect { subject.matches? { 'foo' } }.to equal: true
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'must not be eql' do
|
16
|
+
expect { subject.matches? { 'bar' } }.to equal: false
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'must return the raised exception' do
|
20
|
+
expect { raise subject.matches? { BOOM } }.to raise_exception: NameError
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative 'helper_test'
|
2
|
+
|
3
|
+
subject 'equal built-in matcher' do
|
4
|
+
Spectus::Matcher::Equal.new :foo
|
5
|
+
end
|
6
|
+
|
7
|
+
it 'must return the expected value' do
|
8
|
+
expect { subject.instance_variable_get(:@expected) }.to equal: :foo
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'must be equal' do
|
12
|
+
expect { subject.matches? { :foo } }.to equal: true
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'must not be equal' do
|
16
|
+
expect { subject.matches? { :bar } }.to equal: false
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'must return the raised exception' do
|
20
|
+
expect { raise subject.matches? { BOOM } }.to raise_exception: NameError
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative 'helper_test'
|
2
|
+
|
3
|
+
subject 'match built-in matcher' do
|
4
|
+
Spectus::Matcher::Match.new(/^foo/)
|
5
|
+
end
|
6
|
+
|
7
|
+
it 'must return the expected value' do
|
8
|
+
expect { subject.instance_variable_get(:@expected) }.to({eql: /^foo/})
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'must match the string' do
|
12
|
+
expect { subject.matches? { 'foobar' } }.to equal: true
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'must not match the string' do
|
16
|
+
expect { subject.matches? { 'bar' } }.to equal: false
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'must return the raised exception' do
|
20
|
+
expect { raise subject.matches? { BOOM } }.to raise_exception: NameError
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative 'helper_test'
|
2
|
+
|
3
|
+
subject 'raise exception built-in matcher' do
|
4
|
+
Spectus::Matcher::RaiseException.new ZeroDivisionError
|
5
|
+
end
|
6
|
+
|
7
|
+
it 'must return the expected value' do
|
8
|
+
expect { subject.instance_variable_get(:@expected) }.to equal: ZeroDivisionError
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'must raise the expected exception' do
|
12
|
+
expect { subject.matches? { 0 / 0 } }.to equal: true
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'must not raise any exceptions' do
|
16
|
+
expect { subject.matches? { :foo } }.to equal: false
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'must return the raised exception' do
|
20
|
+
expect { raise subject.matches? { BOOM } }.to raise_exception: NameError
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative 'helper_test'
|
2
|
+
|
3
|
+
subject 'be prime custom matcher' do
|
4
|
+
Spectus::Matcher::BePrime.new
|
5
|
+
end
|
6
|
+
|
7
|
+
it 'must confirm that the instance variable is undefined' do
|
8
|
+
expect { subject.instance_variable_defined?(:@expected) }.to equal: false
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'must be prime' do
|
12
|
+
expect { subject.matches? { 3 } }.to equal: true
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'must not match the string' do
|
16
|
+
expect { subject.matches? { 4 } }.to equal: false
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'must return the raised exception' do
|
20
|
+
expect { raise subject.matches? { BOOM } }.to raise_exception: NameError
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative 'helper_test'
|
2
|
+
|
3
|
+
subject 'be the answer custom matcher' do
|
4
|
+
Spectus::Matcher::BeTheAnswer.new
|
5
|
+
end
|
6
|
+
|
7
|
+
it 'must confirm that the instance variable is undefined' do
|
8
|
+
expect { subject.instance_variable_defined?(:@expected) }.to equal: false
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'must be the answer' do
|
12
|
+
expect { subject.matches? { 42 } }.to equal: true
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'must not match the string' do
|
16
|
+
expect { subject.matches? { 'foo' } }.to equal: false
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'must return the raised exception' do
|
20
|
+
expect { raise subject.matches? { BOOM } }.to raise_exception: NameError
|
21
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require_relative File.join '..', 'helper_test'
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require_relative File.join '..', 'helper_test'
|
2
|
+
|
3
|
+
module Spectus
|
4
|
+
module Matcher
|
5
|
+
class StartWith
|
6
|
+
def initialize expected
|
7
|
+
@expected = expected
|
8
|
+
end
|
9
|
+
|
10
|
+
def matches?
|
11
|
+
Regexp.new("^#{@expected}").match(yield) != nil
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|