spex 0.5.0 → 0.5.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.
data/Rakefile CHANGED
@@ -11,6 +11,7 @@ begin
11
11
  gem.homepage = "http://github.com/bruce/spex"
12
12
  gem.authors = ["Bruce Williams"]
13
13
  gem.add_dependency "colored"
14
+ gem.add_dependency "diff-lcs"
14
15
  end
15
16
  Jeweler::GemcutterTasks.new
16
17
  rescue LoadError
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.0
1
+ 0.5.1
@@ -1,13 +1,18 @@
1
1
  require 'digest/md5'
2
+ require 'diff/lcs'
3
+ require 'diff/lcs/array'
2
4
 
3
5
  module Spex
4
6
 
5
7
  # With no option, just verifies a change occurs
6
8
  class ModifiedAssertion < FileAssertion
7
9
  as :modified, 'file modification'
10
+ option :added, "Added content (string or regexp)"
11
+ option :removed, "Removed content (string or regexp)"
8
12
 
9
13
  def prepare
10
14
  track_checksum!
15
+ track_contents! if options[:added] || options[:removed]
11
16
  end
12
17
 
13
18
  def before
@@ -19,6 +24,7 @@ module Spex
19
24
  checksum = current_checksum
20
25
  if active?
21
26
  assert_not_equal @before_checksum, checksum, "Checksum did not change"
27
+ check_added_and_removed if options[:added] || options[:removed]
22
28
  else
23
29
  assert_equal @before_checksum, checksum, "Checksum changed"
24
30
  end
@@ -26,10 +32,47 @@ module Spex
26
32
 
27
33
  private
28
34
 
35
+ def check_added_and_removed
36
+ diff = generate_diff
37
+ if options[:added]
38
+ assert_diff_match(diff,
39
+ '+', options[:added],
40
+ "Did not add: #{options[:added]}")
41
+ end
42
+ if options[:removed]
43
+ assert_diff_match(diff,
44
+ '-', options[:removed],
45
+ "Did not remove: #{options[:removed]}")
46
+ end
47
+ end
48
+
49
+ def assert_diff_match(diff, action, content, message)
50
+ found = diff.any? do |change|
51
+ if change.action == action
52
+ case content
53
+ when String
54
+ change.element.include?(content)
55
+ when Regexp
56
+ change.element.match(content)
57
+ end
58
+ end
59
+ end
60
+ assert found, message
61
+ end
62
+
63
+ def generate_diff
64
+ contents = File.readlines(target)
65
+ @before_contents.diff(contents).flatten
66
+ end
67
+
29
68
  def track_checksum!
30
69
  @before_checksum = current_checksum
31
70
  end
32
71
 
72
+ def track_contents!
73
+ @before_contents = File.readlines(target)
74
+ end
75
+
33
76
  def current_checksum
34
77
  if File.exist?(target)
35
78
  generate_checksum
data/test/helper.rb CHANGED
@@ -1,10 +1,12 @@
1
1
  require 'rubygems'
2
2
  require 'test/unit'
3
3
  require 'shoulda'
4
+ require 'stringio'
4
5
 
5
6
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
7
  $LOAD_PATH.unshift(File.dirname(__FILE__))
7
8
  require 'spex'
9
+ require 'fakefs/safe'
8
10
 
9
11
  class Test::Unit::TestCase
10
12
 
@@ -13,5 +15,18 @@ class Test::Unit::TestCase
13
15
  def script(&block)
14
16
  @script = Spex::Script.evaluate(&block)
15
17
  end
18
+
19
+ def assertion_passes(&block)
20
+ @assertion.prepare
21
+ @assertion.before
22
+ yield if block_given?
23
+ @assertion.after
24
+ end
25
+
26
+ def assertion_fails(&block)
27
+ assert_raises Test::Unit::AssertionFailedError do
28
+ assertion_passes(&block)
29
+ end
30
+ end
16
31
 
17
32
  end
