Commit Graph

1739 Commits

Author SHA1 Message Date
Michael Miller a31ffe3fa3
Fix argument capture
Fix issue added by 8959d28b38
2022-10-23 22:04:28 -06:00
Michael Miller c77da67341
Hide splat label in certain situations
Undefined double methods were reporting splat arguments, which is technically correct.
But for output in these cases, it makes more sense to show the exact calling args.
2022-10-23 21:56:37 -06:00
Michael Miller 8959d28b38
Cleaner call capture and logging for missing methods in doubles 2022-10-23 21:54:12 -06:00
Michael Miller 39e4f8e37a
Use `build` instead of `capture` for `none` 2022-10-23 21:53:24 -06:00
Michael Miller e2130d12d3
Implement arguments case equality
Implements https://github.com/icy-arctic-fox/spectator/issues/47
Some specs are failing and need to be resolved before the new feature is considered done.
2022-10-23 20:42:08 -06:00
Michael Miller 0177a678f9
Avoid shadowing variable 2022-10-23 20:40:56 -06:00
Michael Miller a728a037d4
Rename attributes 2022-10-23 15:37:55 -06:00
Michael Miller 163f94287e
Fix Arguments to_s 2022-10-23 15:27:39 -06:00
Michael Miller e38e3ecc32
Initial rework of arguments to support named positionals 2022-10-23 15:22:50 -06:00
Michael Miller 11e227b29f
Simplify method receiver conditional 2022-10-09 16:24:28 -06:00
Michael Miller 8e83edcc35
Simpler conditional block inclusion 2022-10-09 16:04:07 -06:00
Michael Miller 090c95b162
Ensure stubs defined with allow syntax are cleared 2022-10-09 15:48:00 -06:00
Michael Miller e9d3f31ac3
Use harness' cleanup instead of defer 2022-10-09 15:32:32 -06:00
Michael Miller 5c910e5a85
Clear stubs defined with `expect().to receive()` syntax after test finishes 2022-10-09 13:57:28 -06:00
Michael Miller 25b9931002
Add ability to remove specific stubs 2022-10-09 13:38:29 -06:00
Michael Miller 4dfa5ccb6e
Prevent defining stubs on undefined methods in LazyDouble
In Crystal 1.6, a segfault would occur in the spec spec/spectator/mocks/lazy_double_spec.cr:238
I suspect this is a Crystal bug of some kind, but can't reduce it.
The methods produced by `method_missing` don't have a return type including Symbol.
Symbol is excluded from the union of return types (Int32 | String | Nil).
The program segfaults when calling a method on the actual value, which is a symbol.
It ultimately crashes when producing a failure message, which indicates the value it tested doesn't equal the expected value (a symbol of the same value).
Avoid this issue by preventing stubs on undefined/untyped methods.
2022-10-08 14:04:02 -06:00
Michael Miller ccdf9f124b
Add require statements and namespace Value
When defining a matcher outside of the `Spectator` module (custom matcher), `Value(ExpectedType)` can't be resolved.
I suspect this is a Crystal compiler bug, since a derived class should not affect lookups of parent classes like this.
Require statements are added to (hopefully) ensure `Spectator::Value` is defined for the initializer.
Related to https://github.com/icy-arctic-fox/spectator/issues/46
2022-09-03 16:46:17 -06:00
Michael Miller 7549351cce
Match tense of failure block component 2022-08-29 21:13:58 -06:00
Michael Miller 9d6d8de72f
Show error block for forced failure - `fail`
Fixes https://gitlab.com/arctic-fox/spectator/-/issues/78
2022-08-29 20:53:48 -06:00
Michael Miller 027521a7bc
ErrorResultBlock only needs the exception, not an ErrorResult 2022-08-29 18:00:32 -06:00
Michael Miller b5c61f9003
Change `-e` to use partial instead of exact match
Fixes https://gitlab.com/arctic-fox/spectator/-/issues/71
Fixes https://github.com/icy-arctic-fox/spectator/issues/45
2022-08-07 15:20:17 -06:00
Michael Miller 17a3ca3ac7
Fix https://gitlab.com/arctic-fox/spectator/-/issues/77 2022-08-07 14:58:09 -06:00
Michael Miller 18e9c1c35d
Workaround issue with Box.unbox causing segfault
Using Box.unbox on a nil value with a union type causes:

