src/HOL/Library/code_test.ML
changeset 72272 6931ab4f1a47
parent 70784 799437173553
child 72273 b8f32e830e95
equal deleted inserted replaced
72269:88880eecd7fe 72272:6931ab4f1a47
   159   let
   159   let
   160     val thy = Proof_Context.theory_of ctxt
   160     val thy = Proof_Context.theory_of ctxt
   161     val (driver, target) =
   161     val (driver, target) =
   162       (case get_driver thy compiler of
   162       (case get_driver thy compiler of
   163         NONE => error ("No driver for target " ^ compiler)
   163         NONE => error ("No driver for target " ^ compiler)
   164       | SOME f => f)
   164       | SOME drv => drv)
   165     val debug = Config.get (Proof_Context.init_global thy) overlord
   165     val debug = Config.get (Proof_Context.init_global thy) overlord
   166     val with_dir = if debug then with_overlord_dir else Isabelle_System.with_tmp_dir
   166     val with_dir = if debug then with_overlord_dir else Isabelle_System.with_tmp_dir
   167     fun evaluate result =
   167     fun evaluate result =
   168       with_dir "Code_Test" (driver ctxt ((apfst o map o apfst) Long_Name.implode result))
   168       with_dir "Code_Test" (driver ctxt ((apfst o map o apfst) Long_Name.implode result))
   169       |> parse_result compiler
   169       |> parse_result compiler
   227     val result = dynamic_value_strict ctxt t target
   227     val result = dynamic_value_strict ctxt t target
   228 
   228 
   229     val failed =
   229     val failed =
   230       filter_out (fst o fst o fst) (result ~~ ts ~~ evals)
   230       filter_out (fst o fst o fst) (result ~~ ts ~~ evals)
   231       handle ListPair.UnequalLengths =>
   231       handle ListPair.UnequalLengths =>
   232         error ("Evaluation failed!\nWrong number of test results: " ^ Int.toString (length result))
   232         error ("Evaluation failed!\nWrong number of test results: " ^ string_of_int (length result))
   233   in
   233   in
   234     (case failed of [] =>
   234     (case failed of [] =>
   235       ()
   235       ()
   236     | _ => error (Pretty.string_of (pretty_failures ctxt target failed)))
   236     | _ => error (Pretty.string_of (pretty_failures ctxt target failed)))
   237   end
   237   end
   312 
   312 
   313         val (out, res) = Isabelle_System.bash_output run_cmd
   313         val (out, res) = Isabelle_System.bash_output run_cmd
   314         val _ =
   314         val _ =
   315           if res = 0 then ()
   315           if res = 0 then ()
   316           else error ("Evaluation for " ^ compilerN ^ " terminated with error code " ^
   316           else error ("Evaluation for " ^ compilerN ^ " terminated with error code " ^
   317             Int.toString res ^ "\nBash output:\n" ^ out)
   317             string_of_int res ^ "\nBash output:\n" ^ out)
   318       in out end
   318       in out end
   319   in run end
   319   in run end
   320 
   320 
   321 
   321 
   322 (* driver for PolyML *)
   322 (* driver for PolyML *)
   494 
   494 
   495     fun mk_code_file name = Path.append path (Path.basic name)
   495     fun mk_code_file name = Path.append path (Path.basic name)
   496     val driver_path = Path.append path (Path.basic driverN)
   496     val driver_path = Path.append path (Path.basic driverN)
   497     val driver =
   497     val driver =
   498       "module Main where {\n" ^
   498       "module Main where {\n" ^
   499       String.concat (map (fn module => "import qualified " ^ unsuffix ".hs" module ^ ";\n") modules) ^
   499       implode (map (fn module => "import qualified " ^ unsuffix ".hs" module ^ ";\n") modules) ^
   500       "main = do {\n" ^
   500       "main = do {\n" ^
   501       "    let {\n" ^
   501       "    let {\n" ^
   502       "      format_term Nothing = \"\";\n" ^
   502       "      format_term Nothing = \"\";\n" ^
   503       "      format_term (Just t) = t ();\n" ^
   503       "      format_term (Just t) = t ();\n" ^
   504       "      format (True, _) = \"" ^ successN ^ "\\n\";\n" ^
   504       "      format (True, _) = \"" ^ successN ^ "\\n\";\n" ^
   581         >> (fn (ts, targets) => Toplevel.keep (test_code_cmd ts targets o Toplevel.context_of)))
   581         >> (fn (ts, targets) => Toplevel.keep (test_code_cmd ts targets o Toplevel.context_of)))
   582 
   582 
   583 val target_Scala = "Scala_eval"
   583 val target_Scala = "Scala_eval"
   584 val target_Haskell = "Haskell_eval"
   584 val target_Haskell = "Haskell_eval"
   585 
   585 
   586 val _ = Theory.setup 
   586 val _ = Theory.setup
   587    (Code_Target.add_derived_target (target_Scala, [(Code_Scala.target, I)])
   587    (Code_Target.add_derived_target (target_Scala, [(Code_Scala.target, I)])
   588     #> Code_Target.add_derived_target (target_Haskell, [(Code_Haskell.target, I)]))
   588     #> Code_Target.add_derived_target (target_Haskell, [(Code_Haskell.target, I)]))
   589 
   589 
   590 val _ =
   590 val _ =
   591   Theory.setup (fold add_driver
   591   Theory.setup (fold add_driver