import { describe, expect, test } from 'vitest'
import { enhanceConsoleLog } from './enhance-logs'

const removeEmptySpace = (str: string) => {
  return str.replace(/\s/g, '').trim()
}

describe('enhance-logs', () => {
  test('it adds enhanced console.logs to console.log()', () => {
    const output = removeEmptySpace(
      enhanceConsoleLog(
        `
        console.log('This is a log')
        `,
        'test.jsx',
        3000,
      )!.code,
    )
    expect(
      output.includes(
        'http://localhost:3000/__tsd/open-source?source=test.jsx',
      ),
    ).toEqual(true)
    expect(output.includes('test.jsx:2:9')).toEqual(true)
    expect(output.includes(removeEmptySpace("'This is a log'"))).toEqual(true)
  })

  test('it does not add enhanced console.logs to console.log that is not called', () => {
    const output = enhanceConsoleLog(
      `
        console.log 
        `,
      'test.jsx',
      3000,
    )
    expect(output).toBe(undefined)
  })

  test('it does not add enhanced console.logs to console.log that is inside a comment', () => {
    const output = enhanceConsoleLog(
      `
        // console.log('This is a log')
        `,
      'test.jsx',
      3000,
    )
    expect(output).toBe(undefined)
  })

  test('it does not add enhanced console.logs to console.log that is inside a multiline comment', () => {
    const output = enhanceConsoleLog(
      `
        /*
        console.log('This is a log')
        */
        `,
      'test.jsx',
      3000,
    )
    expect(output).toBe(undefined)
  })

  test('it does not add enhanced console.error to console.error that is inside a comment', () => {
    const output = enhanceConsoleLog(
      `
        // console.error('This is a log')
        `,
      'test.jsx',
      3000,
    )
    expect(output).toBe(undefined)
  })

  test('it does not add enhanced console.error to console.error that is inside a multiline comment', () => {
    const output = enhanceConsoleLog(
      `
        /*
        console.error('This is a log')
        */
        `,
      'test.jsx',
      3000,
    )
    expect(output).toBe(undefined)
  })

  test('it adds enhanced console.error to console.error()', () => {
    const output = removeEmptySpace(
      enhanceConsoleLog(
        `
        console.error('This is a log')
        `,
        'test.jsx',
        3000,
      )!.code,
    )
    expect(
      output.includes(
        'http://localhost:3000/__tsd/open-source?source=test.jsx',
      ),
    ).toEqual(true)
    expect(output.includes('test.jsx:2:9')).toEqual(true)
    expect(output.includes(removeEmptySpace("'This is a log'"))).toEqual(true)
  })

  test('it does not add enhanced console.error to console.error that is not called', () => {
    const output = enhanceConsoleLog(
      `
        console.log 
        `,
      'test.jsx',
      3000,
    )
    expect(output).toBe(undefined)
  })

  test('it adds enhanced console.log with css formatting to console.log()', () => {
    const output = removeEmptySpace(
      enhanceConsoleLog(
        `
        console.log('This is a log')
        `,
        'test.jsx',
        3000,
      )!.code,
    )
    expect(output.includes('color:#A0A')).toEqual(true)
    expect(output.includes('color:#FFF')).toEqual(true)
    expect(output.includes('color:#55F')).toEqual(true)
    expect(output.includes('color:#FFF')).toEqual(true)
  })
})
