Skip to content
Snippets Groups Projects
Testsuite.ml 1.85 KiB
Newer Older
  • Learn to ignore specific revisions
  • 
    
    module CM = CoAlgMisc
    
    module PF = Printf
    
    
    module CR = CoAlgReasoner
    
    (* sort should be of the form:
        sorts = [| (parseFunctor Sys.argv.(2), [0]) |]
    *)
    
    
    type testResult = | Sat
                      | Unsat
                      | ParseError
    
    
                    (* sat * functors * formula *)
    type satCheck = testResult * (CoAlgMisc.sortTable) * string
    
    
    
    
    let colored_string_of_testResult tr =
        match tr with
        | Sat -> ("1;33","sat")
        | Unsat -> ("1;34","unsat")
        | ParseError -> ("31","unparseable")
    
    let colored_string col str =
        "\027["^col^"m"^str^"\027[0m"
    
    let terminal_string_of_testResult tr =
        let (col,str) = colored_string_of_testResult tr in
        colored_string col str
    
    let runSatCheck (_,logic,input) =
      try
          let nomTable name =
            assert (CoAlgFormula.isNominal name);
            Some 0
          in
          let (tbox, f) = CoAlgFormula.importQuery input in
          let res = CoAlgReasoner.isSat logic nomTable tbox f in
          if res then Sat else Unsat
      with | Stream.Error _ -> ParseError
           | CoAlgFormula.CoAlgException _ -> ParseError
    
    
    let stringCrop width str =
        if (String.length str <= width) then str
        else ((Str.string_before str (width-1)) ^ "…")
    
    let columnCreate width str =
        let shorten = (stringCrop width str) in
        let pad = String.make (max 0 (width - (String.length shorten))) ' ' in
        (shorten ^ pad)
    
    
    let runSatCheckVerbose (sc:satCheck) =
        let cs = colored_string in
        let sotr = terminal_string_of_testResult in
        let (expectation,_,title) = sc in
    
        PF.printf "Is %s " (cs "1" (columnCreate 60 title));
    
        PF.printf "%s? → " (sotr expectation);
    
        flush stdout;
    
        let res = runSatCheck sc in
    
        (if (res = expectation)
    
        then PF.printf "%s\n" (cs "1;32" "Yes")
    
        else PF.printf "%s, cool claims it is %s\n"
    
                        (cs "1;31" "No")
    
                        (sotr res));
    
        flush stdout;