Commit graph

1673 commits

Author SHA1 Message Date
Michael Miller
1093571fbd
Add more info to stub.to_s 2022-11-04 20:34:52 -06:00
Michael Miller
4906dfae0d
Add short before/after hook name 2022-11-04 16:55:31 -06:00
Michael Miller
4dacaab6dc
Fix missing keyword arguments after splat 2022-10-23 22:36:20 -06:00
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