rd-net/Test.RdFramework/Contexts/RdContextBasicTest.cs (99 lines of code) (raw):
using JetBrains.Lifetimes;
using JetBrains.Rd;
using JetBrains.Rd.Impl;
using NUnit.Framework;
namespace Test.RdFramework.Contexts
{
public class RdContextBasicTest : RdFrameworkTestBase
{
[Datapoint]
public static bool TrueDataPoint = true;
[Datapoint]
public static bool FalseDataPoint = false;
public override void SetUp()
{
base.SetUp();
ServerWire.AutoTransmitMode = true;
ClientWire.AutoTransmitMode = true;
}
public class TestKeyHeavy : ThreadLocalRdContext<string>
{
private TestKeyHeavy() : base("test-key", true, Serializers.ReadString, Serializers.WriteString)
{
}
public static readonly TestKeyHeavy Instance = new TestKeyHeavy();
protected internal override void RegisterOn(ISerializers serializers)
{
serializers.Register((_, __) => Instance, (_, __, ___) => { });
}
}
public class TestKeyLight : ThreadLocalRdContext<string>
{
private TestKeyLight() : base("test-key", false, Serializers.ReadString, Serializers.WriteString)
{
}
public static readonly TestKeyLight Instance = new TestKeyLight();
protected internal override void RegisterOn(ISerializers serializers)
{
serializers.Register((_, __) => Instance, (_, __, ___) => { });
}
}
[Theory]
public void TestLateAdd(bool heavy)
{
var key = heavy ? TestKeyHeavy.Instance : (RdContext<string>) TestKeyLight.Instance;
var serverSignal = BindToServer(LifetimeDefinition.Lifetime, NewRdSignal<string>(), 1);
var clientSignal = BindToClient(LifetimeDefinition.Lifetime, NewRdSignal<string>(), 1);
key.RegisterOn(ClientProtocol.Serializers);
ServerProtocol.Contexts.RegisterContext(key);
using var _ = key.UpdateValue("1");
Lifetime.Using(lt =>
{
var fired = false;
clientSignal.Advise(lt, s =>
{
Assert.AreEqual("1", key.Value);
fired = true;
});
serverSignal.Fire("");
Assert.True(fired, "fired");
});
ClientProtocol.Contexts.RegisterContext(key);
Lifetime.Using(lt =>
{
var fired = false;
clientSignal.Advise(lt, s =>
{
Assert.AreEqual("1", key.Value);
fired = true;
});
serverSignal.Fire("");
Assert.True(fired, "fired");
});
Assert.AreEqual("1", key.Value);
Lifetime.Using(lt =>
{
var fired = false;
serverSignal.Advise(lt, s =>
{
Assert.AreEqual("1", key.Value);
fired = true;
});
clientSignal.Fire("");
Assert.True(fired, "fired");
});
Assert.AreEqual("1", key.Value);
}
public class TestKey2 : ThreadLocalRdContext<string>
{
private TestKey2() : base("test-key", true, Serializers.ReadString, Serializers.WriteString)
{
}
public static readonly TestKey2 Instance = new TestKey2();
protected internal override void RegisterOn(ISerializers serializers)
{
serializers.Register((_, __) => Instance, (_, __, ___) => { });
}
}
}
}