1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
15 # Base options for testing tools.
19 private import parser_util
21 redef class ToolContext
23 var opt_full
= new OptionBool("Process also imported modules", "--full")
25 var opt_output
= new OptionString("Output name (default is 'nitunit.xml')", "-o", "--output")
27 var opt_dir
= new OptionString("Working directory (default is '.nitunit')", "--dir")
29 var opt_noact
= new OptionBool("Does not compile and run tests", "--no-act")
31 var opt_nitc
= new OptionString("nitc compiler to use", "--nitc")
33 # Working directory for testing.
34 fun test_dir
: String do
35 var dir
= opt_dir
.value
36 if dir
== null then return ".nitunit"
40 # Search the `nitc` compiler to use
42 # If not `nitc` is suitable, then prints an error and quit.
45 var nitc
= opt_nitc
.value
47 if not nitc
.file_exists
then
48 fatal_error
(null, "error: cannot find `{nitc}` given by --nitc.")
56 if not nitc
.file_exists
then
57 fatal_error
(null, "error: cannot find `{nitc}` given by NITC.")
64 nitc
= nit_dir
/"bin/nitc"
65 if not nitc
.file_exists
then
66 fatal_error
(null, "Error: cannot find nitc. Set envvar NIT_DIR or NITC or use the --nitc option.")
72 # Execute a system command in a more safe context than `Sys::system`.
73 fun safe_exec
(command
: String): Int
76 var real_command
= """
78 ulimit -f {{{ulimit_file}}} 2> /dev/null
79 ulimit -t {{{ulimit_usertime}}} 2> /dev/null
83 return system
(real_command
)
86 # The maximum size (in KB) of files written by a command executed trough `safe_exec`
89 var ulimit_file
= 65536 is writable
91 # The maximum amount of cpu time (in seconds) for a command executed trough `safe_exec`
93 # Default: 10 CPU minute
94 var ulimit_usertime
= 600 is writable
98 # If needed, truncate `self` at `max_length` characters and append an informative `message`.
101 # assert "hello".trunc(10) == "hello"
102 # assert "hello".trunc(2) == "he[truncated. Full size is 5]"
103 # assert "hello".trunc(2, "...") == "he..."
105 fun trunc
(max_length
: Int, message
: nullable String): String
107 if length
<= max_length
then return self
108 if message
== null then message
= "[truncated. Full size is {length}]"
109 return substring
(0, max_length
) + message
112 # Use a special notation for whitespace characters that are not `'\n'` (LFD) or `' '` (space).
115 # assert "hello".filter_nonprintable == "hello"
116 # assert "\r\n\t".filter_nonprintable == "^13\n^9"
118 fun filter_nonprintable
: String
122 var cp
= c
.code_point
123 if cp
< 32 and c
!= '\n' then