================
@@ -0,0 +1,213 @@
+# Dexter Script Testing
+
+Dexter's script mode can be accessed by using the `--use-script` flag.
+
+Dexter scripts are represented by YAML documents, which contain various
"nodes" instructing Dexter how to step through the debuggee program, what
information to collect and store from the debugger, and how to evaluate the
result. A simple Dexter script looks something like this:
+
+```yaml
+---
+!where {function: foo}:
+ !value arg: 5
+ !type arg: int
+ !and {lines: !range [10, 14]}:
+ !value local: ['a', 'b', 'c']
+!where {function: bar}:
+ !where {function: baz}:
+ !step exactly: [20, 21, 22, 23, 24]
+...
+```
+
+This Dexter test checks that:
+- When the debugger steps into `foo`, the type and value of `arg` is always
`(int) 5`.
+- While the debugger is in `foo` and the current line is between 10 and 14
(inclusive), the value of `local` is `'a'`, `'b'`, or `'c'`.
+- While the debugger is in the function `baz`, which was called directly from
the function `bar`, the lines that the debugger steps through exactly the lines
20-24 in order.
+
+The Dexter test follows a structure based on the nodes - in the example above,
each line starts with a node. Some of the basic types of node are:
+
+- `!where` describes a single stack frame using either a function name or a
filename + line range; these will be used by the debugger to set breakpoints.
We consider a `!where` node to be "active" when the current stack frame matches
the `!where` node. A `!where` node can either appear at the "root" of the
script, or it can appear as the child of another `!where`, in which case it
will only be active when its parent `!where` matches the frame above it. For
example, the `!where {function: baz}` node is only active when the next frame
up is `bar`, matching its parent.
+- `!and` is similar to `!where`, but it can only match the same stack frame as
its parent `!where` (and cannot appear at the root of the script). For example,
the `!and {lines: !range [10, 14]}` node is only active when the current line
number is in the range [10-14] *and* the current function is `foo`, because the
`!and` is a child of `!where {function: foo}`. `!where` and `!and` nodes are
collectively referred to as "state" nodes.
+- `!value` and `!type` are "expect" nodes, meaning they describe testable
output from the debugger. These nodes must appear a children of a state node
(`!where` or `!and`), and are active whenever their parent is active. The form
these nodes take is `!(value|type) <variable-name>: <expected-values>`, and
their function is to collect information for `<variable-name>` while the
debugger is running and the node is active, and compare that to
`<expected-values>` during the evaluation step to produce the final test
results.
+- `!step` is another kind of expect node, which tests the line numbers seen
while stepping through the program, and its expected value is a list of line
numbers that we expect to see (or not see in some cases - see more detailed
documentation below).
+- `!range` isn't a "script node" as the others above are, but a "utility
node", meaning it is used by other nodes to represent some data. `!range
[<start>, <stop>]` represents an inclusive range from `start` to `stop`, and is
used by state nodes.
+
+All these nodes are arranged in a nested map structure, where each state node
maps to its children. A YAML document containing this structure is embedded in
the input test file: the file may either be a YAML file, where the whole file
is a single document, or else the first valid YAML document contained in the
file which is also a valid Dexter test script will be used. Generally, this
requires one line that is just `---` to start the document, and another which
is just `...` to end the document.
+
+# Script Nodes
+
+## State Nodes
----------------
OCHyams wrote:
Bikeshed time, wdyt about "Control nodes" instead, which is a bit more
explicit? If "state node" is already deeply embedded then probably not worth
changing it.
https://github.com/llvm/llvm-project/pull/204365
_______________________________________________
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits