SessionTest.cs 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. using GplSession.Program;
  2. using Solana.Unity.Bolt.Test;
  3. using Solana.Unity.Programs;
  4. using Solana.Unity.Wallet;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Threading.Tasks;
  8. using World.Program;
  9. using System.Diagnostics;
  10. using Solana.Unity.Rpc.Types;
  11. namespace SessionTest {
  12. public class Test {
  13. public static async Task Run(Framework framework) {
  14. await CreateSession(framework);
  15. await AddEntity(framework);
  16. await InitializePositionComponent(framework);
  17. await ApplyFlySystemOnComponentUsingSessionToken(framework);
  18. }
  19. public static async Task CreateSession(Framework framework) {
  20. framework.SessionToken = WorldProgram.FindSessionTokenPda(framework.SessionSigner.Account.PublicKey, framework.Wallet.Account.PublicKey);
  21. var createSession = new CreateSessionAccounts() {
  22. SessionToken = framework.SessionToken,
  23. SessionSigner = framework.SessionSigner.Account.PublicKey,
  24. Authority = framework.Wallet.Account.PublicKey,
  25. TargetProgram = new PublicKey(WorldProgram.ID)
  26. };
  27. var instruction = GplSessionProgram.CreateSession(createSession, true, null, 100000000);
  28. await framework.SendAndConfirmInstruction(instruction, new List<Account> { framework.Wallet.Account, framework.SessionSigner.Account });
  29. }
  30. public static async Task AddEntity(Framework framework) {
  31. var addEntity = await Bolt.World.AddEntity(framework.Client, framework.WorldPda, framework.SessionSigner.Account.PublicKey, Commitment.Processed);
  32. framework.SessionEntityPda = addEntity.Pda;
  33. await framework.SendAndConfirmInstruction(addEntity.Instruction, new List<Account> { framework.SessionSigner.Account }, framework.SessionSigner.Account.PublicKey);
  34. }
  35. public static async Task InitializePositionComponent(Framework framework) {
  36. var initializeComponent = await Bolt.World.InitializeComponent(framework.SessionSigner.Account.PublicKey, framework.SessionEntityPda, framework.ExampleComponentPosition);
  37. framework.SessionComponentPositionPda = initializeComponent.Pda;
  38. await framework.SendAndConfirmInstruction(initializeComponent.Instruction, new List<Account> { framework.SessionSigner.Account }, framework.SessionSigner.Account.PublicKey);
  39. }
  40. public static async Task ApplyFlySystemOnComponentUsingSessionToken(Framework framework) {
  41. var instruction = Bolt.World.ApplySystem(
  42. framework.WorldPda,
  43. framework.SystemSimpleMovement,
  44. [new Bolt.World.EntityType(framework.SessionEntityPda, [framework.ExampleComponentPosition])],
  45. new { direction = "Right" },
  46. framework.SessionSigner.Account.PublicKey,
  47. framework.SessionToken
  48. );
  49. await framework.SendAndConfirmInstruction(instruction, new List<Account> { framework.SessionSigner.Account }, framework.SessionSigner.Account.PublicKey);
  50. var accountInfo = await framework.GetAccountInfo(framework.SessionComponentPositionPda);
  51. var data = Convert.FromBase64String(accountInfo.Data[0]);
  52. var position = Position.Accounts.Position.Deserialize(data);
  53. Debug.Assert(1 == position.X, "X is not equal to 1");
  54. Debug.Assert(0 == position.Y, "Y is not equal to 0");
  55. Debug.Assert(0 == position.Z, "Z is not equal to 0");
  56. }
  57. }
  58. }