import { describe, expect, it } from 'vitest'

import { camelToPascal, indent, jsComment, snakeToCamel } from './utils.js'

describe('snakeToCamel', () => {
    it('should convert snake_case to camelCase', () => {
        expect(snakeToCamel('snake_case')).toEqual('snakeCase')
    })

    it('should correctly handle numbers', () => {
        expect(snakeToCamel('snake_case_123')).toEqual('snakeCase123')
        expect(snakeToCamel('snake_case123')).toEqual('snakeCase123')
    })
})

describe('camelToPascal', () => {
    it('should convert camelCase to PascalCase', () => {
        expect(camelToPascal('camelCase')).toEqual('CamelCase')
    })

    it('should correctly handle numbers', () => {
        expect(camelToPascal('camelCase123')).toEqual('CamelCase123')
    })
})

describe('jsComment', () => {
    it('should format comments correctly', () => {
        expect(jsComment('This is a comment')).toEqual('/**\n * This is a comment\n */')
    })

    it('should wrap long comments correctly', () => {
        expect(jsComment('This is a very long comment which should be wrapped around here')).toEqual(
            '/**\n * This is a very long comment which should be wrapped around\n * here\n */',
        )
    })

    it('should not break up links', () => {
        expect(jsComment('This is a very long comment that wraps nearby a {@link link} yeah')).toEqual(
            '/**\n * This is a very long comment that wraps nearby a {@link link}\n * yeah\n */',
        )
        expect(jsComment('This is a very long comment that wraps nearby this {@link link} yeah')).toEqual(
            '/**\n * This is a very long comment that wraps nearby this\n * {@link link} yeah\n */',
        )
    })
})

describe('indent', () => {
    it('should indent correctly', () => {
        expect(indent(4, 'This is a comment')).toEqual('    This is a comment')
    })

    it('should indent correctly with multiple lines', () => {
        expect(indent(4, 'This is a comment\nThis is another comment')).toEqual(
            '    This is a comment\n    This is another comment',
        )
    })
})
