theorem 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +7 -0
  2. data/bin/theorize +5 -0
  3. data/src/harness.rb +40 -0
  4. data/src/hypothesis.rb +137 -0
  5. metadata +117 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 82f4b3d0f32345396cdbc66fc1d28d00d014f3576c8cf36e18eb355913fd34cd
4
+ data.tar.gz: ac2241928677901a46a9e12fb980e7a787f9e43ede2c7bf862a0bb3277fe6527
5
+ SHA512:
6
+ metadata.gz: 2233e6daab124321a5f83dda68b09b8159f1561afb5b9cb8c2f1b626170dce551ed1a833164fc2e58cc5a02a86f216b0be95057b4f8aee6b2c986c3928c10837
7
+ data.tar.gz: 7b4432d63c2a4bdc6c18875b7fdecc27cb14412fcdbaf8d3867fd31863ff8173faa21d2e1b37db65848af72571e7656ebf5ce0a31ed8d21697f2412a9f052976
data/bin/theorize ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require_relative '../src/harness'
4
+
5
+ Theorem::Hypothesis::Harness.run! ARGV[0] || '.'
data/src/harness.rb ADDED
@@ -0,0 +1,40 @@
1
+ require_relative './hypothesis'
2
+ require 'extended_dir'
3
+
4
+ # module
5
+ module Theorem
6
+ module Hypothesis
7
+ on_completed_test do |test|
8
+ print test.failed? ? 'X' : '.'
9
+ end
10
+
11
+ # harness
12
+ class Harness
13
+ def self.locate_tests(dir)
14
+ ExtendedDir.require_all("./#{dir}")
15
+
16
+ Hypothesis.registry
17
+ end
18
+
19
+ def self.run!(dir)
20
+ test_cases = locate_tests(dir)
21
+ total_count = test_cases.map do |test_case|
22
+ test_case.tests.size
23
+ end.inject(&:+)
24
+
25
+ puts "Total tests #{total_count}"
26
+
27
+ results = test_cases.map(&:run!).flatten
28
+
29
+ puts "\n\nSummary\n-------"
30
+
31
+ failed_tests = results.select(&:failed?)
32
+ failed_tests.each do |failure|
33
+ puts "Failure in #{failure.name}\nError: #{failure.error}\nBacktrace:\n------\n#{failure.error.backtrace.join("\n")}"
34
+ end
35
+
36
+ exit failed_tests.any? ? 1 : 0
37
+ end
38
+ end
39
+ end
40
+ end
data/src/hypothesis.rb ADDED
@@ -0,0 +1,137 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Theorem
4
+ # entrypoint
5
+ module Hypothesis
6
+ # beaker
7
+ def self.registry
8
+ @registry ||= []
9
+ end
10
+
11
+ def self.add_to_registry(klass)
12
+ registry << klass
13
+ end
14
+
15
+ def self.on_completed_test(&block)
16
+ @completed_tests ||= []
17
+ @completed_tests << block
18
+ end
19
+
20
+ def self.completed_test_subscribers
21
+ @completed_tests
22
+ end
23
+
24
+ class Beaker
25
+ def initialize
26
+ @state = []
27
+ end
28
+
29
+ def run!(ctx)
30
+ ctx.instance_exec @state, ctx do |state, ctx|
31
+ state.each do |b|
32
+ ctx.instance_eval &b
33
+ end
34
+ end
35
+ end
36
+
37
+ def prepare(&block)
38
+ @state << block
39
+ end
40
+ end
41
+
42
+ # error class
43
+ class CompletedTest
44
+ attr_reader :name, :error
45
+
46
+ def initialize(name, error = nil)
47
+ @name = name
48
+ @error = error
49
+ end
50
+
51
+ def failed?
52
+ !@error.nil?
53
+ end
54
+ end
55
+
56
+
57
+ # test
58
+ class Test
59
+ def initialize(name, beaker, &block)
60
+ @name = name
61
+ @block = block
62
+ end
63
+
64
+ attr_reader :block, :name
65
+
66
+ def run!(ctx)
67
+ ctx.instance_exec self, &block
68
+ nil
69
+ rescue Exception => ex
70
+ ex
71
+ end
72
+ end
73
+
74
+ def self.included(klass)
75
+ klass.extend ClassMethods
76
+ klass.instance_eval do
77
+ @before_all ||= Beaker.new
78
+ @tests = []
79
+ @completed_tests = []
80
+ @self = new
81
+ end
82
+ Hypothesis.add_to_registry(klass)
83
+ end
84
+
85
+ # module
86
+ module ClassMethods
87
+ def inherited(klass)
88
+ klass.include(Hypothesis)
89
+ klass.instance_exec self do |me|
90
+ @parent_before_all ||= []
91
+ @parent_before_all << me.before_all_beaker
92
+ end
93
+ super
94
+ end
95
+
96
+ def before_all(&block)
97
+ @before_all.prepare(&block)
98
+ end
99
+
100
+ def tests
101
+ @tests
102
+ end
103
+
104
+ def before_all_beaker
105
+ @before_all
106
+ end
107
+
108
+ def test(name, &block)
109
+ @tests << Test.new(name, @before_all, &block)
110
+ end
111
+
112
+ def run!
113
+ test_case = new
114
+ @parent_before_all&.each do |beaker|
115
+ beaker.run!(test_case)
116
+ end
117
+ @before_all.run!(test_case)
118
+ results = []
119
+ @tests.each do |test|
120
+ error = test.run!(test_case)
121
+ completed_test = CompletedTest.new(test.name, error)
122
+ publish_test_completion(completed_test)
123
+ results << completed_test
124
+ end
125
+ results
126
+ end
127
+
128
+ private
129
+
130
+ def publish_test_completion(completed_test)
131
+ Hypothesis.completed_test_subscribers.each do |subscriber|
132
+ subscriber.call(completed_test)
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end
metadata ADDED
@@ -0,0 +1,117 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: theorem
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Sean Gregory
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-04-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: extended_dir
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: rbs
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: rspec-expectations
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: rubocop
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: watir
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
+ description: simple. testing. ah.
84
+ email: sean.christopher.gregory@gmail.com
85
+ executables:
86
+ - theorize
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - bin/theorize
91
+ - src/harness.rb
92
+ - src/hypothesis.rb
93
+ homepage: https://rubygems.org/gems/theorem
94
+ licenses:
95
+ - MIT
96
+ metadata:
97
+ source_code_uri: https://github.com/skinnyjames/theorem
98
+ post_install_message:
99
+ rdoc_options: []
100
+ require_paths:
101
+ - lib
102
+ required_ruby_version: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: 2.7.5
107
+ required_rubygems_version: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ requirements: []
113
+ rubygems_version: 3.2.31
114
+ signing_key:
115
+ specification_version: 4
116
+ summary: simple. testing. ah.
117
+ test_files: []