aboutsummaryrefslogtreecommitdiff
path: root/tests
AgeCommit message (Collapse)AuthorFilesLines
2024-02-19Add string_map buildfile value typeBoris Kolpackov3-2/+77
This exposes the std::map<std::string,std::string> type to buildfiles. New functions: $size(<string-map>) $keys(<string-map>) Subscript can be used to lookup a value by key. The result is [null] if there is no value associated with the specified key. For example: map = [string_map] a@1 b@2 c@3 b = ($map[b]) # 2 if ($map[z] == [null]) ... Note that append (+=) is overriding (like std::map::insert_or_assign()) while prepend (=+) is not (like std::map::insert()). In a sense, whatever appears last (from left to right) is kept, which is consistent with what we expect to happen when specifying the same key repeatedly in a literal representation. For example: map = [string_map] a@0 b@2 a@1 # a@1 b@2 map += b@0 c@3 # a@1 b@0 c@3 map =+ b@1 d@4 # a@1 b@0 c@3 d@4 Example of iteration: map = [string_map] a@1 b@2 c@3 for p: $map { k = $first($p) v = $second($p) } While the subscript is mapped to key lookup only, index-based access can be implemented (with a bit of overhead) using the $keys() function: map = [string_map] a@1 b@2 c@3 keys = $keys($m) for i: $integer_sequence(0, $size($keys)) { k = ($keys[$i]) v = ($map[$k]) } Also, this commit changes the naming of other template-based value types (not exposed as buildfile value types) to use C++ template id-like names (e.g., map<string,optional<bool>>).
2024-02-12Add ability to specify recipes in separate filesBoris Kolpackov1-1/+1
This can now be achieved with the new `recipe` directive: recipe <language> <file> Note that similar to the use of if-else and switch directives with recipes, this directive requires explicit % recipe header. For example, instead of: file{foo.output}: {{ echo 'hello' >$path($>) }} We can now write: file{foo.output}: % recipe buildscript hello.buildscript With hello.buildscript containing: echo 'hello' >$path($>) Similarly, for C++ recipes (this time for a pattern), instead of: [rule_name=hello] file{~'/(.+)\.output/'}: % update clean {{ c++ 1 -- -- ... }} We can now write: [rule_name=hello] file{~'/(.+)\.output/'}: % update clean recipe c++ hello.cxx With hello.cxx containing: // c++ 1 -- -- ... Relative <file> paths are resolved using the buildfile directory that contains the `recipe` directive as a base. Note also that this mechanism can be used in exported buildfiles with recipe files placed into build/export/ together with buildfiles.
2024-02-07Add $json.object_names() functionBoris Kolpackov1-15/+37
2024-02-07Tweak $json.*() function names and semanticsBoris Kolpackov1-19/+19
2024-02-07Use reverse to fundamental types semantics in $json.member_value()Boris Kolpackov1-1/+1
Feels like this is an equivalent context to subscript/iteration.
2024-02-07Map JSON null in subscript/iteration to [null] instead of emptyBoris Kolpackov1-6/+14
This in fact feels more natural in the "for consumption" model and also helps with the nested subscript semantics.
2024-02-07Add support for nested subscript, use for json accessBoris Kolpackov1-0/+29
2024-02-07Add experimental support for JSON value typesBoris Kolpackov5-0/+651
New types: json json_array json_object New functions: $json.value_type(<json>) $json.value_size(<json>) $json.member_{name,value}(<json-member>) $json.object_names(<json-object>) $json.array_size(<json-array>) $json.array_find(<json-array>, <json>) $json.array_find_index(<json-array>, <json>) $json.load(<path>) $json.parse(<text>) $json.serialize(<json>[, <indentation>]) For example, to load a JSON value from a file: j = $json.load($src_base/board.json) Or to construct it in a buildfile: j = [json] one@1 two@([json] 2 3 4) three@([json] x@1 y@-1) This can also be done incrementally with append/prepend: j = [json_object] j += one@1 j += two@([json] 2 3 4) j += three@([json] x@1 y@-1) Instead of using this JSON-like syntax, one can also specify valid JSON input text: j = [json] '{"one":1, "two":[2, 3, 4], "three":{"x":1, "y":-1}' Besides the above set of functions, other handy ways to access components in a JSON value are iteration and subscript. For example: for m: $j print $member_name($m) $member_value($m) print ($j[three]) A subscript can be nested: print ($j[two][1]) print ($j[three][x]) While a JSON value can be printed directly like any other value, the representation will not be pretty-printed. As a result, for complex JSON values, printing a serialized representation might be a more readable option: info $serialize($j)
2023-12-14Allow enabling C++ modules for C++20 and later std.cxx valuesBoris Kolpackov2-5/+6
2023-12-08Only enable modules tests for MSVC 17.6 and laterBoris Kolpackov1-2/+4
2023-12-08Re-enable modules tests for MSVC and drop workarounds for old bugsBoris Kolpackov2-7/+13
2023-11-17Disable modules tests for Apple ClangBoris Kolpackov1-2/+6
2023-11-09Enable named modules tests for Clang 16 or later (but not on Windows)Boris Kolpackov2-6/+7
2023-11-02Add $first()/$second() pair functionsBoris Kolpackov1-0/+25
2023-06-26Suppress -Wdangling-reference GCC 13 warningKaren Arutyunov1-0/+5
2023-06-26Suppress -Wunqualified-std-cast-call Clang 15 warningKaren Arutyunov1-0/+2
2023-06-07Re-disable C++20 modules tests for MinGW GCCBoris Kolpackov1-3/+1
Several tests (other than the expected symexport) are still failing due to what looks like Windows-specific bugs in the compiler.
2023-06-07Try to enable C++20 modules tests for MinGW GCCBoris Kolpackov1-1/+3
2023-05-30Add $path.posix_string() and $path.posix_representation() functionsKaren Arutyunov1-0/+72
2023-01-09Fix simple and script tests to correctly terminate processes which don't ↵Karen Arutyunov1-1/+4
close stderr on exit
2022-12-15Add $regex.filter[_out]_{match,search}() functionsKaren Arutyunov1-0/+116
2022-12-15Improve escape sequence supportBoris Kolpackov1-0/+17
Specifically: 1. In the double-quoted strings we now only do effective escaping of the special `$("\` characters plus `)` for symmetry. 2. There is now support for "escape sequence expansion" in the form $\X where \X can be any of the C/C++ simple escape sequences (\n, \t, etc) plus \0 (which in C/C++ is an octal escape sequence). For example: info "foo$\n$\tbar$\n$\tbaz" Will print: buildfile:1:1: info: foo bar baz
2022-12-14Improve empty simple value to empty list of names reduction heuristicsBoris Kolpackov1-0/+55
Specifically, do not reduce typed RHS empty simple values for prepend/append and additionally for assignment provided LHS is typed and is a container.
2022-12-14Handle NULL values in $string() and $concat() functionsBoris Kolpackov1-0/+42
This is relied upon by the parser to provide conversion/concatenation semantics consistent with untyped values. Note that we handle NULL values only for types that have empty representation.
2022-12-02Fail if scope or target qualification in variable expansion is unknownBoris Kolpackov2-0/+21
There are three options here: we can "fall through" to an outer scope (there is always the global scope backstop; this is the old semantics, sort of), we can return NULL straight away, or we can fail. It feels like in most cases unknown scope or target is a mistake and doing anything other than failing is just making things harder to debug.
2022-11-25Use operation name as a buildscript name if unable to deduceKaren Arutyunov1-12/+36
2022-11-18Fix test failure on WindowsBoris Kolpackov1-1/+1
2022-11-18Complete low verbosity diagnostics reworkBoris Kolpackov2-51/+51
2022-11-16Initial low verbosity diagnostics reworkBoris Kolpackov2-2/+2
2022-11-14Add buffering for simple test diagnosticsdiag-bufferKaren Arutyunov2-13/+144
Also fix simple test redirecting diff's stdout to stderr.
2022-11-09Use diag_buffer in scriptKaren Arutyunov7-31/+53
2022-11-08Make process exit diagnostics consistentBoris Kolpackov1-1/+2
In particular, we now always print error message on non-0 exit except in cases where such exit is ignored.
2022-10-25Allow concatenation of path/dir_path type to be a path patternKaren Arutyunov2-1/+30
2022-10-21Add support for pairs in script 'for x:...' loopKaren Arutyunov1-0/+34
2022-10-21Change attribute syntax in script to come after variable in set and for (set ↵Karen Arutyunov3-41/+99
x [...], for x [...])
2022-10-20Add support for for-loop element typeKaren Arutyunov1-0/+14
2022-10-18Fix unexpected 'unterminated double-quoted sequence' script errorKaren Arutyunov2-0/+65
2022-10-18Invent diag preamble for buildscriptKaren Arutyunov2-1/+23
2022-10-14Make -w|--whitespace to be default for for-loopKaren Arutyunov1-6/+17
2022-10-14Fix printing test id multiple times on test failureKaren Arutyunov1-0/+26
2022-10-13Fix script 'for' loop testsKaren Arutyunov2-3/+3
2022-10-13Add support for 'for' loop second (... | for x) and third (for x <...) forms ↵Karen Arutyunov3-14/+1249
in script
2022-10-13Add test for public/private variable modelBoris Kolpackov2-0/+50
2022-10-13Switch to public/private variables modelBoris Kolpackov2-40/+40
Now unqualified variables are project-private and can be typified.
2022-09-30Move integer and bool function to separate source/testscript filesBoris Kolpackov3-39/+47
2022-09-29Add $find(<sequence>, <value>), $find_index(<sequence>, <value>) functionsBoris Kolpackov4-2/+60
The $find() function returns true if the sequence contains the specified value. The $find_index() function returns the index of the first element in the sequence that is equal to the specified value or $size(<sequence>) if none is found. For string sequences, it's possible to request case- insensitive comparison with a flag.
2022-09-28Add support for 'for' loop first form (for x:...) in scriptKaren Arutyunov2-0/+164
2022-09-28Add support for 'while' loop in scriptKaren Arutyunov4-20/+62
2022-09-27Fix test for handling of name patterns with trailing dotKaren Arutyunov1-1/+1
2022-09-23Add $is_a(<name>, <target-type>), $filter[_out](<names>, <target-types>) ↵Boris Kolpackov1-0/+36
functions $is_a() returns true if the <name>'s target type is-a <target-type>. Note that this is a dynamic type check that takes into account target type inheritance. $filter[_out]() return names with target types which are-a (filter) or not are-a (filter_out) one of <target-types>. In particular, these functions are useful for filtering prerequisite targets ($<) in ad hoc recipes and rules.