spectus 1.0.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- 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
|