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>()); }
public void PatchTableSheet(string tableName, string tableCsv) { var action = new PatchTableSheet { TableName = tableName, TableCsv = tableCsv, }; ProcessAction(action); }
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); }
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); }
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)); }
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)); }