matest 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c3cb4b0c49522505608308ad6596db717a91fd27
4
- data.tar.gz: f5140793148a3771aa45539c56350c9b9ce0c228
3
+ metadata.gz: d0503943c0bc0e1cb9e6f7ce6b7dda83ffc9f36f
4
+ data.tar.gz: 377a6890e8bf973cd0eb95248de7012979af510f
5
5
  SHA512:
6
- metadata.gz: 5446d8f70a8ad94ff4e5524e6d85d099336e807cf9df2db67ee9b3caf9ee059128a6d15f707f5f8fd740500a51d0e800c21cb6378c7465b5e37c593abbe9c87c
7
- data.tar.gz: a00212b838c7720c7e4fafafba8730d5210e11928846d5f7f93530177bf6fadfe64b064c4b3a3cd1d0c1922560f9b59f526ad18141118ae2e4c9debb20f8eed2
6
+ metadata.gz: f9057ef4983f5b5830c6735c30c923dd366d11fb67791ab93ca147a596d25e0b3259e15b4078a6e73c60da6339823c2116b44811f5e20f93e3667810b5f5576e
7
+ data.tar.gz: 504844e60f56b6cf9a8cb290112f006e6d5d10e4c7b7b4dba9a28d3b7abc6dbb72edd62438e9ce596de477968a34713e72cdba5ce79347d35f9f36ec169eded3
data/bin/mt ADDED
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "time"
4
+ start_time = Time.now
5
+
6
+ $LOAD_PATH.unshift(File.expand_path('../lib', __dir__))
7
+
8
+ require "pathname"
9
+ require "matest"
10
+
11
+ RUNNER = Matest::Runner.new
12
+
13
+ ARGV.each do |file|
14
+ RUNNER.load_file(Pathname(file).expand_path)
15
+ end
16
+
17
+ RUNNER.execute!
18
+
19
+ time_elapsed = Time.now - start_time
20
+
21
+ puts
22
+ info = RUNNER.info
23
+
24
+ def spec_detail(info)
25
+ info[:num_specs].map { |name, num|
26
+ " #{num} #{name.downcase}."
27
+ }.join("\n")
28
+ end
29
+
30
+ good_bye_message = <<-EOF
31
+ ------------------------------------------
32
+ Specs:
33
+ #{spec_detail(info)}
34
+
35
+ EOF
36
+
37
+ puts good_bye_message
38
+
39
+ time_elapsed = Time.now - start_time
40
+ puts "Elapsed: #{time_elapsed} seconds."
data/lib/matest.rb CHANGED
@@ -1,5 +1,188 @@
1
1
  require "matest/version"
2
2
 
3
3
  module Matest
