§
    ¦½j¿)  ã                  óØ   — d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
Z
ddlmZ ddlZddlmZmZ ddlZddlmZ ddlmZ dZ ej        d	¬
¦  «        dd„¦   «         Z G d„ d¦  «        ZdS )ar  
Adversarial Stress Testing & Empirical Verification Suite:
Spawner Gating, Transition Drop Flushing & Portal Traversal (Milestone 2).

Integrates empirical Node.js execution harness with server-side spatial authority
to verify zero hostile entity leaks in Safe Havens, 100% drop & projectile flushing
across zone boundaries, and reliable 6-portal map device traversal.
é    )ÚannotationsN)ÚPath)ÚAnyÚDict)ÚEntity)Ú
ZoneEnginea\  
import fs from 'fs';
import vm from 'vm';
import path from 'path';
import { pathToFileURL } from 'url';

const projectRoot = process.cwd();
const createMockElement = () => ({
  id: '', className: '', innerHTML: '', innerText: '', style: {},
  classList: { toggle: () => {}, add: () => {}, remove: () => {}, contains: () => false },
  appendChild: () => {}, querySelector: () => null, addEventListener: () => {}
});

globalThis.window = globalThis;
globalThis.addEventListener = () => {};
globalThis.removeEventListener = () => {};
globalThis.document = {
  getElementById: () => createMockElement(),
  createElement: () => createMockElement(),
  body: createMockElement(),
  addEventListener: () => {}
};
globalThis.showNoticeModal = () => {};
globalThis.alert = () => {};
globalThis.groundDrops = [];
globalThis.vfx_slashes = [];
globalThis.vfx_spikes = [];
globalThis.vfx_lightnings = [];
globalThis.particles = [];
globalThis.damageTexts = [];
globalThis.player = { wx: 0, wy: 0, facing: 1, maxHp: 100, hp: 100 };
console.warn = () => {};

const loadScript = (rel) => vm.runInThisContext(fs.readFileSync(path.join(projectRoot, rel), 'utf8'));
loadScript('client/webapp/js/data/monster_catalog.js');
loadScript('client/webapp/js/engine/monster_loot_dropper.js');
loadScript('client/webapp/js/engine/vfx_renderer.js');
loadScript('client/webapp/js/engine/monster_system.js');

const worldmapModule = await import(pathToFileURL(path.join(projectRoot, 'client/webapp/js/ui/worldmap_dungeons.js')).href);
const hideoutModule = await import(pathToFileURL(path.join(projectRoot, 'client/webapp/js/ui/hideout_gates.js')).href);

const teleportToZone = worldmapModule.teleportToZone;
const enterMapPortal = hideoutModule.enterMapPortal;
const activateMapDevice = hideoutModule.activateMapDevice;
const hideoutState = hideoutModule.hideoutState;

const results = {
  test1_spawner_bypass: { passed: true, details: [] },
  test2_drop_flush: { passed: true, details: {} },
  test3_portal_traversal: { passed: true, details: {} },
  test4_stress_rapid_cycle: { passed: true }
};

// 1. Spawner Bypass Attempts
const safeHavens = ['zone_player_hideout', 'zone_boundless_sanctuary'];
const attackVectors = [
  ['spawnQAEnemy', 'boss'], ['spawnQAEnemy', 'pack'],
  ['spawnQAEnemy', 'hound'], ['spawnQAEnemy', 'skeleton'],
  ['spawnSpecificMonster', 'mob_feral_hellhound'],
  ['spawnSpecificMonster', 'mob_skeleton_warrior'],
  ['spawnSpecificMonster', 'boss_abyssal_tyrant']
];

for (const zone of safeHavens) {
  teleportToZone(zone);
  for (const [fn, arg] of attackVectors) {
    let ret = (fn === 'spawnQAEnemy') ? globalThis.spawnQAEnemy(arg) : globalThis.spawnSpecificMonster(arg);
    const hostiles = globalThis.activeMonsters.filter(m => !m.isDummy);
    const ok = (hostiles.length === 0 && (fn === 'spawnQAEnemy' || ret === null));
    results.test1_spawner_bypass.details.push({ zone, fn, arg, ok, hostilesCount: hostiles.length });
    if (!ok) results.test1_spawner_bypass.passed = false;
  }
  globalThis.spawnQAEnemy('dummy');
  const dummyOk = globalThis.activeMonsters.every(m => m.isDummy);
  results.test1_spawner_bypass.details.push({ zone, fn: 'spawnQAEnemy', arg: 'dummy', ok: dummyOk });
  if (!dummyOk) results.test1_spawner_bypass.passed = false;
}

