src/HOL/Library/code_test.ML
author wenzelm
Fri, 26 Apr 2024 13:25:44 +0200
changeset 80150 96f60533ec1d
parent 78728 72631efa3821
permissions -rw-r--r--
update Windows test machines;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
59720
f893472fff31 proper headers;
wenzelm
parents: 59323
diff changeset
     1
(*  Title:      HOL/Library/code_test.ML
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
     2
    Author:     Andreas Lochbihler, ETH Zürich
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
     3
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
     4
Test infrastructure for the code generator.
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
     5
*)
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
     6
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
     7
signature CODE_TEST =
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
     8
sig
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
     9
  val add_driver:
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    10
    string * ((Proof.context -> (string * string) list * string -> Path.T -> string) * string) ->
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    11
    theory -> theory
72284
38497ecb4892 clarified signature;
wenzelm
parents: 72283
diff changeset
    12
  val debug: bool Config.T
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    13
  val test_terms: Proof.context -> term list -> string -> unit
64580
wenzelm
parents: 64579
diff changeset
    14
  val test_code_cmd: string list -> string list -> Proof.context -> unit
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    15
  val eval_term: string -> Proof.context -> term -> term
72276
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
    16
  val check_settings: string -> string -> string -> unit
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
    17
  val compile: string -> string -> unit
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
    18
  val evaluate: string -> string -> string
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    19
  val evaluate_in_polyml: Proof.context -> (string * string) list * string -> Path.T -> string
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    20
  val evaluate_in_mlton: Proof.context -> (string * string) list * string -> Path.T -> string
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    21
  val evaluate_in_smlnj: Proof.context -> (string * string) list * string -> Path.T -> string
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    22
  val evaluate_in_ocaml: Proof.context -> (string * string) list * string -> Path.T -> string
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    23
  val ghc_options: string Config.T
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    24
  val evaluate_in_ghc: Proof.context -> (string * string) list * string -> Path.T -> string
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    25
  val evaluate_in_scala: Proof.context -> (string * string) list * string -> Path.T -> string
66284
378895354604 new derived targets for evaluating Haskell and Scala programs
Andreas Lochbihler
parents: 65905
diff changeset
    26
  val target_Scala: string
378895354604 new derived targets for evaluating Haskell and Scala programs
Andreas Lochbihler
parents: 65905
diff changeset
    27
  val target_Haskell: string
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    28
end
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    29
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    30
structure Code_Test: CODE_TEST =
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    31
struct
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    32
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    33
(* convert a list of terms into nested tuples and back *)
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    34
74636
c35001872139 clarified antiquotations;
wenzelm
parents: 74561
diff changeset
    35
fun mk_tuples [] = \<^Const>\<open>Unity\<close>
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    36
  | mk_tuples [t] = t
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    37
  | mk_tuples (t :: ts) = HOLogic.mk_prod (t, mk_tuples ts)
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    38
74636
c35001872139 clarified antiquotations;
wenzelm
parents: 74561
diff changeset
    39
fun dest_tuples \<^Const_>\<open>Pair _ _ for l r\<close> = l :: dest_tuples r
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    40
  | dest_tuples t = [t]
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    41
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    42
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    43
fun last_field sep str =
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    44
  let
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    45
    val n = size sep
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    46
    val len = size str
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    47
    fun find i =
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    48
      if i < 0 then NONE
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    49
      else if String.substring (str, i, n) = sep then SOME i
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    50
      else find (i - 1)
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    51
  in
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    52
    (case find (len - n) of
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    53
      NONE => NONE
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    54
    | SOME i => SOME (String.substring (str, 0, i), String.extract (str, i + n, NONE)))
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    55
  end
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    56
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    57
fun split_first_last start stop s =
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    58
  (case first_field start s of
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    59
    NONE => NONE
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    60
  | SOME (initial, rest) =>
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    61
      (case last_field stop rest of
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    62
        NONE => NONE
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    63
      | SOME (middle, tail) => SOME (initial, middle, tail)))
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    64
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    65
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    66
(* data slot for drivers *)
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    67
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    68
structure Drivers = Theory_Data
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    69
(
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    70
  type T =
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    71
    (string * ((Proof.context -> (string * string) list * string -> Path.T -> string) * string)) list
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    72
  val empty = []
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    73
  fun merge data : T = AList.merge (op =) (K true) data
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    74
)
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    75
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    76
val add_driver = Drivers.map o AList.update (op =)
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    77
val get_driver = AList.lookup (op =) o Drivers.get
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    78
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    79
(*
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    80
  Test drivers must produce output of the following format:
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    81
72307
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
    82
  The start of the relevant data is marked with start_marker,
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
    83
  its end with end_marker.
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    84
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    85
  Between these two markers, every line corresponds to one test.
72307
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
    86
  Lines of successful tests start with success, failures start with failure.
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
    87
  The failure failure may continue with the YXML encoding of the evaluated term.
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    88
  There must not be any additional whitespace in between.
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    89
*)
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    90
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    91
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
    92
(* parsing of results *)
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    93
72307
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
    94
val success = "True"
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
    95
val failure = "False"
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
    96
val start_marker = "*@*Isabelle/Code_Test-start*@*"
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
    97
val end_marker = "*@*Isabelle/Code_Test-end*@*"
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    98
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
    99
