angular/packages/compiler-cli/src/ngtsc/file_system
JoostK 4161d19374 test(ivy): normalize rooted paths to include a drive letter in Windows (#31996)
The Angular compiler has an emulation system for various kinds of
filesystems and runs its testcases for all those filesystems. This
allows to verify that the compiler behaves correctly in all of the
supported platforms, without needing to run the tests on the actual
platforms.

Previously, the emulated Windows mode would normalize rooted paths to
always include a drive letter, whereas the native mode did not perform
this normalization. The consequence of this discrepancy was that running
the tests in native Windows was behaving differently compared to how
emulated Windows mode behaves, potentially resulting in test failures
in native Windows that would succeed for emulated Windows.

This commit adds logic to ensure that paths are normalized equally for
emulated Windows and native Windows mode, therefore resolving the
discrepancy.

PR Close #31996
2019-08-29 12:38:02 -07:00
..
src perf(ivy): ngcc - add a cache to the FileSystem (#30525) 2019-07-09 09:40:46 -07:00
test perf(ivy): ngcc - add a cache to the FileSystem (#30525) 2019-07-09 09:40:46 -07:00
testing test(ivy): normalize rooted paths to include a drive letter in Windows (#31996) 2019-08-29 12:38:02 -07:00
BUILD.bazel refactor(ivy): implement a virtual file-system layer in ngtsc + ngcc (#30921) 2019-06-25 16:25:24 -07:00
index.ts perf(ivy): ngcc - add a cache to the FileSystem (#30525) 2019-07-09 09:40:46 -07:00
README.md refactor(ivy): implement a virtual file-system layer in ngtsc + ngcc (#30921) 2019-06-25 16:25:24 -07:00

Virtual file-system layer

To improve cross platform support, all file access (and path manipulation) is now done through a well known interface (FileSystem).

For testing a number of MockFileSystem implementations are supplied. These provide an in-memory file-system which emulates operating systems like OS/X, Unix and Windows.

The current file system is always available via the helper method, getFileSystem(). This is also used by a number of helper methods to avoid having to pass FileSystem objects around all the time. The result of this is that one must be careful to ensure that the file-system has been initialized before using any of these helper methods. To prevent this happening accidentally the current file system always starts out as an instance of InvalidFileSystem, which will throw an error if any of its methods are called.

You can set the current file-system by calling setFileSystem(). During testing you can call the helper function initMockFileSystem(os) which takes a string name of the OS to emulate, and will also monkey-patch aspects of the TypeScript library to ensure that TS is also using the current file-system.

Finally there is the NgtscCompilerHost to be used for any TypeScript compilation, which uses a given file-system.

All tests that interact with the file-system should be tested against each of the mock file-systems. A series of helpers have been provided to support such tests:

  • runInEachFileSystem() - wrap your tests in this helper to run all the wrapped tests in each of the mock file-systems, it calls initMockFileSystem() for each OS to emulate.
  • loadTestFiles() - use this to add files and their contents to the mock file system for testing.
  • loadStandardTestFiles() - use this to load a mirror image of files on disk into the in-memory mock file-system.
  • loadFakeCore() - use this to load a fake version of @angular/core into the mock file-system.

All ngcc and ngtsc source and tests now use this virtual file-system setup.