§
    =¿jq(  ã                  óÆ  — d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	m
Z
mZ  eej        d¦  «        rej                             d¬¦  «          ee¦  «                             ¦   «         j        j        j        Zed	z  d
z  Zedz  dz  dz  Zedz  dz  dz  Zedz  dz  dz  Zedz  dz  dz  Zdd„Z G d„ dej        ¦  «        Zedk    r ej        ¦   «          dS dS )aC  
Unit/Node Empirical Challenger Stress Harness for FreeExile Reactive i18n Subsystem (Milestone 2).
Adversarial Verification Targets:
1. 1,000 rapid programmatic switches cycling across all 9 languages in < 1000ms.
2. Character set encoding veracity for non-Latin scripts (Chinese, Japanese, Korean, Thai, German, Russian).
3. Zero subscriber / listener leaks under rapid registration & unregistration loops.
4. Exception resilience and subscriber isolation during burst notifications.
5. Ring buffer message retention and date formatting stability across multi-language cycles.
é    )ÚannotationsN)ÚPath)ÚAnyÚDictÚreconfigureúutf-8)ÚencodingÚclientÚwebappÚjsÚdatazi18n.jszi18n_catalog.jszchat_i18n_catalog.jsÚuiz
chat_ui.jsÚreturnúDict[str, Any]c            	     óp  — t          t          ¦  «                             dd¦  «        } t          t          ¦  «                             dd¦  «        }t          t          ¦  «                             dd¦  «        }t          t
          ¦  «                             dd¦  «        }d|› d|› d| › d|› d�	}t          j        dd	d
|gdddt          t          ¦  «        ¬¦  «        }|j	        dk    r't          d|j	        › d|j        › d|j        › �¦  «        ‚t          |j                             ¦   «                              d¦  «        ¦  «        D ]V}|                     ¦   «         }|                     d¦  «        r+|                     d¦  «        rt%          j        |¦  «        c S ŒWt)          d|j        › �¦  «        ‚)zPExecutes high-throughput Node.js stress testing against i18n engine and chat UI.ú\ú/aÔ  
import fs from 'fs';
import vm from 'vm';
import { performance } from 'perf_hooks';

global.Image = class { constructor() { this.src = ''; } };
const storage = {};
global.localStorage = {
  getItem: (k) => storage[k] || null,
  setItem: (k, v) => { storage[k] = String(v); },
  removeItem: (k) => { delete storage[k]; }
};

const listeners = {};
global.CustomEvent = class CustomEvent {
  constructor(t, i = {}) { this.type = t; this.detail = i.detail || {}; }
};
global.window = {
  addEventListener: (n, cb) => { listeners[n] = listeners[n] || []; listeners[n].push(cb); },
  removeEventListener: (n, cb) => { if (listeners[n]) listeners[n] = listeners[n].filter(f => f !== cb); },
  dispatchEvent: (e) => { (listeners[e.type] || []).forEach(f => f(e)); },
  localStorage: global.localStorage
};

const elements = new Map();
const createMockEl = (id = '', tag = 'div') => ({
  id, tagName: tag.toUpperCase(), dataset: {}, textContent: '', innerText: '', value: '', placeholder: '',
  disabled: false, className: '', classList: { add: () => {}, remove: () => {}, contains: () => false },
  appendChild: (c) => c, querySelectorAll: () => [], querySelector: () => null, addEventListener: () => {}
});
const getEl = (id) => { if (!elements.has(id)) elements.set(id, createMockEl(id)); return elements.get(id); };
const tabs = Array.from({ length: 8 }, (_, i) => {
  const t = createMockEl('chat-tab-' + (i + 1), 'button');
  t.dataset.channelId = String(i + 1);
  return t;
});

global.document = {
  readyState: 'complete',
  getElementById: (id) => getEl(id),
  createElement: (tag) => createMockEl('', tag),
  querySelectorAll: (sel) => (sel === '.chat-channel-tab' ? tabs : []),
  addEventListener: () => {}
};