// 2. Drop & Projectile Flush
teleportToZone('zone_tang_kiem_nhai');
for (let i = 0; i < 500; i++) globalThis.groundDrops.push({ id: `drop_${i}`, wx: i, wy: i });
for (let i = 0; i < 100; i++) {
  globalThis.vfx_slashes.push({ id: i });
  globalThis.vfx_spikes.push({ id: i });
  globalThis.vfx_lightnings.push({ id: i });
  globalThis.particles.push({ id: i });
  globalThis.damageTexts.push({ id: i });
}
const preCounts = { drops: globalThis.groundDrops.length, slashes: globalThis.vfx_slashes.length };
teleportToZone('zone_player_hideout');
const postCounts = {
  drops: globalThis.groundDrops.length,
  slashes: globalThis.vfx_slashes.length,
  spikes: globalThis.vfx_spikes.length,
  lightnings: globalThis.vfx_lightnings.length,
  particles: globalThis.particles.length,
  texts: globalThis.damageTexts.length
};
const allZero = Object.values(postCounts).every(c => c === 0);
results.test2_drop_flush.passed = (preCounts.drops === 500 && allZero);
results.test2_drop_flush.details = { preCounts, postCounts, allZero };

// 3. Portal Traversal Stress
teleportToZone('zone_player_hideout');
hideoutState.mapDevice.targetZoneId = 'zone_tang_kiem_nhai';
activateMapDevice();
const portalHistory = [];
for (let p = 6; p >= 1; p--) {
  teleportToZone('zone_player_hideout');
  enterMapPortal();
  portalHistory.push({
    p, zone: globalThis.currentZoneId,
    rem: hideoutState.mapDevice.portalsRemaining,
    wildMobs: globalThis.activeMonsters.some(m => !m.isDummy)
  });
}
teleportToZone('zone_player_hideout');
enterMapPortal();
const attempt7 = {
  zone: globalThis.currentZoneId,
  rem: hideoutState.mapDevice.portalsRemaining,
  act: hideoutState.mapDevice.active
};
results.test3_portal_traversal.passed = (
  portalHistory.length === 6 &&
  portalHistory.every(h => h.zone === 'zone_tang_kiem_nhai' && h.wildMobs) &&
  attempt7.rem === 0 && attempt7.act === false && attempt7.zone === 'zone_player_hideout'
);
results.test3_portal_traversal.details = { portalHistory, attempt7 };

// 4. Rapid Zone Transition Stress
for (let r = 0; r < 50; r++) {
  const t = (r % 2 === 0) ? 'zone_player_hideout' : 'zone_tang_kiem_nhai';
  globalThis.groundDrops.push({ id: r });
  teleportToZone(t);
  if (t === 'zone_player_hideout') {
    if (globalThis.activeMonsters.some(m => !m.isDummy) || globalThis.groundDrops.length !== 0) {
      results.test4_stress_rapid_cycle.passed = false;
      break;
    }
  }
}

