first commmit

This commit is contained in:
jakciehan
2026-05-06 08:17:32 +08:00
commit 427a33c55b
269 changed files with 20906 additions and 0 deletions
+71
View File
@@ -0,0 +1,71 @@
import { StorageMgr, IStorageDriver } from '@common/StorageMgr';
function makeMemoryDriver(): IStorageDriver {
const m = new Map<string, string>();
return {
getItem: (k) => (m.has(k) ? (m.get(k) as string) : null),
setItem: (k, v) => {
m.set(k, v);
},
removeItem: (k) => {
m.delete(k);
},
};
}
describe('StorageMgr', () => {
it('returns default when key is missing', () => {
const sm = new StorageMgr(makeMemoryDriver());
expect(sm.get('nope', { v: 1 })).toEqual({ v: 1 });
});
it('round-trips structured values via JSON', () => {
const sm = new StorageMgr(makeMemoryDriver());
const layout = { jump: { x: 100, y: 40 }, shuriken: { x: 820, y: 40 } };
sm.set('layout', layout);
expect(sm.get('layout', null)).toEqual(layout);
});
it('returns default when value is malformed JSON (req 17.6)', () => {
const broken: IStorageDriver = {
getItem: () => '{not json',
setItem: () => {},
removeItem: () => {},
};
const sm = new StorageMgr(broken);
expect(sm.get('x', 'fallback')).toBe('fallback');
});
it('does not throw when the driver throws (req 17.6)', () => {
const exploding: IStorageDriver = {
getItem: () => {
throw new Error('I/O error');
},
setItem: () => {
throw new Error('I/O error');
},
removeItem: () => {},
};
const sm = new StorageMgr(exploding);
expect(() => sm.get('x', 'ok')).not.toThrow();
expect(sm.get('x', 'ok')).toBe('ok');
expect(() => sm.set('x', 'value')).not.toThrow();
});
it('remove() deletes the key', () => {
const sm = new StorageMgr(makeMemoryDriver());
sm.set('k', 123);
sm.remove('k');
expect(sm.get('k', -1)).toBe(-1);
});
it('setDriver swaps the underlying driver', () => {
const sm = new StorageMgr(makeMemoryDriver());
sm.set('k', 1);
const fresh = makeMemoryDriver();
sm.setDriver(fresh);
expect(sm.get('k', 0)).toBe(0);
sm.set('k', 2);
expect(sm.get('k', 0)).toBe(2);
});
});