const catCode = fs.readFileSync('zÆ', 'utf-8');
const sb = { window: global.window };
vm.createContext(sb);
vm.runInContext(catCode, sb);
global.I18N_CATALOG = global.window.I18N_CATALOG;

const chatCatModule = await import('file:///zV');
global.CHAT_I18N_CATALOG = chatCatModule.CHAT_I18N_CATALOG;
await import('file:///zS');
const i18n = global.window.FreeExileI18n;
const chatUI = await import('file:///a©  ');
chatUI.initChatUI();

const report = {};

// 1. Stress Test: 1,000 rapid programmatic switches (< 1000ms SLA)
const allLocales = ['vi', 'en', 'zh', 'ja', 'ko', 'th', 'de', 'ru', 'es'];
const t0 = performance.now();
for (let i = 0; i < 1000; i++) {
  i18n.setLocale(allLocales[i % allLocales.length]);
}
const t1 = performance.now();
report.switches1000DurationMs = t1 - t0;
report.finalLocale = i18n.getLocale();

// 2. Non-Latin Script Encoding Veracity & Direct String Assertions
const scriptCheck = {};
for (const loc of allLocales) {
  i18n.setLocale(loc);
  scriptCheck[loc] = {
    worldTab: tabs[0].textContent,
    sendBtn: getEl('chat-send-btn').textContent,
    badgeLocked: i18n.t('chat_badge_locked'),
    systemNotice: i18n.t('chat_perm_system_only'),
    rarity5: i18n.t('rarity_5')
  };
}
report.scriptCheck = scriptCheck;

// 3. Zero Subscriber Leaks Under 500 Subscriptions/Unsubscriptions
const initialListenerCount = i18n.listeners.length;
const unsubs = [];
for (let i = 0; i < 500; i++) {
  unsubs.push(i18n.subscribe(() => {}));
}
report.peakListenerCount = i18n.listeners.length;
unsubs.forEach(u => u());
report.postCleanupListenerCount = i18n.listeners.length;
report.zeroLeak = report.postCleanupListenerCount === initialListenerCount;

// 4. Burst Exception Isolation
let executedAfterThrow = 0;
const noisySub1 = i18n.subscribe(() => { throw new Error('Simulated burst failure'); });
const safeSub1 = i18n.subscribe(() => { executedAfterThrow++; });
for (let i = 0; i < 20; i++) {
  i18n.setLocale(allLocales[i % allLocales.length]);
}
noisySub1();
safeSub1();
report.executedAfterThrow = executedAfterThrow;

// 5. Ring Buffer History Integrity Across Multi-language Bursts
chatUI.addChatMessage({ channel: 1, senderName: 'Hero1', displayContent: 'Adversarial Message 1' });
chatUI.addChatMessage({ channel: 1, senderName: 'Hero2', displayContent: 'Adversarial Message 2' });
const countBefore = chatUI.getChannelHistory(1).length;
for (let i = 0; i < 50; i++) {
  i18n.setLocale(allLocales[i % allLocales.length]);
}
const countAfter = chatUI.getChannelHistory(1).length;
report.historyPreserved = countBefore === countAfter && countAfter >= 2;

