Skip to content
markpaper

src/assets/leverage.test.ts

v0.3.0 · 2.1 KB

Download file
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);
  });
});
All files