@@warning("-44")
module InternalExpressionValue = ReducerInterface_InternalExpressionValue
module Project = ForTS_ReducerProject
module Bindings = Reducer_Bindings

open Jest
open Expect
open Expect.Operators

describe("Parse includes", () => {
  let project = Project.createProject()
  Project.setSource(
    project,
    "main",
    `
#include 'common'
x=1`,
  )
  Project.parseIncludes(project, "main")
  test("dependencies", () => {
    expect(Project.getDependencies(project, "main")) == ["common"]
  })
  test("dependents", () => {
    expect(Project.getDependents(project, "main")) == []
  })
  test("getIncludes", () => {
    let mainIncludes = Project.getIncludes(project, "main")
    switch mainIncludes {
    | Ok(includes) => expect(includes) == ["common"]
    | Error(error) => fail(error->Reducer_ErrorValue.errorToString)
    }
  })
  let internalProject = project->Project.T.Private.castToInternalProject
  test("past chain", () => {
    expect(Project.Private.getPastChain(internalProject, "main")) == ["common"]
  })
  test("import as variables", () => {
    expect(Project.Private.getIncludesAsVariables(internalProject, "main")) == []
  })
})

describe("Parse includes", () => {
  let project = Project.createProject()
  Project.setSource(
    project,
    "main",
    `
#include 'common'
#include 'myModule' as myVariable
x=1`,
  )
  Project.parseIncludes(project, "main")

  test("dependencies", () => {
    expect(Project.getDependencies(project, "main")) == ["common", "myModule"]
  })

  test("dependents", () => {
    expect(Project.getDependents(project, "main")) == []
  })

  test("getIncludes", () => {
    let mainIncludes = Project.getIncludes(project, "main")
    switch mainIncludes {
    | Ok(includes) => expect(includes) == ["common", "myModule"]
    | Error(error) => fail(error->Reducer_ErrorValue.errorToString)
    }
  })

  let internalProject = project->Project.T.Private.castToInternalProject

  test("direct past chain", () => {
    expect(Project.Private.getPastChain(internalProject, "main")) == ["common"]
  })

  test("direct includes", () => {
    expect(Project.Private.getDirectIncludes(internalProject, "main")) == ["common"]
  })

  test("include as variables", () => {
    expect(Project.Private.getIncludesAsVariables(internalProject, "main")) == [
        ("myVariable", "myModule"),
      ]
  })
})

describe("Parse multiple direct includes", () => {
  let project = Project.createProject()
  Project.setSource(
    project,
    "main",
    `
#include 'common' 
#include 'common2'
#include 'myModule' as myVariable
x=1`,
  )
  Project.parseIncludes(project, "main")
  test("dependencies", () => {
    expect(Project.getDependencies(project, "main")) == ["common", "common2", "myModule"]
  })
  test("dependents", () => {
    expect(Project.getDependents(project, "main")) == []
  })
  test("getIncludes", () => {
    let mainIncludes = Project.getIncludes(project, "main")
    switch mainIncludes {
    | Ok(includes) => expect(includes) == ["common", "common2", "myModule"]
    | Error(error) => fail(error->Reducer_ErrorValue.errorToString)
    }
  })
  let internalProject = project->Project.T.Private.castToInternalProject
  test("direct past chain", () => {
    expect(Project.getPastChain(project, "main")) == ["common", "common2"]
  })
  test("include as variables", () => {
    expect(Project.Private.getIncludesAsVariables(internalProject, "main")) == [
        ("myVariable", "myModule"),
      ]
  })
})