Example #1
0
        public void ExecuteNewTable()
        {
            var          adminAddress = new Address("399bddF9F7B6d902ea27037B907B2486C9910730");
            var          adminState   = new AdminState(adminAddress, 100);
            const string tableName    = "TestTable";
            var          initStates   = ImmutableDictionary <Address, IValue> .Empty
                                        .Add(AdminState.Address, adminState.Serialize())
                                        .Add(Addresses.TableSheet.Derive(tableName), Dictionary.Empty.Add(tableName, "Initial"));

            var state  = new State(initStates, ImmutableDictionary <(Address, Currency), FungibleAssetValue> .Empty);
            var action = new PatchTableSheet()
            {
                TableName = nameof(CostumeStatSheet),
                TableCsv  = "id,costume_id,stat_type,stat\n1,40100000,ATK,100",
            };

            var nextState = action.Execute(
                new ActionContext()
            {
                PreviousStates = state,
                Signer         = adminAddress,
            }
                );

            Assert.NotNull(nextState.GetSheet <CostumeStatSheet>());
        }
Example #2
0
        public void PatchTableSheet(string tableName, string tableCsv)
        {
            var action = new PatchTableSheet
            {
                TableName = tableName,
                TableCsv  = tableCsv,
            };

            ProcessAction(action);
        }
Example #3
0
        public void Execute()
        {
            var worldSheetCsv = _initialState.GetSheetCsv <WorldSheet>();
            var worldSheet    = new WorldSheet();

            worldSheet.Set(worldSheetCsv);
            var worldSheetRowCount = worldSheet.Count;

            var worldSheetCsvColumnLine = worldSheetCsv.Split('\n').FirstOrDefault();

            Assert.NotNull(worldSheetCsvColumnLine);

            var patchTableSheetAction = new PatchTableSheet
            {
                TableName = nameof(WorldSheet),
                TableCsv  = worldSheetCsvColumnLine,
            };
            var nextState = patchTableSheetAction.Execute(new ActionContext
            {
                BlockIndex     = 0,
                PreviousStates = _initialState,
                Rehearsal      = false,
            });

            var nextWorldSheetCsv = nextState.GetSheetCsv <WorldSheet>();

            Assert.Single(nextWorldSheetCsv.Split('\n'));

            var nextWorldSheet = new WorldSheet();

            nextWorldSheet.Set(nextWorldSheetCsv);
            Assert.Empty(nextWorldSheet);

            patchTableSheetAction = new PatchTableSheet
            {
                TableName = nameof(WorldSheet),
                TableCsv  = worldSheetCsv,
            };
            nextState = patchTableSheetAction.Execute(new ActionContext
            {
                BlockIndex     = 0,
                PreviousStates = _initialState,
                Rehearsal      = false,
            });

            nextWorldSheet = nextState.GetSheet <WorldSheet>();
            Assert.Equal(worldSheetRowCount, nextWorldSheet.Count);
        }
Example #4
0
        public void CheckPermission()
        {
            var adminAddress = new Address("399bddF9F7B6d902ea27037B907B2486C9910730");
            var adminState   = new AdminState(adminAddress, 100);
            var initStates   = ImmutableDictionary <Address, IValue> .Empty
                               .Add(AdminState.Address, adminState.Serialize())
                               .Add(TableSheetsState.Address, new TableSheetsState(new Dictionary <string, string>()
            {
                ["TestTable"] = "Initial",
            }).Serialize());

            var state =
                new State(initStates, ImmutableDictionary <(Address, Currency), BigInteger> .Empty);
            var action = new PatchTableSheet()
            {
                TableName = "TestTable",
                TableCsv  = "New Value",
            };

            PolicyExpiredException exc1 = Assert.Throws <PolicyExpiredException>(() =>
            {
                action.Execute(
                    new ActionContext()
                {
                    BlockIndex     = 101,
                    PreviousStates = state,
                    Signer         = adminAddress,
                }
                    );
            });

            Assert.Equal(101, exc1.BlockIndex);

            PermissionDeniedException exc2 = Assert.Throws <PermissionDeniedException>(() =>
            {
                action.Execute(
                    new ActionContext()
                {
                    BlockIndex     = 5,
                    PreviousStates = state,
                    Signer         = new Address("019101FEec7ed4f918D396827E1277DEda1e20D4"),
                }
                    );
            });

            Assert.Equal(new Address("019101FEec7ed4f918D396827E1277DEda1e20D4"), exc2.Signer);
        }
