catechism 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.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/Gemfile +3 -0
- data/Guardfile +6 -0
- data/README.md +49 -0
- data/bin/catechism +5 -0
- data/catechism.gemspec +27 -0
- data/lib/catechism.rb +5 -0
- data/lib/catechism/cli.rb +15 -0
- data/lib/catechism/describe_block.rb +7 -0
- data/lib/catechism/it_block.rb +6 -0
- data/lib/catechism/matchers/equal.rb +21 -0
- data/lib/catechism/matchers/raise_error.rb +24 -0
- data/lib/catechism/matchers/send.rb +37 -0
- data/lib/catechism/subject_wrapper.rb +31 -0
- data/lib/catechism/version.rb +3 -0
- data/lib/core_ext/object.rb +5 -0
- data/trials/lib/catechism/cli_trial.rb +4 -0
- data/trials/lib/catechism/context_trial.rb +7 -0
- data/trials/lib/catechism/matcher_trial.rb +42 -0
- data/trials/line_trial.rb +16 -0
- metadata +127 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f9db9fd7efc9a513e2ead19f022759e11fbd9eb5
|
4
|
+
data.tar.gz: 46a5bef2912e4223340f1ab8d177a8d4641f9055
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d54c417d7f68b765f8ca307d4629249fa93a40f2724b6450aa16d48f754bb6b50c8ce354e400199767f9b6f1fcc2b8b8abeab74c06cb545a660e4c71ef9f4e3a
|
7
|
+
data.tar.gz: d504e27f538c3118329ca69ed43bc29d6a4f41a88aec45c57bcddca3e562a3405265c1f619afd13abd7a5c68c3339be51454dbd1a1093ad6025784994b21f54b
|
data/.gitignore
ADDED
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
catechism
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.0.0-p353
|
data/Gemfile
ADDED
data/Guardfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
Catechism
|
2
|
+
=========
|
3
|
+
|
4
|
+
Catechism is a very small test framework for Ruby.
|
5
|
+
|
6
|
+
|
7
|
+
Prerequisites
|
8
|
+
-------------
|
9
|
+
|
10
|
+
* Ruby 2.0.0
|
11
|
+
* A Unix environment
|
12
|
+
|
13
|
+
|
14
|
+
Installation
|
15
|
+
------------
|
16
|
+
|
17
|
+
Add this line to your application's Gemfile:
|
18
|
+
|
19
|
+
gem 'catechism'
|
20
|
+
|
21
|
+
And then execute:
|
22
|
+
|
23
|
+
$ bundle
|
24
|
+
|
25
|
+
Or install it yourself as:
|
26
|
+
|
27
|
+
$ gem install catechism
|
28
|
+
|
29
|
+
|
30
|
+
Usage
|
31
|
+
-----
|
32
|
+
|
33
|
+
Create a `trials` directory in the root of your project.
|
34
|
+
|
35
|
+
Create files in any path underneath it ending in `_trial.rb`. Examples can be found in `trials/lib/catechism`.
|
36
|
+
|
37
|
+
Then, run your test suite:
|
38
|
+
|
39
|
+
$ catechism
|
40
|
+
|
41
|
+
|
42
|
+
Contributing
|
43
|
+
------------
|
44
|
+
|
45
|
+
1. Fork it
|
46
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
47
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
48
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
49
|
+
5. Create new Pull Request
|
data/bin/catechism
ADDED
data/catechism.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'catechism/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'catechism'
|
8
|
+
spec.version = Catechism::VERSION
|
9
|
+
spec.authors = ['Doc Ritezel and Sarah Mei']
|
10
|
+
spec.email = ['pair+doc+sarah@ministryofvelocity.com']
|
11
|
+
spec.description = 'An object-oriented testing framework'
|
12
|
+
spec.summary = 'Put your code through an object-oriented trial by fire.'
|
13
|
+
spec.homepage = 'https://github.com/aosabook/500lines/catechism'
|
14
|
+
spec.license = 'MIT'
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^trials/})
|
19
|
+
spec.require_paths = ['lib']
|
20
|
+
spec.bindir = 'bin'
|
21
|
+
|
22
|
+
spec.add_dependency 'thor'
|
23
|
+
|
24
|
+
spec.add_development_dependency 'bundler', '~> 1.3'
|
25
|
+
spec.add_development_dependency 'gem-release'
|
26
|
+
spec.add_development_dependency 'guard-shell'
|
27
|
+
end
|
data/lib/catechism.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'thor'
|
2
|
+
|
3
|
+
class Catechism::Cli < Thor
|
4
|
+
desc 'run_trial TRIAL', 'Run the given trial'
|
5
|
+
def run_trial(trial_path)
|
6
|
+
Kernel.system("bundle exec ruby #{trial_path}") && puts("#{trial_path} was successful.")
|
7
|
+
end
|
8
|
+
|
9
|
+
desc 'run_all_trials', 'Run all trials in the current path'
|
10
|
+
def run_all_trials
|
11
|
+
Dir.glob('trials/**/*_trial.rb') { |trial_path| run_trial(trial_path) }
|
12
|
+
end
|
13
|
+
|
14
|
+
default_task :run_all_trials
|
15
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Catechism
|
2
|
+
module Matchers
|
3
|
+
class Equal < Struct.new(:subject, :expectation, :negated)
|
4
|
+
def equal?
|
5
|
+
subject == expectation
|
6
|
+
end
|
7
|
+
|
8
|
+
def valid?
|
9
|
+
equal? ^ negated
|
10
|
+
end
|
11
|
+
|
12
|
+
def failure_message
|
13
|
+
if negated
|
14
|
+
"#{subject} equals #{expected}"
|
15
|
+
else
|
16
|
+
"#{subject} does not equal #{expected}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Catechism::Matchers
|
2
|
+
class RaiseError < Struct.new(:subject, :negated)
|
3
|
+
def raised?
|
4
|
+
begin
|
5
|
+
subject.call
|
6
|
+
rescue StandardError => e
|
7
|
+
return true
|
8
|
+
end
|
9
|
+
false
|
10
|
+
end
|
11
|
+
|
12
|
+
def valid?
|
13
|
+
raised? ^ negated
|
14
|
+
end
|
15
|
+
|
16
|
+
def failure_message
|
17
|
+
if negated
|
18
|
+
"Expected no error to be raised, but an error was raised"
|
19
|
+
else
|
20
|
+
"Expected error to be raised, but no error was raised"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Catechism::Matchers
|
2
|
+
class Send < Struct.new(:subject, :method_name, :negated)
|
3
|
+
attr_reader :destination, :arguments
|
4
|
+
|
5
|
+
def to(destination)
|
6
|
+
@destination = destination
|
7
|
+
raise failure_message unless valid?
|
8
|
+
end
|
9
|
+
|
10
|
+
def with(*arguments)
|
11
|
+
@arguments = arguments
|
12
|
+
self
|
13
|
+
end
|
14
|
+
|
15
|
+
def valid?
|
16
|
+
called = false
|
17
|
+
send_matcher = self
|
18
|
+
destination.class.send(:define_method, method_name) do |*args|
|
19
|
+
if !send_matcher.arguments.nil?
|
20
|
+
called = send_matcher.arguments == args
|
21
|
+
else
|
22
|
+
called = true
|
23
|
+
end
|
24
|
+
end
|
25
|
+
subject.call
|
26
|
+
called ^ negated
|
27
|
+
end
|
28
|
+
|
29
|
+
def failure_message
|
30
|
+
if negated
|
31
|
+
"Expected #{destination} not to receive #{method_name}, but got it anyway"
|
32
|
+
else
|
33
|
+
"Expected #{method_name} on #{destination}, but was not received"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'catechism/matchers/equal'
|
2
|
+
require 'catechism/matchers/raise_error'
|
3
|
+
require 'catechism/matchers/send'
|
4
|
+
|
5
|
+
class Catechism::SubjectWrapper < Struct.new(:subject)
|
6
|
+
attr_reader :negated
|
7
|
+
|
8
|
+
def to_equal(expected)
|
9
|
+
matcher = Catechism::Matchers::Equal.new(subject, expected, negated)
|
10
|
+
raise matcher.failure_message unless matcher.valid?
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_be_nil
|
14
|
+
matcher = Catechism::Matchers::Equal.new(subject, nil, negated)
|
15
|
+
raise matcher.failure_message unless matcher.valid?
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_raise_error
|
19
|
+
matcher = Catechism::Matchers::RaiseError.new(subject, negated)
|
20
|
+
raise matcher.failure_message unless matcher.valid?
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_send(method_name)
|
24
|
+
Catechism::Matchers::Send.new(subject, method_name, negated)
|
25
|
+
end
|
26
|
+
|
27
|
+
def not
|
28
|
+
@negated = true
|
29
|
+
self
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'catechism'
|
2
|
+
|
3
|
+
describe 'using catechism matchers' do
|
4
|
+
class Harness; end
|
5
|
+
|
6
|
+
it 'lets you test equality' do
|
7
|
+
expect(1).to_equal(1)
|
8
|
+
expect(2).not.to_equal(1)
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'lets you test nilness' do
|
12
|
+
expect(nil).to_be_nil
|
13
|
+
expect(1).not.to_be_nil
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'lets you test exception raising' do
|
17
|
+
expect { raise 'hands' }.to_raise_error
|
18
|
+
expect { 3 + 1 }.not.to_raise_error
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'lets you test that an instance receives a message' do
|
22
|
+
tacos = Harness.new
|
23
|
+
expect { tacos.sauce }.to_send(:sauce).to(tacos)
|
24
|
+
expect { tacos.to_s }.not.to_send(:sauce).to(tacos)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'lets you test that a class receives a message' do
|
28
|
+
expect { Harness.to_s }.to_send(:to_s).to(Harness)
|
29
|
+
expect { Harness.inspect }.not.to_send(:to_s).to(Harness)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'lets you test that an instance receives a message with arguments' do
|
33
|
+
pants = Object.new
|
34
|
+
expect {
|
35
|
+
pants.tuck_into('socks')
|
36
|
+
}.to_send(:tuck_into).with('socks').to(pants)
|
37
|
+
|
38
|
+
expect {
|
39
|
+
pants.tuck_into('ears')
|
40
|
+
}.not.to_send(:tuck_into).with('socks').to(pants)
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'catechism'
|
2
|
+
|
3
|
+
describe 'the number of lines' do
|
4
|
+
it 'stays under 500' do
|
5
|
+
lib_files = Dir.glob(File.expand_path('../../lib/**/*.rb', __FILE__))
|
6
|
+
bin_files = Dir.glob(File.expand_path('../../bin/*', __FILE__))
|
7
|
+
trial_files = Dir.glob(File.expand_path('../../trials/**/*.rb', __FILE__))
|
8
|
+
|
9
|
+
lines = (lib_files + bin_files + trial_files).reduce(0) do |line_count, filename|
|
10
|
+
line_count + IO.readlines(filename).size
|
11
|
+
end
|
12
|
+
|
13
|
+
expect(lines < 500).to_equal(true)
|
14
|
+
puts "Current number of lines is #{lines}"
|
15
|
+
end
|
16
|
+
end
|
metadata
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: catechism
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Doc Ritezel and Sarah Mei
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-12-15 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: thor
|
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: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.3'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.3'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: gem-release
|
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: guard-shell
|
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
|
+
description: An object-oriented testing framework
|
70
|
+
email:
|
71
|
+
- pair+doc+sarah@ministryofvelocity.com
|
72
|
+
executables:
|
73
|
+
- catechism
|
74
|
+
extensions: []
|
75
|
+
extra_rdoc_files: []
|
76
|
+
files:
|
77
|
+
- .gitignore
|
78
|
+
- .ruby-gemset
|
79
|
+
- .ruby-version
|
80
|
+
- Gemfile
|
81
|
+
- Guardfile
|
82
|
+
- README.md
|
83
|
+
- bin/catechism
|
84
|
+
- catechism.gemspec
|
85
|
+
- lib/catechism.rb
|
86
|
+
- lib/catechism/cli.rb
|
87
|
+
- lib/catechism/describe_block.rb
|
88
|
+
- lib/catechism/it_block.rb
|
89
|
+
- lib/catechism/matchers/equal.rb
|
90
|
+
- lib/catechism/matchers/raise_error.rb
|
91
|
+
- lib/catechism/matchers/send.rb
|
92
|
+
- lib/catechism/subject_wrapper.rb
|
93
|
+
- lib/catechism/version.rb
|
94
|
+
- lib/core_ext/object.rb
|
95
|
+
- trials/lib/catechism/cli_trial.rb
|
96
|
+
- trials/lib/catechism/context_trial.rb
|
97
|
+
- trials/lib/catechism/matcher_trial.rb
|
98
|
+
- trials/line_trial.rb
|
99
|
+
homepage: https://github.com/aosabook/500lines/catechism
|
100
|
+
licenses:
|
101
|
+
- MIT
|
102
|
+
metadata: {}
|
103
|
+
post_install_message:
|
104
|
+
rdoc_options: []
|
105
|
+
require_paths:
|
106
|
+
- lib
|
107
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - '>='
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - '>='
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
117
|
+
requirements: []
|
118
|
+
rubyforge_project:
|
119
|
+
rubygems_version: 2.0.14
|
120
|
+
signing_key:
|
121
|
+
specification_version: 4
|
122
|
+
summary: Put your code through an object-oriented trial by fire.
|
123
|
+
test_files:
|
124
|
+
- trials/lib/catechism/cli_trial.rb
|
125
|
+
- trials/lib/catechism/context_trial.rb
|
126
|
+
- trials/lib/catechism/matcher_trial.rb
|
127
|
+
- trials/line_trial.rb
|