content: {-# LANGUAGE QuasiQuotes #-}
  
  module GCC (
      gccTests
    ) where
  
  import Test.Framework
  import Test.Framework.Providers.HUnit
  import Test.HUnit (Assertion, assert, (@?=))
  
  import qualified Data.ByteString.Char8 as B
  import Data.Char (isSpace)
  import Data.Loc (SrcLoc, noLoc, startPos)
  import Control.Exception (SomeException)
  import Language.C.Quote.GCC
  import Language.C.Smart ()
  import qualified Language.C.Syntax as C
  import qualified Language.C.Parser as P
  import Text.PrettyPrint.Mainland
  import Text.PrettyPrint.Mainland.Class
  
  gccTests :: Test
  gccTests = testGroup "GCC attribute quotations"
      [ testCase "attr antiquote" test_attr
      , testCase "attrs antiquote" test_attrs
      , testCase "attrs antiquote pretty" test_attr_p
      , testCase "case ranges quote" test_case_ranges
      , testCase "case ranges pretty" test_case_ranges_p
      ]
    where
      test_attr :: Assertion
      test_attr =
           [cedecl| int test __attribute__(($attr:a,$attr:b));|]
             @?=
           [cedecl| int test __attribute__((section(".sram2"), noinit));|]
        where
          a = [cattr| section(".sram2") |]
          b = [cattr| noinit |]
  
      test_attrs :: Assertion
      test_attrs =
           [cedecl| int test __attribute__(($attrs:as));|]
             @?=
           [cedecl| int test __attribute__((section(".sram2"), noinit));|]
        where
          a = [cattr| section(".sram2") |]
          b = [cattr| noinit |]
          as = [ a, b ]
  
      test_attr_p :: Assertion
      test_attr_p =
        pretty 80 (ppr [cattr|section(".sram2")|]) @?= "section(\".sram2\")"
  
      test_case_ranges :: Assertion
      test_case_ranges = assert $ case [cstm| case 10 ... 20: ; |] of
        C.CaseRange 10 20 (C.Exp Nothing _) _ -> True
        _ -> False
  
      test_case_ranges_p :: Assertion
      test_case_ranges_p =
        pretty 80 (ppr [cstm| case 10 ... 20: ; |]) @?= "\ncase 10 ... 20:\n;"
  