content: module Runtime.Positive where
  
  import Base
  import Runtime.Base
  
  data PosTest = PosTest
    { _name :: String,
      _relDir :: Path Rel Dir,
      _file :: Path Rel File,
      _expectedFile :: Path Rel File
    }
  
  makeLenses ''PosTest
  
  root :: Path Abs Dir
  root = relToProject $(mkRelDir "tests/runtime/positive/")
  
  testDescr :: PosTest -> TestDescr
  testDescr PosTest {..} =
    let tRoot = root <//> _relDir
        file' = tRoot <//> _file
        expected' = tRoot <//> _expectedFile
        optLevel :: Int = 3
     in TestDescr
          { _testName = _name,
            _testRoot = tRoot,
            _testAssertion = Steps $ clangAssertion optLevel file' expected' ""
          }
  
  allTests :: TestTree
  allTests =
    testGroup
      "Runtime positive tests"
      (map (mkTest . testDescr) tests)
  
  tests :: [PosTest]
  tests =
    [ PosTest
        "Test001: HelloWorld"
        $(mkRelDir ".")
        $(mkRelFile "test001.c")
        $(mkRelFile "out/test001.out"),
      PosTest
        "Test002: Page allocation"
        $(mkRelDir ".")
        $(mkRelFile "test002.c")
        $(mkRelFile "out/test002.out"),
      PosTest
        "Test003: Printing of integers"
        $(mkRelDir ".")
        $(mkRelFile "test003.c")
        $(mkRelFile "out/test003.out"),
      PosTest
        "Test004: Allocator for unstructured objects"
        $(mkRelDir ".")
        $(mkRelFile "test004.c")
        $(mkRelFile "out/test004.out"),
      PosTest
        "Test005: Allocator for unstructured objects (macro API)"
        $(mkRelDir ".")
        $(mkRelFile "test005.c")
        $(mkRelFile "out/test005.out"),
      PosTest
        "Test006: Stack"
        $(mkRelDir ".")
        $(mkRelFile "test006.c")
        $(mkRelFile "out/test006.out"),
      PosTest
        "Test007: Prologue and epilogue"
        $(mkRelDir ".")
        $(mkRelFile "test007.c")
        $(mkRelFile "out/test007.out"),
      PosTest
        "Test008: Basic arithmetic"
        $(mkRelDir ".")
        $(mkRelFile "test008.c")
        $(mkRelFile "out/test008.out"),
      PosTest
        "Test009: Direct call"
        $(mkRelDir ".")
        $(mkRelFile "test009.c")
        $(mkRelFile "out/test009.out"),
      PosTest
        "Test010: Indirect call"
        $(mkRelDir ".")
        $(mkRelFile "test010.c")
        $(mkRelFile "out/test010.out"),
      PosTest
        "Test011: Tail calls"
        $(mkRelDir ".")
        $(mkRelFile "test011.c")
        $(mkRelFile "out/test011.out"),
      PosTest
        "Test012: Tracing and strings"
        $(mkRelDir ".")
        $(mkRelFile "test012.c")
        $(mkRelFile "out/test012.out"),
      PosTest
        "Test013: IO builtins"
        $(mkRelDir ".")
        $(mkRelFile "test013.c")
        $(mkRelFile "out/test013.out"),
      PosTest
        "Test014: Higher-order functions"
        $(mkRelDir ".")
        $(mkRelFile "test014.c")
        $(mkRelFile "out/test014.out"),
      PosTest
        "Test015: Branching, matching and recursion on lists"
        $(mkRelDir ".")
        $(mkRelFile "test015.c")
        $(mkRelFile "out/test015.out"),
      PosTest
        "Test016: Closure extension"
        $(mkRelDir ".")
        $(mkRelFile "test016.c")
        $(mkRelFile "out/test016.out"),
      PosTest
        "Test017: Recursion through higher-order functions"
        $(mkRelDir ".")
        $(mkRelFile "test017.c")
        $(mkRelFile "out/test017.out"),
      PosTest
        "Test018: Tail recursion through higher-order functions"
        $(mkRelDir ".")
        $(mkRelFile "test018.c")
        $(mkRelFile "out/test018.out"),
      PosTest
        "Test019: Dynamic closure extension"
        $(mkRelDir ".")
        $(mkRelFile "test019.c")
        $(mkRelFile "out/test019.out"),
      PosTest
        "Test020: Higher-order function composition"
        $(mkRelDir ".")
        $(mkRelFile "test020.c")
        $(mkRelFile "out/test020.out"),
      PosTest
        "Test021: Higher-order functions with apply"
        $(mkRelDir ".")
        $(mkRelFile "test021.c")
        $(mkRelFile "out/test021.out"),
      PosTest
        "Test022: Dynamic closure extension with apply"
        $(mkRelDir ".")
        $(mkRelFile "test022.c")
        $(mkRelFile "out/test022.out")
    ]
  