If we look at 978849.wp and 506544.wp, both are apparently the same version as our testWordPerfect.wpd: filetype=10, productype=1, minorversion=1
This is wrong, the major version for the ones that work is 2, as you point out above. Sorry. For at least these two test files, the major version is '0'.
If we revert readWP() to read(), the parse finishes without exception, but the content is corrupt – çä.
If the length that is stored in the header is meant to be close or even to equal the actual file length (testWordPerfect.wpd has a stored file size of 2395, but an actual file size of 2044), then something may already be going wrong in the header. File 506544.wp stores 17825842 as its length, but the file is actually only 3117. File 978849.wp has a stored length of 50, but an actual length of 1389.