Invalid memory access (signal 11) at address 0x8

Related Crystal issue: https://github.com/crystal-lang/crystal/issues/11839
Fixes: https://gitlab.com/arctic-fox/spectator/-/issues/76
2022-07-18 19:47:34 -06:00
Michael Miller 7e09016e5c
Add count modifiers for have_received matcher 2022-07-14 20:46:52 -06:00
Michael Miller 827b69483b
Disallow stubs for undefined methods in null double
Any method_missing invocation should return self.
2022-07-14 13:37:09 -06:00
Michael Miller 1d58824e6c
Support default stubs for class_double 2022-07-14 13:18:02 -06:00
Michael Miller e29c732d0f
Add count to ReceiveMatcher 2022-07-13 16:48:38 -06:00
Michael Miller 9efb6c95dd
Workaround compiler bug introduced by aa9ca7a
BUG: trying to upcast Nil (Crystal::NilType) <- NoReturn (Crystal::NoReturnType) (Exception)
  from /crystal/src/compiler/crystal/codegen/cast.cr:668:5 in 'upcast_distinct'
  from /crystal/src/compiler/crystal/codegen/cast.cr:523:15 in 'upcast'
  from /crystal/src/compiler/crystal/codegen/codegen.cr:1369:11 in 'accept'
  from /crystal/src/compiler/crystal/codegen/codegen.cr:2274:9 in 'visit'
  from /crystal/src/compiler/crystal/syntax/visitor.cr:27:12 in 'accept'