console.log(JSON.stringify(report));
Únodez--input-type=modulez-eTr   )Úcapture_outputÚtextr	   Úcwdr   zNode execution failed (code z):
ú
Ú{Ú}z'Could not parse JSON report from Node:
)ÚstrÚI18N_JSÚreplaceÚ
CHAT_UI_JSÚCHAT_CATALOG_JSÚI18N_CATALOG_JSÚ
subprocessÚrunÚPROJECT_ROOTÚ
returncodeÚRuntimeErrorÚstderrÚstdoutÚreversedÚstripÚsplitÚ
startswithÚendswithÚjsonÚloadsÚ
ValueError)Úi18n_pÚ	chat_ui_pÚ
chat_cat_pÚ
i18n_cat_pÚscriptÚresÚlines          úBC:\Projects\FreeExile\tests\unit\test_challenger_m2_i18n_stress.pyÚrun_node_stress_harnessr8      sÛ  € å•‰\Œ\×!Ò! $¨Ñ,Ô,€FÝ•J‘”×'Ò'¨¨cÑ2Ô2€IÝ•_Ñ%Ô%×-Ò-¨d°CÑ8Ô8€JÝ•_Ñ%Ô%×-Ò-¨d°CÑ8Ô8€JðuðZ #-ð[uð uðf .8ðguð uðj ðkuð uðn '0ðouð uð u€Fõn Œ.Ø	Ð&¨¨fÐ5ØØØÝ•ÑÔðñ ô €Cð „~˜ÒÐÝÐh¸#¼.ÐhÐhÈcÌjÐhÐhÐ\_Ô\fÐhÐhÑiÔiÐiÝ˜œ×)Ò)Ñ+Ô+×1Ò1°$Ñ7Ô7Ñ8Ô8ð $ð $ˆØ�zŠz‰|Œ|ˆØ�?Š?˜3ÑÔð 	$ D§M¢M°#Ñ$6Ô$6ð 	$Ý”:˜dÑ#Ô#Ð#Ð#Ð#øÝ
ÐLÀÄ
ÐLÐLÑ
MÔ
MÐMó    c                  óŠ   — e Zd ZU dZi Zded<   edd„¦   «         Zdd„Zdd„Z	dd	„Z
dd
„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„ZdS )ÚTestChallengerM2I18nStresszSAdversarial unit-level stress testing verifying performance and non-Latin encoding.r   Úreportr   ÚNonec                ó,   — t          ¦   «         | _        d S )N)r8   r<   )Úclss    r7   Ú
setUpClassz%TestChallengerM2I18nStress.setUpClass²   s   € å,Ñ.Ô.ˆŒ
ˆ
ˆ
r9   c                ó˜   — | j         d         }|                      |dd|› d�¦  «         |                      | j         d         d¦  «         dS )zA1,000 programmatic language switches must complete within 1000ms.Úswitches1000DurationMsg     @�@z1000 switches took zms, exceeded 1000ms SLAÚfinalLocaleÚviN)r<   Ú
assertLessÚassertEqual)ÚselfÚdurs     r7   Ú.test_01_one_thousand_switches_under_one_secondzITestChallengerM2I18nStress.test_01_one_thousand_switches_under_one_second¶   sT   € àŒkÐ2Ô3ˆØ�Š˜˜VÐ%W¸3Ð%WÐ%WÐ%WÑXÔXÐXØ×Ò˜œ ]Ô3°TÑ:Ô:Ð:Ð:Ð:r9   c                ó  — | j         d         d         }|                      |d         d¦  «         |                      |d         d¦  «         |                      |d         d¦  «         |                      |d	         d
¦  «         dS )z<Verifies Chinese Hanzi characters render without corruption.ÚscriptCheckÚzhÚworldTabu   ä¸–ç•ŒÚsendBtnu   å�‘é€�ÚbadgeLockedu	   å·²é”�å®šÚrarity5õ   å¤ªå�¤N©r<   rF   )rG   rL   s     r7   Útest_02_chinese_script_veracityz:TestChallengerM2I18nStress.test_02_chinese_script_veracity¼   s‚   € àŒ[˜Ô'¨Ô-ˆØ×Ò˜˜Jœ¨Ñ2Ô2Ð2Ø×Ò˜˜Iœ¨Ñ1Ô1Ð1Ø×Ò˜˜MÔ*¨KÑ8Ô8Ð8Ø×Ò˜˜Iœ¨Ñ1Ô1Ð1Ð1Ð1r9   c                ó  — | j         d         d         }|                      |d         d¦  «         |                      |d         d¦  «         |                      |d         d¦  «         |                      |d	         d
¦  «         dS )z?Verifies Japanese Kanji, Hiragana, and Katakana render cleanly.rK   ÚjarM   u   ãƒ¯ãƒ¼ãƒ«ãƒ‰rN   u   é€�ä¿¡rO   u	   ãƒ­ãƒƒã‚¯rP   rQ   NrR   )rG   rU   s     r7   Ú$test_03_japanese_kanji_kana_veracityz?TestChallengerM2I18nStress.test_03_japanese_kanji_kana_veracityÄ   s‚   € àŒ[˜Ô'¨Ô-ˆØ×Ò˜˜Jœ¨Ñ8Ô8Ð8Ø×Ò˜˜Iœ¨Ñ1Ô1Ð1Ø×Ò˜˜MÔ*¨KÑ8Ô8Ð8Ø×Ò˜˜Iœ¨Ñ1Ô1Ð1Ð1Ð1r9   c                ó  — | j         d         d         }|                      |d         d¦  «         |                      |d         d¦  «         |                      |d         d¦  «         |                      |d	         d
¦  «         dS )z0Verifies Korean Hangul syllables render cleanly.rK   ÚkorM   u   ì›”ë“œrN   u   ì „ì†¡rO   u   ìž ê¹€rP   u   íƒœê³ NrR   )rG   rX   s     r7   Útest_04_korean_hangul_veracityz9TestChallengerM2I18nStress.test_04_korean_hangul_veracityÌ   s‚   € àŒ[˜Ô'¨Ô-ˆØ×Ò˜˜Jœ¨Ñ2Ô2Ð2Ø×Ò˜˜Iœ¨Ñ1Ô1Ð1Ø×Ò˜˜MÔ*¨HÑ5Ô5Ð5Ø×Ò˜˜Iœ¨Ñ1Ô1Ð1Ð1Ð1r9   c                ó  — | j         d         d         }|                      |d         d¦  «         |                      |d         d¦  «         |                      |d         d¦  «         |                      |d	         d
¦  «         dS )z+Verifies Thai script glyphs render cleanly.rK   ÚthrM   u	   à¹‚à¸¥à¸�rN   u	   à¸ªà¹ˆà¸‡rO   u   à¸¥à¹‡à¸­à¸„rP   u   à¹‚à¸šà¸£à¸²à¸“à¸�à¸²à¸¥NrR   )rG   r[   s     r7   Útest_05_thai_script_veracityz7TestChallengerM2I18nStress.test_05_thai_script_veracityÔ   sƒ   € àŒ[˜Ô'¨Ô-ˆØ×Ò˜˜Jœ¨Ñ5Ô5Ð5Ø×Ò˜˜Iœ¨Ñ4Ô4Ð4Ø×Ò˜˜MÔ*¨NÑ;Ô;Ð;Ø×Ò˜˜IœÐ(BÑCÔCÐCÐCÐCr9   c                ó  — | j         d         d         }|                      |d         d¦  «         |                      |d         d¦  «         |                      |d         d¦  «         |                      |d	         d
¦  «         dS )u4   Verifies German umlauts (Ã¤, Ã¶, Ã¼) render cleanly.rK   ÚderM   ÚWeltrN   ÚSendenrO   ÚGesperrtrP   ÚUraltNrR   )rG   r^   s     r7   Útest_06_german_umlauts_veracityz:TestChallengerM2I18nStress.test_06_german_umlauts_veracityÜ   s‚   € àŒ[˜Ô'¨Ô-ˆØ×Ò˜˜Jœ¨Ñ0Ô0Ð0Ø×Ò˜˜Iœ¨Ñ1Ô1Ð1Ø×Ò˜˜MÔ*¨JÑ7Ô7Ð7Ø×Ò˜˜Iœ¨Ñ0Ô0Ð0Ð0Ð0r9   c                ó  — | j         d         d         }|                      |d         d¦  «         |                      |d         d¦  «         |                      |d         d¦  «         |                      |d	         d
¦  «         dS )z4Verifies Russian Cyrillic characters render cleanly.rK   ÚrurM   u   ÐœÐ¸Ñ€rN   u   ÐžÑ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÑŒrO   u   Ð‘Ð»Ð¾ÐºrP   u   Ð”Ñ€ÐµÐ²Ð½Ð¸Ð¹NrR   )rG   re   s     r7   Ú!test_07_russian_cyrillic_veracityz<TestChallengerM2I18nStress.test_07_russian_cyrillic_veracityä   s„   € àŒ[˜Ô'¨Ô-ˆØ×Ò˜˜Jœ¨Ñ2Ô2Ð2Ø×Ò˜˜IœÐ(<Ñ=Ô=Ð=Ø×Ò˜˜MÔ*¨JÑ7Ô7Ð7Ø×Ò˜˜IœÐ(8Ñ9Ô9Ð9Ð9Ð9r9   c                ó¦   — |                       | j        d         d¦  «         |                      | j        d         | j        d         dz
  ¦  «         dS )zHAsserts zero memory/listener leaks after 500 subscriptions and cleanups.ÚzeroLeakz0Listeners were leaked after unsubscription burstÚpostCleanupListenerCountÚpeakListenerCountiô  N)Ú
