-- The examples also constitute the test suite: Make sure they all compile. import Control.Monad import Control.Exception import System.Directory import System.IO import System.IO.Temp import System.Process import System.Exit import qualified Examples.Blink.Demo import qualified Examples.Button.Demo import qualified Examples.EEPROM.Demo import qualified Examples.EEPROMrange.Demo import qualified Examples.Random.Demo import qualified Examples.Robot.Demo import qualified Examples.SerialPort.Demo import qualified Examples.WaterHeater.Demo import qualified Examples.ButtonHold.Demo data TestCase = TestCase { desc :: String , builder :: IO () , compileC :: Bool } tests :: [TestCase] tests = [ TestCase "Blink" Examples.Blink.Demo.main True , TestCase "Button" Examples.Button.Demo.main True -- EEPROM needs an additional arduino libraries installed to -- compile the generated C code, so that is skipped. , TestCase "EEPROM" Examples.EEPROM.Demo.main False , TestCase "EEPROMrange" Examples.EEPROMrange.Demo.main False , TestCase "Random" Examples.Random.Demo.main True , TestCase "Robot" Examples.Robot.Demo.main True , TestCase "SerialPort" Examples.SerialPort.Demo.main True , TestCase "WaterHeater" Examples.WaterHeater.Demo.main True , TestCase "ButtonHold" Examples.ButtonHold.Demo.main True ] main :: IO () main = do canccompile <- doesFileExist arduinoMakefile unless canccompile $ putStrLn $ "Skipping C compilation tests, did not find Arduino-Makefile installed in " ++ arduinoMakefile forM_ tests (runtest canccompile) runtest :: Bool -> TestCase -> IO () runtest canccompile t = withSystemTempDirectory "arduino-copilot-test" $ \tmpdir -> bracket (setup tmpdir) cleanup (const copilottest) where setup tmpdir = do setCurrentDirectory tmpdir cleanup _ = return () copilottest = do putStr (desc t ++ " copilot ") hFlush stdout r <- try' (builder t) case r of Right () -> do putStrLn "OK" hFlush stdout ccompiletest Left ex -> putStrLn ("FAILED: " ++ show ex) ccompiletest = when (canccompile && compileC t) $ do putStr (desc t ++ " C compilation ") writeFile "Makefile" $ unlines -- All examples currently use uno. [ "BOARD_TAG = uno" , "include " ++ arduinoMakefile ] r <- readCreateProcessWithExitCode (proc "make" []) "" case r of (ExitSuccess, _, _) -> putStrLn "OK" (_, _out, err) -> do putStrLn "FAILED" putStrLn err try' :: IO () -> IO (Either SomeException ()) try' = try -- This is the location it's installed to on a Debian system -- by apt-get install arduino-mk arduinoMakefile :: FilePath arduinoMakefile = "/usr/share/arduino/Arduino.mk"