testo 0.0.0
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/.gitignore +1 -0
- data/Gemfile +2 -0
- data/Rakefile +7 -0
- data/lib/testo.rb +22 -0
- data/lib/testo/contract.rb +31 -0
- data/lib/testo/contract/term.rb +60 -0
- data/test/contracts/contract.rb +9 -0
- data/test/contracts/report.rb +7 -0
- data/test/helper.rb +11 -0
- data/test/test_contract.rb +46 -0
- data/testo.gemspec +17 -0
- metadata +165 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b9c1330c2a7466c4de24c48ad8dc437540b0890f
|
4
|
+
data.tar.gz: 27465999672270ee8aa1cf5c559daeeec0daa6c1
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 0ea5f3b0c9dc62c39d2780806a8794df80b0103594126c91447647290e8e303c4235ea6e675cf1198fd1b3c214c756188a37df2341ea52b95b30d639c7cffb34
|
7
|
+
data.tar.gz: ef9d3b81968176c0bcc547a84dafcde270867162354c2acf5edcb9d65582a5e6dc00d56f3613eaba5d5a777d16c379278c55a5f9d942735ced26bd3752f2fd20
|
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Gemfile.lock
|
data/Gemfile
ADDED
data/Rakefile
ADDED
data/lib/testo.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'tra/run'
|
2
|
+
|
3
|
+
require 'testo/contract'
|
4
|
+
|
5
|
+
module Testo
|
6
|
+
Thread.new do
|
7
|
+
loop do
|
8
|
+
begin
|
9
|
+
message = Tra.next
|
10
|
+
|
11
|
+
case message
|
12
|
+
when Contract::Term::Message
|
13
|
+
term = ObjectSpace._id2ref message[:object_id]
|
14
|
+
term.queue << message
|
15
|
+
end
|
16
|
+
rescue
|
17
|
+
p $!, $@
|
18
|
+
exit!
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Testo
|
2
|
+
class Contract
|
3
|
+
attr_reader :it
|
4
|
+
def initialize
|
5
|
+
@terms = []
|
6
|
+
instance_eval &Proc.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def check object
|
10
|
+
@it = object
|
11
|
+
@terms.map &:check
|
12
|
+
end
|
13
|
+
|
14
|
+
def ok? object
|
15
|
+
check(object).all? &:ok?
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def term id = nil, &block
|
21
|
+
term = Term.new *id, &block
|
22
|
+
@terms << term
|
23
|
+
end
|
24
|
+
|
25
|
+
def assert
|
26
|
+
fail unless yield
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
require_relative 'contract/term'
|
@@ -0,0 +1,60 @@
|
|
1
|
+
class Testo::Contract
|
2
|
+
class Term
|
3
|
+
def initialize id = object_id, &block
|
4
|
+
@id, @block = id, block
|
5
|
+
end
|
6
|
+
|
7
|
+
attr_reader :queue, :id
|
8
|
+
|
9
|
+
private def initialize_copy _original
|
10
|
+
super
|
11
|
+
@queue = Queue.new
|
12
|
+
end
|
13
|
+
|
14
|
+
Message = -> message { message[:to] == :term }
|
15
|
+
|
16
|
+
def check
|
17
|
+
new_term = clone
|
18
|
+
|
19
|
+
fork do
|
20
|
+
begin
|
21
|
+
@block.call
|
22
|
+
message = {status: :passed, object_id: new_term.object_id}
|
23
|
+
rescue Exception
|
24
|
+
message = {
|
25
|
+
status: :failed,
|
26
|
+
object_id: new_term.object_id,
|
27
|
+
exception: $!
|
28
|
+
}
|
29
|
+
ensure
|
30
|
+
put message
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
new_term
|
35
|
+
end
|
36
|
+
|
37
|
+
def debug
|
38
|
+
require 'pry-byebug'
|
39
|
+
@block.binding.pry
|
40
|
+
end
|
41
|
+
|
42
|
+
def ok?
|
43
|
+
receive_message unless @message_is_received
|
44
|
+
not @exception
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def receive_message
|
50
|
+
message = @queue.pop
|
51
|
+
@exception = message[:exception]
|
52
|
+
@message_is_received = true
|
53
|
+
end
|
54
|
+
|
55
|
+
def put message
|
56
|
+
default = { to: :term }
|
57
|
+
Process.ppid.put message.merge default
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/test/helper.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
|
3
|
+
describe Contract do
|
4
|
+
before do
|
5
|
+
@contract = Contract.new do
|
6
|
+
term 'which changes the state' do
|
7
|
+
it.instance_eval do
|
8
|
+
def hello *args
|
9
|
+
"Hello, #{args.join ' '}."
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
greeting = it.hello 'gentle', 'readers'
|
14
|
+
assert { greeting == 'Hello, gentle readers.' }
|
15
|
+
end
|
16
|
+
|
17
|
+
term 'which asserts that no state has been changed' do
|
18
|
+
assert { not it.respond_to? :hello }
|
19
|
+
end
|
20
|
+
|
21
|
+
term 'which is doomed to fail' do
|
22
|
+
it.has_no_such_a_method
|
23
|
+
end
|
24
|
+
|
25
|
+
term 'with a wrong assertion' do
|
26
|
+
assert { 0 == 1 }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe 'bare Object instance' do
|
32
|
+
before do
|
33
|
+
@terms = @contract.check Object.new
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'basic' do
|
37
|
+
assert { @terms.size == 4 }
|
38
|
+
|
39
|
+
failed_terms = @terms.reject &:ok?
|
40
|
+
assert { failed_terms.size == 2 }
|
41
|
+
|
42
|
+
assert { failed_terms[0].id == 'which is doomed to fail' }
|
43
|
+
assert { failed_terms[1].id == 'with a wrong assertion' }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/testo.gemspec
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
Gem::Specification.new do |g|
|
2
|
+
g.name = 'testo'
|
3
|
+
g.files = `git ls-files`.split($/)
|
4
|
+
g.version = '0.0.0'
|
5
|
+
g.summary = 'A set of primitives from which a powerful test harness can be baked.'
|
6
|
+
g.authors = ['Anatoly Chernow']
|
7
|
+
|
8
|
+
g.add_dependency 'tra'
|
9
|
+
|
10
|
+
g.add_development_dependency 'pry'
|
11
|
+
g.add_development_dependency 'pry-byebug'
|
12
|
+
g.add_development_dependency 'awesome_print'
|
13
|
+
g.add_development_dependency 'minitest'
|
14
|
+
g.add_development_dependency 'minitest-power_assert'
|
15
|
+
g.add_development_dependency 'rake'
|
16
|
+
g.add_development_dependency 'simplecov'
|
17
|
+
end
|
metadata
ADDED
@@ -0,0 +1,165 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: testo
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Anatoly Chernow
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-12-04 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: tra
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: pry
|
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
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: pry-byebug
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: awesome_print
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: minitest
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: minitest-power_assert
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rake
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: simplecov
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
description:
|
126
|
+
email:
|
127
|
+
executables: []
|
128
|
+
extensions: []
|
129
|
+
extra_rdoc_files: []
|
130
|
+
files:
|
131
|
+
- ".gitignore"
|
132
|
+
- Gemfile
|
133
|
+
- Rakefile
|
134
|
+
- lib/testo.rb
|
135
|
+
- lib/testo/contract.rb
|
136
|
+
- lib/testo/contract/term.rb
|
137
|
+
- test/contracts/contract.rb
|
138
|
+
- test/contracts/report.rb
|
139
|
+
- test/helper.rb
|
140
|
+
- test/test_contract.rb
|
141
|
+
- testo.gemspec
|
142
|
+
homepage:
|
143
|
+
licenses: []
|
144
|
+
metadata: {}
|
145
|
+
post_install_message:
|
146
|
+
rdoc_options: []
|
147
|
+
require_paths:
|
148
|
+
- lib
|
149
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
150
|
+
requirements:
|
151
|
+
- - ">="
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: '0'
|
154
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
155
|
+
requirements:
|
156
|
+
- - ">="
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: '0'
|
159
|
+
requirements: []
|
160
|
+
rubyforge_project:
|
161
|
+
rubygems_version: 2.5.2
|
162
|
+
signing_key:
|
163
|
+
specification_version: 4
|
164
|
+
summary: A set of primitives from which a powerful test harness can be baked.
|
165
|
+
test_files: []
|