process.stdout.write(JSON.stringify(results));
Úmodule)ÚscopeÚreturnúDict[str, Any]c                 ó&  — t          j        dddt          gddd¬¦  «        } | j        }|                     d¦  «        }|                     d¦  «        }g }d}| }||k    }|}|rd}	|	 }
||
k    }|}|�spt          j        d	|fd
||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         |r‹t          j        d	|fd||
f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |	¦  «        dœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }t          j        d|› �¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}	}
t#          j        |||dz   …         ¦  «        S )z?Executes empirical Node.js adversarial harness and parses JSON.Únodez--input-type=modulez-eT)Úcapture_outputÚtextÚcheckÚ{Ú}é   )ú!=)z%(py2)s != -%(py5)sÚstart)Úpy2Úpy5z%(py8)sÚpy8)z%(py10)s != -%(py13)sÚend)Úpy10Úpy13z%(py16)sÚpy16r   zInvalid JSON output: z
>assert %(py19)sÚpy19N)Ú
subprocessÚrunÚNODE_HARNESS_SCRIPTÚstdoutÚfindÚrfindÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚappendÚ_format_boolopÚ_format_assertmsgÚAssertionErrorÚ_format_explanationÚjsonÚloads)ÚprocÚ
stdout_rawr   r   Ú@py_assert1Ú@py_assert4Ú@py_assert6Ú@py_assert3Ú@py_assert0Ú@py_assert12Ú@py_assert14Ú@py_assert11Ú@py_format7Ú@py_format9Ú@py_format15Ú@py_format17Ú@py_format18Ú@py_format20s                     úaC:\Projects\FreeExile\tests\security_fuzzing\test_spawner_gating_and_drop_flushing_adversarial.pyÚclient_harness_resultsrC   ©   s�  € õ Œ>Ø	Ð&¨Õ.AÐBØØØð	ñ ô €Dð ”€JØ�OŠO˜CÑ Ô €EØ
×
Ò
˜3Ñ
Ô
€CØJÐJ�QÐJ�Q�BÐJˆ5�BŠ;ÐJÐJÐJÐJÐJ 1ÐJ 1 "ÐJ˜3 "š9ÐJÐJÐJÐJÑJÕJÔJÐJÐJÐJÐJˆ5�BÐJÑJÔJÐJÕJÔJÑJÔJÐJÐJÕJÔJˆ5ÑJÔJÐJÕJÔJˆ5ÑJÔJÐJÐJÕJÔJ�QÑJÔJÐJÐJÑJÐJÐJÐJÐJÐJÑJÐJÐJ×JÒJÐJÑJÔJÐJÐJÐJÕJÔJÐJÐJÐJÐJ˜3 "ÐJÑJÔJÐJÕJÔJÑJÔJÐJÐJÕJÔJ˜3ÑJÔJÐJÕJÔJ˜3ÑJÔJÐJÐJÕJÔJ 1ÑJÔJÐJÐJÑJÐJÐJÐJÐJÐJÑJÐJÐJ×JÒJÐJÑJÔJÐJÕJÔJÐJÐJÑJÔJÐJÑJÐJÕJÔJÐ&J¸jÐ&JÐ&JÑJÔJÐJÑJÐJÐJÐJÑJÐJÕJÕJÔJÐJÑJÔJÑJÔJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJÝŒ:�j ¨¨q© Ô1Ñ2Ô2Ð2ó    c                  óB   — e Zd ZdZdd„Zdd„Zdd„Zdd	„Zdd
„Zdd„Z	dS )Ú4TestEmpiricalSpawnerGatingAndDropFlushingAdversarialz:Empirical adversarial stress test harness for Milestone 2.rC   r   r   ÚNonec                ó¨  — |d         }|d         }d}||u }|s„t          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }t          j        d|› �¦  «        dz   d	|iz  }t	          t          j        |¦  «        ¦  «        ‚d
x}x}}|d         D �]%}|d         }d}||u }|s„t          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }t          j        d|› �¦  «        dz   d	|iz  }t	          t          j        |¦  «        ¦  «        ‚d
x}x}}d|v r„|d         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd	|iz  }t	          t          j        |¦  «        ¦  «        ‚d
x}x}}�Œ'd
S )zOVerifies 100% rejection of hostile QA & specific monster spawns in safe havens.Útest1_spawner_bypassÚpassedT©Úis©z%(py1)s is %(py4)s©Úpy1Úpy4z'Spawner bypass allowed hostile entity! ú
>assert %(py6)sÚpy6NÚdetailsÚokzFailed vector: ÚhostilesCountr   ©ú==©z%(py1)s == %(py4)súassert %(py6)s©r%   r&   r*   r-   r.   r/   )	ÚselfrC   Út1r8   r7   Ú@py_assert2Ú@py_format5r<   Úitems	            rB   Ú>test_client_spawner_bypass_in_safe_havens_100_percent_rejectedzsTestEmpiricalSpawnerGatingAndDropFlushingAdversarial.test_client_spawner_bypass_in_safe_havens_100_percent_rejected¼   s_  € ð $Ð$:Ô;ˆØ�(Œ|ÐS˜tÐSˆ|˜tÐ#ÐSÐSÐSÕSÔSÐSÐSÐSÐSˆ|˜tÐSÑSÔSÕSÔSˆ|ÑSÔSÕSÔS˜tÑSÔSÐSÐSÑSÐSÕSÔSÐ%SÈrÐ%SÐ%SÑSÔSÐSÑSÐSÐSÐSÑSÐSÕSÕSÔSÐSÑSÔSÑSÔSÐSÐSÐSÐSÐSÐSÐSØ�y”Mð 	2ñ 	2ˆDØ˜”:Ð? Ð?�: Ð%Ð?Ð?Ð?Õ?Ô?Ð?Ð?Ð?Ð?�: Ð?Ñ?Ô?Õ?Ô?�:Ñ?Ô?Õ?Ô? Ñ?Ô?Ð?Ð?Ñ?Ð?Õ?Ô?Ð'?¸Ð'?Ð'?Ñ?Ô?Ð?Ñ?Ð?Ð?Ð?Ñ?Ð?Õ?Õ?Ô?Ð?Ñ?Ô?Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ø $Ð&Ð&Ø˜OÔ,Ð1°Ð1Ð,°Ò1Ð1Ð1Ð1Õ1Ô1Ð1Ð1Ð1Ð1Ð,°Ð1Ñ1Ô1Õ1Ô1Ð,Ñ1Ô1Õ1Ô1°Ñ1Ô1Ð1Ð1Ñ1Ð1Ð1Ð1Ð1Ð1Ñ1Ð1Õ1Õ1Ô1Ð1Ñ1Ô1Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1ùð	2ð 	2rD   c                ó2  — |d         }|d         }d}||u }|s„t          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }t          j        d|› �¦  «        dz   d	|iz  }t	          t          j        |¦  «        ¦  «        ‚d
x}x}}|d         }|d         d         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd	|iz  }t	          t          j        |¦  «        ¦  «        ‚d
x}x}}|d         }d}||u }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd	|iz  }t	          t          j        |¦  «        ¦  «        ‚d
x}x}}|d                              ¦   «         D ]Å\  }	}
d}|
|k    }|s²t          j        d|fd|
|f¦  «        dt          j        ¦   «         v st          j	        |
¦  «        rt          j        |
¦  «        ndt          j        |¦  «        dœz  }t          j        d|	› d|
› �¦  «        dz   d|iz  }t	          t          j        |¦  «        ¦  «        ‚d
x}}ŒÆd
S )zOVerifies 500 ground drops and all flying projectiles are flushed on transition.Útest2_drop_flushrJ   TrK   rM   rN   zDrop/projectile flush failed: rQ   rR   NrS   Ú	preCountsÚdropséô  rV   rX   rY   ÚallZeroÚ
postCountsr   )z%(py0)s == %(py3)sÚval©Úpy0Úpy3z	Residual z count after teleport: z
>assert %(py5)sr   )
r%   r&   r*   r-   r.   r/   Úitemsr'   r(   r)   )r[   rC   Út2r8   r7   r]   r^   r<   rS   Úkeyrh   r4   Ú@py_format4Ú@py_format6s                 rB   Ú:test_client_transition_drop_and_projectile_flush_500_itemszoTestEmpiricalSpawnerGatingAndDropFlushingAdversarial.test_client_transition_drop_and_projectile_flush_500_itemsÇ   sF  € ð $Ð$6Ô7ˆØ�(Œ|ÐJ˜tÐJˆ|˜tÐ#ÐJÐJÐJÕJÔJÐJÐJÐJÐJˆ|˜tÐJÑJÔJÕJÔJˆ|ÑJÔJÕJÔJ˜tÑJÔJÐJÐJÑJÐJÕJÔJÐ%JÀbÐ%JÐ%JÑJÔJÐJÑJÐJÐJÐJÑJÐJÕJÕJÔJÐJÑJÔJÑJÔJÐJÐJÐJÐJÐJÐJÐJØ�Y”-ˆØ�{Ô# GÔ,Ð3°Ð3Ð,°Ò3Ð3Ð3Ð3Õ3Ô3Ð3Ð3Ð3Ð3Ð,°Ð3Ñ3Ô3Õ3Ô3Ð,Ñ3Ô3Õ3Ô3°Ñ3Ô3Ð3Ð3Ñ3Ð3Ð3Ð3Ð3Ð3Ñ3Ð3Õ3Õ3Ô3Ð3Ñ3Ô3Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ø�yÔ!Ð) TÐ)Ð! TÐ)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)Ð! TÐ)Ñ)Ô)Õ)Ô)Ð!Ñ)Ô)Õ)Ô) TÑ)Ô)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ø Ô-×3Ò3Ñ5Ô5ð 	Kð 	K‰HˆC�ØÐJ�3˜!’8ÐJÐJÐJÕJÔJÐJÐJÐJÐJ�3˜!ÐJÑJÔJÐJÕJÔJÑJÔJÐJÐJÕJÔJ�3ÑJÔJÐJÕJÔJ�3ÑJÔJÐJÐJÕJÔJ˜!ÑJÔJÐJÐJÑJÐJÕJÔJÐJ¨ÐJÐJÀSÐJÐJÑJÔJÐJÑJÐJÐJÐJÑJÐJÕJÕJÔJÐJÑJÔJÑJÔJÐJÐJÐJÐJÐJÐJð	Kð 	KrD   c                ó�
  — |d         }|d         }d}||u }|s„t          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }t          j        d|› �¦  «        dz   d	|iz  }t	          t          j        |¦  «        ¦  «        ‚d
