import { Mention } from './mention.js'
import { describe, expect, it } from 'vite-plus/test'

describe('mention Markdown', () => {
  it('parses mapped attributes', () => {
    const tokenizer = Mention.config.markdownTokenizer
    expect(tokenizer).toBeDefined()

    const token = tokenizer?.tokenize('[@ id="feature" char="#"]', [], null as any)

    expect(token).toMatchObject({
      attributes: {
        id: 'feature',
        mentionSuggestionChar: '#',
      },
    })
  })

  it('parses malformed attributes in linear time', () => {
    const tokenizer = Mention.config.markdownTokenizer
    expect(tokenizer).toBeDefined()

    const measure = (attributes: string) => {
      const startedAt = performance.now()
      tokenizer?.tokenize(`[@ ${attributes}]`, [], null as any)
      return performance.now() - startedAt
    }

    measure('warmup="true"')
    const sizes = [12_288, 24_576]
    sizes.forEach(size => {
      const attack = '0'.repeat(size)
      const control = '-'.repeat(attack.length)
      const controlDuration = measure(control)
      const attackDuration = measure(attack)

      expect(attackDuration).toBeLessThan(controlDuration * 20 + 100)
    })
  })

  it('only parses attributes at attribute boundaries', () => {
    const tokenizer = Mention.config.markdownTokenizer

    const token = tokenizer?.tokenize('[@ id="feature" prefix:char="#"]', [], null as any)

    expect(token).toMatchObject({ attributes: { id: 'feature' } })
  })
})