Example #5
0
        public void UnlockWorldByHackAndSlashAfterPatchTableWithAddRow(
            int avatarLevel,
            int worldIdToClear,
            int stageIdToClear,
            int worldIdToUnlock)
        {
            Assert.True(_tableSheets.CharacterLevelSheet.ContainsKey(avatarLevel));
            Assert.True(_tableSheets.WorldSheet.ContainsKey(worldIdToClear));
            Assert.True(_tableSheets.StageSheet.ContainsKey(stageIdToClear));
            Assert.True(_tableSheets.WorldSheet.ContainsKey(worldIdToUnlock));
            Assert.False(_tableSheets.WorldUnlockSheet.TryGetUnlockedInformation(
                             worldIdToClear,
                             stageIdToClear,
                             out _));

            var avatarState = _initialState.GetAvatarState(_avatarAddress);

            avatarState.level            = avatarLevel;
            avatarState.worldInformation = new WorldInformation(0, _tableSheets.WorldSheet, stageIdToClear);
            Assert.True(avatarState.worldInformation.IsWorldUnlocked(worldIdToClear));
            Assert.False(avatarState.worldInformation.IsWorldUnlocked(worldIdToUnlock));

            var nextState    = _initialState.SetState(_avatarAddress, avatarState.Serialize());
            var hackAndSlash = new HackAndSlash3
            {
                worldId            = worldIdToClear,
                stageId            = stageIdToClear,
                avatarAddress      = _avatarAddress,
                costumes           = new List <int>(),
                equipments         = new List <Guid>(),
                foods              = new List <Guid>(),
                WeeklyArenaAddress = _weeklyArenaState.address,
                RankingMapAddress  = _rankingMapAddress,
            };

            nextState = hackAndSlash.Execute(new ActionContext
            {
                PreviousStates = nextState,
                Signer         = _agentAddress,
                Random         = new TestRandom(),
                Rehearsal      = false,
            });
            Assert.True(hackAndSlash.Result.IsClear);

            avatarState = nextState.GetAvatarState(_avatarAddress);
            Assert.True(avatarState.worldInformation.IsStageCleared(stageIdToClear));
            Assert.False(avatarState.worldInformation.IsWorldUnlocked(worldIdToUnlock));

            var tableCsv         = nextState.GetSheetCsv <WorldUnlockSheet>();
            var worldUnlockSheet = nextState.GetSheet <WorldUnlockSheet>();
            var newId            = worldUnlockSheet.Last?.Id + 1 ?? 1;
            var newLine          = $"{newId},{worldIdToClear},{stageIdToClear},{worldIdToUnlock}";

            tableCsv = new StringBuilder(tableCsv).AppendLine(newLine).ToString();

            var patchTableSheet = new PatchTableSheet
            {
                TableName = nameof(WorldUnlockSheet),
                TableCsv  = tableCsv,
            };

            nextState = patchTableSheet.Execute(new ActionContext
            {
                PreviousStates = nextState,
                Signer         = AdminState.Address,
                Random         = new TestRandom(),
                Rehearsal      = false,
            });

            var nextTableCsv = nextState.GetSheetCsv <WorldUnlockSheet>();

            Assert.Equal(nextTableCsv, tableCsv);

            nextState = hackAndSlash.Execute(new ActionContext
            {
                PreviousStates = nextState,
                Signer         = _agentAddress,
                Random         = new TestRandom(),
                Rehearsal      = false,
            });
            Assert.True(hackAndSlash.Result.IsClear);

            avatarState = nextState.GetAvatarState(_avatarAddress);
            Assert.True(avatarState.worldInformation.IsWorldUnlocked(worldIdToUnlock));
        }