x}x}}|d         }|d         }	t          |	¦  «        }d}
||
k    }|sòt          j        d|fd||
f¦  «        dt          j        ¦   «         v st          j	        t          ¦  «        rt          j        t          ¦  «        nddt          j        ¦   «         v st          j	        |	¦  «        rt          j        |	¦  «        ndt          j        |¦  «        t          j        |
¦  «        dœz  }dd|iz  }t	          t          j        |¦  «        ¦  «        ‚d
x}x}}
t          |	¦  «        D �]Õ\  }}|d         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd	|iz  }t	          t          j        |¦  «        ¦  «        ‚d
x}x}}|d         }d}||u }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd	|iz  }t	          t          j        |¦  «        ¦  «        ‚d
x}x}}|d         }d}||z
  }||k    }|sªt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }t	          t          j        |¦  «        ¦  «        ‚d
x}x}x}}�Œ×|d         d         }d }||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd	|iz  }t	          t          j        |¦  «        ¦  «        ‚d
x}x}}|d         d         }d!}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd	|iz  }t	          t          j        |¦  «        ¦  «        ‚d
x}x}}|d         d"         }d#}||u }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd	|iz  }t	          t          j        |¦  «        ¦  «        ‚d
x}x}}d
S )$zMVerifies 6-portal cycle: depletion, map teleport, mob refresh, 7th rejection.Útest3_portal_traversalrJ   TrK   rM   rN   z Portal traversal stress failed: rQ   rR   NrS   ÚportalHistoryé   rV   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sÚlenÚhistory)rj   rO   rk   rR   zassert %(py8)sr   ÚzoneÚzone_tang_kiem_nhairX   rY   ÚwildMobsÚremé   )z%(py1)s == (%(py4)s - %(py5)s)Úidx)rO   rP   r   Úattempt7Úzone_player_hideoutr   ÚactF)r%   r&   r*   r-   r.   r/   rv   r'   r(   r)   Ú	enumerate)r[   rC   Út3r8   r7   r]   r^   r<   rS   rw   Ú@py_assert5r5   r=   r}   Úentryr6   s                   rB   Ú;test_client_map_portal_traversal_stress_and_monster_refreshzpTestEmpiricalSpawnerGatingAndDropFlushingAdversarial.test_client_map_portal_traversal_stress_and_monster_refreshÓ   sn  € ð $Ð$<Ô=ˆØ�(Œ|ÐL˜tÐLˆ|˜tÐ#ÐLÐLÐLÕLÔLÐLÐLÐLÐLˆ|˜tÐLÑLÔLÕLÔLˆ|ÑLÔLÕLÔL˜tÑLÔLÐLÐLÑLÐLÕLÔLÐ%LÈÐ%LÐ%LÑLÔLÐLÑLÐLÐLÐLÑLÐLÕLÕLÔLÐLÑLÔLÑLÔLÐLÐLÐLÐLÐLÐLÐLØ�Y”-ˆØ˜/Ô*ˆÝ�7‰|Œ|Ð ˜qÐ ˆ|˜qÒ Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆ|˜qÐ Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô �sÑ Ô Ð Õ Ô �sÑ Ô Ð Ð Ð Õ Ô Ñ Ô Ð Ð Õ Ô �7Ñ Ô Ð Õ Ô �7Ñ Ô Ð Ð Õ Ô ˆ|Ñ Ô Õ Ô ˜qÑ Ô Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð Ð Ð Ý# GÑ,Ô,ð 	+ñ 	+‰JˆC�Ø˜”=Ð9Ð$9Ð9�=Ð$9Ò9Ð9Ð9Ð9Õ9Ô9Ð9Ð9Ð9Ð9�=Ð$9Ð9Ñ9Ô9Õ9Ô9�=Ñ9Ô9Õ9Ô9Ð$9Ñ9Ô9Ð9Ð9Ñ9Ð9Ð9Ð9Ð9Ð9Ñ9Ð9Õ9Õ9Ô9Ð9Ñ9Ô9Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ø˜Ô$Ð,¨Ð,Ð$¨Ð,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð$¨Ð,Ñ,Ô,Õ,Ô,Ð$Ñ,Ô,Õ,Ô,¨Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ø˜”<Ð* 1Ð* 1 s¡7Ð*�< 7Ò*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*�< 7Ð*Ñ*Ô*Õ*Ô*�<Ñ*Ô*Õ*Ô* 1Ñ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô* sÑ*Ô*Ð*Õ*Ô* sÑ*Ô*Ð*Ð*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ñ*Ø�zÔ" 6Ô*ÐCÐ.CÐCÐ*Ð.CÒCÐCÐCÐCÕCÔCÐCÐCÐCÐCÐ*Ð.CÐCÑCÔCÕCÔCÐ*ÑCÔCÕCÔCÐ.CÑCÔCÐCÐCÑCÐCÐCÐCÐCÐCÑCÐCÕCÕCÔCÐCÑCÔCÑCÔCÐCÐCÐCÐCÐCÐCÐCØ�zÔ" 5Ô)Ð.¨QÐ.Ð)¨QÒ.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.Ð)¨QÐ.Ñ.Ô.Õ.Ô.Ð)Ñ.Ô.Õ.Ô.¨QÑ.Ô.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ø�zÔ" 5Ô)Ð2¨UÐ2Ð)¨UÐ2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2Ð)¨UÐ2Ñ2Ô2Õ2Ô2Ð)Ñ2Ô2Õ2Ô2¨UÑ2Ô2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2rD   c                óD  — |d         }|d         }d}||u }|s�t          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }t          j        d¦  «        dz   d	|iz  }t	          t          j        |¦  «        ¦  «        ‚d
x}x}}d
S )zQVerifies 50 rapid back-and-forth zone transitions maintain zero drop/mob leakage.Útest4_stress_rapid_cyclerJ   TrK   rM   rN   z'Rapid zone transition endurance failed!rQ   rR   NrZ   )r[   rC   Út4r8   r7   r]   r^   r<   s           rB   Ú0test_client_rapid_transition_endurance_50_cycleszeTestEmpiricalSpawnerGatingAndDropFlushingAdversarial.test_client_rapid_transition_endurance_50_cyclesä   sÌ   € ð $Ð$>Ô?ˆØ�(Œ|ÐN˜tÐNˆ|˜tÐ#ÐNÐNÐNÕNÔNÐNÐNÐNÐNˆ|˜tÐNÑNÔNÕNÔNˆ|ÑNÔNÕNÔN˜tÑNÔNÐNÐNÑNÐNÕNÔNÐ%NÑNÔNÐNÑNÐNÐNÐNÑNÐNÕNÕNÔNÐNÑNÔNÑNÔNÐNÐNÐNÐNÐNÐNÐNÐNÐNrD   c                óR  — t          ¦   «         }dD �]”}|                     |d¬¦  «        \  }}d}||u }|s—t          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd	|iz  }t          t          j	        |¦  «        ¦  «        ‚d
x}}g }d}||v }	|	}
|	sd}||v }|}
|sd}||v }|}
|
�sæt          j        d|	fd||f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }| 
                    |¦  «         |	�st          j        d|fd||f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }| 
                    |¦  «         |s‹t          j        d|fd||f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }| 
                    |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d
