lookout 2.3.0 → 3.0.0
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/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
|