public MockedCabinetReader(IEnumerable<DataAvailableNotification> notifications)
 {
     _items = new Queue<DataAvailableNotification>(notifications);
     Key = new CabinetKey(
         _items.Peek().Recipient,
         _items.Peek().Origin,
         _items.Peek().ContentType);
 }
Exemple #2
0
        public async Task SaveAsync_NullNotifications_ThrowsException()
        {
            // Arrange
            var target     = CreateTarget();
            var cabinetKey = new CabinetKey(
                new LegacyActorId(new GlobalLocationNumber("fake_value")),
                DomainOrigin.Charges,
                new ContentType("fake_value"));

            // Act + Assert
            await Assert
            .ThrowsAsync <ArgumentNullException>(() =>
                                                 target.SaveAsync(cabinetKey, null !))
            .ConfigureAwait(false);
        }
Exemple #3
0
        private async Task <ICabinetReader> GetCabinetReaderAsync(CabinetKey cabinetKey)
        {
            var drawers = new List <CosmosCabinetDrawer>();
            var content = new List <Task <IEnumerable <CosmosDataAvailable> > >();

            await foreach (var drawer in GetCabinetDrawersAsync(cabinetKey).ConfigureAwait(false))
            {
                var drawerContent = GetCabinetDrawerContentsAsync(drawer);
                drawers.Add(drawer);
                content.Add(drawerContent);
            }

            var cabinetReader = new AsyncCabinetReader(cabinetKey, drawers, content);
            await cabinetReader.InitializeAsync().ConfigureAwait(false);

            return(cabinetReader);
        }
Exemple #4
0
        private IAsyncEnumerable <CosmosCabinetDrawer> GetCabinetDrawersAsync(CabinetKey cabinetKey)
        {
            var partitionKey = string.Join(
                '_',
                cabinetKey.Recipient.Value,
                cabinetKey.Origin,
                cabinetKey.ContentType.Value);

            var asLinq = _repositoryContainer
                         .Cabinet
                         .GetItemLinqQueryable <CosmosCabinetDrawer>();

            var query =
                from cabinetDrawer in asLinq
                where
                cabinetDrawer.PartitionKey == partitionKey &&
                cabinetDrawer.Position < MaximumCabinetDrawerItemCount
                orderby cabinetDrawer.OrderBy
                select cabinetDrawer;

            return(query.Take(MaximumCabinetDrawersInRequest).AsCosmosIteratorAsync());
        }
Exemple #5
0
        private Task <CosmosCabinetDrawer?> FindExistingDrawerWithFreeSpaceAsync(CabinetKey cabinetKey)
        {
            var asLinq = _repositoryContainer
                         .Cabinet
                         .GetItemLinqQueryable <CosmosCabinetDrawer>();

            var partitionKey = string.Join(
                '_',
                cabinetKey.Recipient.Value,
                cabinetKey.Origin,
                cabinetKey.ContentType.Value);

            var query =
                from cabinetDrawer in asLinq
                where
                cabinetDrawer.PartitionKey == partitionKey &&
                cabinetDrawer.Position < MaximumCabinetDrawerItemCount
                orderby cabinetDrawer.OrderBy descending
                select cabinetDrawer;

            return(query
                   .AsCosmosIteratorAsync()
                   .FirstOrDefaultAsync());
        }
