# ffigen testing

## Running Tests

1.  Some tests require that dynamic libraries be built before running the tests.
    You can do so with:

    ```shell
    dart run test/setup.dart
    ```

2.  Run the tests with:

    ```shell
    dart test
    ```

## Development

Some tests verify that the generated Dart FFI bindings match a golden file.

For example, the test
[`test/native_test/native_test.dart`](https://github.com/dart-lang/native/tree/main/pkgs/ffigen/test/native_test/native_test.dart)
works by:

1.  Loading the dynamic library for
    [`test/native_test/native_test.c`](https://github.com/dart-lang/native/tree/main/pkgs/ffigen/test/native_test/native_test.c)
    (which was generated by `dart run test/setup.dart`).

2.  Generating binding files for that dynamic library in the
    `test/debug_generated` directory.

3.  Comparing the golden file (i.e.
    [`test/native_test/_expected_native_test_bindings.dart`](https://github.com/dart-lang/native/tree/main/pkgs/ffigen/test/native_test/_expected_native_test_bindings.dart))
    to the generated file and generating a test failure if they do not match.

4.  Using the *golden* bindings to excercise the dynamic library.

If you modify any source for a dynamic library (e.g. any `.c`, `.h` or `.m`
files), then you should run:

```shell
   dart run test/setup.dart  # Rebuild the dynamic libraries.
   dart run test/regen.dart  # Rebuild the golden FFI bindings.
```

If you modify any code that changes how FFI bindings are generated, then you
should run:

  ```shell
  dart run test/regen.dart  # Rebuild the golden FFI bindings.
  ```

A conservative way to run tests is with:

  ```shell
  dart run test/setup.dart && dart run test/regen.dart && dart test
  ```

> Note: you should verify that the changes to the golden bindings are
> reasonable with `git diff`.