4
- # Your code goes here...
4
+ class Runner
5
+ attr_reader :example_groups
6
+ attr_reader :info
7
+
8
+ def initialize
9
+ @example_groups = []
10
+ @info = {}
11
+ end
12
+
13
+ def <<(example_group)
14
+ example_groups << example_group
15
+ end
16
+
17
+ def load_file(file)
18
+ load(file)
19
+ end
20
+
21
+ def execute!
22
+ statuses = []
23
+ example_groups.each do |current_group|
24
+ current_group.execute!
25
+ end
26
+
27
+ puts
28
+ puts
29
+ puts "### Messages ###"
30
+
31
+ info[:num_specs] = { total: 0 }
32
+ example_groups.each do |current_group|
33
+ current_group.statuses.each do |status|
34
+ info[:num_specs][:total] += 1
35
+
36
+ info[:num_specs][status.name] ||= 0
37
+ info[:num_specs][status.name] += 1
38
+
39
+ if status.is_a?(Matest::SpecPassed)
40
+ else
41
+ puts
42
+ puts "[#{status.name}] #{status.description}"
43
+ if status.is_a?(Matest::NotANaturalAssertion)
44
+ puts "RESULT >> #{status.result.inspect}"
45
+ end
46
+ if status.is_a?(Matest::ExceptionRaised)
47
+ puts "EXCEPTION >> #{status.result}"
48
+ status.result.backtrace.each do |l|
49
+ puts " #{l}"
50
+ end
51
+
52
+ end
53
+ puts " #{status.location}"
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+
60
+ class SpecStatus
61
+ attr_reader :block
62
+ attr_reader :description
63
+ attr_reader :result
64
+
65
+ def initialize(block, result, description=nil)
66
+ @block = block
67
+ @result = result
68
+ @description = description
69
+ end
70
+
71
+ def location
72
+ "%s:%d" % block.source_location
73
+ end
74
+
75
+ end
76
+
77
+ class SpecPassed < SpecStatus
78
+ def to_s
79
+ "."
80
+ end
81
+
82
+ def name
83
+ "PASSING"
84
+ end
85
+ end
86
+ class SpecFailed < SpecStatus
87
+ def to_s
88
+ "F"
89
+ end
90
+
91
+ def name
92
+ "FAILING"
93
+ end
94
+ end
95
+ class SpecSkipped < SpecStatus
96
+ def to_s
97
+ "S"
98
+ end
99
+
100
+ def name
101
+ "SKIPPED"
102
+ end
103
+ end
104
+ class NotANaturalAssertion < SpecStatus
105
+ def to_s
106
+ "N"
107
+ end
108
+
109
+ def name
110
+ "NOT A NATURAL ASSERTION"
111
+ end
112
+ end
113
+
114
+ class ExceptionRaised < SpecStatus
115
+ attr_reader :exception
116
+ def to_s
117
+ "E"
118
+ end
119
+
120
+ def name
121
+ "ERROR"
122
+ end
123
+ end
124
+
125
+ class SkipMe; end
126
+
127
+ class ExampleGroup
128
+ attr_reader :scope_block
129
+ attr_reader :specs
130
+ attr_reader :statuses
131
+
132
+ def initialize(scope_block)
133
+ @scope_block = scope_block
134
+ @specs = []
135
+ @statuses = []
136
+ end
137
+
138
+ def execute!
139
+ instance_eval(&scope_block)
140
+ specs.shuffle.each do |spec, desc|
141
+ res = run_spec(spec, desc)
142
+ print res
143
+ end
144
+
145
+ end
146
+
147
+ def spec(description=nil, &block)
148
+ current_example = block_given? ? block : -> { Matest::SkipMe.new }
149
+ specs << [current_example, description]
150
+ end
151
+
152
+ def xspec(description=nil, &block)
153
+ spec(description)
154
+ end
155
+
156
+ [:it, :spec, :test, :example].each do |m|
157
+ alias m :spec
158
+ alias :"x#{m}" :xspec
159
+ end
160
+
161
+ def run_spec(spec, description)
162
+ status = begin
163
+ result = spec.call
164
+ status_class = case result
165
+ when true
166
+ Matest::SpecPassed
167
+ when false
168
+ Matest::SpecFailed
169
+ when Matest::SkipMe
170
+ Matest::SpecSkipped
171
+ else
172
+ Matest::NotANaturalAssertion
173
+ end
174
+ status_class.new(spec, result, description)
175
+ rescue Exception => e
176
+ Matest::ExceptionRaised.new(spec, e, description)
177
+ end
178
+ @statuses << status
179
+ status
180
+ end
181
+
182
+ end
183
+ end
184
+
185
+
186
+ def scope(description=nil, &block)
187
+ RUNNER.example_groups << Matest::ExampleGroup.new(block)
5
188
  end
@@ -1,3 +1,3 @@
1
1
  module Matest
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/matest.gemspec CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
8
8
  spec.version = Matest::VERSION
9
9
  spec.authors = ["Federico Iachetti"]
10
10
  spec.email = ["iachetti.federico@gmail.com"]
