Commit graph

1690 commits

Author SHA1 Message Date
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
Michael Miller
23d2c014b4
Implement fallback for methods without a stub 2022-04-15 17:27:30 -06:00
Michael Miller
6f04e0b9da
Allow uninteresting messages through mocks
If they are stubbed, but don't match arguments, raise an error.
2022-04-15 17:17:34 -06:00
Michael Miller
4b21c9e6c1
Introduce _spectator_stub_for_method? utility method 2022-04-15 17:16:49 -06:00
Michael Miller
3961662bf6
Experimental mock functionality 2022-04-10 20:01:54 -06:00
Michael Miller
b0e27c69e8
Fix equality check 2022-04-10 15:24:45 -06:00
Michael Miller
e8bac86017
Ensure Stubbable can have stubs defined
Require implementation of _spectator_define_stub.
2022-04-10 11:11:36 -06:00
Michael Miller
0ad1ec11f3
Initial macros for defining and initializing mocks 2022-04-02 18:43:13 -06:00
Michael Miller
d97a62e601
Rename constant DOUBLES to TYPES
Will use for doubles and mocks.
2022-04-02 17:58:15 -06:00
Michael Miller
519836147e
Restructure stub modifiers 2022-04-02 10:50:27 -06:00
Michael Miller
318e4f3707
Store location information in stub
Allows tracking where a stub was originally defined.
2022-04-02 10:39:59 -06:00
Michael Miller
e61b31e47b
Add docs for allow and receive 2022-04-02 10:25:27 -06:00
Michael Miller
17592287ad
Replace stub value method with call method
Pass method call information to stub.
2022-03-31 23:07:55 -06:00
Michael Miller
2131967ba6
Workaround Crystal compiler bug 2022-03-31 22:54:03 -06:00
Michael Miller
e05ef94ef5
Initial work on stub DSL - found bug in Crystal compiler
```
Module validation failed: Invalid bitcast
  %4 = bitcast i32* %3 to %"(Spectator::Arguments(T, NT) | Nil)", !dbg !16
 (Exception)
  from /crystal/src/int.cr:541:9 in 'finish'
  from /crystal/src/compiler/crystal/codegen/codegen.cr:71:7 in 'codegen'
  from /crystal/src/compiler/crystal/compiler.cr:173:16 in 'compile'
  from /crystal/src/compiler/crystal/command/spec.cr:98:14 in 'spec'
  from /crystal/src/hash.cr:901:11 in '__crystal_main'
  from /crystal/src/crystal/main.cr:115:5 in 'main'
  from src/env/__libc_start_main.c:94:2 in 'libc_start_main_stage2'
Error: you've found a bug in the Crystal compiler. ...
```

I haven't been able to reproduce this in a simplified form.

Passing the `constraint` argument in NullStub#and_return to ValueStub.new triggers the bug.
Removing the `constraint` argument fixes the issue.
2022-03-31 22:49:45 -06:00
Michael Miller
003be48591
Use responds_to? to ensure stub is cast correctly 2022-03-31 22:39:21 -06:00
Michael Miller
9c1357da3f
Allow passing predefined stubs in as keyword args 2022-03-31 18:55:12 -06:00
Michael Miller
c1195ef687
Simplify macro eval by returning a lazy double 2022-03-31 18:54:39 -06:00
Michael Miller
914def05e1
Add docs 2022-03-31 18:51:28 -06:00
Michael Miller
231323bbf1
Add return type restriction
This overrides the previous definition which doesn't have a restriction.
This is a workaround for the inability to infer a stub's return type.
2022-03-30 21:10:36 -06:00
Michael Miller
f1a68fee8c
Typo 2022-03-30 20:46:53 -06:00
Michael Miller
39f5ea34eb
Another place that needs a cast 2022-03-30 20:33:19 -06:00
Michael Miller
613c969fbb
Match RSpec behavior 2022-03-30 20:28:36 -06:00
Michael Miller
1327d74040
Fix handling of stubs with the same name 2022-03-26 00:13:24 -06:00
Michael Miller
1199379833
Various fixes 2022-03-26 00:12:37 -06:00
Michael Miller
bbaa8816b8
Weird segfault when inspecting value type is back.
Working around with a crude rescue block.
2022-03-25 23:54:44 -06:00
Michael Miller
b28437ccc4
Match RSpec behavior 2022-03-25 22:32:27 -06:00
Michael Miller
28488d308e
Don't invoke fallback if there are stubs for the method 2022-03-25 22:30:39 -06:00
Michael Miller
fc51c1d730
More logging 2022-03-24 02:39:15 -06:00
Michael Miller
b97a367be7
Method return type restriction takes precedence over original return type
Raise TypeCastError on ambiguous stub values.
2022-03-24 02:01:25 -06:00
Michael Miller
7dd2cffa8e
Inspecting the value's class seems to work now 2022-03-22 22:13:02 -06:00
Michael Miller
d6fcf128ba
Temporarily disable returning un-cast value 2022-03-22 22:11:34 -06:00
Michael Miller
78dea01abe
Manual method existence check 2022-03-20 21:49:21 -06:00
Michael Miller
0fb7be6722
Use stub instead of abstract_stub by default for stub_all
RSpec doesn't appear to raise unexpected message errors for standard object methods (like to_s).
There are also a lot of issues that arise when requiring a stub on common methods.
2022-03-20 15:38:26 -06:00
Michael Miller
e209fe3eb5
Use Box for Wrapper implementation
This won't raise on invalid casts.
It should reduce the amount of instantiated types and methods.
2022-03-19 22:53:50 -06:00
Michael Miller
18a03b02fe
Include reserved 2022-03-19 22:36:25 -06:00
Michael Miller
03a031ad38
Use absolute path to RESERVED_KEYWORDS 2022-03-19 22:00:12 -06:00
Michael Miller
b23a567ee3
Add require statements 2022-03-19 21:56:58 -06:00
Michael Miller
04cf211f24
Move reserved keywords to a separate file
Add finalize as a reserved keyword.
2022-03-19 21:56:18 -06:00
Michael Miller
04f3614ff7
Workaround issue with value not being found
For some reason the `value` method isn't found.
Event casting to TypedStub doesn't work.
2022-03-19 20:00:50 -06:00
Michael Miller
bed84b315d
Add lazy double 2022-03-19 19:32:41 -06:00
Michael Miller
162ad4df33
Report call and args like other error messages 2022-03-19 18:58:06 -06:00
Michael Miller
b3fa2e3bfe
Address Ameba issues 2022-03-19 17:22:13 -06:00
Michael Miller
2f1999b377
Fix call expansion in debug log
Macro expansion somehow generated an error when calling a missing method with a block.

```
syntax error in :1
Error: unknown token: 'n'
```

It seems like 'n' is from the '\n' that was previously generated:

```
Log.debug { "Got undefined method " + "baz do\n  yield\nend" }
```
2022-03-19 16:32:25 -06:00
Michael Miller
17e97cb39a
Explode method expansion
Somewhere along the way the block argument gets dropped.
Even though `method` is a `Def` that accepts a block, the `&block` portion is dropped.
Possible Crystal compiler bug.
2022-03-19 16:13:11 -06:00
Michael Miller
15dd2ea6f1
Inject stubbable method that accepts a block 2022-03-19 16:09:35 -06:00
Michael Miller
99aa8afdce
Add as_null_object method 2022-03-19 14:41:45 -06:00
Michael Miller
70787ce2d4
Extend NullDouble from Double 2022-03-19 13:00:42 -06:00
Michael Miller
d40040c8ee
Remove extra block body leftover from debug
Update docs to show example of default method implementation.
2022-03-19 12:37:46 -06:00
Michael Miller
25f546245a
Handle injecting stubbed abstract method 2022-03-19 12:33:09 -06:00