rspec-stopwatch 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0e0a606b083a128209f5db137f74421518a7111c
4
+ data.tar.gz: 31a6dd12c74dbb4c430a7082e9bc8a72a4e635f8
5
+ SHA512:
6
+ metadata.gz: 7cf4e151d64cd3e0cfa51d98c3762f6011415e4afb605c041bff17d7d4c097295eb95794c284614dae6a9c009e8ed7af15dd49b8110a2feaed3842dd4665d2b9
7
+ data.tar.gz: 117c606c609d00b87a7de6d5430b9d0fca1c80e99509cc798279b52a6d07728bbf91fbde7246ebf286d543bbf93aad25a9f33c824b06c9a028ee3b960dd925f8
@@ -0,0 +1,2 @@
1
+ require_relative './rspec/stopwatch/matchers/run_for_matcher'
2
+
@@ -0,0 +1,83 @@
1
+ require 'rspec'
2
+
3
+ require 'active_support/core_ext/numeric/time'
4
+ require 'benchmark'
5
+
6
+ RSpec::Matchers.define :run_for do |time|
7
+ [:<, :<=, :>, :>=].each do |operator|
8
+ define_method(operator) do |expected|
9
+ RunForComparedTo.new(operator, expected)
10
+ end
11
+ end
12
+
13
+ class RunForComparedTo < RSpec::Matchers::BuiltIn::BaseMatcher
14
+ attr_reader :operator, :expected, :actual, :config
15
+
16
+ def initialize(operator, expected)
17
+ @operator, @expected = operator, expected.to_f
18
+
19
+ @config = {
20
+ :average_over => 10.times,
21
+ :drop_first => 1,
22
+ }
23
+ end
24
+
25
+ def matches?(block)
26
+ raise ArgumentError, 'Expecting a block to `expect`' if !block.is_a?(Proc)
27
+
28
+ begin
29
+ warmup_runs.each { block.call }
30
+ benchmark = Benchmark.measure { runs.each { block.call } }
31
+
32
+ @actual = benchmark.total / runs.count
33
+ @actual.in_milliseconds.send(operator, expected.in_milliseconds)
34
+ rescue ArgumentError
35
+ false
36
+ end
37
+ end
38
+
39
+ def supports_block_expectations?
40
+ true
41
+ end
42
+
43
+ def failure_message
44
+ failure_message_for_operator(operator)
45
+ end
46
+
47
+ def failure_message_when_negated
48
+ failure_message_for_operator(opposite_operator)
49
+ end
50
+
51
+ def description
52
+ "run for #{operator} #{expected_str}"
53
+ end
54
+
55
+ private
56
+
57
+ def runs
58
+ config[:average_over]
59
+ end
60
+
61
+ def warmup_runs
62
+ config[:drop_first].times
63
+ end
64
+
65
+ def failure_message_for_operator(operator)
66
+ "expected: #{operator} #{expected_str}\n" \
67
+ " got: #{operator.to_s.gsub(/./, ' ')} #{actual_str}"
68
+ end
69
+
70
+ def opposite_operator
71
+ { :< => :>=, :<= => :>, :> => :<=, :>= => :< }[operator]
72
+ end
73
+
74
+ def expected_str
75
+ "#{expected.in_milliseconds} ms"
76
+ end
77
+
78
+ def actual_str
79
+ "#{actual.in_milliseconds} ms"
80
+ end
81
+ end
82
+ end
83
+
@@ -0,0 +1,6 @@
1
+ module RSpec
2
+ module Stopwatch
3
+ VERSION = '0.1.0'
4
+ end
5
+ end
6
+
@@ -0,0 +1,64 @@
1
+ require 'rspec-stopwatch'
2
+
3
+ describe :run_for, :matcher => true do
4
+ describe 'timing' do
5
+ it 'reports comparisons correctly' do
6
+ expect { 1000000.times { } }.to run_for > 0.001.seconds
7
+ end
8
+
9
+ it 'ignores real time' do
10
+ expect { sleep(0.2) }.to run_for < 0.1.second
11
+ end
12
+ end
13
+
14
+ describe 'success messages' do
15
+ subject { RunForComparedTo.new(:<, 1.second) }
16
+
17
+ before do
18
+ subject.matches?(lambda { })
19
+ end
20
+
21
+ it 'includes the operator' do
22
+ expect(subject.description).to include '<'
23
+ end
24
+
25
+ it 'includes the expectation time' do
26
+ expect(subject.description).to include '1000.0 ms'
27
+ end
28
+ end
29
+
30
+ describe 'failure messages' do
31
+ subject { RunForComparedTo.new(:>, 1.second) }
32
+
33
+ before do
34
+ subject.matches?(lambda { })
35
+ end
36
+
37
+ it 'includes the operator' do
38
+ expect(subject.failure_message).to include '>'
39
+ end
40
+
41
+ it 'includes the expected time' do
42
+ expect(subject.failure_message).to include '1000.0 ms'
43
+ end
44
+
45
+ it 'includes the actual time' do
46
+ expect(subject.failure_message).to include '0.0 ms'
47
+ end
48
+
49
+ context 'negated' do
50
+ it 'includes the opposite operator' do
51
+ expect(subject.failure_message_when_negated).to include '<='
52
+ end
53
+ end
54
+ end
55
+
56
+ describe 'error messages' do
57
+ it "raises when a block isn't passed" do
58
+ expect do
59
+ expect(:pikachu).to run_for < 1.second
60
+ end.to raise_error(ArgumentError).with_message 'Expecting a block to `expect`'
61
+ end
62
+ end
63
+ end
64
+
metadata ADDED
@@ -0,0 +1,77 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rspec-stopwatch
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Henry J. Wylde
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-07-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '4'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '4'
41
+ description: Provides a matcher that checks the run time of a block
42
+ email:
43
+ - public@hjwylde.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - lib/rspec-stopwatch.rb
49
+ - lib/rspec/stopwatch/matchers/run_for_matcher.rb
50
+ - lib/rspec/stopwatch/version.rb
51
+ - spec/matchers/run_for_spec.rb
52
+ homepage: https://git.powershop.co.nz/hjwylde/rspec-stopwatch-gem
53
+ licenses:
54
+ - BSD-3-Clause
55
+ metadata: {}
56
+ post_install_message:
57
+ rdoc_options: []
58
+ require_paths:
59
+ - lib
60
+ required_ruby_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ required_rubygems_version: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ requirements: []
71
+ rubyforge_project:
72
+ rubygems_version: 2.4.6
73
+ signing_key:
74
+ specification_version: 4
75
+ summary: Ruby gem for writing performance specs
76
+ test_files:
77
+ - spec/matchers/run_for_spec.rb