src/assets/leverage.test.ts
v0.3.0 · 2.1 KB
import { describe, expect, it } from 'vitest';
import { leverageParams } from './leverage.js';
const perp = (maxLeverage: number, onlyIsolated: boolean) => ({ coin: 'xyz:SP500', market: 'perp' as const, maxLeverage, onlyIsolated });
describe('leverageParams', () => {
it('caps at maxLeverage (xyz:HOOD 10x) and reports clamping', () => {
expect(leverageParams(perp(10, true), 25)).toEqual({ leverage: 10, isCross: false, clamped: true });
});
it('floors to an integer and never goes below 1', () => {
expect(leverageParams(perp(50, false), 2.7)).toEqual({ leverage: 2, isCross: true, clamped: true });
expect(leverageParams(perp(50, false), 0.5)).toMatchObject({ leverage: 1, clamped: true });
expect(leverageParams(perp(50, false), 5)).toEqual({ leverage: 5, isCross: true, clamped: false });
});
it('derives isCross from onlyIsolated', () => {
expect(leverageParams(perp(20, true), 3).isCross).toBe(false);
expect(leverageParams(perp(20, false), 3).isCross).toBe(true);
});
it('rejects spot and invalid input', () => {
expect(() => leverageParams({ coin: '@107', market: 'spot', maxLeverage: 1, onlyIsolated: false }, 2)).toThrow(RangeError);
expect(() => leverageParams(perp(10, true), Number.NaN)).toThrow(RangeError);
expect(() => leverageParams(perp(10, true), 0)).toThrow(RangeError);
});
});
describe('leverageParams: float artifacts and bounds', () => {
it('a computed 0.3 / 0.1 (2.9999999999999996) gives 3, not 2, and is not reported as clamped', () => {
const wanted = 0.3 / 0.1;
expect(wanted).toBeLessThan(3);
expect(leverageParams(perp(50, false), wanted)).toEqual({ leverage: 3, isCross: true, clamped: false });
});
it('exactly maxLeverage is allowed; a huge value caps; Infinity and negatives throw', () => {
expect(leverageParams(perp(50, true), 50)).toEqual({ leverage: 50, isCross: false, clamped: false });
expect(leverageParams(perp(3, true), 1e9)).toMatchObject({ leverage: 3, clamped: true });
expect(() => leverageParams(perp(3, true), Number.POSITIVE_INFINITY)).toThrow(RangeError);
expect(() => leverageParams(perp(3, true), -2)).toThrow(RangeError);
});
});