mirror of
https://github.com/anoma/juvix.git
synced 2025-01-07 16:22:14 +03:00
60236e7b58
* [cbackend] Adds an AST for C This should cover enough C to implement the microjuvix backend. * [cbackend] Add C serializer using language-c library We may decide to write our own serializer for the C AST but this demonstrates that the C AST is sufficient at least. * [cbackend] Declarations will always be typed * [cbackend] Add CPP support to AST * [cbackend] Rename some names for clarity * [cbackend] Add translation of InductiveDef to C * [cbackend] Add CLI for C backend * [cbackend] Add stdbool.h to file header * [cbackend] Allow Cpp and Verbatim code inline * [cbackend] Add a newline after printing C * [cbackend] Support foreign blocks * [cbackend] Add support for axioms * [cbackend] Remove code examples * [cbackend] wip FunctionDef including Expressions * [parser] Support esacping '}' inside a foreign block * [cbackend] Add support for patterns in functions * [cbackend] Add foreign C support to HelloWorld.mjuvix * hlint fixes * More hlint fixes not picked up by pre-commit * [cbackend] Remove CompileStatement from MonoJuvix * [cbackend] Add support for compile blocks * [cbackend] Move compileInfo extraction to MonoJuvixResult * [minihaskell] Fix compile block support * [chore] Remove ununsed isBackendSupported function * [chore] Remove unused imports * [cbackend] Use a Reader for pattern bindings * [cbackend] Fix compiler warnings * [cbackend] Add support for nested patterns * [cbackend] Use functions to instantiate argument names * [cbackend] Add non-exhaustive pattern error message * [cbackend] Adds test for c to WASM compile and execution * [cbackend] Add links to test dependencies in quickstart * [cbackend] Add test with inductive types and patterns * [cbackend] Fix indentation * [cbackend] Remove ExpressionTyped case https://github.com/heliaxdev/minijuvix/issues/79 * [lexer] Fix lexing of \ inside a foreign block * [cbackend] PR review fixes * [chore] Remove unused import * [cbackend] Rename CJuvix to MiniC * [cbackend] Rename MonoJuvixToC to MonoJuvixToMiniC * [cbackend] Add test for polymorphic function * [cbackend] Add module for string literals
67 lines
1.9 KiB
Haskell
67 lines
1.9 KiB
Haskell
module BackendC.Positive where
|
|
|
|
import Base
|
|
import Data.Text.IO qualified as TIO
|
|
import MiniJuvix.Pipeline
|
|
import MiniJuvix.Translation.MonoJuvixToMiniC as MiniC
|
|
import System.IO.Extra (withTempDir)
|
|
import System.Process qualified as P
|
|
|
|
data PosTest = PosTest
|
|
{ _name :: String,
|
|
_relDir :: FilePath
|
|
}
|
|
|
|
makeLenses ''PosTest
|
|
|
|
root :: FilePath
|
|
root = "tests/positive/MiniC"
|
|
|
|
mainFile :: FilePath
|
|
mainFile = "Input.mjuvix"
|
|
|
|
testDescr :: PosTest -> TestDescr
|
|
testDescr PosTest {..} =
|
|
let tRoot = root </> _relDir
|
|
in TestDescr
|
|
{ _testName = _name,
|
|
_testRoot = tRoot,
|
|
_testAssertion = Steps $ \step -> do
|
|
step "Check emscripten and wasmer are on path"
|
|
assertCmdExists "emcc"
|
|
assertCmdExists "wasmer"
|
|
|
|
step "C Generation"
|
|
let entryPoint = EntryPoint "." (return "Input.mjuvix")
|
|
p :: MiniC.MiniCResult <- runIO (upToMiniC entryPoint)
|
|
|
|
actual <-
|
|
withTempDir
|
|
( \dirPath -> do
|
|
let cOutputFile = dirPath </> "out.c"
|
|
wasmOutputFile = dirPath </> "out.wasm"
|
|
TIO.writeFile cOutputFile (p ^. MiniC.resultCCode)
|
|
step "WASM generation"
|
|
P.callProcess "emcc" ["-o", wasmOutputFile, cOutputFile]
|
|
step "WASM execution"
|
|
pack <$> P.readProcess "wasmer" [wasmOutputFile] ""
|
|
)
|
|
|
|
expected <- TIO.readFile "expected.golden"
|
|
step "Compare expected and actual program output"
|
|
assertEqDiff "check: WASM output = expected.golden" actual expected
|
|
}
|
|
|
|
allTests :: TestTree
|
|
allTests =
|
|
testGroup
|
|
"Backend C positive tests"
|
|
(map (mkTest . testDescr) tests)
|
|
|
|
tests :: [PosTest]
|
|
tests =
|
|
[ PosTest "HelloWorld" "HelloWorld",
|
|
PosTest "Inductive types and pattern matching" "Nat",
|
|
PosTest "Polymorphic types" "Polymorphism"
|
|
]
|