public void TestDispersing()
        {
            var stowage = new Stowage();

            stowage.StowingMode();

            stowage.Stow(LocalMessage("1"));
            stowage.Stow(LocalMessage("2"));
            stowage.Stow(LocalMessage("3"));

            Assert.True(stowage.HasMessages);

            stowage.DispersingMode();

            Assert.Equal("1", stowage.SwapWith <object>(LocalMessage("4")).Representation);
            Assert.Equal("2", stowage.SwapWith <object>(LocalMessage("5")).Representation);
            Assert.Equal("3", stowage.SwapWith <object>(LocalMessage("6")).Representation);

            Assert.True(stowage.HasMessages);
            Assert.True(stowage.IsDispersing);
            Assert.NotNull(stowage.Head);
            Assert.True(stowage.IsDispersing);
            Assert.NotNull(stowage.Head);
            Assert.True(stowage.IsDispersing);
            Assert.NotNull(stowage.Head);
            Assert.True(stowage.IsDispersing);
            Assert.Null(stowage.Head);
            Assert.False(stowage.IsDispersing);
        }
    protected internal Environment(
        Stage stage,
        IAddress address,
        Definition definition,
        Actor?parent,
        IMailbox mailbox,
        ISupervisor?maybeSupervisor,
        ILogger logger)
    {
        Stage      = stage ?? throw new ArgumentNullException(nameof(stage));
        Address    = address ?? throw new ArgumentNullException(nameof(address));
        Definition = definition ?? throw new ArgumentNullException(nameof(definition));
        if (address.Id != World.PrivateRootId)
        {
            Parent = parent ?? throw new ArgumentNullException(nameof(parent));
        }
        else
        {
            Parent = parent;
        }
        Mailbox           = mailbox ?? throw new ArgumentNullException(nameof(mailbox));
        MaybeSupervisor   = maybeSupervisor;
        FailureMark       = new FailureMark();
        Logger            = logger;
        Children          = new ConcurrentDictionary <long, Actor>();
        ProxyCache        = new Dictionary <Type, object>(1);
        Stowage           = new Stowage();
        _stowageOverrides = null;
        Suspended         = new Stowage();

        _secured = new AtomicBoolean(false);
        _stopped = new AtomicBoolean(false);
    }
        public void TestHead()
        {
            var stowage = new Stowage();

            stowage.StowingMode();

            stowage.Stow <object>(LocalMessage());
            stowage.Stow <object>(LocalMessage());
            stowage.Stow <object>(LocalMessage());

            Assert.NotNull(stowage.Head);
            Assert.NotNull(stowage.Head);
            Assert.NotNull(stowage.Head);
            Assert.Null(stowage.Head);
        }
        public void TestReset()
        {
            var stowage = new Stowage();

            stowage.StowingMode();

            Assert.True(stowage.IsStowing);
            Assert.False(stowage.IsDispersing);

            stowage.Stow <object>(LocalMessage());
            stowage.Stow <object>(LocalMessage());
            stowage.Stow <object>(LocalMessage());

            Assert.True(stowage.HasMessages);

            stowage.Reset();

            Assert.False(stowage.HasMessages);
            Assert.False(stowage.IsStowing);
            Assert.False(stowage.IsDispersing);
        }
        public void TestStowHasMessages()
        {
            IMessage _;

            var stowage = new Stowage();

            stowage.StowingMode();

            stowage.Stow <object>(LocalMessage());
            Assert.True(stowage.HasMessages);

            _ = stowage.Head;
            Assert.False(stowage.HasMessages);

            stowage.Stow <object>(LocalMessage());
            stowage.Stow <object>(LocalMessage());
            Assert.True(stowage.HasMessages);

            _ = stowage.Head;
            Assert.True(stowage.HasMessages);

            _ = stowage.Head;
            Assert.False(stowage.HasMessages);
        }