x}
x}x}x}	x}x}x}}|                     |d¬¦  «        \  }}d}||u }|s—t          j        d|fd||f¦  «        d t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd t          j        |¦  «        dœz  }dd	|iz  }t          t          j	        |¦  «        ¦  «        ‚d
x}}�Œ–d
S )!zHValidates that ZoneEngine authoritative validation rejects hostile mobs.)r   Úzone_boundless_sanctuaryF)Úis_dummyrK   )z%(py0)s is %(py3)sÚallowed_mobri   zassert %(py5)sr   Nu   An ToÃ nÚHideoutÚ	Sanctuary)Úin)z%(py3)s in %(py5)sÚ
reason_mob)rk   r   z%(py7)sÚpy7)z%(py10)s in %(py12)s)r   Úpy12z%(py14)sÚpy14)z%(py17)s in %(py19)s)Úpy17r   z%(py21)sÚpy21r   zassert %(py24)sÚpy24TÚallowed_dummy)r   Úvalidate_monster_spawnr%   r&   r'   r(   r)   r*   r.   r/   r+   r,   )r[   ÚengineÚzidr�   r‘   r]   r4   ro   rp   r5   r8   Ú@py_assert9r;   Ú@py_assert16Ú@py_assert18Ú@py_format8Ú@py_format13r>   rA   Ú@py_format22Ú@py_format23Ú@py_format25r˜   Ú_s                           rB   Ú1test_server_authoritative_spawn_rejection_fuzzingzfTestEmpiricalSpawnerGatingAndDropFlushingAdversarial.test_server_authoritative_spawn_rejection_fuzzingë   s“  € å‘”ˆØFð 	)ñ 	)ˆCØ&,×&CÒ&CÀCÐRWÐ&CÑ&XÔ&XÑ#ˆK˜Ø"'Ð'�; %Ð'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'�; %Ð'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'�;Ñ'Ô'Ð'Õ'Ô'�;Ñ'Ô'Ð'Ð'Õ'Ô' %Ñ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'ØcÐc�:Ðc�: Ð+ÐcÐcÐcÐcÐc¨yÐc¨y¸JÐ/FÐcÐcÐcÐcÐcÈ+ÐcÈ+ÐYcÐJcÐcÐcÐcÐcÑcÕcÔcÐcÐcÐcÐc�: ÐcÑcÔcÕcÔc�:ÑcÔcÐcÕcÔcÑcÔcÐcÐcÕcÔc ÑcÔcÐcÕcÔc ÑcÔcÐcÐcÐcÐcÑcÐcÐcÐcÐcÐcÑcÐcÐc×cÒcÐcÑcÔcÐcÐcÑcÕcÔcÐcÐcÐcÐc¨y¸JÐcÑcÔcÕcÔc¨yÑcÔcÐcÕcÔcÑcÔcÐcÐcÕcÔc¸JÑcÔcÐcÕcÔc¸JÑcÔcÐcÐcÐcÐcÑcÐcÐcÐcÐcÐcÑcÐcÐc×cÒcÐcÑcÔcÐcÐcÐcÕcÔcÐcÐcÐcÐcÈ+ÐYcÐcÑcÔcÕcÔcÈ+ÑcÔcÐcÕcÔcÑcÔcÐcÐcÕcÔcÐYcÑcÔcÐcÕcÔcÐYcÑcÔcÐcÐcÐcÐcÑcÐcÐcÐcÐcÐcÑcÐcÐc×cÒcÐcÑcÔcÐcÕcÔcÐcÐcÑcÔcÐcÑcÐcÐcÐcÐcÐcÑcÐcÕcÕcÔcÐcÑcÔcÑcÔcÐcÐcÐcÐcÐcÐcÐcÐcÐcÐcÐcÐcÐcÐcÐcÐcÐcØ%×<Ò<¸SÈ4Ð<ÑPÔPÑˆM˜1Ø$(Ð(�= DÐ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(�= DÐ(Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(�=Ñ(Ô(Ð(Õ(Ô(�=Ñ(Ô(Ð(Ð(Õ(Ô( DÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ñ(ð	)ð 	)rD   c                óî  — t          ¦   «         }|j        d         }|j        d         }t          d¦  «        D ]J}|                     t	          d|z   t          |dz  ¦  «        t          |dz  ¦  «        ¬¦  «        ¦  «         ŒK|j        }t          |¦  «        }d}||k    }|�st          j	        d|fd||f¦  «        d	t          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nd	d
t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd
t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}x}}|j        }t          |¦  «        }d}||k    }|�st          j	        d|fd||f¦  «        d	t          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nd	dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}x}}|j        }d}d}d} ||||¬¦  «        }t          |¦  «        }d}||k    }|�sQt          j	        d|fd||f¦  «        d	t          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nd	dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœ	z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}}dS )zIValidates spatial grid boundary isolation between wilderness and hideout.ry   r   re   i�_ é2   )Ú	entity_idÚxÚy)ú>=)zN%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.entities
})
} >= %(py8)srv   Ú	wild_grid)rj   rO   rk   r   r   zassert %(py10)sr   Nr   rV   )zN%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.entities
})
} == %(py8)sÚhideout_gridg        é
   )Úradius_cells)z›%(py13)s
{%(py13)s = %(py0)s(%(py11)s
{%(py11)s = %(py3)s
{%(py3)s = %(py1)s.get_entities_in_aoi
}(%(py5)s, %(py7)s, radius_cells=%(py9)s)
})
} == %(py16)s)	rj   rO   rk   r   r’   Úpy9Úpy11r   r   zassert %(py18)sÚpy18)r   Úzone_spatial_gridsÚrangeÚ
add_entityr   ÚfloatÚentitiesrv   r%   r&   r'   r(   r)   r*   r.   r/   Úget_entities_in_aoi)r[   rš   r¬   r­   Úir]   r5   Ú@py_assert7r6   r=   Ú@py_format11Ú@py_assert8Ú@py_assert10r9   Ú@py_assert15r:   r?   Ú@py_format19s                     rB   Ú5test_server_spatial_grid_drop_isolation_on_transitionzjTestEmpiricalSpawnerGatingAndDropFlushingAdversarial.test_server_spatial_grid_drop_isolation_on_transitionõ   s¾  € å‘”ˆØÔ-Ð.CÔDˆ	ØÔ0Ð1FÔGˆÝ�s‘”ð 	að 	aˆAØ× Ò ¥°%¸!±)½uÀQÈÁV¹}¼}ÕPUÐVWÐ[]ÑV]ÑP^ÔP^Ð!_Ñ!_Ô!_Ñ`Ô`Ð`Ð`ØÔ%Ð-�sÐ%Ñ&Ô&Ð-¨#Ð-Ð&¨#Ò-Ð-Ð-Ñ-Õ-Ô-Ð-Ð-Ð-Ð-Ð&¨#Ð-Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-�sÑ-Ô-Ð-Õ-Ô-�sÑ-Ô-Ð-Ð-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-�9Ñ-Ô-Ð-Õ-Ô-�9Ñ-Ô-Ð-Ð-Õ-Ô-Ð%Ñ-Ô-Õ-Ô-Ð&Ñ-Ô-Õ-Ô-¨#Ñ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-ØÔ(Ð.�sÐ(Ñ)Ô)Ð.¨QÐ.Ð)¨QÒ.Ð.Ð.Ñ.Õ.Ô.Ð.Ð.Ð.Ð.Ð)¨QÐ.Ñ.Ô.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô.�sÑ.Ô.Ð.Õ.Ô.�sÑ.Ô.Ð.Ð.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô.�<Ñ.Ô.Ð.Õ.Ô.�<Ñ.Ô.Ð.Ð.Õ.Ô.Ð(Ñ.Ô.Õ.Ô.Ð)Ñ.Ô.Õ.Ô.¨QÑ.Ô.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.ØÔ3ÐT°CÐT¸ÐTÈ2ÐTÐ3Ð3°C¸È2ÐNÑNÔNÐT�sÐNÑOÔOÐTÐSTÐTÐOÐSTÒTÐTÐTÑTÕTÔTÐTÐTÐTÐTÐOÐSTÐTÑTÔTÐTÕTÔTÑTÔTÐTÐTÕTÔT�sÑTÔTÐTÕTÔT�sÑTÔTÐTÐTÐTÕTÔTÑTÔTÐTÐTÕTÔT�<ÑTÔTÐTÕTÔT�<ÑTÔTÐTÐTÕTÔTÐ3ÑTÔTÕTÔT°CÑTÔTÕTÔT¸ÑTÔTÕTÔTÈ2ÑTÔTÕTÔTÐNÑTÔTÕTÔTÐOÑTÔTÕTÔTÐSTÑTÔTÐTÐTÑTÐTÐTÐTÐTÐTÑTÐTÕTÕTÔTÐTÑTÔTÑTÔTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTrD   N)rC   r   r   rG   )r   rG   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r`   rq   r…   r‰   r¥   rÀ   © rD   rB   rF   rF   ¹   s    € € € € € ØDÐDð	2ð 	2ð 	2ð 	2ð
Kð 
Kð 
Kð 
Kð3ð 3ð 3ð 3ð"Oð Oð Oð Oð)ð )ð )ð )ð	Uð 	Uð 	Uð 	Uð 	Uð 	UrD   rF   )r   r   )rÄ   Ú
__future__r   Úbuiltinsr'   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter%   r0   ÚosÚpathlibr   r   Útypingr   r   ÚpytestÚserver.world.spatial_gridr   Úserver.world.zone_enginer   r!   ÚfixturerC   rF   rÅ   rD   rB   ú<module>rÒ      s2  ððð ð #Ð "Ð "Ð "Ð "Ð "Ø  € € € € € € € € € € € € €€€€Ø 	€	€	€	Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð Ð Ð Ø €€€à ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø /Ð /Ð /Ð /Ð /Ð /ðQÐ ðh €„�hÐÑÔð3ð 3ð 3ñ  Ôð3ðEUð EUð EUð EUð EUñ EUô EUð EUð EUð EUrD   