import type { Margin } from './spaces.js';
import { withMargin, withSpace } from './spaces.js';

describe('withMargin', () => {
  it('returns an empty object for empty input', () => {
    const marginProps: Margin = {};
    const result = withMargin(marginProps);
    expect(result).toEqual({});
  });

  it('applies margin to the top', () => {
    const marginProps: Margin = { mt: '10' };
    const result = withMargin(marginProps);
    expect(result).toEqual({ marginTop: '10px' });
  });

  it('applies margin to the left and right', () => {
    const marginProps: Margin = { mx: '20' };
    const result = withMargin(marginProps);
    expect(result).toEqual({ marginLeft: '20px', marginRight: '20px' });
  });

  it('applies margin to the top and bottom', () => {
    const marginProps: Margin = { my: '15' };
    const result = withMargin(marginProps);
    expect(result).toEqual({
      marginBottom: '15px',
      marginTop: '15px',
    });
  });

  it('applies margin to all sides', () => {
    const marginProps: Margin = { m: '25' };
    const result = withMargin(marginProps);
    expect(result).toEqual({
      margin: '25px',
    });
  });

  it('applies margin to specified sides when provided', () => {
    const marginProps: Margin = { mt: '5', mr: '10', mb: '15', ml: '20' };
    const result = withMargin(marginProps);
    expect(result).toEqual({
      marginBottom: '15px',
      marginLeft: '20px',
      marginRight: '10px',
      marginTop: '5px',
    });
  });

  it('ignores invalid margin values', () => {
    const marginProps: Margin = { m: 'invalid', mt: '5', mx: 'valid' };
    const result = withMargin(marginProps);
    expect(result).toEqual({
      marginTop: '5px',
    });
  });
});

describe('withSpace', () => {
  it('returns an empty object for undefined value', () => {
    const result = withSpace(undefined, ['margin']);
    expect(result).toEqual({});
  });

  it('applies space to the specified properties', () => {
    const result = withSpace(15, ['marginTop', 'marginLeft']);
    expect(result).toEqual({ marginTop: '15px', marginLeft: '15px' });
  });
});
