matest 1.0.0 → 1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b3dca823c49ba5da737893a493c8b2d6577fe39a
4
- data.tar.gz: ee624abd646826218183f7eb841d0e9eb2430c2c
3
+ metadata.gz: 19f65ecc765b4eb7cdb7eaf25c6f5648d9c901f2
4
+ data.tar.gz: ec5e805afbf404d59335d25815b37aeb6cbe4578
5
5
  SHA512:
6
- metadata.gz: b04d07f356a535fdf18a12073d8cab63d3179e4d70555e91b3576de10b4a2d87b22239a5d160cd88d1c21fb8db023a0a103e8ad8ed94afc0999a33c04d2604f8
7
- data.tar.gz: 1f3c6259e4f602eb7d2b1325cbb1255ef023ead69558511eb28bf01a76869f36971cdae788e7218f1a91a72b76330f74f526d64ea3e974b8c38efa6c73ad68fd
6
+ metadata.gz: 9dfd3eb0dae94b317f4490b9f32ac0c74b0e8f1bb823c186137cd385bb6dca7d96ad9ad4901124254a3e5683f066142246d57bdb9eef6041e7f9736288ba5337
7
+ data.tar.gz: f41231aa62ed1453868d538734f6355ddc5409c0b9b9afaea4886d35a000f205ffa720f4750d40c2639bf3698a05a716119d7b7aa8e0d8eb4344f7894c82356b
data/README.md CHANGED
@@ -11,24 +11,8 @@ It doesn't use the usual assertion style (`assert(1, 1)`) nor the rspec style(`1
11
11
  It uses natural assertions.
12
12
 
13
13
  This means that:
14
- - A test will pass if it returns true
15
- - A test will fail if it returns false
16
-
17
- ## Installation
18
-
19
- Add this line to your application's Gemfile:
20
-
21
- ```ruby
22
- gem 'matest'
23
- ```
24
-
25
- And then execute:
26
-
27
- $ bundle
28
-
29
- Or install it yourself as:
30
-
31
- $ gem install matest
14
+ - A test will pass if it returns `true`
15
+ - A test will fail if it returns `false`
32
16
 
33
17
  ## Usage
34
18
 
@@ -61,7 +45,7 @@ scope do
61
45
  end
62
46
  ```
63
47
 
64
- If the return value of the `spec` block is `true`, the spec will pass and if it's false it will `fail`.
48
+ If the return value of the `spec` block is `true`, the spec will pass and if it's `false` it will fail.
65
49
 
66
50
  If you return anithing else, you'll get a `NOT A NATURAL ASSERTION` status.
67
51
 
@@ -85,10 +69,10 @@ You can skip a test in two possible ways: You can declare a spec whithout a bloc
85
69
 
86
70
  ```ruby
87
71
  scope do
88
- xspec "I'll be skipped" do
72
+ spec "I'll be skipped"
73
+ xspec "I'll be skipped too" do
89
74
  true
90
75
  end
91
- spec "I'll be skipped too"
92
76
  end
93
77
  ```
94
78
 
@@ -98,11 +82,11 @@ You can skip the whole scope by using `xscope` instead of `scope`.
98
82
 
99
83
  Take into account that `xscope` is a no-op so you won't be informed when you skip a scope.
100
84
 
101
- ## Let and let!
85
+ ## `#let` and `#let!`
102
86
 
103
87
  Matest steals the `let` and `let!` features from `RSpec` and `Minitest`.
104
88
 
105
- With `let` you can declare a lazy variable valid on the current scope and all sub-scopes.
89
+ With `let` you can declare a lazy variable valid on the current scope and all sub-scopes. `let!` has the same efect, but it won't be lazy (it wil be loaded when defined).
106
90
 
107
91
  Here are some examples of what you can do with them:
108
92
 
@@ -147,6 +131,28 @@ scope do
147
131
  end