@@ -0,0 +1,140 @@
1
+ require 'helper'
2
+
3
+ class TestAssertion < Test::Unit::TestCase
4
+
5
+ def set_assertion(options = {})
6
+ @assertion = Spex::ModifiedAssertion.new(@filename, options)
7
+ end
8
+
9
+ def non_blank_file!(text = 'test')
10
+ File.open(@filename, 'w') { |f| f.puts text }
11
+ end
12
+
13
+ def blank_file!
14
+ File.open(@filename, 'w') { |f| f.puts }
15
+ end
16
+
17
+ context "Modified Assertion" do
18
+ setup do
19
+ FakeFS.activate!
20
+ @filename = '/tmp/modified-test'
21
+ end
22
+
23
+ teardown do
24
+ FakeFS.deactivate!
25
+ end
26
+
27
+ context "instances" do
28
+ context "without options" do
29
+ setup do
30
+ set_assertion
31
+ blank_file!
32
+ end
33
+ should "pass when modifications happen" do
34
+ assertion_passes { non_blank_file! }
35
+ end
36
+ should "when modifications don't happen" do
37
+ assertion_fails
38
+ end
39
+ end
40
+ context "with :added" do
41
+ context "as a string" do
42
+ setup do
43
+ set_assertion(:added => 'test')
44
+ blank_file!
45
+ end
46
+ context "when the text is added" do
47
+ should "pass" do
48
+ assertion_passes { non_blank_file! }
49
+ end
50
+ end
51
+ context "when different text is added" do
52
+ should "fail" do
53
+ assertion_fails { non_blank_file!('other') }
54
+ end
55
+ end
56
+ context "when modifications don't happen" do
57
+ should "fail when modifications don't happen" do
58
+ assertion_fails
59
+ end
60
+ end
61
+ end
62
+ context "as a regexp" do
63
+ setup do
64
+ set_assertion(:added => /t.st/)
65
+ blank_file!
66
+ end
67
+ context "when the text is added" do
68
+ should "pass" do
69
+ assertion_passes { non_blank_file! }
70
+ end
71
+ end
72
+ context "when different text is added" do
73
+ should "fail" do
74
+ assertion_fails { non_blank_file!('other') }
75
+ end
76
+ end
77
+ context "when modifications don't happen" do
78
+ should "fail when modifications don't happen" do
79
+ assertion_fails
80
+ end
81
+ end
82
+ end
83
+ end
84
+ context "with :removed" do
85
+ context "as a string" do
86
+ setup do
87
+ set_assertion(:removed => 'test')
88
+ end
89
+ context "when the text is removed" do
90
+ setup do
91
+ non_blank_file!
92
+ end
93
+ should "pass" do
94
+ assertion_passes { blank_file! }
95
+ end
96
+ end
97
+ context "when different text is removed" do
98
+ setup do
99
+ non_blank_file!('other')
100
+ end
101
+ should "fail" do
102
+ assertion_fails { blank_file! }
103
+ end
104
+ end
105
+ context "when modifications don't happen" do
106
+ should "fail when modifications don't happen" do
107
+ assertion_fails
108
+ end
109
+ end
110
+ end
111
+ context "as a regexp" do
112
+ setup do
113
+ set_assertion(:removed => /t.st/)
114
+ end
115
+ context "when the text is removed" do
116
+ setup do
117
+ non_blank_file!
118
+ end
119
+ should "pass" do
120
+ assertion_passes { blank_file! }
121
+ end
122
+ end
123
+ context "when different text is removed" do
124
+ setup do
125
+ non_blank_file!('other')
126
+ end
127
+ should "fail" do
128
+ assertion_fails { blank_file! }
129
+ end
130
+ end
131
+ context "when modifications don't happen" do
132
+ should "fail when modifications don't happen" do
133
+ assertion_fails
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end
140
+ end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 5
8
- - 0
9
- version: 0.5.0
8
+ - 1
9
+ version: 0.5.1
10
10
  platform: ruby
11
11
  authors:
12
12
  - Bruce Williams
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-04-13 00:00:00 -07:00
17
+ date: 2010-04-14 00:00:00 -07:00
18
18
  default_executable: spex
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -29,6 +29,18 @@ dependencies:
29
29
  version: "0"
30
30
  type: :runtime
31
31
  version_requirements: *id001
32
+ - !ruby/object:Gem::Dependency
33
+ name: diff-lcs
34
+ prerelease: false
35
+ requirement: &id002 !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ segments:
40
+ - 0
41
+ version: "0"
42
+ type: :runtime
43
+ version_requirements: *id002
32
44
  description: An easy-to-use test harness that runs assertions before and after and executable is run
33
45
  email: bruce@codefluency.com
34
46
  executables:
@@ -68,6 +80,7 @@ files:
68
80
  - lib/spex/script.rb
69
81
  - test/helper.rb
70
82
  - test/test_assertion.rb
83
+ - test/test_modified_assertion.rb
71
84
  - test/test_script.rb
72
85
  has_rdoc: true
73
86
  homepage: http://github.com/bruce/spex
@@ -102,6 +115,7 @@ summary: A test harness for executables
102
115
  test_files:
103
116
  - test/helper.rb
104
117
  - test/test_assertion.rb
118
+ - test/test_modified_assertion.rb
105
119
  - test/test_script.rb
106
120
  - examples/chgrp.rb
107
121
  - examples/chmod.rb