This directory contains the expected result of type-checking projects from
https://github.com/plume-lib/, after whole-program inference.
The script `test-wpi-plumelib.sh` runs the tests.

If the tests fail, you may need to fix a problem with whole-program
inference, or you might need to edit the `*.expected` files in this
directory.  Those files are just like the `typecheck.out` file created by
running wpi.sh, with two permitted additions:
 * comments (a line starting with "#") to explain type-checking errors
 * blank lines to improve readability

The script `test-wpi-plumelib.sh` complements the Gradle `wpiManyTests`
task.  Here are differences:
 * different projects use a different list of type-checkers.
   (wpi-many.sh uses a fixed set of type-checkers for all projects)
 * this uses the HEAD commit
   (wpi-many.sh uses a fixed commit)
 * this checks for expected type-checking errors
   (the Gradle wpiManyTests target requires that there are no errors, so it
   skips type systems for which inference does not currently work)

The use of the HEAD commit makes these tests brittle.  They might fail if:
 * The Checker Framework is changed in a way that makes whole-program
   inference fail to infer all needed annotations.
 * A plume-lib project is changed in a way that exposes a limitation of
   whole-program inference.

A test failure always indicates a limitation of whole-program inference, or
the removal of a limitation.  It is unfortunate that commits to a different
repository can make the Checker Framework tests fail, but that is the price
of staying at the head commit.