148
132
  ```
149
133
 
134
+ ## Matchers
135
+
136
+ Matest doesn't come with predefined matchers, it doesn't need them. In fact, the concept of a matcher is not required, because of the natural assertions nature of the library.
137
+
138
+ But you can define helper methods to *assert* long, complex or repeated logic:
139
+
140
+ ```ruby
141
+ def is_even?(val)
142
+ val % 2 == 0
143
+ end
144
+
145
+ scope do
146
+ spec do
147
+ is_even?(4)
148
+ end
149
+
150
+ spec do
151
+ ! is_even?(5)
152
+ end
153
+ end
154
+ ```
155
+
150
156
  ## Aliases
151
157
 
152
158
  You may be used to other keywords provenient from different testing frameworks. Matest has a couple of alias that you may use indistinctly to fit your style.
@@ -161,6 +167,22 @@ You may be used to other keywords provenient from different testing frameworks.
161
167
  - `test` (and `xtest`)
162
168
  - `example` (and `xexample`)
163
169
 
170
+ ## Installation
171
+
172
+ Add this line to your application's Gemfile:
173
+
174
+ ```ruby
175
+ gem 'matest'
176
+ ```
177
+
178
+ And then execute:
179
+
180
+ $ bundle
181
+
182
+ Or install it yourself as:
183
+
184
+ $ gem install matest
185
+
164
186
  ## Contributing
165
187
 
166
188
  1. Fork it ( https://github.com/[my-github-username]/matest/fork )
data/lib/matest.rb CHANGED
@@ -1,13 +1,18 @@
1
1
  require "matest/version"
2
2
  require "matest/spec_status"
3
+ require "matest/spec_printer"
4
+
5
+
3
6
  module Matest
4
7
  class Runner
5
8
  attr_reader :example_groups
6
9
  attr_reader :info
10
+ attr_reader :printer
7
11
 
8
- def initialize
12
+ def initialize(printer: SpecPrinter.new)
9
13
  @example_groups = []
10
- @info = {}
14
+ @info = {}
15
+ @printer = printer
11
16
  end
12
17
 
13
18
  def self.runner
@@ -26,60 +31,26 @@ module Matest
26
31
  example_groups.each do |current_group|
27
32
  current_group.execute!
28
33
  end
29
- print_messages
30
- end
31
-
32
- def print_messages
33
- puts "\n\n### Messages ###"
34
-
35
- statuses = []
36
- info[:success] = true
37
- info[:num_specs] = { total: 0 }
38
-
39
- example_groups.each do |current_group|
40
- current_group.statuses.each do |status|
41
- info[:num_specs][:total] += 1
42
-
43
- info[:num_specs][status.name] ||= 0
44
- info[:num_specs][status.name] += 1
45
-
46
- if status.is_a?(Matest::SpecPassed)
47
- else
48
- if status.is_a?(Matest::SpecFailed)
49
- info[:success] = false
50
- end
51
- puts "\n[#{status.name}] #{status.description}"
52
- if status.is_a?(Matest::NotANaturalAssertion)
53
- info[:success] = false
54
- puts " # => #{status.result.inspect}"
55
- end
56
- if status.is_a?(Matest::ExceptionRaised)
57
- info[:success] = false
58
- puts "EXCEPTION >> #{status.result}"
59
- status.result.backtrace.each do |l|
60
- puts " #{l}"
61
- end
62
-
63
- end
64
- puts " #{status.location}:"
65
- end
66
- end
67
- end
34
+ printer.print(self)
68
35
  end
69
36
  end
70
37
 
71
38
  class SkipMe; end
72
39
 
73
40
  class Example
74
- attr_reader :example_block
75
- attr_reader :description
41
+ def example_block
42
+ @__example_block
43
+ end
44
+ def description
45
+ @__description
46
+ end
76
47
 
77
48
  def initialize(example_block, description, lets)
78
- @example_block = example_block
79
- @description = description
49
+ @__example_block = example_block
50
+ @__description = description
80
51
  lets.each do |let|
81
52
  self.class.let(let.var_name, &let.block)
82
- send(let.var_name) if let.and_call
53
+ send(let.var_name) if let.and_call
83
54
  end
84
55
  end
85
56
 
@@ -92,20 +63,24 @@ module Matest
92
63
  instance_variable_set(:"@#{var_name}", block.call)
93
64
  end
94
65
  end
66
+
67
+ def track
68
+ instance_variables.reject {|i| i.to_s =~ /\A@__/}.map {|i| [i, instance_variable_get(i)] }
69
+ end
95
70
  end
96
71
 
97
72
  class Let
98
73
  attr_reader :var_name
99
74
  attr_reader :block
100
75
  attr_reader :and_call
101
-
76
+
102
77
  def initialize(var_name, block, and_call=false)
103
78
  @var_name = var_name
104
79
  @block = block
105
80
  @and_call = and_call
106
81
  end
107
82
  end
108
-
83
+
109
84
  class ExampleGroup
110
85
  attr_reader :scope_block
111
86
  attr_reader :specs
@@ -169,14 +144,13 @@ module Matest
169
144
  else
170
145
  Matest::NotANaturalAssertion
171
146
  end
172
- status_class.new(spec.example_block, result, spec.description)
147
+ status_class.new(spec, result)
173
148
  rescue Exception => e
174
- Matest::ExceptionRaised.new(spec.example_block, e, spec.description)
149
+ Matest::ExceptionRaised.new(spec, e, spec.description)
175
150
  end
176
151
  @statuses << status
177
152
  status
178
153
  end
179
-
180
154
  end
181
155
  end
182
156
 
@@ -0,0 +1,47 @@
1
+ module Matest
2
+
3
+ class SpecPrinter
4
+
5
+ def print(runner)
6
+ puts "\n\n### Messages ###"
7
+
8
+ statuses = []
9
+ runner.info[:success] = true
10
+ runner.info[:num_specs] = { total: 0 }
11
+
12
+ runner.example_groups.each do |current_group|
13
+ current_group.statuses.each do |status|
14
+ runner.info[:num_specs][:total] += 1
15
+
16
+ runner.info[:num_specs][status.name] ||= 0
17
+ runner.info[:num_specs][status.name] += 1
18
+
19
+ if status.is_a?(Matest::SpecPassed)
20
+ else
21
+ puts "\n[#{status.name}] #{status.description}"
22
+ if status.is_a?(Matest::SpecFailed)
23
+ runner.info[:success] = false
24
+ puts "Variables: "
25
+ status.example.track.each do |var, val|
26
+ puts " #{var}: #{val.inspect}"
27
+ end
28
+ end
29
+ if status.is_a?(Matest::NotANaturalAssertion)
30
+ runner.info[:success] = false
31
+ puts " # => #{status.result.inspect}"
32
+ end
33
+ if status.is_a?(Matest::ExceptionRaised)
34
+ runner.info[:success] = false
35
+ puts "EXCEPTION >> #{status.result}"
36
+ status.result.backtrace.each do |l|
37
+ puts " #{l}"
38
+ end
39
+
40
+ end
41
+ puts " #{status.location}:"
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -1,17 +1,19 @@
1
1
  module Matest
2
2
  class SpecStatus
3
- attr_reader :block
4
- attr_reader :description
3
+ attr_reader :example
5
4
  attr_reader :result
6
5
 
7
- def initialize(block, result, description=nil)
8
- @block = block
6
+ def initialize(example, result, description=nil)
7
+ @example = example
9
8
  @result = result
10
- @description = description
11
9
  end
12
10
 
13
11
  def location
14
- "%s:%d" % block.source_location
12
+ "%s:%d" % example.example_block.source_location
13
+ end
14
+
15
+ def description
16
+ example.description
15
17
  end
16
18
  end
17
19
 
@@ -1,3 +1,3 @@
1
1
  module Matest
2
- VERSION = "1.0.0"
2
+ VERSION = "1.0.1"
3
3
  end
@@ -0,0 +1,7 @@
1
+ scope do
2
+ let(:a) { true }
3
+ spec do
4
+ @b = false
5
+ a == @b
6
+ end
7
+ end
@@ -0,0 +1,12 @@
1
+ def is_even?(val)
2
+ val % 2 == 0
3
+ end
4
+ scope do
5
+ spec do
6
+ is_even?(4)
7
+ end
8
+
9
+ spec do
10
+ ! is_even?(5)
11
+ end
12
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: matest
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Federico Iachetti
@@ -53,10 +53,13 @@ files:
53
53
  - Rakefile
54
54
  - bin/mt
55
55
  - lib/matest.rb
56
+ - lib/matest/spec_printer.rb
56
57
  - lib/matest/spec_status.rb
57
58
  - lib/matest/version.rb
58
59
  - matest.gemspec
59
60
  - spec/matest_spec.rb
61
+ - spec/matest_specs/failing_spec.rb
62
+ - spec/matest_specs/matchers_spec.rb
60
63
  - spec/matest_specs/nested_scopes_spec.rb
61
64
  - spec/matest_specs/passing_spec.rb
62
65
  - spec/matest_specs/scope_spec.rb
@@ -89,6 +92,8 @@ specification_version: 4
89
92
  summary: Tests gasoleros (cheap tests).
90
93
  test_files:
91
94
  - spec/matest_spec.rb
95
+ - spec/matest_specs/failing_spec.rb
96
+ - spec/matest_specs/matchers_spec.rb
92
97
  - spec/matest_specs/nested_scopes_spec.rb
93
98
  - spec/matest_specs/passing_spec.rb
94
99
  - spec/matest_specs/scope_spec.rb