packages feed

libclang-bindings-0.1.0.0: test/Test/Util/Input/Examples.hs

-- | Example inputs
--
-- Intended for unqualified import.
module Test.Util.Input.Examples (ExampleInput(..)) where

import Test.Util.AST (AST (..))
import Test.Util.AST qualified as AST
import Test.Util.Input (TestInput)
import Test.Util.Input qualified as TestInput

import Clang.LowLevel.Core (CXCursorKind (..))

{-------------------------------------------------------------------------------
  Top-level
-------------------------------------------------------------------------------}

data ExampleInput =
    SingleFunction
  | SingleStruct
  | ThreeStructs

instance AST.IsConcrete ExampleInput where
  toTestInput = \case
      SingleFunction -> inputSingleFunction
      SingleStruct   -> inputSingleStruct
      ThreeStructs   -> inputThreeStructs

  toAbstractAST = \case
      SingleFunction -> astSingleFunction
      SingleStruct   -> astSingleStruct
      ThreeStructs   -> astThreeStructs

{-------------------------------------------------------------------------------
  Example: single function
-------------------------------------------------------------------------------}

astSingleFunction :: AST AST.Descr
astSingleFunction = AST $ AST.Siblings [
      AST.Node (AST.defaultDescr "f" CXCursor_FunctionDecl) $
        AST.Siblings []
    ]

inputSingleFunction :: TestInput
inputSingleFunction = TestInput.unlines [
      "void f();"
    ]

{-------------------------------------------------------------------------------
  Example: single struct
-------------------------------------------------------------------------------}

inputSingleStruct :: TestInput
inputSingleStruct = TestInput.unlines [
      "struct foo {"
    , "  int x;"
    , "  int y;"
    , "};"
    ]

astSingleStruct :: AST AST.Descr
astSingleStruct = AST $ AST.Siblings [
      AST.Node (AST.defaultDescr "foo" CXCursor_StructDecl) $ AST.Siblings [
          AST.Node (AST.defaultDescr "x" CXCursor_FieldDecl) $ AST.Siblings []
        , AST.Node (AST.defaultDescr "y" CXCursor_FieldDecl) $ AST.Siblings []
        ]
    ]

{-------------------------------------------------------------------------------
  Example: three structs
-------------------------------------------------------------------------------}

inputThreeStructs :: TestInput
inputThreeStructs = TestInput.unlines [
      "struct foo {"
    , "  int a;"
    , "  int b;"
    , "};"
    , ""
    , "struct bar {"
    , "  int c;"
    , "  int d;"
    , "};"
    , ""
    , "struct baz {"
    , "  int e;"
    , "  int f;"
    , "};"
    ]

astThreeStructs :: AST AST.Descr
astThreeStructs = AST $ AST.Siblings [
      AST.Node (AST.defaultDescr "foo" CXCursor_StructDecl) $ AST.Siblings [
          AST.Node (AST.defaultDescr "a" CXCursor_FieldDecl) $ AST.Siblings []
        , AST.Node (AST.defaultDescr "b" CXCursor_FieldDecl) $ AST.Siblings []
        ]
    , AST.Node (AST.defaultDescr "bar" CXCursor_StructDecl) $ AST.Siblings [
          AST.Node (AST.defaultDescr "c" CXCursor_FieldDecl) $ AST.Siblings []
        , AST.Node (AST.defaultDescr "d" CXCursor_FieldDecl) $ AST.Siblings []
        ]
    , AST.Node (AST.defaultDescr "baz" CXCursor_StructDecl) $ AST.Siblings [
          AST.Node (AST.defaultDescr "e" CXCursor_FieldDecl) $ AST.Siblings []
        , AST.Node (AST.defaultDescr "f" CXCursor_FieldDecl) $ AST.Siblings []
        ]
    ]