Commit graph

243 commits

Author SHA1 Message Date
Michael Miller
9cf82928b7 Ensure harness is reset on error 2018-10-19 18:52:00 -06:00
Michael Miller
c48467f783 Slightly better wording and naming 2018-10-19 18:50:21 -06:00
Michael Miller
67e192edc6 Implement ExpectationResults specs and fix typo 2018-10-19 16:27:59 -06:00
Michael Miller
703a791f78 Formatting changes 2018-10-19 14:02:27 -06:00
Michael Miller
0892a073fe Change Result to a class
This is to get around a segfault.
I'm unable to reproduce this in a simpler example at this time.
However, this can be worked around by changing from a struct to a class.

Relevant backtrace:

Invalid memory access (signal 11) at address 0x4
[0x4829f6] *CallStack::print_backtrace:Int32 +118
[0x46de7d] __crystal_sigfault_handler +61
[0x7fe6ec64b390] ???
[0x486df5] *String#==<String>:Bool +37
[0x509ac4] *Spectator::Expectations::ValueExpectationPartial(Int32) +52
[0x50a52e] *Spectator::Expectations::ValueExpectation(Int32, Int32) +94
[0x50acb2] *Spectator::Expectations::Expectation::Result +210
[0x4fcd9b] *Spectator::Expectations::ExpectationResults +635
[0x50c9eb]*Spec::ContainExpectation(Spectator::Expectations::Expectation::Result)+43
[0x4fcaea] *Spectator::Expectations::ExpectationResults +138
...
2018-10-19 13:04:51 -06:00
Michael Miller
7f4690b042 Secondary initializer for missing label
Label is set to actual/expected stringified value if omitted.
2018-10-18 21:52:00 -06:00
Michael Miller
9a77f8b7fd Add specs for value expectation
Fix bug in expectation result actual message.
2018-10-18 17:54:43 -06:00
Michael Miller
df36331132 Workaround for Crystal compiler bug
See: https://github.com/crystal-lang/crystal/issues/4225
If there are no concrete implementations of a class, an "undefined
method" error is given for abstract methods.
2018-10-15 15:27:05 -06:00
Michael Miller
cd86687dfb Handle negative indices 2018-10-14 19:33:38 -06:00
Michael Miller
155e9ec81a Store example count instead of recalculating 2018-10-14 19:08:07 -06:00
Michael Miller
bcb68a5856 Implement example lookup by index
This will be used later for executing tests in random order.
2018-10-14 19:06:02 -06:00
Michael Miller
eade6873e4 Implement ExampleComponent#example_count 2018-10-14 18:37:54 -06:00
Michael Miller
467afd053c Implement iterator version of ExampleGroup#each 2018-10-14 18:29:01 -06:00
Michael Miller
1a2cba79fc Parent group can't be nil for nested group 2018-10-14 18:00:55 -06:00
Michael Miller
ab146c88c2 Bit of code cleanup 2018-10-14 17:43:33 -06:00
Michael Miller
bff6d463df Root group builder should not inherit from nested 2018-10-14 17:40:37 -06:00
Michael Miller
30a45a24d3 Restructure to use a composite design pattern
Examples and example groups now have a common ancestor.
2018-10-14 17:10:12 -06:00
Michael Miller
2070d7816b Root example group specialization 2018-10-14 14:28:05 -06:00
Michael Miller
3facf3af9d Change "description" to "what" for consistency 2018-10-14 11:50:08 -06:00
Michael Miller
68412daec0 Remove unused code 2018-10-14 01:02:52 -06:00
Michael Miller
77f631205e Break apart runnable example and document it 2018-10-11 10:16:48 -06:00
Michael Miller
34dce28663 Initial documentation and rework on runnable example 2018-10-10 16:57:43 -06:00
Michael Miller
81dce3df9a Cleanup and document some example classes 2018-10-10 13:05:17 -06:00
Michael Miller
53831ab36a Fix hook flags being nullable 2018-10-10 13:03:47 -06:00
Michael Miller
3e78f48d39 Pending examples weren't marked as finished 2018-10-09 14:53:51 -06:00
Michael Miller
d8223297af Treat harness more like a facade 2018-10-09 14:41:22 -06:00
Michael Miller
f5317ecbd3 Rig up the harness 2018-10-09 14:25:52 -06:00
Michael Miller
bfb133f44d Create example harness 2018-10-09 14:25:39 -06:00
Michael Miller
7b8f47f327 Implement expectation results 2018-10-08 11:25:22 -06:00
Michael Miller
c27f72c83e Add enum for example status 2018-10-07 16:13:17 -06:00
Michael Miller
64a233a9e1 Rename ExpectationRegistry to ExpectationReporter
Some initial implementation for the class.
2018-10-07 13:46:51 -06:00
Michael Miller
e14babc014 ExpectationFailed exception takes a result 2018-10-07 13:45:36 -06:00
Michael Miller
73a0d51c1b Rename message methods and add #failure? 2018-10-07 13:05:32 -06:00
Michael Miller
7277b3caaf Display actual value if label is empty 2018-10-07 12:49:10 -06:00
Michael Miller
38da6615bf Documentation for expectations and matchers 2018-10-07 12:42:09 -06:00
Michael Miller
d98bc05b88 Switch to structs to reduce memory allocations 2018-10-06 10:09:39 -06:00
Michael Miller
f11031f113 Upcast to fix type error 2018-10-06 09:58:58 -06:00
Michael Miller
79886e9efb More structure around exceptions and matching 2018-10-05 16:30:19 -06:00
Michael Miller
4c2f6157af Define some Expectation methods 2018-10-01 20:34:26 -06:00
Michael Miller
3035273e9a Rework how expectations and matchers work together 2018-09-28 11:47:42 -06:00
Michael Miller
4948fe0c6f Short-hand syntax for blocks with yield 2018-09-27 18:49:01 -06:00
Michael Miller
d670d96045 Remove extra assignment operations 2018-09-27 18:47:54 -06:00
Michael Miller
7484b92db9 Formatting 2018-09-27 17:50:50 -06:00
Michael Miller
b9abdb86ff Use actual value if label is empty
This will show a value instead of nothing if the should-syntax is used.
2018-09-27 16:28:47 -06:00
Michael Miller
77b4c71c2a Reduce nesting by collapsing modules with :: 2018-09-27 16:20:55 -06:00
Michael Miller
0d282d3d50 Wording - should-syntax instead of #should 2018-09-27 16:15:31 -06:00
Michael Miller
e9b8992130 Implemented should-syntax 2018-09-27 16:11:45 -06:00
Michael Miller
83a2a8e238 Manually include all sub-modules and top-level types
This is needed so that `spectator/should` is not included by default.
2018-09-27 15:49:34 -06:00
Michael Miller
1a61235cdc Simplify #examples and #groups methods 2018-09-27 13:51:19 -06:00
Michael Miller
f63f8b15a0 Use label (expression string) instead of value 2018-09-24 22:58:35 -06:00
Michael Miller
371fe680c2 Pass matcher messages to failure results 2018-09-24 22:57:37 -06:00
Michael Miller
8fb051d61e Add custom messages for matchers
This gives users natural, easier to understand text for expectations.
2018-09-24 22:56:48 -06:00
Michael Miller
562b544223 Capture expression string from expectations
This allows a string that the user had in source code instead of a resolved value.

This change requires storing a 'label' and changing expectation and matcher constructor methods to macros.
2018-09-24 22:51:26 -06:00
Michael Miller
ef7e0462cb GivenExampleGroupBuilder produces group of groups
Now a group is created for each element in the collection.
A group to contain the sub-groups is returned.
2018-09-24 00:25:15 -06:00
Michael Miller
1c7c6e5e90 Initial code for example names 2018-09-23 20:24:28 -06:00
Michael Miller
5e4f0f3bbc Initial formatting output for failures 2018-09-23 18:00:01 -06:00
Michael Miller
dcbca302dc Fix values being wrapped twice
This simplifies some code.
2018-09-23 17:13:30 -06:00
Michael Miller
cf0c438a5d Abstract away locals to SampleValues 2018-09-23 17:04:06 -06:00
Michael Miller
cddfe5591d Move ValueWrapper and TypedValueWrapper to Internals
Trying to hide from top-level some inner-workings.
2018-09-23 16:23:26 -06:00
Michael Miller
887a04a92a Remove unused classes 2018-09-23 16:13:48 -06:00
Michael Miller
7a6045a1f3 Change #it_behaves_like to a macro 2018-09-23 16:10:07 -06:00
Michael Miller
b3b8efdd59 Mark helper macros private 2018-09-23 16:07:58 -06:00
Michael Miller
70e37eeccf DRY up DSL 2018-09-23 16:07:03 -06:00
Michael Miller
0f323666a0 Fix methods for adding hooks 2018-09-23 15:41:58 -06:00
Michael Miller
855a5f2239 Move hook storage to their own class 2018-09-23 15:26:19 -06:00
Michael Miller
57c9f2c58e Copy/paste to reimplement pending examples 2018-09-23 14:53:32 -06:00
Michael Miller
56ae92a25d Add symbol for getting local from #given 2018-09-23 14:45:36 -06:00
Michael Miller
3c31783fd7 Pass arguments directly onto initializer with splat 2018-09-23 14:45:14 -06:00
Michael Miller
03a8efd7f8 Create test instance when example is created
This exposes errors in the framework
instead of delaying them until the test runs.
2018-09-23 14:39:05 -06:00
Michael Miller
94e2f54713 Implement building groups and examples 2018-09-23 14:34:42 -06:00
Michael Miller
037fe604ea Example group builder classes should build groups
It's implied in their name.
2018-09-23 13:40:16 -06:00
Michael Miller
d551cf6e1b Add missing GivenExampleGroupBuilder class 2018-09-23 12:27:21 -06:00
Michael Miller
6bf07e3967 Collection for #given is now an array of ValueWrapper 2018-09-23 12:27:08 -06:00
Michael Miller
faf3bef05c Fix typo 2018-09-23 12:21:10 -06:00
Michael Miller
fc1c0351cd Must use class variables 2018-09-23 12:19:29 -06:00
Michael Miller
ab7087649d Example wrappers need a top-level initializer
The default initializer made by the compiler takes no arguments.
Use this one to not create a default initializer.
2018-09-23 12:19:07 -06:00
Michael Miller
ecba0d00ec Pass group to example initializer 2018-09-23 12:16:38 -06:00
Michael Miller
09184f4a2a Group builder needs "what" as first arg 2018-09-23 12:15:53 -06:00
Michael Miller
0999cb2dbc Use fully-qualified names 2018-09-23 12:05:19 -06:00
Michael Miller
9109fc30fd Can pass types around (somewhat) at runtime
No need for extra factory classes.
2018-09-23 12:03:52 -06:00
Michael Miller
87d9cc438f Move code for root back to Spectator#describe
There seems to be a problem using def in block.
This broke helper methods and gives the error: `can't declare def 
dynamically`.
2018-09-23 12:02:51 -06:00
Michael Miller
9ba3fc898b More refatoring 2018-09-22 19:41:56 -06:00
Michael Miller
a1b5533504 Some initial work to cleanup the DSL builder 2018-09-22 15:15:29 -06:00
Michael Miller
a82076e2b7 Remove type from group macros
This value is never directly seen,
so it isn't necessary to support it.
2018-09-22 11:38:00 -06:00
Michael Miller
66ca06337d Fix locals not being passed to child groups 2018-09-21 14:26:09 -06:00
Michael Miller
a9d4acda36 Pass locals to example and test wrapper initializer
The #initialize method is defined in each context/given/module
that needs to add a local.
This is an elegant (although possibly confusing) solution.
2018-09-21 14:03:09 -06:00
Michael Miller
cba0abc7f1 Fixes for enumerating examples 2018-09-20 18:41:36 -06:00
Michael Miller
39be62c511 Temp disable until I figure out how to reference wrapped example 2018-09-20 18:41:21 -06:00
Michael Miller
007572f0b8 Get rid of #add_examples
Added #example_count method to help with array sizing.
2018-09-19 23:13:43 -06:00
Michael Miller
8b8981494d Trying to get exaples to map to their given values 2018-09-19 23:00:17 -06:00
Michael Miller
aaf973b8cf Concat #all_examples instead of recursive #add_examples 2018-09-19 22:28:20 -06:00
Michael Miller
4d601281f6 Delay example creation by using factories
The #given block functionality specifically needs this to create 
multiple examples.
2018-09-19 21:58:32 -06:00
Michael Miller
bb7f036a82 Make Example#group abstract
Instead of passing parent group as an argument, define the group method 
in the exapmle class created by the #it macro.
2018-09-19 21:50:51 -06:00
Michael Miller
0f7640411f Use symbols instead of strings for hash lookups 2018-09-19 21:06:10 -06:00
Michael Miller
a28f512ae4 Some code for repeating examples in given blocks 2018-09-19 20:49:01 -06:00
Michael Miller
830aa7b43a Structural code for enumerating given value sets 2018-09-19 20:00:26 -06:00
Michael Miller
2be9d65997 Add examples to group children 2018-09-19 19:32:59 -06:00
Michael Miller
06630e87d3 Rework how children are handled
Uses a loose version of the composite pattern.
This is to keep examples in the order they were declared.
2018-09-19 19:31:50 -06:00
Michael Miller
d679c356fd Move conditional into context macro 2018-09-19 19:29:33 -06:00
Michael Miller
fe81341e1a Rename MAPPING to GROUPS - better name 2018-09-19 18:58:44 -06:00