Skip to content

Commit 78c1dd4

Browse files
committed
Merge pull request #250 from ktoso/patch-1
+tck explains createElement in more useful terms
2 parents 0b59ebe + f771516 commit 78c1dd4

File tree

1 file changed

+15
-4
lines changed

1 file changed

+15
-4
lines changed

tck/README.md

+15-4
Original file line numberDiff line numberDiff line change
@@ -241,18 +241,29 @@ Note that explicitly passed in values take precedence over values provided by th
241241

242242
Subscriber rules Verification is split up into two files (styles) of tests.
243243

244-
The Blackbox Verification tests do not require the implementation under test to be modified at all, yet they are *not* able to verify most rules. In Whitebox Verification, more control over `request()` calls etc. is required in order to validate rules more precisely.
244+
The Blackbox Verification tests do not require the implementation under test to be modified at all, yet they are *not* able
245+
to verify most rules. In Whitebox Verification, more control over `request()` calls etc. is required in order to validate rules more precisely.
246+
247+
It is highly recommended to implement the `SubscriberWhiteboxVerification<T>` instead of the blackbox one even if it is
248+
more work to do so, as it can test far more corner cases in implementations that would otherwise be left untested
249+
(if only blackbox tests would be used).
245250

246251
### createElement and Helper Publisher implementations
247252
Since testing a `Subscriber` is not possible without a corresponding `Publisher` the TCK Subscriber Verifications
248253
both provide a default "*helper publisher*" to drive its test and also alow to replace this Publisher with a custom implementation.
249254
The helper publisher is an asynchronous publisher by default - meaning that your subscriber can not blindly assume single threaded execution.
250255

256+
When extending subscriber verification classes a type parameter representing the element type passed through the stream must be given.
257+
Implementations usually should not be sensitive to the type of element being signalled, but sometimes a Subscriber may be limited to only be able to work within a known set of types -
258+
like a `FileSubscriber extends Subscriber<String>` for example, that writes each element it receives as new line into a file.
259+
For element type agnostic Subscribers it is the simplest to parameterize the tests using `Integer` and in the `createElement(int idx)` method (explained below in futher detail), return the incoming `int`.
260+
In case an implementation needs to work on a specific type, the verification class should be parameterized using that type (e.g. `class StringSubTest extends SubscriberWhiteboxVerification<String>`) and a `String` must be returned from the `createElement` method.
261+
251262
While the `Publisher` implementation is provided, creating the signal elements is not – this is because a given Subscriber
252263
may for example only work with `HashedMessage` or some other specific kind of signal. The TCK is unable to generate such
253264
special messages automatically, so we provide the `T createElement(Integer id)` method to be implemented as part of
254265
Subscriber Verifications which should take the given ID and return an element of type `T` (where `T` is the type of
255-
elements flowing into the `Subscriber<T>`, as known thanks to `... extends WhiteboxSubscriberVerification<T>`) representing
266+
elements flowing into the `Subscriber<T>`, as known thanks to `... extends SubscriberWhiteboxVerification<T>`) representing
256267
an element of the stream that will be passed on to the Subscriber.
257268

258269
The simplest valid implemenation is to return the incoming `id` *as the element* in a verification using `Integer`s as element types:
@@ -268,8 +279,8 @@ public class MySubscriberTest extends SubscriberBlackboxVerification<Integer> {
268279
```
269280

270281

271-
The `createElement` method MAY be called from multiple
272-
threads, so in case of more complicated implementations, please be aware of this fact.
282+
The `createElement` method MAY be called concurrently from multiple threads,
283+
so in case of more complicated implementations, please be aware of this fact.
273284

274285
**Very Advanced**: While we do not expect many implementations having to do so, it is possible to take full control of the `Publisher`
275286
which will be driving the TCKs test. This can be achieved by implementing the `createHelperPublisher` method in which you can implement your

0 commit comments

Comments
 (0)