Example #6
0
        public void UnlockWorldByMimisbrunnrBttleAfterPatchTableWithChangeRow(
            int avatarLevel,
            int stageIdToUnlock,
            string targetRowStringBefore,
            string targetRowStringAfter)
        {
            var elements = targetRowStringAfter.Split(",");

            Assert.True(int.TryParse(elements[1], out var worldIdToClear));
            Assert.True(int.TryParse(elements[2], out var stageIdToClear));
            Assert.True(int.TryParse(elements[3], out var worldIdToUnlock));

            Assert.True(_tableSheets.CharacterLevelSheet.ContainsKey(avatarLevel));
            Assert.True(_tableSheets.WorldSheet.ContainsKey(worldIdToClear));
            Assert.True(_tableSheets.StageSheet.ContainsKey(stageIdToClear));
            Assert.True(_tableSheets.WorldSheet.ContainsKey(worldIdToUnlock));
            Assert.False(_tableSheets.WorldUnlockSheet.TryGetUnlockedInformation(
                             worldIdToClear,
                             stageIdToClear,
                             out _));

            var avatarState = _initialState.GetAvatarState(_avatarAddress);

            avatarState.level            = avatarLevel;
            avatarState.worldInformation = new WorldInformation(0, _tableSheets.WorldSheet, stageIdToClear);
            Assert.True(avatarState.worldInformation.IsWorldUnlocked(worldIdToClear));
            Assert.False(avatarState.worldInformation.IsWorldUnlocked(worldIdToUnlock));

            var nextState         = _initialState.SetState(_avatarAddress, avatarState.Serialize());
            var mimisbrunnrBattle = new MimisbrunnrBattle()
            {
                worldId            = worldIdToUnlock,
                stageId            = stageIdToUnlock,
                avatarAddress      = _avatarAddress,
                costumes           = new List <Guid>(),
                equipments         = new List <Guid>(),
                foods              = new List <Guid>(),
                WeeklyArenaAddress = _weeklyArenaState.address,
                RankingMapAddress  = _rankingMapAddress,
            };

            Assert.Throws <InvalidWorldException>(() =>
            {
                nextState = mimisbrunnrBattle.Execute(new ActionContext
                {
                    PreviousStates = nextState,
                    Signer         = _agentAddress,
                    Random         = new TestRandom(),
                    Rehearsal      = false,
                });
            });

            avatarState = nextState.GetAvatarState(_avatarAddress);
            Assert.False(avatarState.worldInformation.IsWorldUnlocked(worldIdToUnlock));

            var tableCsv        = nextState.GetSheetCsv <WorldUnlockSheet>();
            var newTable        = new StringBuilder(tableCsv).Replace(targetRowStringBefore, targetRowStringAfter).ToString();
            var patchTableSheet = new PatchTableSheet
            {
                TableName = nameof(WorldUnlockSheet),
                TableCsv  = newTable,
            };

            nextState = patchTableSheet.Execute(new ActionContext
            {
                PreviousStates = nextState,
                Signer         = AdminState.Address,
                Random         = new TestRandom(),
                Rehearsal      = false,
            });

            var nextTableCsv = nextState.GetSheetCsv <WorldUnlockSheet>();

            Assert.Equal(nextTableCsv, newTable);

            nextState = mimisbrunnrBattle.Execute(new ActionContext
            {
                PreviousStates = nextState,
                Signer         = _agentAddress,
                Random         = new TestRandom(),
                Rehearsal      = false,
            });

            avatarState = nextState.GetAvatarState(_avatarAddress);
            Assert.True(mimisbrunnrBattle.Result.IsClear);
            Assert.True(avatarState.worldInformation.IsStageCleared(stageIdToClear));
            Assert.True(avatarState.worldInformation.IsWorldUnlocked(worldIdToUnlock));
        }