Exemple #6
0
    //private void OnGUI()
    //{
    //    GUI.Label(new Rect(10, 10, 100, 80), "test float: " + testFloat);
    //}

    public void Save()
    {
        BinaryFormatter binaryFormatter = new BinaryFormatter();
        FileStream      dataFile        = File.Create(Application.persistentDataPath + "/TrainOfBotDataFile.dat");

        Data data = new Data();

        data.testFloat               = 0.0f;
        data.storageRoomBoxPos       = StorageRoomBox.FindObjectOfType <Transform>().position;
        data.testCharacterCanRecieve = true;
        data.testCharacterCanGive    = true;

        //ITEMS
        data.bottleOfBoltsTaken          = BottleOfBolts.FindObjectOfType <BottleOfBolts>().taken;
        data.cabinetKeyTaken             = CabinetKey.FindObjectOfType <CabinetKey>().taken;
        data.chefsSpoonTaken             = ChefsSpoon.FindObjectOfType <ChefsSpoon>().taken;
        data.cookedMechanicalDinnerTaken = CookedMechanicalDinner.FindObjectOfType <CookedMechanicalDinner>().taken;
        data.earmuffsTaken = Earmuffs.FindObjectOfType <Earmuffs>().taken;
        data.frozenMechanicalDinnerTaken = FrozenMechanicalDinner.FindObjectOfType <FrozenMechanicalDinner>().taken;
        data.gasCanisterTaken            = GasCanister.FindObjectOfType <GasCanister>().taken;
        data.passengersEyeTaken          = PassengersEye.FindObjectOfType <PassengersEye>().taken;
        data.plungerTaken = Plunger.FindObjectOfType <Plunger>().taken;
        data.rattleTaken  = Rattle.FindObjectOfType <Rattle>().taken;
        data.valveTaken   = Valve.FindObjectOfType <Valve>().taken;

        data.plungerThrown = Plunger.FindObjectOfType <Plunger>().thrown;

        //NPCS
        data.earmuffsGuyCanGive    = EarmuffsGuy.FindObjectOfType <EarmuffsGuy>().canGiveItem;
        data.earmuffsGuyCanRecieve = EarmuffsGuy.FindObjectOfType <EarmuffsGuy>().canRecieveItem;

        data.eyeRobotCanGive    = EyeRobot.FindObjectOfType <EyeRobot>().canGiveItem;
        data.eyeRobotCanRecieve = EyeRobot.FindObjectOfType <EyeRobot>().canRecieveItem;

        data.chefCanGive    = Chef.FindObjectOfType <Chef>().canGiveItem;
        data.chefCanRecieve = Chef.FindObjectOfType <Chef>().canRecieveItem;
        data.chefFrozen     = Chef.FindObjectOfType <Chef>().frozen;

        data.womanRobotCanGive    = WomanRobot.FindObjectOfType <WomanRobot>().canGiveItem;
        data.womanRobotCanRecieve = WomanRobot.FindObjectOfType <WomanRobot>().canRecieveItem;

        data.cabinetCanGive    = Cabinet.FindObjectOfType <Cabinet>().canGiveItem;
        data.cabinetCanRecieve = Cabinet.FindObjectOfType <Cabinet>().canRecieveItem;

        data.toiletcanRecieve = Toilet.FindObjectOfType <Toilet>().canRecieveItem;

        data.hoboThrew = HoboRobot.FindObjectOfType <HoboRobot>().hoboThrew;

        data.nozzleCanRecieve = Nozzle.FindObjectOfType <Nozzle>().canRecieveItem;

        //ROBOT SPECIFIC
        data.robotLeftBathroom = BathroomRobot.FindObjectOfType <BathroomRobot>().leftBathroom;

        //DOG
        data.dogEating   = Dog.FindObjectOfType <Dog>().eating;
        data.dogLocation = Dog.FindObjectOfType <Transform>().position;

        //DOG BOWL
        data.bowlHasFood  = DogBowl.FindObjectOfType <DogBowl>().hasFood;
        data.dinnerActive = DogBowl.FindObjectOfType <DogBowl>().dinnerActive;

        //WORKTABLE
        data.canRecieveChefsSpoon = Worktable.FindObjectOfType <Worktable>().canRecieveChefsSpoon;
        data.canRecieveBottle     = Worktable.FindObjectOfType <Worktable>().canRecieveBottle;
        data.tableCanGiveItem     = Worktable.FindObjectOfType <Worktable>().canGiveItem;

        //STOVE
        data.canRecieveFMD         = Stove.FindObjectOfType <Stove>().canRecieveFMD;
        data.canRecieveGasCanister = Stove.FindObjectOfType <Stove>().canRecieveGasCanister;
        data.stoveCanGiveItem      = Stove.FindObjectOfType <Stove>().canGiveItem;

        //        Data data = new Data
        //        {
        //            testFloat = 0.0f
        //        };

        binaryFormatter.Serialize(dataFile, data);
        dataFile.Close();
    }