assertTruer<   rF   ©rG   s    r7   Ú(test_08_subscriber_leak_free_under_burstzCTestChallengerM2I18nStress.test_08_subscriber_leak_free_under_burstì   sP   € à�Š˜œ JÔ/Ð1cÑdÔdÐdØ×Ò˜œÐ%?Ô@À$Ä+ÐNaÔBbÐehÑBhÑiÔiÐiÐiÐir9   c                óH   — |                       | j        d         d¦  «         dS )zFAsserts subscriber throwing errors does not interrupt other listeners.ÚexecutedAfterThrowé   N)rF   r<   rl   s    r7   Ú'test_09_exception_isolation_under_burstzBTestChallengerM2I18nStress.test_09_exception_isolation_under_burstñ   s&   € à×Ò˜œÐ%9Ô:¸BÑ?Ô?Ð?Ð?Ð?r9   c                óF   — |                       | j        d         ¦  «         dS )zKAsserts chat ring buffer is preserved intact across rapid switching bursts.ÚhistoryPreservedN)rk   r<   rl   s    r7   Ú!test_10_chat_history_preservationz<TestChallengerM2I18nStress.test_10_chat_history_preservationõ   s"   € à�Š˜œÐ$6Ô7Ñ8Ô8Ð8Ð8Ð8r9   N)r   r=   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r<   Ú__annotations__Úclassmethodr@   rI   rS   rV   rY   r\   rc   rf   rm   rq   rt   © r9   r7   r;   r;   ­   s  € € € € € € Ø]Ð]à€FÐÐÐÑàð/ð /ð /ñ „[ð/ð;ð ;ð ;ð ;ð2ð 2ð 2ð 2ð2ð 2ð 2ð 2ð2ð 2ð 2ð 2ðDð Dð Dð Dð1ð 1ð 1ð 1ð:ð :ð :ð :ðjð jð jð jð
@ð @ð @ð @ð9ð 9ð 9ð 9ð 9ð 9r9   r;   Ú__main__)r   r   )rx   Ú
__future__r   r-   r!   ÚsysÚunittestÚpathlibr   Útypingr   r   Úhasattrr'   r   Ú__file__ÚresolveÚparentr#   Ú
CLIENT_DIRr   r    r   r   r8   ÚTestCaser;   ru   Úmainr{   r9   r7   ú<module>r‰      sŸ  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ð Ð à
€7ˆ3Œ:�}Ñ%Ô%ð -Ø„J×Ò GÐÑ,Ô,Ð,àˆt�H‰~Œ~×%Ò%Ñ'Ô'Ô.Ô5Ô<€Ø˜HÑ$ xÑ/€
Ø
�tÑ
˜fÑ
$ yÑ
0€Ø˜tÑ# fÑ,Ð/@Ñ@€Ø˜tÑ# fÑ,Ð/EÑE€Ø˜$Ñ Ñ%¨Ñ4€
ðKNð KNð KNð KNð\J9ð J9ð J9ð J9ð J9 Ô!2ñ J9ô J9ð J9ðZ ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr9   