import { compile } from '../src'

describe('ssr: v-for', () => {
  test('basic', () => {
    expect(compile(`<div v-for="i in list" />`).code).toMatchInlineSnapshot(`
      "const { _renderList } = require(\\"@vue/server-renderer\\")

      return function ssrRender(_ctx, _push, _parent) {
        _push(\`<!---->\`)
        _renderList(_ctx.list, (i) => {
          _push(\`<div></div>\`)
        })
        _push(\`<!---->\`)
      }"
    `)
  })

  test('nested content', () => {
    expect(compile(`<div v-for="i in list">foo<span>bar</span></div>`).code)
      .toMatchInlineSnapshot(`
      "const { _renderList } = require(\\"@vue/server-renderer\\")

      return function ssrRender(_ctx, _push, _parent) {
        _push(\`<!---->\`)
        _renderList(_ctx.list, (i) => {
          _push(\`<div>foo<span>bar</span></div>\`)
        })
        _push(\`<!---->\`)
      }"
    `)
  })

  test('nested v-for', () => {
    expect(
      compile(
        `<div v-for="row, i in list">` +
          `<div v-for="j in row">{{ i }},{{ j }}</div>` +
          `</div>`
      ).code
    ).toMatchInlineSnapshot(`
      "const { _interpolate, _renderList } = require(\\"@vue/server-renderer\\")

      return function ssrRender(_ctx, _push, _parent) {
        _push(\`<!---->\`)
        _renderList(_ctx.list, (row, i) => {
          _push(\`<div><!---->\`)
          _renderList(row, (j) => {
            _push(\`<div>\${_interpolate(i)},\${_interpolate(j)}</div>\`)
          })
          _push(\`<!----></div>\`)
        })
        _push(\`<!---->\`)
      }"
    `)
  })

  test('template v-for (text)', () => {
    expect(compile(`<template v-for="i in list">{{ i }}</template>`).code)
      .toMatchInlineSnapshot(`
      "const { _interpolate, _renderList } = require(\\"@vue/server-renderer\\")

      return function ssrRender(_ctx, _push, _parent) {
        _push(\`<!---->\`)
        _renderList(_ctx.list, (i) => {
          _push(\`<!---->\${_interpolate(i)}<!---->\`)
        })
        _push(\`<!---->\`)
      }"
    `)
  })

  test('template v-for (single element)', () => {
    expect(
      compile(`<template v-for="i in list"><span>{{ i }}</span></template>`)
        .code
    ).toMatchInlineSnapshot(`
      "const { _interpolate, _renderList } = require(\\"@vue/server-renderer\\")

      return function ssrRender(_ctx, _push, _parent) {
        _push(\`<!---->\`)
        _renderList(_ctx.list, (i) => {
          _push(\`<span>\${_interpolate(i)}</span>\`)
        })
        _push(\`<!---->\`)
      }"
    `)
  })

  test('template v-for (multi element)', () => {
    expect(
      compile(
        `<template v-for="i in list"><span>{{ i }}</span><span>{{ i + 1 }}</span></template>`
      ).code
    ).toMatchInlineSnapshot(`
      "const { _interpolate, _renderList } = require(\\"@vue/server-renderer\\")

      return function ssrRender(_ctx, _push, _parent) {
        _push(\`<!---->\`)
        _renderList(_ctx.list, (i) => {
          _push(\`<!----><span>\${_interpolate(i)}</span><span>\${_interpolate(i + 1)}</span><!---->\`)
        })
        _push(\`<!---->\`)
      }"
    `)
  })

  test('render loop args should not be prefixed', () => {
    const { code } = compile(
      `<div v-for="{ foo }, index in list">{{ foo + bar + index }}</div>`
    )
    expect(code).toMatch(`_ctx.bar`)
    expect(code).not.toMatch(`_ctx.foo`)
    expect(code).not.toMatch(`_ctx.index`)
    expect(code).toMatchInlineSnapshot(`
      "const { _interpolate, _renderList } = require(\\"@vue/server-renderer\\")

      return function ssrRender(_ctx, _push, _parent) {
        _push(\`<!---->\`)
        _renderList(_ctx.list, ({ foo }, index) => {
          _push(\`<div>\${_interpolate(foo + _ctx.bar + index)}</div>\`)
        })
        _push(\`<!---->\`)
      }"
    `)
  })
})