Exemple #7
0
        public async Task SaveAsync(CabinetKey key, IReadOnlyList <DataAvailableNotification> notifications)
        {
            ArgumentNullException.ThrowIfNull(key, nameof(key));
            ArgumentNullException.ThrowIfNull(notifications, nameof(notifications));

            var nextDrawer = await FindExistingDrawerWithFreeSpaceAsync(key).ConfigureAwait(false);

            var nextDrawerItemCount = nextDrawer != null
                ? await CountItemsInDrawerAsync(nextDrawer).ConfigureAwait(false)
                : 0;

            for (var i = 0; i < notifications.Count; i++)
            {
                var notification = notifications[i];

                Debug.Assert(key == new CabinetKey(notification), "All notifications should belong to the provided key.");

                if (await CheckIdempotencyAsync(notification).ConfigureAwait(false))
                {
                    continue;
                }

                if (nextDrawer is null)
                {
                    nextDrawer          = CreateEmptyDrawer(notification);
                    nextDrawerItemCount = 0;

                    await _repositoryContainer
                    .Cabinet
                    .CreateItemAsync(nextDrawer)
                    .ConfigureAwait(false);
                }

                if (nextDrawer.Position == nextDrawerItemCount)
                {
                    var catalogEntry = CreateCatalogEntry(notification);
                    await _repositoryContainer
                    .Catalog
                    .CreateItemAsync(catalogEntry)
                    .ConfigureAwait(false);
                }

                var cosmosDataAvailable = CosmosDataAvailableMapper.Map(notification, nextDrawer.Id);
                await _repositoryContainer
                .Cabinet
                .CreateItemAsync(cosmosDataAvailable)
                .ConfigureAwait(false);

                var itemsLeft = notifications.Count - (i + 1);
                var spaceLeft = MaximumCabinetDrawerItemCount - (nextDrawerItemCount + 1);

                var itemsToFill = notifications
                                  .Skip(i + 1)
                                  .Take(Math.Min(itemsLeft, spaceLeft));

                var itemsInserted = await FillCabinetDrawerAsync(nextDrawer, itemsToFill).ConfigureAwait(false);

                i += itemsInserted;
                nextDrawerItemCount += itemsInserted;
                nextDrawerItemCount++;

                Debug.Assert(nextDrawerItemCount <= MaximumCabinetDrawerItemCount, "Too many items were inserted into a single drawer.");

                if (nextDrawerItemCount == MaximumCabinetDrawerItemCount)
                {
                    nextDrawer = null;
                }
            }
        }
Exemple #8
0
        public async Task <ICabinetReader?> GetNextUnacknowledgedAsync(ActorId recipient, params DomainOrigin[] domains)
        {
            ArgumentNullException.ThrowIfNull(recipient, nameof(recipient));
            ArgumentNullException.ThrowIfNull(domains, nameof(domains));

            if (domains.Length == 0)
            {
                domains = Enum.GetValues <DomainOrigin>();
            }

            var entryLookups = domains
                               .Where(domain => domain != DomainOrigin.Unknown)
                               .Select(domain =>
            {
                var asLinq = _repositoryContainer
                             .Catalog
                             .GetItemLinqQueryable <CosmosCatalogEntry>();

                var partitionKey = string.Join('_', recipient.Value, domain);

                var query =
                    from catalogEntry in asLinq
                    where catalogEntry.PartitionKey == partitionKey
                    orderby catalogEntry.NextSequenceNumber
                    select catalogEntry;

                var task = query
                           .Take(1)
                           .AsCosmosIteratorAsync()
                           .FirstOrDefaultAsync();

                return(new { domain, task });
            });

            var smallestDomain = DomainOrigin.Unknown;
            CosmosCatalogEntry?smallestEntry = null;

            foreach (var entryLookup in entryLookups.ToList())
            {
                var catalogEntry = await entryLookup.task.ConfigureAwait(false);

                if (catalogEntry == null)
                {
                    continue;
                }

                if (smallestEntry == null || smallestEntry.NextSequenceNumber > catalogEntry.NextSequenceNumber)
                {
                    smallestEntry  = catalogEntry;
                    smallestDomain = entryLookup.domain;
                }
            }

            var maximumSequenceNumber = await _sequenceNumberRepository
                                        .GetMaximumSequenceNumberAsync()
                                        .ConfigureAwait(false);

            if (smallestEntry == null || smallestEntry.NextSequenceNumber > maximumSequenceNumber.Value)
            {
                return(null);
            }

            var cabinetKey = new CabinetKey(
                recipient,
                smallestDomain,
                new ContentType(smallestEntry.ContentType));

            var cabinetReader = await GetCabinetReaderAsync(cabinetKey).ConfigureAwait(false);

            if (cabinetReader.CanPeek)
            {
                var nextItem = cabinetReader.Peek();
                if (nextItem.SequenceNumber.Value == smallestEntry.NextSequenceNumber)
                {
                    return(cabinetReader);
                }
            }

            // If SaveAsync fails to insert DataAvailable, for example due to crash/timeout,
            // there will be a catalog entry pointing to a non-existent item.
            await DeleteOldCatalogEntryAsync(smallestEntry).ConfigureAwait(false);

            return(null);
        }
Exemple #9
0
 public Task SaveAsync(CabinetKey key, IReadOnlyList <DataAvailableNotification> notifications)
 {
     return(_dataAvailableNotificationRepository.SaveAsync(key, notifications));
 }