assay 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. data/.ruby +46 -41
  2. data/COPYING.rdoc +38 -0
  3. data/HISTORY.rdoc +18 -1
  4. data/QED.rdoc +1100 -0
  5. data/README.rdoc +139 -16
  6. data/lib/assay.rb +82 -29
  7. data/lib/assay.yml +46 -41
  8. data/lib/assay/{adapters → adapter}/minitest.rb +0 -0
  9. data/lib/assay/{adapters → adapter}/testunit.rb +0 -0
  10. data/lib/assay/assertable.rb +174 -0
  11. data/lib/assay/assertion.rb +98 -124
  12. data/lib/assay/assertor.rb +187 -0
  13. data/lib/assay/boolean_assay.rb +15 -0
  14. data/lib/assay/case_assay.rb +17 -0
  15. data/lib/assay/compare_assay.rb +38 -0
  16. data/lib/assay/core_ext/kernel.rb +52 -0
  17. data/lib/assay/core_ext/na.rb +9 -0
  18. data/lib/assay/directory_assay.rb +20 -0
  19. data/lib/assay/empty_assay.rb +17 -0
  20. data/lib/assay/equal_assay.rb +35 -0
  21. data/lib/assay/equality_assay.rb +18 -0
  22. data/lib/assay/execution_assay.rb +59 -0
  23. data/lib/assay/false_assay.rb +17 -0
  24. data/lib/assay/file_assay.rb +17 -0
  25. data/lib/assay/identity_assay.rb +49 -0
  26. data/lib/assay/include_assay.rb +17 -0
  27. data/lib/assay/instance_assay.rb +17 -0
  28. data/lib/assay/kind_assay.rb +18 -0
  29. data/lib/assay/less_assay.rb +18 -0
  30. data/lib/assay/less_equal_assay.rb +25 -0
  31. data/lib/assay/like_assay.rb +17 -0
  32. data/lib/assay/match_assay.rb +17 -0
  33. data/lib/assay/more_assay.rb +18 -0
  34. data/lib/assay/more_equal_assay.rb +25 -0
  35. data/lib/assay/nil_assay.rb +15 -0
  36. data/lib/assay/nomatch_assay.rb +17 -0
  37. data/lib/assay/output_assay.rb +35 -0
  38. data/lib/assay/path_assay.rb +17 -0
  39. data/lib/assay/raise_assay.rb +109 -0
  40. data/lib/assay/rescue_assay.rb +55 -0
  41. data/lib/assay/respond_assay.rb +17 -0
  42. data/lib/assay/return_assay.rb +46 -0
  43. data/lib/assay/silent_assay.rb +59 -0
  44. data/lib/assay/stderr_assay.rb +30 -0
  45. data/lib/assay/stdout_assay.rb +30 -0
  46. data/lib/assay/throw_assay.rb +89 -0
  47. data/lib/assay/true_assay.rb +20 -0
  48. data/lib/assay/unequal_assay.rb +37 -0
  49. data/lib/assay/within_assay.rb +39 -0
  50. data/test/case_compare_assay.rb +59 -0
  51. data/test/case_empty_assay.rb +51 -0
  52. data/test/case_equal_assay.rb +53 -0
  53. data/test/case_equality_assay.rb +55 -0
  54. data/test/case_false_assay.rb +48 -0
  55. data/test/case_identity_assay.rb +51 -0
  56. data/test/case_include_assay.rb +51 -0
  57. data/test/case_instance_assay.rb +51 -0
  58. data/test/case_kind_assay.rb +51 -0
  59. data/test/case_less_assay.rb +53 -0
  60. data/test/case_less_equal_assay.rb +53 -0
  61. data/test/case_like_assay.rb +57 -0
  62. data/test/case_match_assay.rb +45 -0
  63. data/test/case_more_assay.rb +53 -0
  64. data/test/case_more_equal_assay.rb +53 -0
  65. data/test/case_nil_assay.rb +48 -0
  66. data/test/case_nomatch_assay.rb +47 -0
  67. data/test/case_raise_assay.rb +51 -0
  68. data/test/case_respond_assay.rb +51 -0
  69. data/test/case_throw_assay.rb +51 -0
  70. data/test/case_true_assay.rb +48 -0
  71. data/test/case_unequal_assay.rb +55 -0
  72. data/test/case_within_assay.rb +61 -0
  73. data/test/helper.rb +36 -0
  74. metadata +135 -108
  75. data/APACHE2.txt +0 -205
  76. data/NOTICE.rdoc +0 -18
  77. data/lib/assay/assertions/compare_failure.rb +0 -61
  78. data/lib/assay/assertions/delta_failure.rb +0 -80
  79. data/lib/assay/assertions/empty_failure.rb +0 -76
  80. data/lib/assay/assertions/equality_failure.rb +0 -100
  81. data/lib/assay/assertions/execution_failure.rb +0 -90
  82. data/lib/assay/assertions/false_failure.rb +0 -72
  83. data/lib/assay/assertions/identity_failure.rb +0 -85
  84. data/lib/assay/assertions/instance_failure.rb +0 -76
  85. data/lib/assay/assertions/kind_failure.rb +0 -80
  86. data/lib/assay/assertions/match_failure.rb +0 -85
  87. data/lib/assay/assertions/nil_failure.rb +0 -75
  88. data/lib/assay/assertions/raise_failure.rb +0 -134
  89. data/lib/assay/assertions/response_failure.rb +0 -86
  90. data/lib/assay/assertions/same_failure.rb +0 -82
  91. data/lib/assay/assertions/throw_failure.rb +0 -122
  92. data/lib/assay/assertions/true_failure.rb +0 -79
  93. data/lib/assay/matcher.rb +0 -48
  94. data/qed/01_failure_classes.rdoc +0 -75
  95. data/qed/02_assertives.rdoc +0 -118
  96. data/qed/03_matchers.rdoc +0 -118
  97. data/qed/04_lookup.rdoc +0 -10
