import {
  processStringWithLogsSync,
  encodeJSBinding,
  defaultJSSetup,
} from "../src/index"

const processJS = (js: string, context?: object) => {
  return processStringWithLogsSync(encodeJSBinding(js), context)
}

describe("Javascript", () => {
  beforeAll(() => {
    defaultJSSetup()
  })

  describe("Test logging in JS bindings", () => {
    it("should execute a simple expression", () => {
      const output = processJS(
        `console.log("hello"); 
         console.log("world"); 
         console.log("foo"); 
         return "hello"`
      )
      expect(output.result).toEqual("hello")
      expect(output.logs[0].log).toEqual(["hello"])
      expect(output.logs[0].line).toEqual(1)
      expect(output.logs[1].log).toEqual(["world"])
      expect(output.logs[1].line).toEqual(2)
      expect(output.logs[2].log).toEqual(["foo"])
      expect(output.logs[2].line).toEqual(3)
    })
  })

  it("should log comma separated values", () => {
    const output = processJS(`console.log(1, { a: 1 }); return 1`)
    expect(output.logs[0].log).toEqual([1, JSON.stringify({ a: 1 })])
    expect(output.logs[0].line).toEqual(1)
  })

  it("should return the type working with warn", () => {
    const output = processJS(`console.warn("warning"); return 1`)
    expect(output.logs[0].log).toEqual(["warning"])
    expect(output.logs[0].line).toEqual(1)
    expect(output.logs[0].type).toEqual("warn")
  })

  it("should return the type working with error", () => {
    const output = processJS(`console.error("error"); return 1`)
    expect(output.logs[0].log).toEqual(["error"])
    expect(output.logs[0].line).toEqual(1)
    expect(output.logs[0].type).toEqual("error")
  })
})