File: test-create.sml

package info (click to toggle)
mlton 20130715-3
  • links: PTS
  • area: main
  • in suites: stretch
  • size: 60,900 kB
  • ctags: 69,386
  • sloc: xml: 34,418; ansic: 17,399; lisp: 2,879; makefile: 1,605; sh: 1,254; pascal: 256; python: 143; asm: 97
file content (60 lines) | stat: -rw-r--r-- 1,860 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
fun statusToString status =
   case status of
      Posix.Process.W_EXITED => "W_EXITED"
    | Posix.Process.W_EXITSTATUS w => concat ["W_EXITSTATUS ", Word8.toString w]
    | Posix.Process.W_SIGNALED s => 
         concat ["W_SIGNALED ", SysWord.toString (Posix.Signal.toWord s)]
    | Posix.Process.W_STOPPED s => 
         concat ["W_STOPPED ", SysWord.toString (Posix.Signal.toWord s)]

val cmd = CommandLine.name ()

fun stdout () =
   TextIO.output (TextIO.stdOut, "Hello world! [stdout]\n")
fun exit () = Posix.Process.exit 0wx7
fun diverge () = diverge ()

fun test () =
   let
      fun create arg =
         let
            val _ = TextIO.flushOut (TextIO.stdOut)
            val _ = TextIO.flushOut (TextIO.stdErr)
         in
            MLton.Process.create
            {path = cmd, 
             args = [arg],
             env = NONE,
             stdin = MLton.Process.Param.self,
             stdout = MLton.Process.Param.self,
             stderr = MLton.Process.Param.self}
         end
      fun reap pid =
         MLton.Process.reap pid
      fun kill (pid, signal) =
         MLton.Process.kill (pid, signal)
      fun doTest (arg, withPid) =
         let
            val _ = print (concat ["testing ", arg, "...\n"])
            val pid = create arg
            val () = withPid pid
            val status = reap pid
            val _ = print (concat ["exit_status: ", statusToString status, "\n"])
         in
            ()
         end
      fun doSimpleTest arg = doTest (arg, fn _ => ())
   in
      print "create test:\n"
      ; doSimpleTest "stdout"
      ; doSimpleTest "exit"
      ; doTest ("diverge", fn pid => kill (pid, Posix.Signal.kill))
   end

val _ =
   case CommandLine.arguments () of
      [] => test ()
    | ["stdout"] => stdout ()
    | ["exit"] => exit ()
    | ["diverge"] => diverge ()
    | _ => raise Match