jinitest 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 (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/jinitest.rb +157 -0
  3. metadata +43 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 999ccc2a82fb6d40ec8de5ee28c9453fb5fb481670d3efdd10dc8db1531e6add
4
+ data.tar.gz: 11159a397a1c7f3df08742abce10a282c3eb7156b7516d6841f34e676e9afc26
5
+ SHA512:
6
+ metadata.gz: 9eef5d8450cc44c36180596296bb6f516f4af163b0d41e25ff19ac0119ba03d96939f0aef00190e6ec48510de2cc62fd4c3bc3158c417fba03ee4c2bf3ec311f
7
+ data.tar.gz: bf8853ed01718d7182a36b38162bcccce1686269784fa01429335b5c5423db88e8daedcdc1e5de2ca135387784f9baa021a81ae9a0385afc1abd4c5ac316f893
@@ -0,0 +1,157 @@
1
+ module JiniTest
2
+ MAKE_SETUP = :make_setup
3
+
4
+ def self.autorun
5
+ at_exit {
6
+ JiniTest.run
7
+ }
8
+ end
9
+
10
+ def self.run
11
+ reporter = Reporter.new
12
+ reporter.render_header
13
+ suites = Test.runnables.reject { |suite| suite.runnable_methods.empty? }
14
+ suites.map { |suite| suite.run(reporter) }
15
+ reporter.render_statistics
16
+ end
17
+
18
+ def self.run_method(klass, method_name, reporter)
19
+ reporter.inc_runs
20
+ begin
21
+ instance = klass.new(method_name, reporter)
22
+ instance.send(MAKE_SETUP) if instance.respond_to? MAKE_SETUP
23
+ instance.run
24
+ reporter.render_test_ok
25
+ rescue TestError => e
26
+ reporter.add_failure(e)
27
+ reporter.render_test_failure
28
+ end
29
+ end
30
+
31
+ class Reporter
32
+ MSG_ASSERT_FAILURE = 'Expected false to be truthy.'
33
+
34
+ def initialize
35
+ @count_runs = 0
36
+ @count_assertions = 0
37
+ @count_failures = 0
38
+ @failures = []
39
+ end
40
+
41
+ def add_failure(e)
42
+ @count_failures += 1
43
+ @failures << e
44
+ end
45
+
46
+ def inc_runs
47
+ @count_runs += 1
48
+ end
49
+
50
+ def inc_assertions
51
+ @count_assertions += 1
52
+ end
53
+
54
+ def render_test_ok
55
+ print('.')
56
+ end
57
+
58
+ def render_test_failure
59
+ print('F')
60
+ end
61
+
62
+ def render_header
63
+ print "# Running:\r\n\r\n"
64
+ end
65
+
66
+ def render_statistics
67
+ print "\r\n"
68
+ print "# Finish:\r\n"
69
+ print "\r\n"
70
+ print render_failures, "\r\n"
71
+ print "\r\n"
72
+ print "#{@count_runs} runs, #{@count_assertions} assertions, #{@count_failures} failures"
73
+ print "\r\n"
74
+ end
75
+
76
+ private
77
+
78
+ def render_failures
79
+ text_failures = @failures.map.with_index do |failure, i|
80
+ info = parse_failure(failure)
81
+ header = "#{i}) Failure:"
82
+ body = "#{failure.class_name}##{info[:method_name]} [#{info[:file_path]}:#{info[:line_number]}]:"
83
+ [header, body].join("\r\n")
84
+ end
85
+
86
+ text_failures.join("\r\n")
87
+ end
88
+
89
+ def parse_failure(failure)
90
+ place_of_exception = failure.backtrace[1].split(' ')
91
+
92
+ info_about_file = place_of_exception[0].split(':')
93
+
94
+ {
95
+ method_name: place_of_exception[1].delete('`\''),
96
+ file_path: info_about_file[0],
97
+ line_number: info_about_file[1],
98
+ }
99
+ end
100
+ end
101
+
102
+ class TestError < StandardError
103
+ attr_reader :class_name
104
+
105
+ def initialize(class_name, msg = '')
106
+ @class_name = class_name
107
+ super(msg)
108
+ end
109
+ end
110
+
111
+ class Test
112
+ @@runnables = []
113
+
114
+ def self.setup(&block)
115
+ define_method(JiniTest::MAKE_SETUP, &block)
116
+ end
117
+
118
+ def initialize(method_name, reporter)
119
+ @method_name = method_name
120
+ @reporter = reporter
121
+ end
122
+
123
+ def run
124
+ self.send(@method_name)
125
+ end
126
+
127
+ def assert(a, b)
128
+ @reporter.inc_assertions
129
+ result = a == b
130
+ raise TestError.new(self.class) unless result
131
+ result
132
+ end
133
+
134
+ def self.runnables
135
+ @@runnables
136
+ end
137
+
138
+ def self.inherited(klass)
139
+ self.runnables << klass
140
+ super
141
+ end
142
+
143
+ def self.runnable_methods
144
+ self.public_instance_methods(true).grep(/^test_/)
145
+ end
146
+
147
+ def self.run(reporter)
148
+ test_methods = self.runnable_methods
149
+ test_methods.each do |method_name|
150
+ JiniTest.run_method(self, method_name, reporter)
151
+ end
152
+ end
153
+ end
154
+ end
155
+
156
+ JiniTest.autorun
157
+
metadata ADDED
@@ -0,0 +1,43 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jinitest
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Jo Ago
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-12-05 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: A simple hello world gem
14
+ email: zipofar@gmail.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/jinitest.rb
20
+ homepage: https://rubygems.org/gems/jinitest
21
+ licenses:
22
+ - MIT
23
+ metadata: {}
24
+ post_install_message:
25
+ rdoc_options: []
26
+ require_paths:
27
+ - lib
28
+ required_ruby_version: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ required_rubygems_version: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - ">="
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ requirements: []
39
+ rubygems_version: 3.1.2
40
+ signing_key:
41
+ specification_version: 4
42
+ summary: JiniTest
43
+ test_files: []