fun parse_line line =
72307
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
   100
  if String.isPrefix success line then (true, NONE)
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
   101
  else if String.isPrefix failure line then (false,
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
   102
    if size line > size failure then
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
   103
      String.extract (line, size failure, NONE)
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   104
      |> YXML.parse_body
70784
799437173553 Term_XML.Encode/Decode.term uses Const "typargs";
wenzelm
parents: 69950
diff changeset
   105
      |> Term_XML.Decode.term_raw
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   106
      |> dest_tuples
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   107
      |> SOME
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   108
    else NONE)
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   109
  else raise Fail ("Cannot parse result of evaluation:\n" ^ line)
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   110
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   111
fun parse_result target out =
72307
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
   112
  (case split_first_last start_marker end_marker out of
72273
b8f32e830e95 tuned messages;
wenzelm
parents: 72272
diff changeset
   113
    NONE => error ("Evaluation failed for " ^ target ^ "!\nCompiler output:\n" ^ out)
65904
8411f1a2272c permissive trim_line as in Scala, e.g. relevant for poly/TextIO.print output on Windows;
wenzelm
parents: 65901
diff changeset
   114
  | SOME (_, middle, _) => middle |> trim_split_lines |> map parse_line)
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   115
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   116
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   117
(* pretty printing of test results *)
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   118
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   119
fun pretty_eval _ NONE _ = []
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   120
  | pretty_eval ctxt (SOME evals) ts =
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   121
      [Pretty.fbrk,
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   122
       Pretty.big_list "Evaluated terms"
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   123
         (map (fn (t, eval) => Pretty.block
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   124
           [Syntax.pretty_term ctxt t, Pretty.brk 1, Pretty.str "=", Pretty.brk 1,
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   125
            Syntax.pretty_term ctxt eval])
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   126
         (ts ~~ evals))]
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   127
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   128
fun pretty_failure ctxt target (((_, evals), query), eval_ts) =
72276
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   129
  Pretty.block (Pretty.text ("Test in " ^ target ^ " failed for") @
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   130
    [Pretty.brk 1, Pretty.quote (Syntax.pretty_term ctxt query)] @
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   131
    pretty_eval ctxt evals eval_ts)
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   132
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   133
fun pretty_failures ctxt target failures =
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   134
  Pretty.blk (0, Pretty.fbreaks (map (pretty_failure ctxt target) failures))
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   135
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   136
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   137
(* driver invocation *)
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   138
72293
584aea0b29bb clarified name;
wenzelm
parents: 72291
diff changeset
   139
val debug = Attrib.setup_config_bool \<^binding>\<open>test_code_debug\<close> (K false)
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   140
72284
38497ecb4892 clarified signature;
wenzelm
parents: 72283
diff changeset
   141
fun with_debug_dir name f =
72511
460d743010bc clarified signature: overloaded "+" for Path.append;
wenzelm
parents: 72376
diff changeset
   142
  (Path.explode "$ISABELLE_HOME_USER" + Path.basic (name ^ serial_string ()))
72376
04bce3478688 clarified signature;
wenzelm
parents: 72375
diff changeset
   143
  |> Isabelle_System.make_directory
78707
0b794165e9d4 omit pointless capture/release (see also 469a375212c1);
wenzelm
parents: 78705
diff changeset
   144
  |> f
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   145
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   146
fun dynamic_value_strict ctxt t compiler =
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   147
  let
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   148
    val thy = Proof_Context.theory_of ctxt
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   149
    val (driver, target) =
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   150
      (case get_driver thy compiler of
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   151
        NONE => error ("No driver for target " ^ compiler)
72272
wenzelm
parents: 70784
diff changeset
   152
      | SOME drv => drv)
72285
989bd067ae30 proper context;
wenzelm
parents: 72284
diff changeset
   153
    val with_dir = if Config.get ctxt debug then with_debug_dir else Isabelle_System.with_tmp_dir
72274
a1098a183f4a misc tuning and clarification;
wenzelm
parents: 72273
diff changeset
   154
    fun eval result =
75604
39df30349778 more scalable generated files and code export, using Bytes.T;
wenzelm
parents: 74636
diff changeset
   155
      with_dir "Code_Test"
