theorem 0.0.1

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.
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: []