import { compileStyle, parse } from '../src'
import { mockId, compile, assertCode } from './util'
describe('CSS vars injection', () => {
  test('generating correct code for nested paths', () => {
    const { content } = compile(
      `\n` +
        ``
    )
    expect(content).toMatch(`_useCssVars((_vm, _setup) => ({
  "${mockId}-color": (_vm.color),
  "${mockId}-font_size": (_vm.font.size)
})`)
    assertCode(content)
  })
  test('w/ normal \n` +
        ``
    )
    expect(content).toMatch(`_useCssVars((_vm, _setup) => ({
  "${mockId}-size": (_vm.size)
})`)
    expect(content).toMatch(`import { useCssVars as _useCssVars } from 'vue'`)
    assertCode(content)
  })
  test('w/ \n` +
        ``
    )
    // should handle:
    // 1. local const bindings
    // 2. local potential ref bindings
    // 3. props bindings (analyzed)
    expect(content).toMatch(`_useCssVars((_vm, _setup) => ({
  "${mockId}-color": (_setup.color),
  "${mockId}-size": (_setup.size),
  "${mockId}-foo": (_vm.foo)
})`)
    expect(content).toMatch(`import { useCssVars as _useCssVars } from 'vue'`)
    assertCode(content)
  })
  test('should rewrite CSS vars in compileStyle', () => {
    const { code } = compileStyle({
      source: `.foo {
        color: v-bind(color);
        font-size: v-bind('font.size');
      }`,
      filename: 'test.css',
      id: 'data-v-test'
    })
    expect(code).toMatchInlineSnapshot(`
      ".foo[data-v-test] {
              color: var(--test-color);
              font-size: var(--test-font_size);
      }"
    `)
  })
  test('prod mode', () => {
    const { content } = compile(
      `\n` +
        ``,
      { isProd: true }
    )
    expect(content).toMatch(`_useCssVars((_vm, _setup) => ({
  "4003f1a6": (_vm.color),
  "41b6490a": (_vm.font.size)
}))}`)
    const { code } = compileStyle({
      source: `.foo {
        color: v-bind(color);
        font-size: v-bind('font.size');
      }`,
      filename: 'test.css',
      id: mockId,
      isProd: true
    })
    expect(code).toMatchInlineSnapshot(`
      ".foo[xxxxxxxx] {
              color: var(--4003f1a6);
              font-size: var(--41b6490a);
      }"
    `)
  })
  describe('codegen', () => {
    test('\n` +
            ``
        ).content
      )
    })
    test('\n` +
            ``
        ).content
      )
    })
    test('\n` + ``
        ).content
      )
    })
    test('w/ \n` +
            ``
        ).content
      )
    })
    //#4185
    test('should ignore comments', () => {
      const { content } = compile(
        `\n` +
          ``
      )
      expect(content).not.toMatch(`"${mockId}-color": (_setup.color)`)
      expect(content).toMatch(`"${mockId}-width": (_setup.width)`)
      assertCode(content)
    })
    test('w/ \n` +
          ``
      )
      // color should only be injected once, even if it is twice in style
      expect(content).toMatch(`_useCssVars((_vm, _setup) => ({
  "${mockId}-color": (_setup.color)
})`)
      assertCode(content)
    })
    test('should work with w/ complex expression', () => {
      const { content } = compile(
        `\n` +
          ``
      )
      expect(content).toMatch(`_useCssVars((_vm, _setup) => ({
  "${mockId}-foo": (_setup.foo),
  "${mockId}-foo____px_": (_setup.foo + 'px'),
  "${mockId}-_a___b____2____px_": ((_setup.a + _setup.b) / 2 + 'px'),
  "${mockId}-__a___b______2___a_": (((_setup.a + _setup.b)) / (2 * _setup.a))
})`)
      assertCode(content)
    })
    // #6022
    test('should be able to parse incomplete expressions', () => {
      const { cssVars } = parse({
        source: `
        `
      })
      expect(cssVars).toMatchObject([`count.toString(`, `xxx`])
    })
  })
})