# Snapshot Tests

The `.fine` files in this directory and its descendants are processed
by `build.rs` into a series of snapshot-tests. The various test
assertions are specified by `@` directives in comments in the file.

e.g., a test might look like this:

```fine
// @concrete:
// | File
// |   ExpressionStatement
// |     BinaryExpression
// |       BinaryExpression
// |         LiteralExpression
// |           Number:'"1"'
// |         Star:'"*"'
// |         LiteralExpression
// |           Number:'"2"'
// |       Plus:'"+"'
// |       BinaryExpression
// |         UnaryExpression
// |           Minus:'"-"'
// |           LiteralExpression
// |             Number:'"3"'
// |         Star:'"*"'
// |         LiteralExpression
// |           Number:'"4"'
// |     Semicolon:'";"'
//
1 * 2 + -3 * 4;

// @type: 532 f64
```

## Assertions

The various assertions are as follows:

- The `// @ignore` directive marks the test as ignored.

- The `// @concrete:` assertion says that the following lines
  (prefixed with `// | `, as above) describe the concrete syntax tree
  of the file after parsing.

  e.g.:

  ```fine
  // @concrete:
  // | File
  // |   ExpressionStatement
  // |     LiteralExpression
  // |       String:'"\"Hello world\""'
  // |     Semicolon:'";"'
  //
  "Hello world";
  ```

- The `// @type:` assertion says that the type of the tree at the
  given point will match the given type. `@type` assertions usually go
  after the contents of the file to make the probe points more stable
  in the face of new assertions and whatnot.

  e.g.:

  ```fine
  "Hello world!"
  // @type: 2 string
  ```

- The `// @type-error:` assertion says that the type of the tree at
  the given point should be an error, and that the error message
  provided should be among the generated errors. (Like `@type`, these
  usually go after the code, for stability.)

  e.g.:

  ```fine
  - "twenty five";
  // @type-error: 0 cannot apply unary operator '-' to value of type string
  ```
