From de71fb18c287c82dc69401c64a7d4f179528bb6f Mon Sep 17 00:00:00 2001 From: Marc Piechura Date: Fri, 31 Mar 2017 22:39:58 +0200 Subject: [PATCH 1/2] =?UTF-8?q?Skip=20=C2=A72.13=20for=20value=20types?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SyncSubscriberWhiteboxTest.cs | 16 ++++++++-------- .../SubscriberBlackboxVerificationTest.cs | 6 ++++++ .../SubscriberBlackboxVerification.cs | 8 +++++--- .../SubscriberWhiteboxVerification.cs | 8 +++++--- 4 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/examples/Reactive.Streams.Example.Unicast.Tests/SyncSubscriberWhiteboxTest.cs b/src/examples/Reactive.Streams.Example.Unicast.Tests/SyncSubscriberWhiteboxTest.cs index 845a444..52906d4 100644 --- a/src/examples/Reactive.Streams.Example.Unicast.Tests/SyncSubscriberWhiteboxTest.cs +++ b/src/examples/Reactive.Streams.Example.Unicast.Tests/SyncSubscriberWhiteboxTest.cs @@ -5,21 +5,21 @@ namespace Reactive.Streams.Example.Unicast.Tests { [TestFixture] - public class SyncSubscriberWhiteboxTest : SubscriberWhiteboxVerification + public class SyncSubscriberWhiteboxTest : SubscriberWhiteboxVerification { public SyncSubscriberWhiteboxTest() : base(new TestEnvironment()) { } - public override int? CreateElement(int element) => element; + public override int CreateElement(int element) => element; - public override ISubscriber CreateSubscriber(WhiteboxSubscriberProbe probe) => new Subscriber(probe); + public override ISubscriber CreateSubscriber(WhiteboxSubscriberProbe probe) => new Subscriber(probe); - private sealed class Subscriber : SyncSubscriber + private sealed class Subscriber : SyncSubscriber { - private readonly WhiteboxSubscriberProbe _probe; + private readonly WhiteboxSubscriberProbe _probe; - public Subscriber(WhiteboxSubscriberProbe probe) + public Subscriber(WhiteboxSubscriberProbe probe) { _probe = probe; } @@ -45,13 +45,13 @@ public SubscriberPuppet(ISubscription subscription) public void SignalCancel() => _subscription.Cancel(); } - public override void OnNext(int? element) + public override void OnNext(int element) { base.OnNext(element); _probe.RegisterOnNext(element); } - protected override bool WhenNext(int? element) => true; + protected override bool WhenNext(int element) => true; public override void OnError(Exception cause) { diff --git a/src/tck/Reactive.Streams.TCK.Tests/SubscriberBlackboxVerificationTest.cs b/src/tck/Reactive.Streams.TCK.Tests/SubscriberBlackboxVerificationTest.cs index 853fd42..606a0b1 100644 --- a/src/tck/Reactive.Streams.TCK.Tests/SubscriberBlackboxVerificationTest.cs +++ b/src/tck/Reactive.Streams.TCK.Tests/SubscriberBlackboxVerificationTest.cs @@ -115,6 +115,12 @@ public void Required_spec213_blackbox_mustThrowNullPointerExceptionWhenParameter () => CustomSubscriberVerification(new LamdaSubscriber()).Required_spec213_blackbox_onNext_mustThrowNullPointerExceptionWhenParametersAreNull(), "OnNext(null) did not throw ArgumentNullException"); + [Test] + public void Required_spec213_blackbox_mustThrowNullPointerExceptionWhenParametersAreNull_mustIgnoreSpecForValueType_onNext() + => RequireTestSkip( + () => SimpleSubscriberVerification().Required_spec213_blackbox_onNext_mustThrowNullPointerExceptionWhenParametersAreNull(), + "Can't verify behavior for value types"); + [Test] public void Required_spec213_blackbox_mustThrowNullPointerExceptionWhenParametersAreNull_mustFailOnIgnoredNull_onError() => RequireTestFailure( diff --git a/src/tck/Reactive.Streams.TCK/SubscriberBlackboxVerification.cs b/src/tck/Reactive.Streams.TCK/SubscriberBlackboxVerification.cs index f918136..a093679 100644 --- a/src/tck/Reactive.Streams.TCK/SubscriberBlackboxVerification.cs +++ b/src/tck/Reactive.Streams.TCK/SubscriberBlackboxVerification.cs @@ -310,15 +310,17 @@ public void Required_spec213_blackbox_onSubscribe_mustThrowNullPointerExceptionW public void Required_spec213_blackbox_onNext_mustThrowNullPointerExceptionWhenParametersAreNull() => BlackboxSubscriberWithoutSetupTest(stage => { + var element = default(T); + if(element != null) + throw new IgnoreException("Can't verify behavior for value types"); + var subscriber = CreateSubscriber(); var gotNpe = false; subscriber.OnSubscribe(new Spec213DummySubscription()); try { - // we can't use null here because we can't enforce a constsraint which supports Nullable - // default(T) will return null for all reference types as well as Nullable - subscriber.OnNext(default(T)); + subscriber.OnNext(element); } catch (ArgumentNullException) { diff --git a/src/tck/Reactive.Streams.TCK/SubscriberWhiteboxVerification.cs b/src/tck/Reactive.Streams.TCK/SubscriberWhiteboxVerification.cs index 5eb1d7c..8146bbb 100644 --- a/src/tck/Reactive.Streams.TCK/SubscriberWhiteboxVerification.cs +++ b/src/tck/Reactive.Streams.TCK/SubscriberWhiteboxVerification.cs @@ -329,13 +329,15 @@ public void Required_spec213_onSubscribe_mustThrowNullPointerExceptionWhenParame public void Required_spec213_onNext_mustThrowNullPointerExceptionWhenParametersAreNull() => SubscriberTest(stage => { + var element = default(T); + if (element != null) + throw new IgnoreException("Can't verify behavior for value types"); + var subscriber = stage.Sub; var gotNpe = false; try { - // we can't use null here because we can't enforce a constsraint which supports Nullable - // default(T) will return null for all reference types as well as Nullable - subscriber.OnNext(default(T)); + subscriber.OnNext(element); } catch (ArgumentNullException) { From ee890a0cb2d08b4f350821bee62ee62598d70e24 Mon Sep 17 00:00:00 2001 From: Marc Piechura Date: Sat, 1 Apr 2017 21:09:42 +0200 Subject: [PATCH 2/2] restore nullable whitebox test --- .../SyncSubscriberWhiteboxTest.cs | 67 ++++++++++++++++++- 1 file changed, 65 insertions(+), 2 deletions(-) diff --git a/src/examples/Reactive.Streams.Example.Unicast.Tests/SyncSubscriberWhiteboxTest.cs b/src/examples/Reactive.Streams.Example.Unicast.Tests/SyncSubscriberWhiteboxTest.cs index 52906d4..b3b3df5 100644 --- a/src/examples/Reactive.Streams.Example.Unicast.Tests/SyncSubscriberWhiteboxTest.cs +++ b/src/examples/Reactive.Streams.Example.Unicast.Tests/SyncSubscriberWhiteboxTest.cs @@ -5,9 +5,9 @@ namespace Reactive.Streams.Example.Unicast.Tests { [TestFixture] - public class SyncSubscriberWhiteboxTest : SubscriberWhiteboxVerification + public class ValueTypeSyncSubscriberWhiteboxTest : SubscriberWhiteboxVerification { - public SyncSubscriberWhiteboxTest() : base(new TestEnvironment()) + public ValueTypeSyncSubscriberWhiteboxTest() : base(new TestEnvironment()) { } @@ -66,4 +66,67 @@ public override void OnComplete() } } } + + [TestFixture] + public class NullableSyncSubscriberWhiteboxTest : SubscriberWhiteboxVerification + { + public NullableSyncSubscriberWhiteboxTest() : base(new TestEnvironment()) + { + } + + public override int? CreateElement(int element) => element; + + public override ISubscriber CreateSubscriber(WhiteboxSubscriberProbe probe) => new Subscriber(probe); + + private sealed class Subscriber : SyncSubscriber + { + private readonly WhiteboxSubscriberProbe _probe; + + public Subscriber(WhiteboxSubscriberProbe probe) + { + _probe = probe; + } + + public override void OnSubscribe(ISubscription subscription) + { + base.OnSubscribe(subscription); + + _probe.RegisterOnSubscribe(new SubscriberPuppet(subscription)); + } + + private sealed class SubscriberPuppet : ISubscriberPuppet + { + private readonly ISubscription _subscription; + + public SubscriberPuppet(ISubscription subscription) + { + _subscription = subscription; + } + + public void TriggerRequest(long elements) => _subscription.Request(elements); + + public void SignalCancel() => _subscription.Cancel(); + } + + public override void OnNext(int? element) + { + base.OnNext(element); + _probe.RegisterOnNext(element); + } + + protected override bool WhenNext(int? element) => true; + + public override void OnError(Exception cause) + { + base.OnError(cause); + _probe.RegisterOnError(cause); + } + + public override void OnComplete() + { + base.OnComplete(); + _probe.RegisterOnComplete(); + } + } + } }