...
2022-07-13 15:40:22 -06:00
Michael Miller aa9ca7a98e
Don't return nil for methods using NoReturn 2022-07-13 12:24:29 -06:00
Michael Miller 14d8c046f0
Workaround absolute path requirement for mock injection 2022-07-13 12:23:28 -06:00
Michael Miller ac3b322900
Use absolute path for inject_mock
This is necessary to override the original type instead of creating a new one within the spec.
2022-07-13 11:29:19 -06:00
Michael Miller 70efa1ad78
Indent multi-line values in failure block output 2022-07-13 11:11:31 -06:00
Michael Miller 181a34a0b3
Display "None" when no methods are called 2022-07-13 10:53:57 -06:00
Michael Miller 754bfd6939
Intercept most exit calls and raise instead 2022-07-12 23:02:20 -06:00
Michael Miller 2e5f822e1d
Remove `new` from reserved keywords
This effectively allows stubs to be placed on the `new` method for types.
A strange issue arose when the keyword was allowed.
The compiler failed to resolve the Stub type from the Double initializer.
The error trace goes through null_double_spec.cr.
Running just that spec file confirms the issue is there, but running other individual files doesn't produce the error.
As a workaround, I've put the full path of Stub in the initializer.
2022-07-12 22:30:04 -06:00
Michael Miller fe88eefa86
Add inject_mock to DSL 2022-07-12 22:12:48 -06:00
Michael Miller 99fb47c6e9
Remove redundant block conditionals 2022-07-12 21:46:12 -06:00
Michael Miller df5a4fa77c
Use tap to modify new mock
Without this, mocked structs were not getting their stubs applied.
An unintended side-effect is the tap shows up in recorded calls.
This seems to be harmless, but might need to be revisited.
2022-07-12 21:19:51 -06:00
Michael Miller 0e556c3d55
Clear stubs and recorded calls after example completes 2022-07-12 20:40:27 -06:00
Michael Miller bb0c85d9ec
Fix possible shadowing of `mock` 2022-07-12 19:50:04 -06:00
Michael Miller 6e57a1c44a
Allow method calls with unconstrained arguments
Workaround for the expect-receive DSL syntax to allow methods to be called without matching arguments.
2022-07-12 19:23:13 -06:00
Michael Miller c91e288f61
Add initial support for exect-receive syntax 2022-07-12 19:11:44 -06:00
Michael Miller 3d7655a5d1
Add support for any_args in DSL 2022-07-12 19:05:55 -06:00
Michael Miller 4aaa8db5e2
Rename Arguments.empty to Arguments.none 2022-07-12 18:59:23 -06:00
Michael Miller 4b2b37477e
Remove unused methods 2022-07-12 18:04:55 -06:00
Michael Miller d7ea969f55
Pretify stub and call output
Fix some tests.
2022-07-12 17:47:05 -06:00
Michael Miller 00c7141d95
Re-add `with` modifier with constraint
Fixes `no_args` in DSL.
2022-07-12 10:56:49 -06:00
Michael Miller 694e2e6259
Initial implementation of `have_received` 2022-07-11 20:25:15 -06:00
Michael Miller 4f46c98a86
Rename `with` method to avoid recursive splat and ambiguity 2022-07-11 20:24:51 -06:00
Michael Miller ecab2dd37e
Upcast to AbstractArguments to avoid instantiating methods
This reduced compilation times when using a large amount of Arguments types.
2022-07-10 21:54:25 -06:00
Michael Miller 32a9bfd356
Add no_args 2022-07-10 18:51:58 -06:00
Michael Miller b9eaefb424
Add docs 2022-07-10 18:33:56 -06:00
Michael Miller 9eb2946be6
Change empty args to reusable readonly instance 2022-07-10 17:51:05 -06:00
Michael Miller 29389f1dbf
Add indexer methods for captured arguments 2022-07-10 17:38:17 -06:00
Michael Miller 4aaed186c3
Add `with` stub modifier 2022-07-10 17:31:13 -06:00
Michael Miller cd177dd2ae
Implement ProcStub 2022-07-10 11:54:51 -06:00
Michael Miller 4d5004ab4f
Add ExceptionStub 2022-07-09 22:12:24 -06:00
Michael Miller 9c705bf888
Add MultiValueStub 2022-07-09 20:52:01 -06:00
Michael Miller 813983de4b
Implement and test DSL for class mocks and doubles 2022-07-07 19:09:18 -06:00
Michael Miller 77096b76e9
Allow StubbedType alongside Stubbable for allow() 2022-07-07 19:01:02 -06:00
Michael Miller 55b2ac9f05
Fix macro for class double name 2022-07-07 19:00:22 -06:00
Michael Miller 70391b2d31
Fix warnings from Crystal 1.5.0 regarding positional parameters 2022-07-07 18:10:21 -06:00
Michael Miller f7147299ab
Add stub support to class methods on mocks 2022-07-04 20:19:13 -06:00
Michael Miller c76ead4065
Auto stub class methods 2022-07-04 20:16:07 -06:00
Michael Miller fb5f44ef10
Add 'new' and 'allocate' to reserved keywords 2022-07-04 20:06:26 -06:00
Michael Miller 22a37d38f9
Don't automatically extend StubbedType
Mocked module includes StubbedType, which doesn't pass along functionality to mocks.
2022-07-04 16:43:37 -06:00
Michael Miller 989086c4fc
Add method to clear recorded calls 2022-07-04 15:35:12 -06:00
Michael Miller 056d5892fa
Indicate class double/mock in stubbed name 2022-07-04 15:34:38 -06:00
Michael Miller cecd2464de
Initial code for StubbedType 2022-07-03 13:40:29 -06:00
Michael Miller 20c9da75a8
Add missing dot after method receiver (self) 2022-06-29 22:02:27 -06:00
Michael Miller c8ec0ad02a
Record calls on injected mocks 2022-06-28 23:36:24 -06:00
Michael Miller 8aed5027aa
Remove _spectator_calls method with filter 2022-06-28 23:02:46 -06:00
Michael Miller 3589f23475
Store calls to mocks and doubles 2022-06-28 22:54:08 -06:00
Michael Miller c98edcec5d
Add methods for recording calls to stubs 2022-06-08 08:18:31 -06:00
Michael Miller cb93f4eee0
Document mock modules 2022-06-04 18:21:08 -06:00
Michael Miller effad28559
Better compiler error for wrong argument type passed to mock 2022-06-01 22:23:39 -06:00
Michael Miller 3f4216a271
Allow passing default value stubs to mock initialization 2022-06-01 22:04:18 -06:00
Michael Miller b6083f0e09
Fix passing along mock body 2022-05-28 10:10:20 -06:00
Michael Miller 03754321b5
Fix existing mock DSL macros
Initial code for mock DSL.
2022-05-28 09:18:49 -06:00
Michael Miller 5132ce7329
Don't define method body for abstract stub method
Test inheriting an abstract class with mocks.
2022-05-24 19:25:22 -06:00
Michael Miller ddaed636c4
Remove type resolution
The `resolve` macro method operates in the scope of `@type`, not where the macro method was called.
This is why types could not be found within the spec.
Change `define_subclass` to `define_subtype` and accept base type keyword.
2022-05-18 20:56:04 -06:00
Michael Miller 4f0e2f6e46
Fix clearing stubs for mocks
Prevent reverting initial defaults set by mock macro.
2022-05-15 16:21:05 -06:00
Michael Miller a39b27387c
Add delete method to clear stubs for a mock 2022-05-15 16:19:55 -06:00
Michael Miller c98442e0ed
Add functionality to clear stubs 2022-05-15 15:56:32 -06:00
Michael Miller 37c6db250d
Add ValueMockRegistry
Support injecting mock functionality into concrete structs (value types).
2022-05-15 12:34:50 -06:00
Michael Miller ac03bd439b
Address Ameba issues 2022-05-15 11:06:00 -06:00
Michael Miller 1adcf74c3f
Fix stub_type when used on a sub-type
previous_def should only be used if the type being stubbed matches the type stub methods are defined in.
Re-enable tests for define_subclass mocking.
2022-05-15 10:59:44 -06:00
Michael Miller 86b49dc20e
Add mock registry fetch method
Solves the issue of pre-populating a mock with stubs.
2022-05-15 00:36:29 -06:00
Michael Miller 7923eb3ad0
Fix detection of nullable return type from stubbed method 2022-05-15 00:19:03 -06:00
Michael Miller 380d721fad
Add ReferenceMockRegistry 2022-05-14 23:31:57 -06:00
Michael Miller 0704fd2a48
Adjust evaluation order of change matcher expressions
Handles reference types better and matches RSpec more closely.
2022-05-14 23:30:15 -06:00
Michael Miller 739629ef9d
Reintroduce nil type check for stub value cast 2022-04-30 12:10:02 -06:00
Michael Miller 9817b2948e
Add mock inject macro
Debugging some type resolution issues.
2022-04-30 11:40:54 -06:00
Michael Miller 95282e7510
Combine type stubbing macros
Prevent redefining stubbed methods multiple times.
2022-04-30 11:40:17 -06:00
Michael Miller 8d14be6c67
Move spectator stub retrieval to abstract getter 2022-04-28 23:04:22 -06:00
Michael Miller 978e6c3625
Cleanup and docs 2022-04-28 22:22:07 -06:00
Michael Miller ad24515d58
Dumb fix for overriding stubbed methods with default in block 2022-04-28 22:11:34 -06:00
Michael Miller 307c679609
Rework stubbing type hierarchy
No longer need to "inject" stubs for new methods.
No weird lookup of super/previous_def.
Handle visibility modifier of def.
2022-04-28 22:07:12 -06:00
Michael Miller 8f5f3becb4
Some initial rework of stub macros 2022-04-16 23:37:00 -06:00
Michael Miller 0758c19a86
Remove need for nillable argument to cast macro
The `class` method cannot be stubbed as this causes the cast (via `as`) to fail at compile-time.
2022-04-16 16:33:37 -06:00