testo 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
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: []