@@ -0,0 +1,17 @@
1
+ require_relative 'equality_assay'
2
+
3
+ # Equality assertion using `#===`, the case equality method.
4
+ #
5
+ class CaseAssay < EqualityAssay
6
+
7
+ register :===, :case
8
+
9
+ #
10
+ # Check assertion via `#===` method.
11
+ #
12
+ def self.pass?(subject, criterion)
13
+ subject === criterion
14
+ end
15
+
16
+ end
17
+
@@ -0,0 +1,38 @@
1
+ require_relative 'assertion'
2
+
3
+ # Compare assertion serves primarily as a base class
4
+ # for other more specific comparison assertions.
5
+ #
6
+ # In itself it can be used to test a comparision
7
+ # made by #<=>.
8
+ #
9
+ class CompareAssay < Assertion
10
+
11
+ # TODO: What about #cmp alias?
12
+
13
+ register :<=>, :compare
14
+
15
+ #
16
+ # Check assertion using `<=>`.
17
+ #
18
+ def self.pass?(subject, criterion, result=0)
19
+ (subject <=> criterion) == result
20
+ end
21
+
22
+ #
23
+ # Error message for campare assertion.
24
+ #
25
+ def self.assert_message(subject, criterion, result=0)
26
+ a = subject.inspect
27
+ b = criterion.inspect
28
+ r = result.inspect
29
+
30
+ if a.size > SIZE_LIMIT or b.size > SIZE_LIMIT
31
+ "a <=> b == #{r}\na) #{a}\nb) #{b}"
32
+ else
33
+ "#{a} <=> #{b} == #{r}"
34
+ end
35
+ end
36
+
37
+ end
38
+
@@ -0,0 +1,52 @@
1
+ module Kernel
2
+
3
+ # Do two references have the same `#object_id`, and hence are the
4
+ # same object.
5
+ #
6
+ # @param [Object] other
7
+ # Any object reference.
8
+ #
9
+ def identical?(other)
10
+ object_id == other.object_id
11
+ end
12
+
13
+ # Ascertain likeness, returns true if any of `equal?`, `eql?`, `==`,
14
+ # `===` or `=~` evaluate truthfully, either with `self` as the receiver
15
+ # or `other` as the receiver.
16
+ #
17
+ # @todo Should `#=~` be apart of this comparison?
18
+ #
19
+ # @param [Object] other
20
+ # Any object reference.
21
+ #
22
+ # @return [Boolean] +true+ if alike.
23
+ #
24
+ def like?(other)
25
+ self.equal?(other) ||
26
+ self.eql?(other) ||
27
+ self.==(other) ||
28
+ self.===(other) ||
29
+ self.=~(other) ||
30
+ other.equal?(self) ||
31
+ other.eql?(self) ||
32
+ other.==(self) ||
33
+ other.===(self) ||
34
+ other.=~(self)
35
+ end
36
+
37
+ #
38
+ def true?
39
+ TrueClass === self
40
+ end
41
+
42
+ #
43
+ def false?
44
+ FalseClass === self
45
+ end
46
+
47
+ #
48
+ def boolean?
49
+ true? || false?
50
+ end
51
+
52
+ end
@@ -0,0 +1,9 @@
1
+
2
+ class << NA = ArgumentError.new
3
+ def inspect ; 'N/A' ; end
4
+ def method_missing(*); self; end
5
+ end
6
+
7
+ def __
8
+ NA
9
+ end
@@ -0,0 +1,20 @@
1
+ require_relative 'path_assay'
2
+
3
+ # Assert the existance of a directory with `File.directory?` call.
4
+ #
5
+ class DirectoryAssay < PathAssay
6
+
7
+ register :directory
8
+
9
+ #
10
+ # Check assertion using `File.file?` method.
11
+ #
12
+ def self.pass?(path)
13
+ File.directory?(path)
14
+ end
15
+
16
+ end
17
+
18
+ # I would prefer this name.
19
+ #FolderAssay = DirectoryAssay
20
+
@@ -0,0 +1,17 @@
1
+ require_relative 'include_assay'
2
+
3
+ # Empty assertion tests an object with `#empty?` method.
4
+ #
5
+ class EmptyAssay < IncludeAssay
6
+
7
+ register :empty
8
+
9
+ #
10
+ # Check assertion with `#empty?`.
11
+ #
12
+ def self.pass?(subject)
13
+ subject.empty?
14
+ end
15
+
16
+ end
17
+
@@ -0,0 +1,35 @@
1
+ require_relative 'like_assay'
2
+
3
+ # EqualAssay coers the assertion comparing two objects with `#==` operator.
4
+ #
5
+ class EqualAssay < LikeAssay
6
+
7
+ register :==, :equal
8
+
9
+ #
10
+ # Test assertion of `#==` method.
11
+ #
12
+ def self.pass?(subject, criterion)
13
+ subject == criterion
14
+ end
15
+
16
+ #
17
+ # Error message for equal assertion.
18
+ #
19
+ def self.assert_message(subject, criterion)
20
+ a = subject.inspect
21
+ b = criterion.inspect
22
+
23
+ if a.size > SIZE_LIMIT or b.size > SIZE_LIMIT
24
+ if $ansi
25
+ d = ANSI::Diff.new(a, b)
26
+ a, b = d.diff1, d.diff2 # *d.to_a
27
+ end
28
+ "a == b\na) #{a}\nb) #{b}"
29
+ else
30
+ "#{a} == #{b}"
31
+ end
32
+ end
33
+
34
+ end
35
+
@@ -0,0 +1,18 @@
1
+ require_relative 'equal_assay'
2
+
3
+ # EqualityAssay defines the assertion for the `#eql?`, the strict
4
+ # equality method.
5
+ #
6
+ class EqualityAssay < EqualAssay
7
+
8
+ register :eql
9
+
10
+ #
11
+ # Check assertion via `#eql?` method.
12
+ #
13
+ def self.pass?(subject, criterion)
14
+ subject.eql?(criterion)
15
+ end
16
+
17
+ end
18
+
@@ -0,0 +1,59 @@
1
+ require_relative 'assertion'
2
+
3
+ # Assert that a block of coded executes without error and does
4
+ # not return +nil+ or +false+.
5
+ #
6
+ # NOTE: To test only for successful execution regardless of return value
7
+ # use a negated {RaiseAssay} on the Exception class. But generally
8
+ # this would be pretty silly, if you think about it, this is exactly
9
+ # what testing is for!
10
+ #
11
+ class ExecutionAssay < Assertion
12
+
13
+ register :executes
14
+
15
+ #
16
+ # Check assertion.
17
+ #
18
+ def self.pass?(*arguments, &block)
19
+ begin
20
+ block.call(*arguments)
21
+ rescue Exception
22
+ false
23
+ end
24
+ end
25
+
26
+ #
27
+ # Check negated assertion.
28
+ #
29
+ def self.fail?(*arguments, &block)
30
+ begin
31
+ ! block.call(*arguments)
32
+ rescue Exception
33
+ true
34
+ end
35
+ end
36
+
37
+ #
38
+ #def self.assert!(*criteria, &block)
39
+ # options = (Hash === criteria.last ? criteria.pop : {})
40
+ # assay = new(nil, *criteria) #, &block)
41
+ # assay.assert!(options, &block)
42
+ #end
43
+
44
+ #
45
+ #def self.refute!(*criteria, &block)
46
+ # options = (Hash === criteria.last ? criteria.pop : {})
47
+ # assay = new(nil, *criteria) #, &block)
48
+ # assay.refute!(options, &block)
49
+ #end
50
+
51
+ #
52
+ #
53
+ #
54
+ def self.assert_message(*arguments, &block)
55
+ "#{block}.call(*#{arguments.inspect})"
56
+ end
57
+
58
+ end
59
+
@@ -0,0 +1,17 @@
1
+ require_relative 'boolean_assay'
2
+
3
+ # Assert and object if strictly `false`.
4
+ #
5
+ class FalseAssay < BooleanAssay
6
+
7
+ register :false
8
+
9
+ #
10
+ # Check assertion.
11
+ #
12
+ def self.pass?(subject)
13
+ subject.false? #FalseClass === subject
14
+ end
15
+
16
+ end
17
+
@@ -0,0 +1,17 @@
1
+ require_relative 'path_assay'
2
+
3
+ # Assert the existance of a file with `File.file?` call.
4
+ #
5
+ class FileAssay < PathAssay
6
+
7
+ register :file
8
+
9
+ #
10
+ # Check assertion using `File.file?` method.
11
+ #
12
+ def self.pass?(path)
13
+ File.file?(path)
14
+ end
15
+
16
+ end
17
+
@@ -0,0 +1,49 @@
1
+ require_relative 'equality_assay'
2
+
3
+ # Check that two objects are one and the same object.
4
+ #
5
+ # NOTE: Ruby defines #equal? to mean #identical? but I believe
6
+ # this to be a misnomer, at the very least. So we use the term
7
+ # `identical` instead.
8
+ #
9
+ class IdentityAssay < EqualityAssay
10
+
11
+ register :identical
12
+
13
+ #
14
+ # Check assertion using `object_id == object_id`.
15
+ #
16
+ def self.pass?(subject, criterion)
17
+ subject.identical?(criterion) #subject.object_id == criterion.object_id
18
+ end
19
+
20
+ # #
21
+ # #
22
+ # #
23
+ # def assert_message(subject)
24
+ # a = subject.inspect
25
+ # b = criteria.first.inspect
26
+ #
27
+ # if a.size > SIZE_LIMIT or b.size > SIZE_LIMIT
28
+ # "a.identical?object_id == b.object.id\na) #{criterion}\nb) #{actual}"
29
+ # else
30
+ # "#{criterion}.object_id == #{actual}.object.id"
31
+ # end
32
+ # end
33
+ #
34
+ # #
35
+ # #
36
+ # #
37
+ # def refute_message(subject)
38
+ # actual = subject.inspect
39
+ # criterion = criteria.first.inspect
40
+ #
41
+ # if actual.size > SIZE_LIMIT or criterion.size > SIZE_LIMIT
42
+ # "a.object_id != b.object.id\na) #{criterion}\nb) #{actual}"
43
+ # else
44
+ # "#{criterion}.object_id != #{actual}.object.id"
45
+ # end
46
+ # end
47
+
48
+ end
49
+
@@ -0,0 +1,17 @@
1
+ require_relative 'assertion'
2
+
3
+ # Assert that a container includes some object.
4
+ #
5
+ class IncludeAssay < Assertion
6
+
7
+ register :include
8
+
9
+ #
10
+ # Check assertion using `#include?` method.
11
+ #
12
+ def self.pass?(container, member)
13
+ container.include?(member)
14
+ end
15
+
16
+ end
17
+
@@ -0,0 +1,17 @@
1
+ require_relative 'kind_assay'
2
+
3
+ # Assert that an object is an instance of a class.
4
+ #
5
+ class InstanceAssay < KindAssay
6
+
7
+ register :instance_of
8
+
9
+ #
10
+ # Check assertion.
11
+ #
12
+ def self.pass?(object, class_type)
13
+ object.instance_of?(class_type)
14
+ end
15
+
16
+ end
17
+
@@ -0,0 +1,18 @@
1
+ require_relative 'assertion'
2
+
3
+ # Comparison assertion for #kind_of?
4
+ #
5
+ # KindAssay.pass?(1, Integer) #=> true
6
+ # KindAssay.fail?(1, String) #=> true
7
+ #
8
+ class KindAssay < Assertion
9
+
10
+ register :kind_of
11
+
12
+ # Check assertion.
13
+ def self.pass?(object, class_type)
14
+ object.kind_of?(class_type)
15
+ end
16
+
17
+ end
18
+
@@ -0,0 +1,18 @@
1
+ require_relative 'compare_assay'
2
+
3
+ # Compare assertion is used to test a comparision
4
+ # made by `#<`.
5
+ #
6
+ class LessAssay < CompareAssay
7
+
8
+ register :<, :less_than
9
+
10
+ #
11
+ # Check assertion.
12
+ #
13
+ def self.pass?(subject, criterion)
14
+ subject < criterion
15
+ end
16
+
17
+ end
18
+
@@ -0,0 +1,25 @@
1
+ require_relative 'compare_assay'
2
+
3
+ # Compare assertion is used to test a comparision made by `#<=`.
4
+ #
5
+ # NOTE: We are taking some leeway here with the name of this class,
6
+ # which ordinarily would be called `LesserThanOrEqualAssay`.
7
+ # However, such a name is a bit winded. The shortest name then,
8
+ # without resorting to abbreviations, is _less-equal_, a monosyllabic
9
+ # reading of the operator itself. Since it is ordinarily meaningless
10
+ # to say something is "more equal" than something else, why not allow
11
+ # it to be meaningful and save ourselves all that uneccessary verbage?
12
+ #
13
+ class LessEqualAssay < CompareAssay
14
+
15
+ register :<=, :less_equal
16
+
17
+ #
18
+ # Check assertion.
19
+ #
20
+ def self.pass?(subject, criterion)
21
+ subject <= criterion
22
+ end
23
+
24
+ end
25
+