import { readFileSync } from 'fs'; import { resolve } from 'path'; import { describe, expect, it } from 'vitest'; import { GAME_DISCRIMINATOR, getGameDecoder, } from '../src/generated/accounts/game'; const LEGACY_ONCHAIN_FIXTURE_PATH = resolve( __dirname, '../../../../fixtures/game-account.bin', ); const GENESIS_FIXTURE_PATH = resolve( __dirname, '../../../../fixtures/game-genesis.bin', ); describe('Game account decode', () => { const legacyOnchainBytes = readFileSync(LEGACY_ONCHAIN_FIXTURE_PATH); const genesisBytes = readFileSync(GENESIS_FIXTURE_PATH); it('fixtures have correct discriminator', () => { const discriminator = genesisBytes.slice(0, 8); const legacyDiscriminator = legacyOnchainBytes.slice(0, 8); expect(Buffer.from(discriminator)).toEqual(Buffer.from(GAME_DISCRIMINATOR)); expect(Buffer.from(legacyDiscriminator)).toEqual( Buffer.from(GAME_DISCRIMINATOR), ); }); it('decodes the full Game account from genesis snapshot', () => { const decoder = getGameDecoder(); const game = decoder.decode(genesisBytes); // Header fields expect(game.version).toBeDefined(); expect(game.profile).toBeDefined(); expect(game.resources).toBeDefined(); expect(game.currencies).toBeDefined(); expect(game.combat).toBeDefined(); expect(game.crewConfig).toBeDefined(); // All definition sections must be present expect(game.shipDefinitions).toBeDefined(); expect(game.shipDefinitions.seqId).toBeGreaterThanOrEqual(0); expect(game.shipDefinitions.ships.unsizedList.length).toBeGreaterThan(0); expect(game.cargoDefinitions).toBeDefined(); expect(game.claimStakeDefinitions).toBeDefined(); expect(game.buildingDefinitions).toBeDefined(); expect(game.craftingHabDefinitions).toBeDefined(); expect(game.habBuildingDefinitions).toBeDefined(); expect(game.xpDefinitions).toBeDefined(); expect(game.researchTreeDefinitions).toBeDefined(); expect(game.stimulantDefinitions).toBeDefined(); expect(game.stimulantDefinitions.definitions.size).toBe(3); }); it('documents legacy on-chain fixture layout mismatch', () => { const decoder = getGameDecoder(); expect(() => decoder.decode(legacyOnchainBytes)).toThrow( /expected 32 bytes, got 24/, ); }); });