39df30349778 more scalable generated files and code export, using Bytes.T;
wenzelm
parents: 74636
diff changeset
   156
        (driver ctxt ((apfst o map) (apfst Long_Name.implode #> apsnd Bytes.content) result))
69623
ef02c5e051e5 explicit model concerning files of generated code
haftmann
parents: 69597
diff changeset
   157
      |> parse_result compiler
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   158
    fun evaluator program _ vs_ty deps =
78705
fde0b195cb7d clarified signature: avoid association with potentially dangerous Exn.capture;
wenzelm
parents: 76884
diff changeset
   159
      Exn.result eval (Code_Target.compilation_text ctxt target program deps true vs_ty)
64578
wenzelm
parents: 64577
diff changeset
   160
    fun postproc f = map (apsnd (Option.map (map f)))
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   161
  in Exn.release (Code_Thingol.dynamic_value ctxt (Exn.map_res o postproc) evaluator t) end
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   162
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   163
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   164
(* term preprocessing *)
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   165
74636
c35001872139 clarified antiquotations;
wenzelm
parents: 74561
diff changeset
   166
fun add_eval \<^Const_>\<open>Trueprop for t\<close> = add_eval t
c35001872139 clarified antiquotations;
wenzelm
parents: 74561
diff changeset
   167
  | add_eval \<^Const_>\<open>HOL.eq _ for lhs rhs\<close> = (fn acc =>
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   168
      acc
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   169
      |> add_eval rhs
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   170
      |> add_eval lhs
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   171
      |> cons rhs
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   172
      |> cons lhs)
74636
c35001872139 clarified antiquotations;
wenzelm
parents: 74561
diff changeset
   173
  | add_eval \<^Const_>\<open>Not for t\<close> = add_eval t
c35001872139 clarified antiquotations;
wenzelm
parents: 74561
diff changeset
   174
  | add_eval \<^Const_>\<open>less_eq _ for lhs rhs\<close> = (fn acc => lhs :: rhs :: acc)
c35001872139 clarified antiquotations;
wenzelm
parents: 74561
diff changeset
   175
  | add_eval \<^Const_>\<open>less _ for lhs rhs\<close> = (fn acc => lhs :: rhs :: acc)
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   176
  | add_eval _ = I
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   177
74383
107941e8fa01 clarified antiquotations;
wenzelm
parents: 72511
diff changeset
   178
fun mk_term_of [] = \<^Const>\<open>None \<^typ>\<open>unit \<Rightarrow> yxml_of_term\<close>\<close>
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   179
  | mk_term_of ts =
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   180
      let
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   181
        val tuple = mk_tuples ts
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   182
        val T = fastype_of tuple
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   183
      in
74636
c35001872139 clarified antiquotations;
wenzelm
parents: 74561
diff changeset
   184
        \<^Const>\<open>Some \<^typ>\<open>unit \<Rightarrow> yxml_of_term\<close> for
c35001872139 clarified antiquotations;
wenzelm
parents: 74561
diff changeset
   185
          \<open>absdummy \<^Type>\<open>unit\<close>
c35001872139 clarified antiquotations;
wenzelm
parents: 74561
diff changeset
   186
            \<^Const>\<open>yxml_string_of_term for \<^Const>\<open>Code_Evaluation.term_of T for tuple\<close>\<close>\<close>\<close>
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   187
      end
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   188
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   189
fun test_terms ctxt ts target =
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   190
  let
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   191
    val thy = Proof_Context.theory_of ctxt
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   192
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67330
diff changeset
   193
    fun term_of t = Sign.of_sort thy (fastype_of t, \<^sort>\<open>term_of\<close>)
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   194
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   195
    fun ensure_bool t =
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   196
      (case fastype_of t of
74636
c35001872139 clarified antiquotations;
wenzelm
parents: 74561
diff changeset
   197
        \<^Type>\<open>bool\<close> => ()
64579
38a1d8b41189 more standard pretty printing;
wenzelm
parents: 64578
diff changeset
   198
      | _ =>
38a1d8b41189 more standard pretty printing;
wenzelm
parents: 64578
diff changeset
   199
        error (Pretty.string_of
38a1d8b41189 more standard pretty printing;
wenzelm
parents: 64578
diff changeset
   200
          (Pretty.block [Pretty.str "Test case not of type bool:", Pretty.brk 1,
38a1d8b41189 more standard pretty printing;
wenzelm
parents: 64578
diff changeset
   201
            Syntax.pretty_term ctxt t])))
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   202
64578
wenzelm
parents: 64577
diff changeset
   203
    val _ = List.app ensure_bool ts
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   204
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   205
    val evals = map (fn t => filter term_of (add_eval t [])) ts
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   206
    val eval = map mk_term_of evals
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   207
64578
wenzelm
parents: 64577
diff changeset
   208
    val t =
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67330
diff changeset
   209
      HOLogic.mk_list \<^typ>\<open>bool \<times> (unit \<Rightarrow> yxml_of_term) option\<close>
64578
wenzelm
parents: 64577
diff changeset
   210
        (map HOLogic.mk_prod (ts ~~ eval))
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   211
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   212
    val result = dynamic_value_strict ctxt t target
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   213
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   214
    val failed =
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   215
      filter_out (fst o fst o fst) (result ~~ ts ~~ evals)
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   216
      handle ListPair.UnequalLengths =>
72272
wenzelm
parents: 70784
diff changeset
   217
        error ("Evaluation failed!\nWrong number of test results: " ^ string_of_int (length result))
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   218
  in
72276
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   219
    (case failed of
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   220
      [] => ()
64578
wenzelm
parents: 64577
diff changeset
   221
    | _ => error (Pretty.string_of (pretty_failures ctxt target failed)))
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   222
  end
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   223
64580
wenzelm
parents: 64579
diff changeset
   224
fun test_code_cmd raw_ts targets ctxt =
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   225
  let
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   226
    val ts = Syntax.read_terms ctxt raw_ts
64579
38a1d8b41189 more standard pretty printing;
wenzelm
parents: 64578
diff changeset
   227
    val frees = fold Term.add_frees ts []
64578
wenzelm
parents: 64577
diff changeset
   228
    val _ =
wenzelm
parents: 64577
diff changeset
   229
      if null frees then ()
64579
38a1d8b41189 more standard pretty printing;
wenzelm
parents: 64578
diff changeset
   230
      else error (Pretty.string_of
38a1d8b41189 more standard pretty printing;
wenzelm
parents: 64578
diff changeset
   231
        (Pretty.block (Pretty.str "Terms contain free variables:" :: Pretty.brk 1 ::
72283
c0d04c740b8a tuned signature;
wenzelm
parents: 72278
diff changeset
   232
          Pretty.commas (map (Syntax.pretty_term ctxt o Free) frees))))
c0d04c740b8a tuned signature;
wenzelm
parents: 72278
diff changeset
   233
  in List.app (test_terms ctxt ts) targets end
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   234
58348
2d47c7d10b62 add target language evaluators for the value command;
Andreas Lochbihler
parents: 58039
diff changeset
   235
fun eval_term target ctxt t =
2d47c7d10b62 add target language evaluators for the value command;
Andreas Lochbihler
parents: 58039
diff changeset
   236
  let
64579
38a1d8b41189 more standard pretty printing;
wenzelm
parents: 64578
diff changeset
   237
    val frees = Term.add_frees t []
64578
wenzelm
parents: 64577
diff changeset
   238
    val _ =
wenzelm
parents: 64577
diff changeset
   239
      if null frees then ()
64579
38a1d8b41189 more standard pretty printing;
wenzelm
parents: 64578
diff changeset
   240
      else
38a1d8b41189 more standard pretty printing;
wenzelm
parents: 64578
diff changeset
   241
        error (Pretty.string_of
38a1d8b41189 more standard pretty printing;
wenzelm
parents: 64578
diff changeset
   242
          (Pretty.block (Pretty.str "Term contains free variables:" :: Pretty.brk 1 ::
72283
c0d04c740b8a tuned signature;
wenzelm
parents: 72278
diff changeset
   243
            Pretty.commas (map (Syntax.pretty_term ctxt o Free) frees))))
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   244
64579
38a1d8b41189 more standard pretty printing;
wenzelm
parents: 64578
diff changeset
   245
    val T = fastype_of t
64578
wenzelm
parents: 64577
diff changeset
   246
    val _ =
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67330
diff changeset
   247
      if Sign.of_sort (Proof_Context.theory_of ctxt) (T, \<^sort>\<open>term_of\<close>) then ()
64579
38a1d8b41189 more standard pretty printing;
wenzelm
parents: 64578
diff changeset
   248
      else error ("Type " ^ Syntax.string_of_typ ctxt T ^
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67330
diff changeset
   249
       " of term not of sort " ^ Syntax.string_of_sort ctxt \<^sort>\<open>term_of\<close>)
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   250
64578
wenzelm
parents: 64577
diff changeset
   251
    val t' =
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67330
diff changeset
   252
      HOLogic.mk_list \<^typ>\<open>bool \<times> (unit \<Rightarrow> yxml_of_term) option\<close>
74636
c35001872139 clarified antiquotations;
wenzelm
parents: 74561
diff changeset
   253
        [HOLogic.mk_prod (\<^Const>\<open>False\<close>, mk_term_of [t])]
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   254
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   255
    val result = dynamic_value_strict ctxt t' target
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   256
  in (case result of [(_, SOME [t])] => t | _ => error "Evaluation failed") end
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   257
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   258
72276
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   259
(* check and invoke compiler *)
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   260
72276
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   261
fun check_settings compiler var descr =
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   262
  if getenv var = "" then
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   263
    error (Pretty.string_of (Pretty.para
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   264
      ("Environment variable " ^ var ^ " is not set. To test code generation with " ^
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   265
        compiler ^ ", set this variable to your " ^ descr ^
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   266
        " in the $ISABELLE_HOME_USER/etc/settings file.")))
72306
wenzelm
parents: 72297
diff changeset
   267
  else ()
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   268
72276
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   269
fun compile compiler cmd =
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   270
  let val (out, ret) = Isabelle_System.bash_output cmd in
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   271
    if ret = 0 then ()
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   272
    else error ("Compilation with " ^ compiler ^ " failed:\n" ^ cmd ^ "\n" ^ out)
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   273
  end
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   274
72276
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   275
fun evaluate compiler cmd =
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   276
  let val (out, res) = Isabelle_System.bash_output cmd in
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   277
    if res = 0 then out
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   278
    else error ("Evaluation for " ^ compiler ^ " terminated with error code " ^
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   279
      string_of_int res ^ "\nCompiler output:\n" ^ out)
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   280
  end
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   281
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   282
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   283
(* driver for PolyML *)
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   284
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   285
val polymlN = "PolyML"
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   286
72297
bc31c4a2c77c clarified;
wenzelm
parents: 72296
diff changeset
   287
fun evaluate_in_polyml (_: Proof.context) (code_files, value_name) dir =
72276
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   288
  let
72511
460d743010bc clarified signature: overloaded "+" for Path.append;
wenzelm
parents: 72376
diff changeset
   289
    val code_path = dir + Path.basic "generated.sml"
460d743010bc clarified signature: overloaded "+" for Path.append;
wenzelm
parents: 72376
diff changeset
   290
    val driver_path = dir + Path.basic "driver.sml"
460d743010bc clarified signature: overloaded "+" for Path.append;
wenzelm
parents: 72376
diff changeset
   291
    val out_path = dir + Path.basic "out"
72297
bc31c4a2c77c clarified;
wenzelm
parents: 72296
diff changeset
   292
72306
wenzelm
parents: 72297
diff changeset
   293
    val code = #2 (the_single code_files)
72286
e4a317d00489 output via file instead of stdout;
wenzelm
parents: 72285
diff changeset
   294
    val driver = \<^verbatim>\<open>
72290
wenzelm
parents: 72289
diff changeset
   295
fun main () =
72286
e4a317d00489 output via file instead of stdout;
wenzelm
parents: 72285
diff changeset
   296
  let
72307
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
   297
    fun format (true, _) = \<close> ^ ML_Syntax.print_string success ^ \<^verbatim>\<open> ^ "\n"
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
   298
      | format (false, NONE) = \<close> ^ ML_Syntax.print_string failure ^ \<^verbatim>\<open> ^ "\n"
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
   299
      | format (false, SOME t) = \<close> ^ ML_Syntax.print_string failure ^ \<^verbatim>\<open> ^ t () ^ "\n"
72286
e4a317d00489 output via file instead of stdout;
wenzelm
parents: 72285
diff changeset
   300
    val result = \<close> ^ value_name ^ \<^verbatim>\<open> ()
e4a317d00489 output via file instead of stdout;
wenzelm
parents: 72285
diff changeset
   301
    val result_text = \<close> ^
72307
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
   302
      ML_Syntax.print_string start_marker ^
72286
e4a317d00489 output via file instead of stdout;
wenzelm
parents: 72285
diff changeset
   303
      \<^verbatim>\<open> ^ String.concat (map format result) ^ \<close> ^
72307
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
   304
      ML_Syntax.print_string end_marker ^ \<^verbatim>\<open>
72288
03628da91b07 proper platform_path for Windows;
wenzelm
parents: 72287
diff changeset
   305
    val out = BinIO.openOut \<close> ^ ML_Syntax.print_platform_path out_path ^ \<^verbatim>\<open>
72286
e4a317d00489 output via file instead of stdout;
wenzelm
parents: 72285
diff changeset
   306
    val _ = BinIO.output (out, Byte.stringToBytes result_text)
e4a317d00489 output via file instead of stdout;
wenzelm
parents: 72285
diff changeset
   307
    val _ = BinIO.closeOut out
e4a317d00489 output via file instead of stdout;
wenzelm
parents: 72285
diff changeset
   308
  in () end;
e4a317d00489 output via file instead of stdout;
wenzelm
parents: 72285
diff changeset
   309
\<close>
72306
wenzelm
parents: 72297
diff changeset
   310
    val _ = File.write code_path code
wenzelm
parents: 72297
diff changeset
   311
    val _ = File.write driver_path driver
wenzelm
parents: 72297
diff changeset
   312
    val _ =
wenzelm
parents: 72297
diff changeset
   313
      ML_Context.eval
78728
72631efa3821 explicitly reject 'handle' with catch-all patterns;
wenzelm
parents: 78707
diff changeset
   314
        {environment = ML_Env.SML, redirect = false, verbose = false, catch_all = true,
72631efa3821 explicitly reject 'handle' with catch-all patterns;
wenzelm
parents: 78707
diff changeset
   315
          debug = NONE, writeln = writeln, warning = warning}
72306
wenzelm
parents: 72297
diff changeset
   316
        Position.none
76884
a004c5322ea4 clarified modules;
wenzelm
parents: 76882
diff changeset
   317
        (ML_Lex.read_text (code, Position.file (File.symbolic_path code_path)) @
a004c5322ea4 clarified modules;
wenzelm
parents: 76882
diff changeset
   318
         ML_Lex.read_text (driver, Position.file (File.symbolic_path driver_path)) @
72306
wenzelm
parents: 72297
diff changeset
   319
         ML_Lex.read "main ()")
72308
aa14f630d8ef clarified errors;
wenzelm
parents: 72307
diff changeset
   320
      handle ERROR msg => error ("Evaluation for " ^ polymlN ^ " failed:\n" ^ msg)
72306
wenzelm
parents: 72297
diff changeset
   321
  in File.read out_path end
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   322
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   323
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   324
(* driver for mlton *)
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   325
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   326
val mltonN = "MLton"
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   327
val ISABELLE_MLTON = "ISABELLE_MLTON"
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   328
72276
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   329
fun evaluate_in_mlton (_: Proof.context) (code_files, value_name) dir =
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   330
  let
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   331
    val compiler = mltonN
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   332
    val generatedN = "generated.sml"
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   333
    val driverN = "driver.sml"
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   334
    val projectN = "test"
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   335
72511
460d743010bc clarified signature: overloaded "+" for Path.append;
wenzelm
parents: 72376
diff changeset
   336
    val code_path = dir + Path.basic generatedN
460d743010bc clarified signature: overloaded "+" for Path.append;
wenzelm
parents: 72376
diff changeset
   337
    val driver_path = dir + Path.basic driverN
460d743010bc clarified signature: overloaded "+" for Path.append;
wenzelm
parents: 72376
diff changeset
   338
    val basis_path = dir + Path.basic (projectN ^ ".mlb")
72291
wenzelm
parents: 72290
diff changeset
   339
    val driver = \<^verbatim>\<open>
72307
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
   340
fun format (true, _) = \<close> ^ ML_Syntax.print_string success ^ \<^verbatim>\<open> ^ "\n"
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
   341
  | format (false, NONE) = \<close> ^ ML_Syntax.print_string failure ^ \<^verbatim>\<open> ^ "\n"
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
   342
  | format (false, SOME t) = \<close> ^ ML_Syntax.print_string failure ^ \<^verbatim>\<open> ^ t () ^ "\n"
72291
wenzelm
parents: 72290
diff changeset
   343
val result = \<close> ^ value_name ^ \<^verbatim>\<open> ()
72307
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
   344
val _ = print \<close> ^ ML_Syntax.print_string start_marker ^ \<^verbatim>\<open>
72291
wenzelm
parents: 72290
diff changeset
   345
val _ = List.app (print o format) result
72307
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
   346
val _ = print \<close> ^ ML_Syntax.print_string end_marker ^ \<^verbatim>\<open>
72291
wenzelm
parents: 72290
diff changeset
   347
\<close>
72306
wenzelm
parents: 72297
diff changeset
   348
    val _ = check_settings compiler ISABELLE_MLTON "MLton executable"
wenzelm
parents: 72297
diff changeset
   349
    val _ = List.app (File.write code_path o snd) code_files
wenzelm
parents: 72297
diff changeset
   350
    val _ = File.write driver_path driver
wenzelm
parents: 72297
diff changeset
   351
    val _ = File.write basis_path ("$(SML_LIB)/basis/basis.mlb\n" ^ generatedN ^ "\n" ^ driverN)
72276
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   352
  in
76181
d27ed188e0c4 support for ISABELLE_MLTON_OPTIONS, notably for Ubuntu 22.04 with external mlton executable;
wenzelm
parents: 75654
diff changeset
   353
    compile compiler
d27ed188e0c4 support for ISABELLE_MLTON_OPTIONS, notably for Ubuntu 22.04 with external mlton executable;
wenzelm
parents: 75654
diff changeset
   354
      (\<^verbatim>\<open>"$ISABELLE_MLTON" $ISABELLE_MLTON_OPTIONS -default-type intinf \<close> ^
d27ed188e0c4 support for ISABELLE_MLTON_OPTIONS, notably for Ubuntu 22.04 with external mlton executable;
wenzelm
parents: 75654
diff changeset
   355
        File.bash_platform_path basis_path);
d27ed188e0c4 support for ISABELLE_MLTON_OPTIONS, notably for Ubuntu 22.04 with external mlton executable;
wenzelm
parents: 75654
diff changeset
   356
    evaluate compiler (File.bash_platform_path (dir + Path.basic projectN))
72276
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   357
  end
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   358
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   359
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   360
(* driver for SML/NJ *)
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   361
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   362
val smlnjN = "SMLNJ"
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   363
val ISABELLE_SMLNJ = "ISABELLE_SMLNJ"
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   364
72276
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   365
fun evaluate_in_smlnj (_: Proof.context) (code_files, value_name) dir =
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   366
  let
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   367
    val compiler = smlnjN
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   368
    val generatedN = "generated.sml"
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   369
    val driverN = "driver.sml"
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   370
72511
460d743010bc clarified signature: overloaded "+" for Path.append;
wenzelm
parents: 72376
diff changeset
   371
    val code_path = dir + Path.basic generatedN
460d743010bc clarified signature: overloaded "+" for Path.append;
wenzelm
parents: 72376
diff changeset
   372
    val driver_path = dir + Path.basic driverN
72291
wenzelm
parents: 72290
diff changeset
   373
    val driver = \<^verbatim>\<open>
wenzelm
parents: 72290
diff changeset
   374
structure Test =
wenzelm
parents: 72290
diff changeset
   375
struct
wenzelm
parents: 72290
diff changeset
   376
  fun main () =
wenzelm
parents: 72290
diff changeset
   377
    let
72307
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
   378
      fun format (true, _) = \<close> ^ ML_Syntax.print_string success ^ \<^verbatim>\<open> ^ "\n"
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
   379
        | format (false, NONE) = \<close> ^ ML_Syntax.print_string failure ^ \<^verbatim>\<open> ^ "\n"
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
   380
        | format (false, SOME t) = \<close> ^ ML_Syntax.print_string failure ^ \<^verbatim>\<open> ^ t () ^ "\n"
72291
wenzelm
parents: 72290
diff changeset
   381
      val result = \<close> ^ value_name ^ \<^verbatim>\<open> ()
72307
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
   382
      val _ = print \<close> ^ ML_Syntax.print_string start_marker ^ \<^verbatim>\<open>
72291
wenzelm
parents: 72290
diff changeset
   383
      val _ = List.app (print o format) result
72307
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
   384
      val _ = print \<close> ^ ML_Syntax.print_string end_marker ^ \<^verbatim>\<open>
72291
wenzelm
parents: 72290
diff changeset
   385
    in 0 end
wenzelm
parents: 72290
diff changeset
   386
end
wenzelm
parents: 72290
diff changeset
   387
\<close>
72306
wenzelm
parents: 72297
diff changeset
   388
    val _ = check_settings compiler ISABELLE_SMLNJ "SMLNJ executable"
wenzelm
parents: 72297
diff changeset
   389
    val _ = List.app (File.write code_path o snd) code_files
wenzelm
parents: 72297
diff changeset
   390
    val _ = File.write driver_path driver
72276
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   391
    val ml_source =
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   392
      "Control.MC.matchRedundantError := false; Control.MC.matchRedundantWarn := false;" ^
72277
48254fa33d88 proper ml_source: avoid duplicate Bash.string;
wenzelm
parents: 72276
diff changeset
   393
      "use " ^ ML_Syntax.print_string (File.platform_path code_path) ^
48254fa33d88 proper ml_source: avoid duplicate Bash.string;
wenzelm
parents: 72276
diff changeset
   394
      "; use " ^ ML_Syntax.print_string (File.platform_path driver_path) ^
72276
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   395
      "; Test.main ();"
72306
wenzelm
parents: 72297
diff changeset
   396
  in evaluate compiler ("echo " ^ Bash.string ml_source ^ " | \"$ISABELLE_SMLNJ\"") end
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   397
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   398
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   399
(* driver for OCaml *)
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   400
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   401
val ocamlN = "OCaml"
69926
110fff287217 access OCaml tools and libraries via ISABELLE_OCAMLFIND;
wenzelm
parents: 69925
diff changeset
   402
val ISABELLE_OCAMLFIND = "ISABELLE_OCAMLFIND"
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   403
72276
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   404
fun evaluate_in_ocaml (_: Proof.context) (code_files, value_name) dir =
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   405
  let
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   406
    val compiler = ocamlN
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   407
72511
460d743010bc clarified signature: overloaded "+" for Path.append;
wenzelm
parents: 72376
diff changeset
   408
    val code_path = dir + Path.basic "generated.ml"
460d743010bc clarified signature: overloaded "+" for Path.append;
wenzelm
parents: 72376
diff changeset
   409
    val driver_path = dir + Path.basic "driver.ml"
72276
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   410
    val driver =
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   411
      "let format_term = function\n" ^
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   412
      "  | None -> \"\"\n" ^
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   413
      "  | Some t -> t ();;\n" ^
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   414
      "let format = function\n" ^
72307
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
   415
      "  | (true, _) -> \"" ^ success ^ "\\n\"\n" ^
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
   416
      "  | (false, x) -> \"" ^ failure ^ "\" ^ format_term x ^ \"\\n\";;\n" ^
72276
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   417
      "let result = " ^ ("Generated." ^ value_name) ^ " ();;\n" ^
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   418
      "let main x =\n" ^
72307
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
   419
      "  let _ = print_string \"" ^ start_marker ^ "\" in\n" ^
72276
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   420
      "  let _ = List.map (fun x -> print_string (format x)) result in\n" ^
72307
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
   421
      "  print_string \"" ^ end_marker ^ "\";;\n" ^
72276
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   422
      "main ();;"
72511
460d743010bc clarified signature: overloaded "+" for Path.append;
wenzelm
parents: 72376
diff changeset
   423
    val compiled_path = dir + Path.basic "test"
72306
wenzelm
parents: 72297
diff changeset
   424
wenzelm
parents: 72297
diff changeset
   425
    val _ = check_settings compiler ISABELLE_OCAMLFIND "ocamlfind executable"
wenzelm
parents: 72297
diff changeset
   426
    val _ = List.app (File.write code_path o snd) code_files
wenzelm
parents: 72297
diff changeset
   427
    val _ = File.write driver_path driver
72276
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   428
    val cmd =
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   429
      "\"$ISABELLE_OCAMLFIND\" ocamlopt -w pu -package zarith -linkpkg" ^
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   430
      " -o " ^ File.bash_path compiled_path ^ " -I " ^ File.bash_path dir ^ " " ^
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   431
      File.bash_path code_path ^ " " ^ File.bash_path driver_path ^ " </dev/null"
72306
wenzelm
parents: 72297
diff changeset
   432
  in compile compiler cmd; evaluate compiler (File.bash_path compiled_path) end
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   433
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   434
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   435
(* driver for GHC *)
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   436
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   437
val ghcN = "GHC"
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   438
val ISABELLE_GHC = "ISABELLE_GHC"
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   439
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67330
diff changeset
   440
val ghc_options = Attrib.setup_config_string \<^binding>\<open>code_test_ghc\<close> (K "")
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   441
72276
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   442
fun evaluate_in_ghc ctxt (code_files, value_name) dir =
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   443
  let
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   444
    val compiler = ghcN
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   445
    val modules = map fst code_files
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   446
72511
460d743010bc clarified signature: overloaded "+" for Path.append;
wenzelm
parents: 72376
diff changeset
   447
    val driver_path = dir + Path.basic "Main.hs"
72276
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   448
    val driver =
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   449
      "module Main where {\n" ^
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   450
      implode (map (fn module => "import qualified " ^ unsuffix ".hs" module ^ ";\n") modules) ^
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   451
      "main = do {\n" ^
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   452
      "    let {\n" ^
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   453
      "      format_term Nothing = \"\";\n" ^
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   454
      "      format_term (Just t) = t ();\n" ^
72307
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
   455
      "      format (True, _) = \"" ^ success ^ "\\n\";\n" ^
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
   456
      "      format (False, to) = \"" ^ failure ^ "\" ++ format_term to ++ \"\\n\";\n" ^
72276
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   457
      "      result = " ^ value_name ^ " ();\n" ^
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   458
      "    };\n" ^
72307
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
   459
      "    Prelude.putStr \"" ^ start_marker ^ "\";\n" ^
72276
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   460
      "    Prelude.mapM_ (putStr . format) result;\n" ^
72307
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
   461
      "    Prelude.putStr \"" ^ end_marker ^ "\";\n" ^
72276
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   462
      "  }\n" ^
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   463
      "}\n"
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   464
72306
wenzelm
parents: 72297
diff changeset
   465
    val _ = check_settings compiler ISABELLE_GHC "GHC executable"
72511
460d743010bc clarified signature: overloaded "+" for Path.append;
wenzelm
parents: 72376
diff changeset
   466
    val _ = List.app (fn (name, code) => File.write (dir + Path.basic name) code) code_files
72306
wenzelm
parents: 72297
diff changeset
   467
    val _ = File.write driver_path driver
wenzelm
parents: 72297
diff changeset
   468
72511
460d743010bc clarified signature: overloaded "+" for Path.append;
wenzelm
parents: 72376
diff changeset
   469
    val compiled_path = dir + Path.basic "test"
72276
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   470
    val cmd =
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   471
      "\"$ISABELLE_GHC\" " ^ Code_Haskell.language_params ^ " " ^
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   472
      Config.get ctxt ghc_options ^ " -o " ^
72278
199dc903131b clarified signature;
wenzelm
parents: 72277
diff changeset
   473
      File.bash_platform_path compiled_path ^ " " ^
199dc903131b clarified signature;
wenzelm
parents: 72277
diff changeset
   474
      File.bash_platform_path driver_path ^ " -i" ^
199dc903131b clarified signature;
wenzelm
parents: 72277
diff changeset
   475
      File.bash_platform_path dir
72306
wenzelm
parents: 72297
diff changeset
   476
  in compile compiler cmd; evaluate compiler (File.bash_path compiled_path) end
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   477
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   478
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   479
(* driver for Scala *)
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   480
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   481
val scalaN = "Scala"
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   482
72297
bc31c4a2c77c clarified;
wenzelm
parents: 72296
diff changeset
   483
fun evaluate_in_scala (_: Proof.context) (code_files, value_name) dir =
72276
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   484
  let
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   485
    val generatedN = "Generated_Code"
dfe150a246e6 misc tuning and clarification: prefer functions over data;
wenzelm
parents: 72275
diff changeset
   486
    val driverN = "Driver.scala"
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   487
72511
460d743010bc clarified signature: overloaded "+" for Path.append;
wenzelm
parents: 72376
diff changeset
   488
    val code_path = dir + Path.basic (generatedN ^ ".scala")
460d743010bc clarified signature: overloaded "+" for Path.append;
wenzelm
parents: 72376
diff changeset
   489
    val driver_path = dir + Path.basic driverN
460d743010bc clarified signature: overloaded "+" for Path.append;
wenzelm
parents: 72376
diff changeset
   490
    val out_path = dir + Path.basic "out"
72297
bc31c4a2c77c clarified;
wenzelm
parents: 72296
diff changeset
   491
72306
wenzelm
parents: 72297
diff changeset
   492
    val code = #2 (the_single code_files)
72296
00490c408e52 evaluate Scala via running Isabelle/Scala;
wenzelm
parents: 72293
diff changeset
   493
    val driver = \<^verbatim>\<open>
00490c408e52 evaluate Scala via running Isabelle/Scala;
wenzelm
parents: 72293
diff changeset
   494
{
00490c408e52 evaluate Scala via running Isabelle/Scala;
wenzelm
parents: 72293
diff changeset
   495
  val result = \<close> ^ value_name ^ \<^verbatim>\<open>(())
00490c408e52 evaluate Scala via running Isabelle/Scala;
wenzelm
parents: 72293
diff changeset
   496
  val result_text =
00490c408e52 evaluate Scala via running Isabelle/Scala;
wenzelm
parents: 72293
diff changeset
   497
    result.map(
00490c408e52 evaluate Scala via running Isabelle/Scala;
wenzelm
parents: 72293
diff changeset
   498
      {
00490c408e52 evaluate Scala via running Isabelle/Scala;
wenzelm
parents: 72293
diff changeset
   499
        case (true, _) => "True\n"
00490c408e52 evaluate Scala via running Isabelle/Scala;
wenzelm
parents: 72293
diff changeset
   500
        case (false, None) => "False\n"
00490c408e52 evaluate Scala via running Isabelle/Scala;
wenzelm
parents: 72293
diff changeset
   501
        case (false, Some(t)) => "False" + t(()) + "\n"
00490c408e52 evaluate Scala via running Isabelle/Scala;
wenzelm
parents: 72293
diff changeset
   502
      }).mkString
00490c408e52 evaluate Scala via running Isabelle/Scala;
wenzelm
parents: 72293
diff changeset
   503
  isabelle.File.write(
76882
wenzelm
parents: 76880
diff changeset
   504
    isabelle.Path.explode(\<close> ^ quote (File.standard_path out_path) ^ \<^verbatim>\<open>),
72307
b82347da780b tuned signature;
wenzelm
parents: 72306
diff changeset
   505
    \<close> ^ quote start_marker ^ \<^verbatim>\<open> + result_text + \<close> ^ quote end_marker ^ \<^verbatim>\<open>)
72296
00490c408e52 evaluate Scala via running Isabelle/Scala;
wenzelm
parents: 72293
diff changeset
   506
}\<close>
72306
wenzelm
parents: 72297
diff changeset
   507
    val _ = File.write code_path code
wenzelm
parents: 72297
diff changeset
   508
    val _ = File.write driver_path driver
75654
21164fd15e3d switch to Scala 3;
wenzelm
parents: 75604
diff changeset
   509
    val _ = Scala_Compiler.toplevel (code ^ driver)
72308
aa14f630d8ef clarified errors;
wenzelm
parents: 72307
diff changeset
   510
      handle ERROR msg => error ("Evaluation for " ^ scalaN ^ " failed:\n" ^ msg)
72306
wenzelm
parents: 72297
diff changeset
   511
  in File.read out_path end
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   512
64580
wenzelm
parents: 64579
diff changeset
   513
wenzelm
parents: 64579
diff changeset
   514
(* command setup *)
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   515
64577
0288a566c966 tuned whitespace;
wenzelm
parents: 63806
diff changeset
   516
val _ =
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67330
diff changeset
   517
  Outer_Syntax.command \<^command_keyword>\<open>test_code\<close>
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   518
    "compile test cases to target languages, execute them and report results"
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67330
diff changeset
   519
      (Scan.repeat1 Parse.prop -- (\<^keyword>\<open>in\<close> |-- Scan.repeat1 Parse.name)
64580
wenzelm
parents: 64579
diff changeset
   520
        >> (fn (ts, targets) => Toplevel.keep (test_code_cmd ts targets o Toplevel.context_of)))
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   521
66284
378895354604 new derived targets for evaluating Haskell and Scala programs
Andreas Lochbihler
parents: 65905
diff changeset
   522
val target_Scala = "Scala_eval"
378895354604 new derived targets for evaluating Haskell and Scala programs
Andreas Lochbihler
parents: 65905
diff changeset
   523
val target_Haskell = "Haskell_eval"
378895354604 new derived targets for evaluating Haskell and Scala programs
Andreas Lochbihler
parents: 65905
diff changeset
   524
64580
wenzelm
parents: 64579
diff changeset
   525
val _ =
72306
wenzelm
parents: 72297
diff changeset
   526
  Theory.setup
wenzelm
parents: 72297
diff changeset
   527
   (Code_Target.add_derived_target (target_Scala, [(Code_Scala.target, I)]) #>
wenzelm
parents: 72297
diff changeset
   528
    Code_Target.add_derived_target (target_Haskell, [(Code_Haskell.target, I)]) #>
wenzelm
parents: 72297
diff changeset
   529
    fold add_driver
wenzelm
parents: 72297
diff changeset
   530
      [(polymlN, (evaluate_in_polyml, Code_ML.target_SML)),
wenzelm
parents: 72297
diff changeset
   531
       (mltonN, (evaluate_in_mlton, Code_ML.target_SML)),
wenzelm
parents: 72297
diff changeset
   532
       (smlnjN, (evaluate_in_smlnj, Code_ML.target_SML)),
wenzelm
parents: 72297
diff changeset
   533
       (ocamlN, (evaluate_in_ocaml, Code_ML.target_OCaml)),
wenzelm
parents: 72297
diff changeset
   534
       (ghcN, (evaluate_in_ghc, target_Haskell)),
wenzelm
parents: 72297
diff changeset
   535
       (scalaN, (evaluate_in_scala, target_Scala))] #>
wenzelm
parents: 72297
diff changeset
   536
    fold (fn target => Value_Command.add_evaluator (Binding.name target, eval_term target) #> #2)
64580
wenzelm
parents: 64579
diff changeset
   537
      [polymlN, mltonN, smlnjN, ocamlN, ghcN, scalaN])
59323
468bd3aedfa1 modernized and more uniform style
haftmann
parents: 58832
diff changeset
   538
58039
469a375212c1 add testing framework for generated code
Andreas Lochbihler
parents:
diff changeset
   539
end