angular-cn/integration
Miško Hevery 9bd9590767 refactor(ivy): change styling to use programmatic API on updates (#34804)
Previously we would write to class/style as strings `element.className` and `element.style.cssText`. Turns out that approach is good for initial render but not good for updates. Updates using this approach are problematic because we have to check to see if there was an out of bound write to style and than perform reconciliation. This also requires the browser to bring up CSS parser which is expensive.

Another problem with old approach is that we had to queue the DOM writes and flush them twice. Once on element advance instruction and once in `hostBindings`. The double flushing is expensive but it also means that a directive can observe that styles are not yet written (they are written after directive executes.)

The new approach uses `element.classList.add/remove` and `element.style.setProperty/removeProperty` API for updates only (it continues to use `element.className` and `element.style.cssText` for initial render as it is cheaper.) The other change is that the styling changes are applied immediately (no queueing). This means that it is the instruction which computes priority. In some circumstances it may result in intermediate writes which are than overwritten with new value. (This should be rare)

Overall this change deletes most of the previous code and replaces it with new simplified implement. The simplification results in code savings.

PR Close #34804
2020-01-24 12:23:19 -08:00
..
bazel build: upgrade to bazel 2.0.0 (#34877) 2020-01-23 10:05:05 -08:00
bazel-schematics build: consolidate @angular-devkit/build-angular to the root package.json (#34002) 2019-12-02 10:49:12 -08:00
cli-hello-world build: consolidate @angular-devkit/build-angular to the root package.json (#34002) 2019-12-02 10:49:12 -08:00
cli-hello-world-ivy-compat build: consolidate @angular-devkit/build-angular to the root package.json (#34002) 2019-12-02 10:49:12 -08:00
cli-hello-world-ivy-i18n build: use CLI rc.8 (#34788) 2020-01-17 13:42:41 -05:00
cli-hello-world-ivy-minimal build: consolidate @angular-devkit/build-angular to the root package.json (#34002) 2019-12-02 10:49:12 -08:00
cli-hello-world-lazy build: consolidate @angular-devkit/build-angular to the root package.json (#34002) 2019-12-02 10:49:12 -08:00
cli-hello-world-lazy-rollup build: consolidate @angular-devkit/build-angular to the root package.json (#34002) 2019-12-02 10:49:12 -08:00
dynamic-compiler build: update lockfiles for integration projects (#33968) 2019-11-26 16:08:32 -08:00
hello_world__closure test(ngcc): build `zone.js` from source in `scripts/build-packages-dist.sh` (#33733) 2019-11-12 09:55:16 -08:00
hello_world__systemjs_umd test(ngcc): build `zone.js` from source in `scripts/build-packages-dist.sh` (#33733) 2019-11-12 09:55:16 -08:00
i18n test(ngcc): build `zone.js` from source in `scripts/build-packages-dist.sh` (#33733) 2019-11-12 09:55:16 -08:00
injectable-def build: update lockfiles for integration projects (#33968) 2019-11-26 16:08:32 -08:00
ivy-i18n build: consolidate @angular-devkit/build-angular to the root package.json (#34002) 2019-12-02 10:49:12 -08:00
language_service_plugin feat(language-service): Append symbol type to hover tooltip (#34515) 2019-12-20 14:40:04 -08:00
ng_elements test(ngcc): build `zone.js` from source in `scripts/build-packages-dist.sh` (#33733) 2019-11-12 09:55:16 -08:00
ng_update test(ngcc): build `zone.js` from source in `scripts/build-packages-dist.sh` (#33733) 2019-11-12 09:55:16 -08:00
ng_update_migrations build: consolidate @angular-devkit/build-angular to the root package.json (#34002) 2019-12-02 10:49:12 -08:00
ngcc fix(ngcc): do not collect private declarations from external packages (#34811) 2020-01-23 13:58:37 -08:00
platform-server build: use exact versions for integration project dependencies (#33968) 2019-11-26 16:08:32 -08:00
service-worker-schema build: update lockfiles for integration projects (#33968) 2019-11-26 16:08:32 -08:00
side-effects Revert "refactor: use isObservable provided by rxjs 6.1+ (#27668)" 2019-11-27 13:00:59 -08:00
terser build: update lockfiles for integration projects (#33968) 2019-11-26 16:08:32 -08:00
typings_test_ts36 test: explicitly turn off skipLibCheck for typings tests (#34798) 2020-01-16 12:06:57 -05:00
typings_test_ts37 test: explicitly turn off skipLibCheck for typings tests (#34798) 2020-01-16 12:06:57 -05:00
.gitignore test(ivy): i18n - add compile time translation to integration test (#32881) 2019-10-09 13:19:38 -07:00
README.md build: consolidate @angular-devkit/build-angular to the root package.json (#34002) 2019-12-02 10:49:12 -08:00
_payload-limits.json refactor(ivy): change styling to use programmatic API on updates (#34804) 2020-01-24 12:23:19 -08:00
check-dependencies.js ci: check versions of non-local integration project dependencies (#33968) 2019-11-26 16:08:33 -08:00
get-sharded-tests.js build: shard integration tests on circleci (#27937) 2019-01-07 15:35:09 -08:00
run_tests.sh fix(ngcc): do not collect private declarations from external packages (#34811) 2020-01-23 13:58:37 -08:00

README.md

Integration tests for Angular

This directory contains end-to-end tests for Angular. Each directory is a self-contained application that exactly mimics how a user might expect Angular to work, so they allow high-fidelity reproductions of real-world issues.

For this to work, we first build the Angular distribution via ./scripts/build-packages-dist.js, then install the distribution into each app.

To test Angular CLI applications, we use the cli-hello-world-* integration tests. When a significant change is released in the CLI, the applications should be updated with ng update:

$ cd integration/cli-hello-world[-*]
$ yarn install
$ yarn ng update @angular/cli @angular-devkit/build-angular
$ yarn build
$ yarn test

Afterwards the @angular/cli and @angular-devkit/build-angular should be reverted to the file:../ urls and the main package.json should be updated with the new versions.

Render3 tests

The directory cli-hello-world-ivy-compat contains a test for render3 used with the angular cli.

The cli-hello-world-ivy-minimal contains a minimal ivy app that is meant to mimic the bazel equivalent in packages/core/test/bundling/hello_world, and should be kept similar.

Writing an integration test

The API for each test is:

  • Each sub-directory here is an integration test
  • Each test should have a package.json file
  • The test runner will run yarn and yarn test on the package

This means that the test should be started by test script, like

"scripts": {"test": "runProgramA && assertResultIsGood"}

Note that the package.json file uses a special file:../../dist scheme to reference the Angular packages, so that the locally-built Angular is installed into the test app.

Also, beware of floating (non-locked) dependencies. If in doubt, you can install the package directly from file:../../node_modules.

WARNING

Always ensure that yarn.lock files are up-to-date with the corresponding package.json files (wrt the non-local dependencies - i.e. dependencies whose versions do not start with file:).

You can update a yarn.lock file by running yarn install in the project subdirectory.

Running integration tests

$ ./integration/run_tests.sh

The test runner will first re-build any stale npm packages, then cd into each subdirectory to execute the test.