Commit Graph

1690 Commits

Author SHA1 Message Date
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
Michael Miller 9091b8d027
Literally inject stubs from double block 2022-03-19 12:28:00 -06:00
Michael Miller 5a4e95e8a2
Split double macro into def_double and new_double 2022-03-19 11:41:53 -06:00
Michael Miller 4dff018330
Pass along block only if it exists 2022-03-19 11:28:36 -06:00
Michael Miller a508aeb4a3
Use a shared macro to handle stub type cast 2022-03-17 02:45:50 -06:00
Michael Miller 751ea77172
Add docs explaining how stub macros work 2022-03-17 02:18:32 -06:00
Michael Miller 4f7a4a3453
Avoid issue with TypeCastError message
For some reason, attempting to get the class of the stubbed value causes a segfault.
This appears to get swallowed in some cases.
Trying to inspect the value was difficult without triggering some error.
In the failing case, the value is 42 (returned by a stubbed foo method).
The method is supposed to return a String, and this error checking should be triggered (line 119).
The value is a union, and inspecting the bytes contained in it looks like it's prefixed with the Crystal type ID for Int32.
However it looks like Crystal tries to treat it as a Bool? I'm not sure.
Very weird behavior and instead of wasting more time on it, I'm omitting the returned type from the error.
This type of casting error shouldn't be common.
This seems like a Crystal bug, but I'm having a hard time distilling the issue.
2022-03-16 22:40:24 -06:00
Michael Miller 280f117e23
Use TypedStub instead of ValueStub
Test possible issues around stub returning nil
2022-03-16 21:07:20 -06:00
Michael Miller 8e38d3b054
Add intermediate TypedStub 2022-03-16 21:05:43 -06:00
Michael Miller dc74a741cf
Bit of method cleanup 2022-03-15 22:55:24 -06:00
Michael Miller 332ab1cebc
Smarter handling of stub fallback 2022-03-15 22:46:43 -06:00
Michael Miller 01fc91e854
Add stubs for primitive methods 2022-03-14 21:53:09 -06:00
Michael Miller 64cd921a7e
Add block arguments and yield 2022-03-12 23:50:30 -07:00
Michael Miller 03aa282512
Don't stub primitive methods 2022-03-12 23:02:55 -07:00
Michael Miller 291b4c75a8
Compiler error if stub defined in a method 2022-03-12 23:02:33 -07:00
Michael Miller 94872a498d
Better string representation of method call 2022-03-12 19:26:18 -07:00
Michael Miller 20087f1c57
Treat any tokens starting with _spectator as reserved 2022-03-12 19:17:38 -07:00
Michael Miller 5ad29f486f
Better formatting for empty arguments 2022-03-12 17:49:07 -07:00
Michael Miller ca827a3c52
Initial work on null (object) double 2022-03-12 17:07:34 -07:00
Michael Miller f82719746d
Stubable -> Stubbable 2022-03-12 15:45:48 -07:00
Michael Miller 7931847164
Cleanup and docs 2022-03-12 15:43:12 -07:00
Michael Miller 151926fd25
Fix captured arguments not handling splat 2022-03-12 14:31:39 -07:00
Michael Miller ea46af00a6
Add method to define stubs 2022-03-12 14:31:19 -07:00
Michael Miller 123dd0efca
Obscure parameters to avoid accidental usage 2022-03-12 13:58:20 -07:00
Michael Miller c8864b169e
Quick def methods should accept any args 2022-03-12 13:51:58 -07:00
Michael Miller f497aeb79d
Fix redefinition of method with splat argument 2022-03-12 13:15:26 -07:00
Michael Miller c1a14d1ad2
Add logging 2022-03-12 12:59:44 -07:00
Michael Miller 59f966d0e0
Fix missing double name
Rename internal method to _spectator_stubbed_name.
This is a better name for mocks and doubles.
Improve some handling around stubbed name.
2022-03-12 12:17:27 -07:00
Michael Miller 56f1c77a6c
Move method masking macro to Stubable
Rename to stub_all.
2022-03-12 11:56:54 -07:00
Michael Miller 85cc28c499
Utility method to define a method and a stub override 2022-03-12 11:41:47 -07:00
Michael Miller 8de457d80c
Handle previous_def and super - don't redefine method 2022-03-12 11:34:35 -07:00
Michael Miller 554e215898
Prevent ugly "has no type" errors 2022-03-12 11:33:56 -07:00
Michael Miller 12eeb02a8d
Move method redefinition for stub to Stubable
Require stub or raise UnexpectedMessage for all double methods.
Expose abstract_stub macro to require a stub.
2022-03-12 11:11:22 -07:00
Michael Miller 9b94245bd8
Stub's type might not match return type (subclass or union) 2022-03-12 11:08:58 -07:00
Michael Miller d891422b3a
Don't need to recreate method by hand 2022-03-12 11:08:29 -07:00
Michael Miller 76c1d6a096
Some rework of stubs and doubles 2022-03-12 09:39:32 -07:00
Michael Miller ae14a47329
Rename Response to Stub 2022-03-05 20:09:56 -07:00
Michael Miller ced98778a4
Document and test MethodCall 2022-03-05 16:15:42 -07:00
Michael Miller 13f185b801
Capture and report arguments in exception message 2022-03-05 16:06:01 -07:00
Michael Miller d16c55984c
Fixup macros 2022-03-05 15:39:19 -07:00
Michael Miller 2e15686d2d
Use internal arg name 2022-03-05 12:31:00 -07:00
Michael Miller ec57105afd
Support response constraints
Reduce union expansion by casting at key points.
2022-03-05 12:21:31 -07:00
Michael Miller 8668e495ef
Placeholder mocks DSL 2022-03-05 10:41:52 -07:00
Michael Miller 2adc867843
Initial work on response constraints 2022-03-05 10:41:39 -07:00
Michael Miller de7cd90d11
Add type capturing arguments 2022-03-04 17:16:45 -07:00
Michael Miller d7f8c2b958
Cleanup and document double 2022-03-03 23:12:35 -07:00
Michael Miller 7e65d94cee
Match RSpec double name string 2022-03-03 22:41:18 -07:00
Michael Miller 9594604770
Obscure and disallow double name method 2022-03-03 22:34:57 -07:00
Michael Miller 5644d54470
Support double names 2022-03-03 22:31:40 -07:00
Michael Miller 26deea3d20
Initial work on Double 2022-03-03 22:10:09 -07:00
Michael Miller 8ac6546bdd
Rip out more existing mocks 2022-02-28 22:15:29 -07:00
Michael Miller 0ea7890ece
Merge branch 'master' into mock-redesign 2022-02-28 20:39:33 -07:00
Michael Miller 31d68a9ca3
Don't capture original block as proc 2022-02-22 16:55:11 -07:00
Michael Miller 35f8779ceb
Forward Example procsy to_s to example
https://gitlab.com/arctic-fox/spectator/-/issues/70
2022-02-22 16:36:16 -07:00
Michael Miller eb8bd88927
Handle case with typeless block
Fixes syntax:
`stub method(&block)`

To stub a block with args, use:
`stub method(&block : Type -> Type)`

Addresses https://github.com/icy-arctic-fox/spectator/issues/42
2022-02-21 18:17:44 -07:00
Michael Miller 92e839415d
Fix sample iteration with single block arg (not tuple) 2022-01-26 13:14:30 -07:00
Michael Miller d6112bd2dd
Rip out mocks 2022-01-26 12:41:41 -07:00
Michael Miller 4057089c20
Support multiple block arguments in sample block
https://github.com/icy-arctic-fox/spectator/issues/41#issuecomment-1010192486
2022-01-11 15:53:53 -07:00
Michael Miller dd49fe3a67
Support string interpolation for example names 2022-01-10 21:29:05 -07:00
Michael Miller aabec269cb
Raise compilation error for string interpolation in group name 2022-01-10 21:11:28 -07:00
Michael Miller 07aa968d68
Report failed expectation line
In output listing the failures, the comment line now shows the failed expectation line.
Previously this showed the example's source line.
2022-01-03 18:47:56 -07:00
Michael Miller 4d81031274
Fix usage of 'expect' outside test block
Previously gave weird runtime erorr about mismatched groups.
Now correctly produces a compilation error.
2021-12-13 02:42:02 -07:00
Michael Miller d9269e17a8
Better implementation of explicit subject 2021-12-02 01:57:34 -07:00
Michael Miller 315a318d7d
Explicit "provided" block description
Implements https://gitlab.com/arctic-fox/spectator/-/issues/69
2021-12-01 19:11:36 -07:00
Michael Miller 59ce312341
Fix typos and spelling 2021-11-28 15:45:17 -07:00
Michael Miller f1f1659836
Fix adding stubs to class methods on mocked types 2021-10-11 23:03:50 -06:00
Michael Miller 5692a77a1b
Update naming from partial to target 2021-10-11 23:03:12 -06:00
Michael Miller 53f7c94e8a
Add missing negation variants for method stubs 2021-10-11 22:39:16 -06:00
Michael Miller 36354082c7
Pass arguments to original/fallback for stubbed top-level methods
Addresses https://github.com/icy-arctic-fox/spectator/issues/36
2021-09-28 19:02:42 -06:00
Michael Miller a95c5bcab7
Better handling with `be` match against Value types and nil
Releates to https://github.com/icy-arctic-fox/spectator/issues/37
2021-09-28 18:22:41 -06:00
Michael Miller 99ced17516
Handle undefined methods with have_attributes matcher
Instead of producing a compilation error on missing/undefind methods, 
substitute in an "undefined" value.
This shows better output to the user.
2021-09-26 12:50:17 -06:00
Michael Miller 2f1ac1374b
Use RegexMatcher to force used =~ operator 2021-09-22 17:57:56 -06:00
Michael Miller 64b9c13436
Remove Test prefix 2021-09-22 17:53:42 -06:00
Michael Miller 627a288358
Missing doc 2021-09-20 11:01:00 -06:00
Michael Miller a51640105c
Re-add pre- and post-condition hooks
Accidentally removed in hook refactoring.
Addresses https://gitlab.com/arctic-fox/spectator/-/issues/62
2021-09-16 09:01:51 -06:00
Todd Sundsted a3b7f5f4b1 Handle directories with spaces in the path/filename 2021-09-16 09:02:34 -04:00
Michael Miller 632845574f
Stringify tags
Addresses https://gitlab.com/arctic-fox/spectator/-/issues/61
2021-09-11 16:05:20 -06:00
Michael Miller 09dcbdb383
Fix dumb with JUnit and HTML output 2021-08-19 13:55:58 -06:00
Michael Miller 09414e611b
Brighten yellow for pending 2021-08-19 13:45:22 -06:00
Michael Miller e037e42fa7
Fix links to examples not working 2021-08-19 13:14:53 -06:00
Michael Miller f5ec9ccff6
CSS!
The HTML report looks beautiful.
2021-08-19 13:07:15 -06:00
Michael Miller efca1409c6
Fix dumb 2021-08-19 13:00:51 -06:00
Michael Miller 708fd692ae
Add actual label to match data description 2021-08-19 11:46:07 -06:00
Michael Miller babc7ebc3a
Tweaks 2021-08-18 22:15:50 -06:00
Michael Miller 18b42304c9
Use lists and fix some issues 2021-08-18 18:18:18 -06:00
Michael Miller dd0ef01369
Initial code for HTML formatter 2021-08-18 17:50:09 -06:00
Michael Miller f4fc599a1d
Add display_name convenience method 2021-08-18 17:47:20 -06:00
Michael Miller c49522a791
Allow tags on top-level groups 2021-08-18 15:57:22 -06:00
Michael Miller 21d14bd814
Add f-prefix variants of groups and examples
For instance: `fit` for `it "...", :focus`
2021-08-18 13:55:21 -06:00
Michael Miller 2b27ea5a01
Quick implementation of `filter_run_when_matching`
Needed for focus tests.
2021-08-18 13:46:54 -06:00
Michael Miller fd4812207a
Whitespace 2021-08-18 11:27:06 -06:00
Michael Miller 1e82608500
Add methods matching RSpec for configuring include and exclude tags 2021-08-17 23:40:58 -06:00
Michael Miller c209fe7259
Add ascend methods 2021-08-17 22:10:01 -06:00
Michael Miller 8d366bf637
Fully implemented test filtering by tags
Addresses https://gitlab.com/arctic-fox/spectator/-/issues/16
2021-08-17 21:54:01 -06:00
Michael Miller a9a46c76ad
Support tag filtering with value 2021-08-17 21:34:26 -06:00
Michael Miller b79dd4361e
Initial implementation of tag filtering 2021-08-17 20:52:06 -06:00
Michael Miller 38ea2e7f96
Address Ameba issue 2021-08-17 15:02:34 -06:00
Michael Miller 94d5c96e7d
Implement an example filter that supports matching groups
Addresses https://gitlab.com/arctic-fox/spectator/-/issues/25 and 
https://github.com/icy-arctic-fox/spectator/issues/24
2021-08-17 14:09:37 -06:00
Michael Miller 65799fdd3b
Pass along end line 2021-08-17 13:49:58 -06:00
Michael Miller 67b4c0589b
Implement NodeIterator 2021-08-17 12:55:49 -06:00
Michael Miller cf7d67c972
Simplify ExampleIterator and remove unecessary allocations 2021-08-17 12:55:22 -06:00