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 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
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require 'rake/testtask'
2
+ Rake::TestTask.new
3
+
4
+ task :coverage do
5
+ ENV['COVERAGE'] = 'true'
6
+ Rake::Task['test'].execute
7
+ end
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
@@ -0,0 +1,9 @@
1
+ term do
2
+ bool = it.ok? Object.new
3
+ assert { bool == true || bool == false }
4
+ end
5
+
6
+ term do
7
+ report = it.check Object.new
8
+ assert { contract[:report].ok? report }
9
+ end
@@ -0,0 +1,7 @@
1
+ term do
2
+ assert { it.is_a? Enumerable }
3
+
4
+ it.each do |term_report|
5
+ assert { contract[:term_report].ok? term_report }
6
+ end
7
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,11 @@
1
+ if ENV['COVERAGE']
2
+ require 'simplecov'
3
+ SimpleCov.start
4
+ end
5
+
6
+ require 'minitest'
7
+ require 'minitest-power_assert'
8
+ require 'minitest/autorun'
9
+
10
+ require 'testo'
11
+ include Testo
@@ -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: []