defekt 0.0.1 → 0.0.2
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 +4 -4
- data/.travis.yml +2 -0
- data/README.md +38 -2
- data/bin/console +1 -1
- data/bin/setup +0 -0
- data/defekt.gemspec +6 -4
- data/lib/defekt.rb +7 -3
- data/lib/defekt/assertions.rb +45 -0
- data/lib/defekt/base.rb +25 -0
- data/lib/defekt/collection.rb +31 -0
- data/lib/defekt/errors.rb +19 -0
- data/lib/defekt/object.rb +6 -0
- data/lib/defekt/runner.rb +39 -0
- data/lib/defekt/test.rb +65 -0
- data/lib/defekt/version.rb +1 -1
- metadata +17 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 954d8400f90cdb7972f5d7f743264b19f017a8c1
|
4
|
+
data.tar.gz: a3e4787acc89cab5d4dbd3d37be7ddd73a0842e6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ec6589474c3151e97fa9294295c2bcc74e145b7865b2684d2e8f7d18663a4fc8aff6cdaa3088e4dcffe5f0e48f16fec890df4f4da8ea9b1f52009eeaaa1a8204
|
7
|
+
data.tar.gz: 70573b204c30eb87828cee86d7750140ef03a88a2896981da6d310a054e8f5bcb3129502e464522c38add127eed2d43811094aeb686f04f56549783dca9fb8b2
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,9 @@
|
|
1
|
+
[](http://badge.fury.io/rb/defekt)
|
2
|
+
[](https://travis-ci.org/kodnin/defekt)
|
3
|
+
|
1
4
|
# Defekt
|
2
5
|
|
3
|
-
A micro testing framework
|
6
|
+
A micro testing framework.
|
4
7
|
|
5
8
|
## Installation
|
6
9
|
|
@@ -20,7 +23,40 @@ Or install it yourself as:
|
|
20
23
|
|
21
24
|
## Usage
|
22
25
|
|
23
|
-
|
26
|
+
Inherit test classes from ```Defekt::Base``` and define tests prefixed with ```test_```. ```before``` and ```after``` methods are optional, which will be invoked around a test.
|
27
|
+
|
28
|
+
```ruby
|
29
|
+
require 'defekt'
|
30
|
+
|
31
|
+
class Person
|
32
|
+
attr_reader :name
|
33
|
+
|
34
|
+
def initialize(name)
|
35
|
+
@name = name
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class PersonTest < Defekt::Base
|
40
|
+
def before
|
41
|
+
@person = Person.new('kodnin')
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_initialize
|
45
|
+
instance_of! Person, @person
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_name
|
49
|
+
equal_to! 'kodnin', @person.name
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_age
|
53
|
+
@person.stub(:age) { 'unknown' }
|
54
|
+
equal_to! 'unknown', @person.age
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
Defekt::Runner.new(Defekt::Collection.new(Defekt::Base)).run.report
|
59
|
+
```
|
24
60
|
|
25
61
|
## Development
|
26
62
|
|
data/bin/console
CHANGED
data/bin/setup
CHANGED
File without changes
|
data/defekt.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.email = ['kodnin@gmail.com']
|
11
11
|
|
12
12
|
spec.summary = 'Micro testing framework'
|
13
|
-
spec.description = 'Micro testing framework
|
13
|
+
spec.description = 'Micro testing framework'
|
14
14
|
spec.homepage = 'https://github.com/kodnin/defekt'
|
15
15
|
spec.license = 'MIT'
|
16
16
|
|
@@ -19,8 +19,10 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
20
|
spec.require_paths = ['lib']
|
21
21
|
|
22
|
-
spec.
|
22
|
+
spec.required_ruby_version = '>= 1.9.3'
|
23
|
+
|
24
|
+
spec.add_development_dependency 'bundler', '~> 1.9'
|
23
25
|
spec.add_development_dependency 'rake', '~> 10.0'
|
24
|
-
spec.add_development_dependency 'minitest', '~> 5.5
|
25
|
-
spec.add_development_dependency 'pry', '~> 0.10
|
26
|
+
spec.add_development_dependency 'minitest', '~> 5.5'
|
27
|
+
spec.add_development_dependency 'pry', '~> 0.10'
|
26
28
|
end
|
data/lib/defekt.rb
CHANGED
@@ -0,0 +1,45 @@
|
|
1
|
+
module Defekt
|
2
|
+
module Assertions
|
3
|
+
def true!(value)
|
4
|
+
unless value
|
5
|
+
raise Errors::TrueError, message(value, 'is not', true)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def equal_to!(expected, actual)
|
10
|
+
unless actual == expected
|
11
|
+
raise Errors::EqualToError, message(actual, 'is not equal to', expected)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def identical_to!(expected, actual)
|
16
|
+
unless actual.equal?(expected)
|
17
|
+
raise Errors::IdenticalToError, message(actual, 'is not identical to', expected)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def included_in!(collection, member)
|
22
|
+
unless collection.include?(member)
|
23
|
+
raise Errors::IncludedInError, message(member, 'is not included in', collection)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def instance_of!(klass, instance)
|
28
|
+
unless instance.instance_of?(klass)
|
29
|
+
raise Errors::InstanceOfError, message(instance, 'is not an instance of', klass)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def kind_of!(klass, instance)
|
34
|
+
unless instance.kind_of?(klass)
|
35
|
+
raise Errors::KindOfError, message(instance, 'is not a kind of', klass)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def message(object1, text, object2)
|
42
|
+
"~#{object1}~ #{text} #{object2}"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/lib/defekt/base.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
module Defekt
|
2
|
+
class Base
|
3
|
+
include Assertions
|
4
|
+
|
5
|
+
def before
|
6
|
+
end
|
7
|
+
|
8
|
+
def after
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.children
|
12
|
+
@children ||= []
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.descendants
|
16
|
+
children + children.map(&:descendants).flatten
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def self.inherited(klass)
|
22
|
+
children.push(klass)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Defekt
|
2
|
+
class Collection
|
3
|
+
def initialize(klass)
|
4
|
+
@klass = klass
|
5
|
+
end
|
6
|
+
|
7
|
+
def all
|
8
|
+
@all ||= @klass.descendants.flat_map do |klass|
|
9
|
+
klass.instance_methods.grep(/^test_/).map do |methot|
|
10
|
+
Test.new(klass.instance_method(methot))
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def passed
|
16
|
+
@passed ||= all.select(&:passed?)
|
17
|
+
end
|
18
|
+
|
19
|
+
def failed
|
20
|
+
@failed ||= all.select(&:failed?)
|
21
|
+
end
|
22
|
+
|
23
|
+
def errored
|
24
|
+
@errored ||= all.select(&:errored?)
|
25
|
+
end
|
26
|
+
|
27
|
+
def broken
|
28
|
+
@broken ||= all.select(&:broken?)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Defekt
|
2
|
+
module Errors
|
3
|
+
class BaseError < StandardError
|
4
|
+
def message
|
5
|
+
"#{super} (#{self.class.name})"
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.name
|
9
|
+
super.sub('Defekt::Errors::', '')
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def self.const_missing(klass)
|
16
|
+
const_set(klass, Class.new(BaseError))
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'benchmark'
|
2
|
+
|
3
|
+
module Defekt
|
4
|
+
class Runner
|
5
|
+
attr_reader :collection, :benchmark
|
6
|
+
|
7
|
+
def initialize(collection)
|
8
|
+
@collection = collection
|
9
|
+
end
|
10
|
+
|
11
|
+
def run
|
12
|
+
@benchmark = Benchmark.measure do
|
13
|
+
collection.all.shuffle.each { |test| print test.run }
|
14
|
+
end
|
15
|
+
self
|
16
|
+
end
|
17
|
+
|
18
|
+
def report
|
19
|
+
puts nil, nil
|
20
|
+
puts report_broken, nil if collection.broken.any?
|
21
|
+
puts statistics
|
22
|
+
self
|
23
|
+
end
|
24
|
+
|
25
|
+
def statistics
|
26
|
+
"#{collection.passed.length} passed, #{collection.failed.length} failed" +
|
27
|
+
", #{collection.errored.length} errored of #{collection.all.length} " +
|
28
|
+
"tests (in #{benchmark.real.round(3)} seconds)"
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def report_broken
|
34
|
+
collection.broken.flat_map do |test|
|
35
|
+
[test.summary, " #{test.error.message}"]
|
36
|
+
end.join("\n")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/defekt/test.rb
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
module Defekt
|
2
|
+
class Test
|
3
|
+
attr_reader :methot, :error
|
4
|
+
|
5
|
+
def initialize(methot)
|
6
|
+
@methot = methot
|
7
|
+
end
|
8
|
+
|
9
|
+
def instance
|
10
|
+
@instance ||= methot.owner.new
|
11
|
+
end
|
12
|
+
|
13
|
+
def run
|
14
|
+
@ran = true
|
15
|
+
|
16
|
+
begin
|
17
|
+
instance.before
|
18
|
+
methot.bind(instance).call
|
19
|
+
'.'
|
20
|
+
rescue => e
|
21
|
+
@error = e
|
22
|
+
status.chars.first
|
23
|
+
ensure
|
24
|
+
instance.after
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def summary
|
29
|
+
"#{methot.owner}##{methot.name} at #{methot.source_location.join(':')} #{status}"
|
30
|
+
end
|
31
|
+
|
32
|
+
def ran?
|
33
|
+
!!@ran
|
34
|
+
end
|
35
|
+
|
36
|
+
def passed?
|
37
|
+
ran? && error.nil?
|
38
|
+
end
|
39
|
+
|
40
|
+
def failed?
|
41
|
+
ran? && !passed? && error.kind_of?(Errors::BaseError)
|
42
|
+
end
|
43
|
+
|
44
|
+
def errored?
|
45
|
+
ran? && !failed? && error.kind_of?(Exception)
|
46
|
+
end
|
47
|
+
|
48
|
+
def broken?
|
49
|
+
failed? || errored?
|
50
|
+
end
|
51
|
+
|
52
|
+
def status
|
53
|
+
case
|
54
|
+
when passed?
|
55
|
+
'passed'
|
56
|
+
when failed?
|
57
|
+
'failed'
|
58
|
+
when errored?
|
59
|
+
'errored'
|
60
|
+
else
|
61
|
+
'did not run'
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/lib/defekt/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: defekt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Boot
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1.
|
19
|
+
version: '1.9'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '1.
|
26
|
+
version: '1.9'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -44,29 +44,29 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 5.5
|
47
|
+
version: '5.5'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 5.5
|
54
|
+
version: '5.5'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: pry
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.10
|
61
|
+
version: '0.10'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 0.10
|
69
|
-
description: Micro testing framework
|
68
|
+
version: '0.10'
|
69
|
+
description: Micro testing framework
|
70
70
|
email:
|
71
71
|
- kodnin@gmail.com
|
72
72
|
executables: []
|
@@ -84,6 +84,13 @@ files:
|
|
84
84
|
- bin/setup
|
85
85
|
- defekt.gemspec
|
86
86
|
- lib/defekt.rb
|
87
|
+
- lib/defekt/assertions.rb
|
88
|
+
- lib/defekt/base.rb
|
89
|
+
- lib/defekt/collection.rb
|
90
|
+
- lib/defekt/errors.rb
|
91
|
+
- lib/defekt/object.rb
|
92
|
+
- lib/defekt/runner.rb
|
93
|
+
- lib/defekt/test.rb
|
87
94
|
- lib/defekt/version.rb
|
88
95
|
homepage: https://github.com/kodnin/defekt
|
89
96
|
licenses:
|
@@ -97,7 +104,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
97
104
|
requirements:
|
98
105
|
- - ">="
|
99
106
|
- !ruby/object:Gem::Version
|
100
|
-
version:
|
107
|
+
version: 1.9.3
|
101
108
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
102
109
|
requirements:
|
103
110
|
- - ">="
|