11
- spec.summary = %q{Tests argentinisimos.}
12
- spec.description = %q{Natural assertions test suites.}
11
+ spec.summary = %q{Tests gasoleros (cheap tests).}
12
+ spec.description = %q{Natural assertions test suite.}
13
13
  spec.homepage = ""
14
14
  spec.license = "MIT"
15
15
 
@@ -0,0 +1,159 @@
1
+ require "spec_helper"
2
+
3
+ describe "scope" do
4
+ it "can pass" do
5
+ res = scope do
6
+ spec do
7
+ true
8
+ end
9
+ end
10
+ res.must_be_kind_of(Matest::SpecPassed)
11
+ end
12
+ end
13
+
14
+ describe "spec" do
15
+ describe "passing" do
16
+ it "passes" do
17
+ scope do
18
+ res = spec do
19
+ true
20
+ end
21
+ res.must_be_kind_of(Matest::SpecPassed)
22
+ end
23
+ end
24
+
25
+ it "forwards the block" do
26
+ scope do
27
+ res = spec do
28
+ true
29
+ end
30
+ res.block.call.must_equal(true)
31
+ end
32
+ end
33
+
34
+ it "allows a description and forwards it" do
35
+ scope do
36
+ res = spec "THE DESCRIPTION" do
37
+ true
38
+ end
39
+ res.description.must_equal("THE DESCRIPTION")
40
+ end
41
+ end
42
+ end
43
+
44
+ describe "failing" do
45
+ it "fails" do
46
+ scope do
47
+ res = spec do
48
+ false
49
+ end
50
+ res.must_be_kind_of(Matest::SpecFailed)
51
+ end
52
+ end
53
+
54
+ it "forwards the block" do
55
+ scope do
56
+ res = spec do
57
+ false
58
+ end
59
+ res.block.call.must_equal(false)
60
+ end
61
+ end
62
+
63
+ it "allows a description and forwards it" do
64
+ scope do
65
+ res = spec "THE DESCRIPTION" do
66
+ false
67
+ end
68
+ res.description.must_equal("THE DESCRIPTION")
69
+ end
70
+ end
71
+ end
72
+
73
+ it "only allows natural assertions" do
74
+ scope do
75
+ res = spec do
76
+ :not_true_nor_false
77
+ end
78
+ res.must_be_kind_of(Matest::NotANaturalAssertion)
79
+ end
80
+ end
81
+
82
+ it "skips if no block is given" do
83
+ scope do
84
+ res = spec
85
+ res.must_be_kind_of(Matest::SpecSkipped)
86
+ end
87
+ end
88
+
89
+ it "allows raising an exception" do
90
+ scope do
91
+ res = spec do
92
+ raise RuntimeError
93
+ end
94
+ res.must_be_kind_of(Matest::ExceptionRaised)
95
+ end
96
+ end
97
+
98
+ end
99
+
100
+ describe "xspec" do
101
+ it "skips" do
102
+ scope do
103
+ res = xspec do
104
+ raise "Wanna raise an error? do it ... nothing will happen"
105
+ :whatever
106
+ end
107
+ res.must_be_kind_of(Matest::SpecSkipped)
108
+ end
109
+ end
110
+
111
+ it "forwards the block" do
112
+ scope do
113
+ res = xspec do
114
+ false
115
+ end
116
+ res.block.call.must_equal(false)
117
+ end
118
+ end
119
+
120
+ it "allows a description and forwards it" do
121
+ scope do
122
+ res = spec "THE DESCRIPTION" do
123
+ false
124
+ end
125
+ res.description.must_equal("THE DESCRIPTION")
126
+ end
127
+ end
128
+ end
129
+
130
+ ####
131
+ #### spec do
132
+ #### 5 == 5
133
+ #### end
134
+ ####
135
+ #### spec do
136
+ #### 5 == 6
137
+ #### end
138
+ ####
139
+ #### spec do
140
+ #### skip
141
+ #### end
142
+ ####
143
+ #### spec do
144
+ #### 10
145
+ #### end
146
+ ####
147
+ ####
148
+ ####
149
+ ####
150
+ #### # >> .
151
+ #### # >>
152
+ #### # >> F
153
+ #### # >>
154
+ #### # >> S
155
+ #### # >>
156
+ #### # >> X
157
+ #### # >>
158
+ #### # >> {:message=>"The spec needs to return either true or false, but it returned 10", :block=>#<Proc:0x00000001f61408@-:17>}
159
+ #
@@ -0,0 +1,24 @@
1
+ scope "A" do
2
+ spec "A.0" do
3
+ false
4
+ end
5
+
6
+ spec "A.1" do
7
+ false
8
+ end
9
+
10
+ scope "B" do
11
+ spec "B.0" do
12
+ false
13
+ end
14
+
15
+ scope "C" do
16
+ spec "C.0" do
17
+ false
18
+ end
19
+ end
20
+ spec "B.1" do
21
+ false
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,36 @@
1
+ scope do
2
+ spec do
3
+ 1 == 1
4
+ end
5
+
6
+ spec "I shall fail" do
7
+ false
8
+ end
9
+
10
+ spec do
11
+ @hola = 5
12
+ @hola == 5
13
+ end
14
+
15
+ spec do
16
+ @hola == nil
17
+ end
18
+
19
+ spec do
20
+ "not true nor false"
21
+ end
22
+
23
+ spec "I'm not natural" do
24
+ "not true nor false w/desc"
25
+ end
26
+
27
+ spec "I raise" do
28
+ raise IndexError
29
+ end
30
+
31
+ spec "I skip"
32
+
33
+ xspec "I skip too" do
34
+ false
35
+ end
36
+ end
@@ -0,0 +1,3 @@
1
+ $LOAD_PATH.unshift(File.expand_path('../lib', __dir__))
2
+
3
+ require "matest"
@@ -0,0 +1,5 @@
1
+ $LOAD_PATH.unshift(File.expand_path('../lib', __dir__))
2
+
3
+ require "minitest/autorun"
4
+
5
+ require "matest"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: matest
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Federico Iachetti
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-16 00:00:00.000000000 Z
11
+ date: 2014-11-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -38,10 +38,11 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '10.0'
41
- description: Natural assertions test suites.
41
+ description: Natural assertions test suite.
42
42
  email:
43
43
  - iachetti.federico@gmail.com
44
- executables: []
44
+ executables:
45
+ - mt
45
46
  extensions: []
46
47
  extra_rdoc_files: []
47
48
  files:
@@ -50,9 +51,15 @@ files:
50
51
  - LICENSE.txt
51
52
  - README.md
52
53
  - Rakefile
54
+ - bin/mt
53
55
  - lib/matest.rb
54
56
  - lib/matest/version.rb
55
57
  - matest.gemspec
58
+ - spec/matest_spec.rb
59
+ - spec/matest_specs/nested_scopes_spec.rb
60
+ - spec/matest_specs/scope_spec.rb
61
+ - spec/matest_specs/spec_helper.rb
62
+ - spec/spec_helper.rb
56
63
  homepage: ''
57
64
  licenses:
58
65
  - MIT
@@ -76,5 +83,10 @@ rubyforge_project:
76
83
  rubygems_version: 2.4.2
77
84
  signing_key:
78
85
  specification_version: 4
79
- summary: Tests argentinisimos.
80
- test_files: []
86
+ summary: Tests gasoleros (cheap tests).
87
+ test_files:
88
+ - spec/matest_spec.rb
89
+ - spec/matest_specs/nested_scopes_spec.rb
90
+ - spec/matest_specs/scope_spec.rb
91
+ - spec/matest_specs/spec_helper.rb
92
+ - spec/spec_helper.rb