lookout 2.3.0 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README +351 -181
- data/Rakefile +20 -5
- data/lib/lookout-3.0.rb +138 -0
- data/lib/lookout-3.0/actual.rb +30 -0
- data/lib/lookout-3.0/actual/method.rb +31 -0
- data/lib/lookout-3.0/actual/not.rb +13 -0
- data/lib/lookout-3.0/actual/not/method.rb +10 -0
- data/lib/lookout-3.0/aphonic.rb +44 -0
- data/lib/lookout-3.0/diff.rb +29 -0
- data/lib/{lookout → lookout-3.0}/diff/algorithms.rb +1 -1
- data/lib/lookout-3.0/diff/algorithms/difflib.rb +62 -0
- data/lib/lookout-3.0/diff/algorithms/difflib/position.rb +63 -0
- data/lib/{lookout/diff/algorithms/difflib/position/to.rb → lookout-3.0/diff/algorithms/difflib/position/new.rb} +8 -17
- data/lib/lookout-3.0/diff/formats.rb +5 -0
- data/lib/lookout-3.0/diff/formats/inline.rb +43 -0
- data/lib/lookout-3.0/diff/formats/set.rb +48 -0
- data/lib/lookout-3.0/diff/formats/unified.rb +56 -0
- data/lib/lookout-3.0/diff/group.rb +57 -0
- data/lib/lookout-3.0/diff/groups.rb +47 -0
- data/lib/lookout-3.0/diff/match.rb +31 -0
- data/lib/lookout-3.0/diff/operation.rb +41 -0
- data/lib/lookout-3.0/diff/operations.rb +35 -0
- data/lib/lookout-3.0/diff/operations/copy.rb +25 -0
- data/lib/lookout-3.0/diff/operations/delete.rb +5 -0
- data/lib/lookout-3.0/diff/operations/insert.rb +5 -0
- data/lib/lookout-3.0/diff/operations/replace.rb +6 -0
- data/lib/lookout-3.0/diff/slice.rb +97 -0
- data/lib/lookout-3.0/difference.rb +10 -0
- data/lib/lookout-3.0/difference/array.rb +22 -0
- data/lib/lookout-3.0/difference/exception.rb +40 -0
- data/lib/lookout-3.0/difference/hash.rb +31 -0
- data/lib/lookout-3.0/difference/lookout.rb +5 -0
- data/lib/lookout-3.0/difference/lookout/actual.rb +6 -0
- data/lib/lookout-3.0/difference/lookout/actual/method.rb +13 -0
- data/lib/lookout-3.0/difference/lookout/actual/not.rb +6 -0
- data/lib/lookout-3.0/difference/lookout/actual/not/method.rb +9 -0
- data/lib/lookout-3.0/difference/lookout/output.rb +8 -0
- data/lib/lookout-3.0/difference/lookout/reception.rb +21 -0
- data/lib/lookout-3.0/difference/lookout/warning.rb +9 -0
- data/lib/lookout-3.0/difference/module.rb +12 -0
- data/lib/lookout-3.0/difference/object.rb +73 -0
- data/lib/lookout-3.0/difference/range.rb +12 -0
- data/lib/lookout-3.0/difference/regexp.rb +12 -0
- data/lib/lookout-3.0/difference/string.rb +21 -0
- data/lib/lookout-3.0/difference/symbol.rb +21 -0
- data/lib/lookout-3.0/encode.rb +20 -0
- data/lib/lookout-3.0/exception.rb +79 -0
- data/lib/lookout-3.0/exception/backtrace.rb +65 -0
- data/lib/lookout-3.0/exception/unknown.rb +25 -0
- data/lib/lookout-3.0/expect.rb +32 -0
- data/lib/lookout-3.0/expect/classes.rb +6 -0
- data/lib/lookout-3.0/expect/classes/exception.rb +27 -0
- data/lib/lookout-3.0/expect/exception.rb +30 -0
- data/lib/lookout-3.0/expect/object.rb +54 -0
- data/lib/lookout-3.0/expect/object/context.rb +149 -0
- data/lib/lookout-3.0/expectations.rb +69 -0
- data/lib/lookout-3.0/expectations/context.rb +52 -0
- data/lib/lookout-3.0/expected.rb +10 -0
- data/lib/lookout-3.0/expected/array.rb +16 -0
- data/lib/lookout-3.0/expected/classes.rb +5 -0
- data/lib/lookout-3.0/expected/classes/exception.rb +14 -0
- data/lib/lookout-3.0/expected/exception.rb +46 -0
- data/lib/lookout-3.0/expected/falseclass.rb +9 -0
- data/lib/lookout-3.0/expected/hash.rb +14 -0
- data/lib/lookout-3.0/expected/lookout.rb +5 -0
- data/lib/lookout-3.0/expected/lookout/actual.rb +5 -0
- data/lib/lookout-3.0/expected/lookout/actual/method.rb +13 -0
- data/lib/lookout-3.0/expected/lookout/actual/not.rb +6 -0
- data/lib/lookout-3.0/expected/lookout/actual/not/method.rb +13 -0
- data/lib/lookout-3.0/expected/lookout/output.rb +26 -0
- data/lib/lookout-3.0/expected/lookout/reception.rb +24 -0
- data/lib/lookout-3.0/expected/lookout/warning.rb +29 -0
- data/lib/lookout-3.0/expected/module.rb +12 -0
- data/lib/lookout-3.0/expected/object.rb +30 -0
- data/lib/lookout-3.0/expected/range.rb +12 -0
- data/lib/lookout-3.0/expected/regexp.rb +12 -0
- data/lib/lookout-3.0/expected/string.rb +11 -0
- data/lib/lookout-3.0/expected/symbol.rb +21 -0
- data/lib/lookout-3.0/expected/trueclass.rb +9 -0
- data/lib/lookout-3.0/inspect.rb +45 -0
- data/lib/lookout-3.0/interfaces.rb +5 -0
- data/lib/lookout-3.0/interfaces/commandline.rb +109 -0
- data/lib/lookout-3.0/literal.rb +18 -0
- data/lib/lookout-3.0/mock.rb +24 -0
- data/lib/lookout-3.0/object.rb +6 -0
- data/lib/lookout-3.0/object/not.rb +16 -0
- data/lib/lookout-3.0/object/not/receive.rb +18 -0
- data/lib/lookout-3.0/object/to.rb +12 -0
- data/lib/lookout-3.0/object/to/receive.rb +18 -0
- data/lib/lookout-3.0/output.rb +20 -0
- data/lib/lookout-3.0/plugins.rb +7 -0
- data/lib/lookout-3.0/reception.rb +128 -0
- data/lib/lookout-3.0/reception/arguments.rb +20 -0
- data/lib/lookout-3.0/reception/arguments/any.rb +16 -0
- data/lib/lookout-3.0/reception/arguments/error.rb +5 -0
- data/lib/lookout-3.0/reception/arguments/list.rb +17 -0
- data/lib/lookout-3.0/reception/arguments/none.rb +6 -0
- data/lib/lookout-3.0/reception/error.rb +24 -0
- data/lib/lookout-3.0/result.rb +16 -0
- data/lib/lookout-3.0/results.rb +5 -0
- data/lib/lookout-3.0/results/error.rb +18 -0
- data/lib/lookout-3.0/results/failure.rb +15 -0
- data/lib/lookout-3.0/results/success.rb +7 -0
- data/lib/lookout-3.0/stub.rb +55 -0
- data/lib/lookout-3.0/version.rb +133 -0
- data/lib/lookout-3.0/warning.rb +40 -0
- data/test/unit/examples.rb +208 -83
- data/test/unit/{lookout.rb → lookout-3.0.rb} +0 -0
- data/test/unit/lookout-3.0/actual.rb +13 -0
- data/test/unit/lookout-3.0/actual/method.rb +31 -0
- data/test/unit/lookout-3.0/actual/not.rb +15 -0
- data/test/unit/lookout-3.0/actual/not/method.rb +7 -0
- data/test/unit/lookout-3.0/aphonic.rb +31 -0
- data/test/unit/{lookout → lookout-3.0}/diff.rb +0 -0
- data/test/unit/{lookout/diff/group.rb → lookout-3.0/diff/algorithms.rb} +0 -0
- data/test/unit/lookout-3.0/diff/algorithms/difflib.rb +56 -0
- data/test/unit/lookout-3.0/diff/algorithms/difflib/position.rb +92 -0
- data/test/unit/{lookout/diff/algorithms/difflib/position/to.rb → lookout-3.0/diff/algorithms/difflib/position/new.rb} +1 -2
- data/test/unit/{lookout/results.rb → lookout-3.0/diff/formats.rb} +0 -0
- data/test/unit/{lookout → lookout-3.0}/diff/formats/inline.rb +0 -0
- data/test/unit/lookout-3.0/diff/formats/set.rb +26 -0
- data/test/unit/{lookout → lookout-3.0}/diff/formats/unified.rb +0 -0
- data/test/unit/{lookout/results/error.rb → lookout-3.0/diff/group.rb} +0 -0
- data/test/unit/lookout-3.0/diff/groups.rb +102 -0
- data/test/unit/{lookout → lookout-3.0}/diff/match.rb +0 -0
- data/test/unit/lookout-3.0/diff/operation.rb +17 -0
- data/test/unit/lookout-3.0/diff/operations.rb +22 -0
- data/test/unit/lookout-3.0/diff/operations/copy.rb +50 -0
- data/test/unit/lookout-3.0/diff/operations/delete.rb +45 -0
- data/test/unit/lookout-3.0/diff/operations/insert.rb +45 -0
- data/test/unit/lookout-3.0/diff/operations/replace.rb +45 -0
- data/test/unit/lookout-3.0/diff/slice.rb +56 -0
- data/test/unit/{lookout/results/failures/behavior.rb → lookout-3.0/difference.rb} +0 -0
- data/test/unit/lookout-3.0/difference/array.rb +32 -0
- data/test/unit/lookout-3.0/difference/exception.rb +69 -0
- data/test/unit/lookout-3.0/difference/hash.rb +30 -0
- data/test/unit/{lookout/results/failures/state.rb → lookout-3.0/difference/lookout.rb} +0 -0
- data/test/unit/{lookout/results/fulfilled.rb → lookout-3.0/difference/lookout/actual.rb} +0 -0
- data/test/unit/lookout-3.0/difference/lookout/actual/method.rb +7 -0
- data/test/unit/{lookout/runners/console.rb → lookout-3.0/difference/lookout/actual/not.rb} +0 -0
- data/test/unit/lookout-3.0/difference/lookout/actual/not/method.rb +7 -0
- data/test/unit/lookout-3.0/difference/lookout/output.rb +11 -0
- data/test/unit/lookout-3.0/difference/lookout/reception.rb +11 -0
- data/test/unit/lookout-3.0/difference/lookout/warning.rb +11 -0
- data/test/unit/lookout-3.0/difference/module.rb +11 -0
- data/test/unit/lookout-3.0/difference/object.rb +31 -0
- data/test/unit/lookout-3.0/difference/range.rb +11 -0
- data/test/unit/lookout-3.0/difference/regexp.rb +11 -0
- data/test/unit/lookout-3.0/difference/string.rb +29 -0
- data/test/unit/lookout-3.0/difference/symbol.rb +11 -0
- data/test/unit/lookout-3.0/encode.rb +28 -0
- data/test/unit/lookout-3.0/exception.rb +107 -0
- data/test/unit/lookout-3.0/exception/backtrace.rb +75 -0
- data/test/unit/lookout-3.0/exception/unknown.rb +23 -0
- data/test/unit/lookout-3.0/expect.rb +15 -0
- data/test/unit/{lookout/ui/console.rb → lookout-3.0/expect/classes.rb} +0 -0
- data/test/unit/lookout-3.0/expect/classes/exception.rb +41 -0
- data/test/unit/lookout-3.0/expect/exception.rb +63 -0
- data/test/unit/lookout-3.0/expect/object.rb +55 -0
- data/test/unit/lookout-3.0/expect/object/context.rb +120 -0
- data/test/unit/lookout-3.0/expectations.rb +55 -0
- data/test/unit/lookout-3.0/expectations/context.rb +44 -0
- data/test/unit/lookout-3.0/expected.rb +4 -0
- data/test/unit/lookout-3.0/expected/array.rb +19 -0
- data/test/unit/lookout-3.0/expected/classes.rb +4 -0
- data/test/unit/lookout-3.0/expected/classes/exception.rb +7 -0
- data/test/unit/lookout-3.0/expected/exception.rb +24 -0
- data/test/unit/lookout-3.0/expected/falseclass.rb +23 -0
- data/test/unit/lookout-3.0/expected/hash.rb +23 -0
- data/test/unit/lookout-3.0/expected/lookout.rb +4 -0
- data/test/unit/lookout-3.0/expected/lookout/actual.rb +4 -0
- data/test/unit/lookout-3.0/expected/lookout/actual/method.rb +11 -0
- data/test/unit/lookout-3.0/expected/lookout/actual/not.rb +4 -0
- data/test/unit/lookout-3.0/expected/lookout/actual/not/method.rb +11 -0
- data/test/unit/lookout-3.0/expected/lookout/output.rb +27 -0
- data/test/unit/lookout-3.0/expected/lookout/reception.rb +25 -0
- data/test/unit/lookout-3.0/expected/lookout/warning.rb +48 -0
- data/test/unit/lookout-3.0/expected/module.rb +23 -0
- data/test/unit/lookout-3.0/expected/object.rb +24 -0
- data/test/unit/lookout-3.0/expected/range.rb +19 -0
- data/test/unit/lookout-3.0/expected/regexp.rb +19 -0
- data/test/unit/lookout-3.0/expected/string.rb +44 -0
- data/test/unit/lookout-3.0/expected/symbol.rb +35 -0
- data/test/unit/lookout-3.0/expected/trueclass.rb +23 -0
- data/test/unit/lookout-3.0/inspect.rb +39 -0
- data/test/unit/lookout-3.0/interfaces.rb +4 -0
- data/test/unit/lookout-3.0/interfaces/commandline.rb +4 -0
- data/test/unit/lookout-3.0/literal.rb +15 -0
- data/test/unit/lookout-3.0/mock.rb +22 -0
- data/test/unit/lookout-3.0/object.rb +4 -0
- data/test/unit/lookout-3.0/object/not.rb +7 -0
- data/test/unit/lookout-3.0/object/not/receive.rb +9 -0
- data/test/unit/lookout-3.0/object/to.rb +7 -0
- data/test/unit/lookout-3.0/object/to/receive.rb +9 -0
- data/test/unit/lookout-3.0/output.rb +31 -0
- data/test/unit/lookout-3.0/plugins.rb +4 -0
- data/test/unit/lookout-3.0/reception.rb +86 -0
- data/test/unit/lookout-3.0/reception/arguments.rb +23 -0
- data/test/unit/lookout-3.0/reception/arguments/any.rb +15 -0
- data/test/unit/lookout-3.0/reception/arguments/error.rb +4 -0
- data/test/unit/lookout-3.0/reception/arguments/list.rb +19 -0
- data/test/unit/lookout-3.0/reception/arguments/none.rb +15 -0
- data/test/unit/lookout-3.0/reception/error.rb +4 -0
- data/test/unit/lookout-3.0/result.rb +27 -0
- data/test/unit/lookout-3.0/results.rb +4 -0
- data/test/unit/lookout-3.0/results/error.rb +37 -0
- data/test/unit/lookout-3.0/results/failure.rb +21 -0
- data/test/unit/lookout-3.0/results/success.rb +4 -0
- data/test/unit/lookout-3.0/stub.rb +53 -0
- data/test/unit/lookout-3.0/version.rb +4 -0
- data/test/unit/lookout-3.0/warning.rb +47 -0
- metadata +1159 -456
- data/lib/lookout.rb +0 -30
- data/lib/lookout/aphonic.rb +0 -40
- data/lib/lookout/diff.rb +0 -10
- data/lib/lookout/diff/algorithms/difflib.rb +0 -38
- data/lib/lookout/diff/algorithms/difflib/position.rb +0 -92
- data/lib/lookout/diff/formats.rb +0 -7
- data/lib/lookout/diff/formats/hash.rb +0 -53
- data/lib/lookout/diff/formats/inline.rb +0 -39
- data/lib/lookout/diff/formats/unified.rb +0 -57
- data/lib/lookout/diff/group.rb +0 -61
- data/lib/lookout/diff/groups.rb +0 -34
- data/lib/lookout/diff/match.rb +0 -36
- data/lib/lookout/diff/operation.rb +0 -33
- data/lib/lookout/diff/operations.rb +0 -36
- data/lib/lookout/diff/operations/delete.rb +0 -9
- data/lib/lookout/diff/operations/equal.rb +0 -27
- data/lib/lookout/diff/operations/insert.rb +0 -9
- data/lib/lookout/diff/operations/replace.rb +0 -9
- data/lib/lookout/diff/range.rb +0 -91
- data/lib/lookout/equalities.rb +0 -13
- data/lib/lookout/equalities/array.rb +0 -22
- data/lib/lookout/equalities/boolean.rb +0 -9
- data/lib/lookout/equalities/hash.rb +0 -25
- data/lib/lookout/equalities/include.rb +0 -9
- data/lib/lookout/equalities/object.rb +0 -24
- data/lib/lookout/equalities/output.rb +0 -19
- data/lib/lookout/equalities/standarderror.rb +0 -32
- data/lib/lookout/equalities/string.rb +0 -19
- data/lib/lookout/equalities/warning.rb +0 -16
- data/lib/lookout/equality.rb +0 -36
- data/lib/lookout/expectation.rb +0 -69
- data/lib/lookout/expectations.rb +0 -49
- data/lib/lookout/expectations/behavior.rb +0 -20
- data/lib/lookout/expectations/line.rb +0 -29
- data/lib/lookout/expectations/state.rb +0 -31
- data/lib/lookout/expectations/state/warning.rb +0 -26
- data/lib/lookout/mock.rb +0 -20
- data/lib/lookout/mock/method.rb +0 -70
- data/lib/lookout/mock/method/arguments.rb +0 -33
- data/lib/lookout/mock/method/arguments/any.rb +0 -11
- data/lib/lookout/mock/method/arguments/anything.rb +0 -11
- data/lib/lookout/mock/method/arguments/list.rb +0 -15
- data/lib/lookout/mock/method/arguments/none.rb +0 -11
- data/lib/lookout/mock/method/arguments/one.rb +0 -11
- data/lib/lookout/mock/method/calls.rb +0 -11
- data/lib/lookout/mock/method/calls/class.rb +0 -21
- data/lib/lookout/mock/method/calls/exactly.rb +0 -28
- data/lib/lookout/mock/method/calls/instance.rb +0 -25
- data/lib/lookout/mock/method/calls/lower.rb +0 -22
- data/lib/lookout/mock/method/calls/upper.rb +0 -22
- data/lib/lookout/mock/methods.rb +0 -12
- data/lib/lookout/mock/object.rb +0 -12
- data/lib/lookout/object.rb +0 -11
- data/lib/lookout/output.rb +0 -21
- data/lib/lookout/rake/tasks.rb +0 -36
- data/lib/lookout/rake/tasks/gem.rb +0 -49
- data/lib/lookout/rake/tasks/tags.rb +0 -16
- data/lib/lookout/rake/tasks/test.rb +0 -46
- data/lib/lookout/rake/tasks/test/loader.rb +0 -22
- data/lib/lookout/recorder.rb +0 -45
- data/lib/lookout/recorder/not.rb +0 -11
- data/lib/lookout/recorder/tape.rb +0 -21
- data/lib/lookout/recorders.rb +0 -6
- data/lib/lookout/recorders/reception.rb +0 -47
- data/lib/lookout/recorders/state.rb +0 -35
- data/lib/lookout/result.rb +0 -13
- data/lib/lookout/results.rb +0 -25
- data/lib/lookout/results/error.rb +0 -18
- data/lib/lookout/results/error/exception.rb +0 -34
- data/lib/lookout/results/error/exception/backtrace.rb +0 -50
- data/lib/lookout/results/failure.rb +0 -16
- data/lib/lookout/results/failures.rb +0 -6
- data/lib/lookout/results/failures/behavior.rb +0 -5
- data/lib/lookout/results/failures/state.rb +0 -5
- data/lib/lookout/results/fulfilled.rb +0 -5
- data/lib/lookout/results/unsuccessful.rb +0 -31
- data/lib/lookout/runners.rb +0 -6
- data/lib/lookout/runners/console.rb +0 -49
- data/lib/lookout/runners/trackers.rb +0 -5
- data/lib/lookout/runners/trackers/failure.rb +0 -14
- data/lib/lookout/stub.rb +0 -18
- data/lib/lookout/stub/method.rb +0 -105
- data/lib/lookout/stub/methods.rb +0 -18
- data/lib/lookout/stub/object.rb +0 -11
- data/lib/lookout/ui.rb +0 -7
- data/lib/lookout/ui/console.rb +0 -19
- data/lib/lookout/ui/silent.rb +0 -9
- data/lib/lookout/version.rb +0 -5
- data/lib/lookout/warning.rb +0 -7
- data/lib/lookout/xml.rb +0 -17
- data/test/unit/lookout/diff/algorithms/difflib.rb +0 -56
- data/test/unit/lookout/diff/algorithms/difflib/position.rb +0 -92
- data/test/unit/lookout/diff/groups.rb +0 -102
- data/test/unit/lookout/diff/operations.rb +0 -22
- data/test/unit/lookout/diff/operations/delete.rb +0 -45
- data/test/unit/lookout/diff/operations/equal.rb +0 -45
- data/test/unit/lookout/diff/operations/insert.rb +0 -45
- data/test/unit/lookout/diff/operations/replace.rb +0 -45
- data/test/unit/lookout/diff/range.rb +0 -50
- data/test/unit/lookout/equality.rb +0 -113
- data/test/unit/lookout/expectation.rb +0 -47
- data/test/unit/lookout/expectations.rb +0 -36
- data/test/unit/lookout/expectations/behavior.rb +0 -35
- data/test/unit/lookout/expectations/line.rb +0 -29
- data/test/unit/lookout/expectations/state.rb +0 -29
- data/test/unit/lookout/mock/method.rb +0 -143
- data/test/unit/lookout/mock/method/arguments.rb +0 -57
- data/test/unit/lookout/mock/method/arguments/any.rb +0 -11
- data/test/unit/lookout/recorder.rb +0 -11
- data/test/unit/lookout/results/error/exception/backtrace.rb +0 -20
- data/test/unit/lookout/results/unsuccessful.rb +0 -9
- data/test/unit/lookout/runners/trackers/failure.rb +0 -30
- data/test/unit/lookout/stub/method.rb +0 -48
- data/test/unit/lookout/stub/methods.rb +0 -19
- data/test/unit/lookout/xml.rb +0 -55
@@ -0,0 +1,11 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
# Represents expected {::String}s.
|
4
|
+
class Lookout::Expected::String < Lookout::Expected::Object
|
5
|
+
# @param [::String] actual
|
6
|
+
# @return [Difference::String, nil] A difference report between ACTUAL and
|
7
|
+
# {#expected} unless they’re `#==`
|
8
|
+
def difference(actual)
|
9
|
+
Lookout::Difference::String.new(actual, expected) unless expected == actual
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
# Represents expected {::Symbol}s. A Symbol that’s suffixed by “?” is
|
4
|
+
# considered to be a query to be invoked on the actual result. If such a
|
5
|
+
# symbol is prefixed by “not_”, the result of the query is inversed.
|
6
|
+
class Lookout::Expected::Symbol < Lookout::Expected::Object
|
7
|
+
def initialize(expected)
|
8
|
+
super
|
9
|
+
@negated, @query = /\A(?:(not)_)?(?:(.+\?)|.*)\z/m.match(expected.to_s)[1..2]
|
10
|
+
end
|
11
|
+
|
12
|
+
# @param [::Symbol, ::Object] actual
|
13
|
+
# @return [Difference::Symbol, nil] A difference report between _actual_ and
|
14
|
+
# {#expected} if {#expected} is a query and the result of the query doesn’t
|
15
|
+
# equal what’s expected, {super} otherwise
|
16
|
+
def difference(actual)
|
17
|
+
return super if not @query or Symbol === actual or actual.method(@query).arity != 0
|
18
|
+
Lookout::Difference::Symbol.new(actual, expected, @query, @negated) unless
|
19
|
+
(not not actual.send(@query)) ^ !!@negated
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
# Represents expected TrueClasses (of which `true` is the only instance).
|
4
|
+
class Lookout::Expected::TrueClass < Lookout::Expected::Object
|
5
|
+
# @param [Boolean] actual
|
6
|
+
# @return [Difference::Object] A difference report between ACTUAL and
|
7
|
+
# {#expected} unless ACTUAL is truthful
|
8
|
+
def difference(actual) super((not not actual)) end
|
9
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
# Non-failing inspection of objects. The inspection is {Lookout::Encode
|
4
|
+
# encoded} for output.
|
5
|
+
class Lookout::Inspect
|
6
|
+
# Non-failing inspection of OBJECT, using TYPE as a description of the
|
7
|
+
# type of object being inspected for failure outputs.
|
8
|
+
# @param [Object] object
|
9
|
+
# @param [String] type
|
10
|
+
Value(:object, :type)
|
11
|
+
|
12
|
+
class << self
|
13
|
+
# @param [Object, …] args
|
14
|
+
# @return [String] The inspections of ARGS, separated by “, ”’s
|
15
|
+
def args(*args)
|
16
|
+
args.map{ |e| Lookout::Inspect.new(e, 'argument') }.join(', ')
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# @return [String] An UTF-8-encoded String inspection of the given object,
|
21
|
+
# generated by invoking #inspect on it, then {Lookout::Encode encoding} it
|
22
|
+
# as UTF-8, using #dump if any transcoding that may take place fails
|
23
|
+
def call
|
24
|
+
Lookout::Encode.new(inspection = inspect_object).call
|
25
|
+
rescue => e
|
26
|
+
'(cannot encode inspected %s for output: %s; %s)' %
|
27
|
+
[type,
|
28
|
+
Lookout::Exception.new(e),
|
29
|
+
begin
|
30
|
+
'dumping instead: %s' % [inspection.dump]
|
31
|
+
rescue => inner
|
32
|
+
'dumping also failed: %s' % Lookout::Exception.new(inner)
|
33
|
+
end]
|
34
|
+
end
|
35
|
+
|
36
|
+
alias to_s call
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def inspect_object
|
41
|
+
String(object.inspect)
|
42
|
+
rescue => e
|
43
|
+
'(cannot inspect %s: %s)' % [type, Lookout::Exception.new(e)]
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
# Command-line interface to Lookout.
|
4
|
+
class Lookout::Interfaces::Commandline
|
5
|
+
# Processes ARGUMENTS, looking for options, running from the directory
|
6
|
+
# PWD and outputting results to IO.
|
7
|
+
#
|
8
|
+
# Valid arguments are
|
9
|
+
#
|
10
|
+
# * --: Stops processing of options, treating remaining arguments as files
|
11
|
+
# * -rFEATURE: Requires _FEATURE_
|
12
|
+
# * -lLINE: Only runs expectation closest before or on _LINE_
|
13
|
+
# * -c: Reports test coverage
|
14
|
+
# * FILENAME: Loads expectations from _FILENAME_, relative to PWD
|
15
|
+
#
|
16
|
+
# @param [Array<String>] arguments
|
17
|
+
# @param [String] pwd
|
18
|
+
# @param [IO] io
|
19
|
+
# @raise [ArgumentError] If an unknown option exists among ARGUMENTS
|
20
|
+
def initialize(arguments = ARGV, pwd = Dir.pwd, io = $stderr)
|
21
|
+
@pwd, @io = pwd, io
|
22
|
+
@line = nil
|
23
|
+
@files = []
|
24
|
+
@requires = []
|
25
|
+
@coverage = false
|
26
|
+
only_load = false
|
27
|
+
arguments.each do |argument|
|
28
|
+
if not only_load and argument == '--'
|
29
|
+
only_load = true
|
30
|
+
elsif not only_load and argument =~ /\A-r(.*)/
|
31
|
+
@requires << $1
|
32
|
+
elsif not only_load and argument =~ /\A-l(.*)/
|
33
|
+
@line = $1.to_i
|
34
|
+
elsif not only_load and argument == '-c'
|
35
|
+
@coverage = true
|
36
|
+
elsif not only_load and argument =~ /\A-/
|
37
|
+
raise ArgumentError, 'unknown option: %s' % argument
|
38
|
+
else
|
39
|
+
@files << [File.expand_path(argument, pwd), argument]
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Requires requested features, sets up coverage reporting, if desired, and
|
45
|
+
# checks the requested expectations. Coverage reporting will only be done if
|
46
|
+
# all expectations passed.
|
47
|
+
#
|
48
|
+
# @return [Boolean] True if all expectations passed
|
49
|
+
def call
|
50
|
+
require
|
51
|
+
coverage do
|
52
|
+
return false unless expectations
|
53
|
+
end
|
54
|
+
true
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def require
|
60
|
+
@requires.each do |feature| super feature end
|
61
|
+
end
|
62
|
+
|
63
|
+
def coverage
|
64
|
+
return yield unless @coverage
|
65
|
+
require 'coverage'
|
66
|
+
Coverage.start
|
67
|
+
yield
|
68
|
+
Coverage.result.
|
69
|
+
select{ |file, _| file.start_with? @pwd }.
|
70
|
+
reject{ |file, _| files.assoc(file) }.
|
71
|
+
sort.
|
72
|
+
each do |file, counts|
|
73
|
+
counts.
|
74
|
+
each_cons(2).
|
75
|
+
with_index.
|
76
|
+
slice_before{ |(c1, c2), _| (c1 != 0 and c2 == 0) or (c1 == 0 and c2 != 0) }.
|
77
|
+
select{ |e| e.first.first.last == 0 }.
|
78
|
+
map{ |e| e.first.last+2..e.last.last+2 }.
|
79
|
+
each do |lines|
|
80
|
+
io.puts '%s:%s: not covered by test' %
|
81
|
+
[relativize(file),
|
82
|
+
lines.one? ? lines.begin : ('%d-%d' % [lines.begin, lines.end])]
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def expectations
|
88
|
+
passed = true
|
89
|
+
@files.each do |expanded, file|
|
90
|
+
expectations = Lookout::Expectations.new(expanded)
|
91
|
+
if @line
|
92
|
+
target = nil.to_lookout_expected.expect(expanded, @line){
|
93
|
+
raise RuntimeError, 'line expectation not found: %s:%d' % [file, @line]
|
94
|
+
}
|
95
|
+
[(expectations.take_while{ |expect| expect <= target }.last or target)]
|
96
|
+
else
|
97
|
+
expectations
|
98
|
+
end.each do |expect|
|
99
|
+
result = expect.call
|
100
|
+
next if Lookout::Results::Success === result
|
101
|
+
passed = false
|
102
|
+
@io.puts relativize(result.to_s)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
passed
|
106
|
+
end
|
107
|
+
|
108
|
+
def relativize(path) path.start_with?(@pwd) ? path[@pwd.length+1..-1] : path end
|
109
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
# Proxies objects that should be literally expected. This is achieved by
|
4
|
+
# overriding #to_lookout_expected to wrap the object in a
|
5
|
+
# {Lookout::Expected::Object} instead of using whatever #to_lookout_expected on
|
6
|
+
# the object would normally return. This allows us to expect a literal {Range}
|
7
|
+
# instead of allowing either a Range or an item included in the range.
|
8
|
+
class Lookout::Literal
|
9
|
+
# Proxies the EXPECTED value, allowing it to be expected literally.
|
10
|
+
# @param [Object] expected
|
11
|
+
Value(:expected)
|
12
|
+
|
13
|
+
def inspect; 'literal(%p)' % output end
|
14
|
+
|
15
|
+
# @return [Expected::Object] An expected value wrapper around the expected
|
16
|
+
# value
|
17
|
+
def to_lookout_expected; Lookout::Expected::Object.new(@expected) end
|
18
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
# Object that doesn’t respond to anything except for what’s been explicitly
|
4
|
+
# defined on it and throws a mock error whenever it receives a method call.
|
5
|
+
class Lookout::Mock < Lookout::Stub
|
6
|
+
def inspect; 'mock' end
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
# @param [Symbol] method
|
11
|
+
# @param [Object, …] args
|
12
|
+
# @raise [Reception::Error] When called, including the METHOD that was called
|
13
|
+
# and with what ARGS in the messaged and with the proper backtrace, making
|
14
|
+
# it easy to see where things went wrong
|
15
|
+
def method_missing(method, *args)
|
16
|
+
raise Lookout::Reception::Error.
|
17
|
+
from('%p#%s(%s)%s' % [self,
|
18
|
+
method,
|
19
|
+
Lookout::Inspect.args(*args),
|
20
|
+
block_given? ? '{ … }' : ''],
|
21
|
+
1,
|
22
|
+
0..0)
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
# The “not” keyword on {::Object}s.
|
4
|
+
class Lookout::Object::Not
|
5
|
+
# Wraps OBJECT as a “not”.
|
6
|
+
# @param [::Object] object
|
7
|
+
def initialize(object) @object = object end
|
8
|
+
|
9
|
+
# Method for improving readability of “not” keyword set-up.
|
10
|
+
# @return [self]
|
11
|
+
def to; self end
|
12
|
+
|
13
|
+
# @return [Receive] A wrapper around the object that’ll set up a reception
|
14
|
+
# expectation on it
|
15
|
+
def receive; Receive.new(@object) end
|
16
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
# The “not to receive” keywords on {::Object}s.
|
4
|
+
class Lookout::Object::Not::Receive < Lookout::Aphonic
|
5
|
+
# Stands in for OBJECT, allowing a {Reception} exception that expects the
|
6
|
+
# given method never to be called to be set up.
|
7
|
+
# @param [::Object] object
|
8
|
+
def initialize(object) @object = object end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
# @param (see Reception#initialize)
|
13
|
+
# @return [Reception] A method reception expectation on the object that
|
14
|
+
# expects METHOD {Reception#never never} to be called
|
15
|
+
def method_missing(method, *args, &body)
|
16
|
+
Lookout::Reception.of(@object, method, *args, &body).never
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
# The “to” keyword on {::Object}s.
|
4
|
+
class Lookout::Object::To
|
5
|
+
# Wraps OBJECT as a “to”.
|
6
|
+
# @param [::Object] object
|
7
|
+
def initialize(object) @object = object end
|
8
|
+
|
9
|
+
# @return [Receive] A wrapper around the object that’ll set up a reception
|
10
|
+
# expectation on it
|
11
|
+
def receive; Receive.new(@object) end
|
12
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
# The “to receive” keywords on {::Object}s.
|
4
|
+
class Lookout::Object::To::Receive < Lookout::Aphonic
|
5
|
+
# Stands in for OBJECT, allowing a {Reception} exception that expects the
|
6
|
+
# given method to be called to be set up.
|
7
|
+
# @param [::Object] object
|
8
|
+
def initialize(object) @object = object end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
# @param (see Reception#initialize)
|
13
|
+
# @return [Reception] A method reception expectation on the subject for
|
14
|
+
# METHOD with _args_, using _body_ as the method definition
|
15
|
+
def method_missing(method, *args, &body)
|
16
|
+
Lookout::Reception.of(@object, method, *args, &body)
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
# Output expectation proxy. Used to expect output on an IO object during the
|
4
|
+
# execution of an {Lookout::Expect expect block}.
|
5
|
+
class Lookout::Output
|
6
|
+
# Proxies the EXPECTED output.
|
7
|
+
# @param [String] expected
|
8
|
+
Value(:expected)
|
9
|
+
|
10
|
+
def inspect; 'output(%p)' % expected end
|
11
|
+
|
12
|
+
# @return [Enumerable<String>] An Enumerable over the formatted operations
|
13
|
+
# that would have to be applied to the actual output to get the expected
|
14
|
+
# output
|
15
|
+
def diff(other) expected.to_lookout_expected.difference(other.expected).diff end
|
16
|
+
|
17
|
+
# @return [Expected::Lookout::Output] A wrapper around the receiver, making
|
18
|
+
# it an expected value
|
19
|
+
def to_lookout_expected; Lookout::Expected::Lookout::Output.new(self) end
|
20
|
+
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
# Method reception expectation builder. Method reception expectations can set
|
4
|
+
# expectations on what method is going to be called, with what arguments, and
|
5
|
+
# how many times it’s to take place.
|
6
|
+
class Lookout::Reception
|
7
|
+
Value(:object, :method, :range, :'*args', :'&body')
|
8
|
+
# @return [Range] The range of number of times that the method may be called
|
9
|
+
public :range
|
10
|
+
|
11
|
+
class << self
|
12
|
+
# @param [Symbol] method
|
13
|
+
# @param [Object, …] args
|
14
|
+
# @return [Lookout::Reception] A reception expectation expecting METHOD to
|
15
|
+
# be called on OBJECT with ARGS, using BODY as the method definition.
|
16
|
+
def of(object, method, *args, &body)
|
17
|
+
new(object, method, 1..1.0/0, *args, &body)
|
18
|
+
end
|
19
|
+
|
20
|
+
private :new
|
21
|
+
end
|
22
|
+
|
23
|
+
# This is an alias for {#exactly}(0).
|
24
|
+
def never; exactly(0) end
|
25
|
+
|
26
|
+
# This is an alias for {#at_most}(1).
|
27
|
+
def at_most_once; at_most(1) end
|
28
|
+
|
29
|
+
# This is an alias for {#exactly}(1).
|
30
|
+
def once; exactly(1) end
|
31
|
+
|
32
|
+
# This is an alias for {#at_least}(1).
|
33
|
+
def at_least_once; at_least(1) end
|
34
|
+
|
35
|
+
# This is an alias for {#exactly}(2).
|
36
|
+
def twice; exactly(2) end
|
37
|
+
|
38
|
+
# @param [Integer] times
|
39
|
+
# @return [Lookout::Reception] A reception expectation with a maximum number
|
40
|
+
# of TIMES that the method may be called
|
41
|
+
# @raise [ArgumentError] If TIMES < 1
|
42
|
+
def at_most(times)
|
43
|
+
limit('cannot convert upper reception limit to Integer: %s', times){ |i|
|
44
|
+
raise ArgumentError,
|
45
|
+
'upper reception limit must be positive: %d < 1' % i if i < 1
|
46
|
+
0..i
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
# @param [Integer] times
|
51
|
+
# @return [Lookout::Reception] A reception expectation with a minimum and
|
52
|
+
# maximum number of TIMES that the method may be called
|
53
|
+
# @raise [ArgumentError] If TIMES < 0
|
54
|
+
def exactly(times)
|
55
|
+
limit('cannot convert reception invocation count to Integer: %s', times){ |i|
|
56
|
+
raise ArgumentError,
|
57
|
+
'expected reception count must be non-negative: %d < 0' % i if i < 0
|
58
|
+
i..i
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
62
|
+
# Sets the minimum number of times that the method may be called.
|
63
|
+
# @param [Integer] times
|
64
|
+
# @return [Lookout::Reception] A reception expectation with a minimum number
|
65
|
+
# of TIMES that the method may be called
|
66
|
+
# @raise [ArgumentError] If TIMES < 1
|
67
|
+
def at_least(times)
|
68
|
+
limit('cannot convert lower reception limit to Integer: %s', times){ |i|
|
69
|
+
raise ArgumentError,
|
70
|
+
'lower reception limit must be positive: %d < 1' % i if i < 1
|
71
|
+
i..1.0/0
|
72
|
+
}
|
73
|
+
end
|
74
|
+
|
75
|
+
# @return [Expected::Lookout::Reception] A wrapper around the object that
|
76
|
+
# represents the expected reception of this method
|
77
|
+
def to_lookout_expected
|
78
|
+
Lookout::Expected::Lookout::Reception.new(self)
|
79
|
+
end
|
80
|
+
|
81
|
+
# @return [Proc] A block to be used by {Expected::Lookout::Reception#expect}
|
82
|
+
# that’ll set up a stub for the expected method reception that’ll check
|
83
|
+
# that the call count doesn’t exceed any upper limit imposed upon it and
|
84
|
+
# verify that any arguments are what they’re expected to be and then invoke
|
85
|
+
# BLOCK
|
86
|
+
def block(&block)
|
87
|
+
args, calls = Arguments.for(*@args), 0
|
88
|
+
reception, object, method, range, body = self, @object, @method, @range, @body || Nil
|
89
|
+
proc{
|
90
|
+
stub(object, method => proc{ |*mock_args, &mock_block|
|
91
|
+
calls += 1
|
92
|
+
raise Error.from(reception, calls, range) if calls > range.end
|
93
|
+
raise Arguments::Error,
|
94
|
+
'%s: unexpected arguments: [%s]≠[%s]' %
|
95
|
+
[reception, Arguments::List.new(*mock_args), args] unless
|
96
|
+
args =~ mock_args
|
97
|
+
body.call(*mock_args, &mock_block)
|
98
|
+
}, &block) if block
|
99
|
+
calls
|
100
|
+
}
|
101
|
+
end
|
102
|
+
|
103
|
+
# @return A String consisting of the inspection of the object, followed by
|
104
|
+
# either ‘.’ or ‘#’ depending on whether the object is a Class or not, and
|
105
|
+
# the method name
|
106
|
+
def to_s
|
107
|
+
[Lookout::Inspect.new(object, 'object'),
|
108
|
+
Class === object ? '.' : '#',
|
109
|
+
method].join('')
|
110
|
+
end
|
111
|
+
|
112
|
+
private
|
113
|
+
|
114
|
+
def limit(format, times)
|
115
|
+
self.class.send(:new,
|
116
|
+
object,
|
117
|
+
method,
|
118
|
+
yield(begin
|
119
|
+
times.to_int
|
120
|
+
rescue => e
|
121
|
+
raise e, format % e
|
122
|
+
end),
|
123
|
+
*args,
|
124
|
+
&body)
|
125
|
+
end
|
126
|
+
|
127
|
+
Nil = proc{ Lookout::Stub.new }
|
128
|
+
end
|