ranger-compiler 3.5.0 → 3.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1160 -19
- package/LICENSE +3 -1
- package/README.md +124 -29
- package/dist/Lang.rgr +1188 -290
- package/dist/api.d.ts +2343 -879
- package/dist/api.js +79924 -56922
- package/dist/lib/JSON.rgr +102 -91
- package/dist/lib/Shell.rgr +4 -4
- package/dist/lib/apple/AppleToolchain.rgr +4 -4
- package/dist/lib/apple/README.md +5 -4
- package/dist/lib/apple/apple_test.rgr +1 -1
- package/dist/lib/core/README.md +1 -1
- package/dist/lib/evg/EVG.rgr +12 -0
- package/dist/lib/evg/EVGA11yFromTree.rgr +302 -0
- package/dist/lib/evg/EVGA11yTree.rgr +894 -0
- package/dist/lib/evg/EVGBox.rgr +267 -0
- package/dist/lib/evg/EVGBoxShorthandTest.rgr +220 -0
- package/dist/lib/evg/EVGCodepoint.rgr +316 -0
- package/dist/lib/evg/EVGColor.rgr +700 -0
- package/dist/lib/evg/EVGCommands.rgr +177 -0
- package/dist/lib/evg/EVGComponent.rgr +331 -0
- package/dist/lib/evg/EVGComponentTest.rgr +387 -0
- package/dist/lib/evg/EVGConnector.rgr +541 -0
- package/dist/lib/evg/EVGConnectorTest.rgr +306 -0
- package/dist/lib/evg/EVGDisplayList.rgr +4186 -0
- package/dist/lib/evg/EVGEasing.rgr +370 -0
- package/dist/lib/evg/EVGEffectTest.rgr +253 -0
- package/dist/lib/evg/EVGElement.rgr +4914 -0
- package/dist/lib/evg/EVGFixedTest.rgr +289 -0
- package/dist/lib/evg/EVGFlexRulesTest.rgr +317 -0
- package/dist/lib/evg/EVGFlexWrapTest.rgr +246 -0
- package/dist/lib/evg/EVGFling.rgr +244 -0
- package/dist/lib/evg/EVGFocus.rgr +400 -0
- package/dist/lib/evg/EVGFocusTest.rgr +399 -0
- package/dist/lib/evg/EVGGradient.rgr +322 -0
- package/dist/lib/evg/EVGGrapheme.rgr +190 -0
- package/dist/lib/evg/EVGGrid.rgr +975 -0
- package/dist/lib/evg/EVGHitTest.rgr +208 -0
- package/dist/lib/evg/EVGHoles.rgr +294 -0
- package/dist/lib/evg/EVGHostMeasurerTest.rgr +281 -0
- package/dist/lib/evg/EVGHostTextMeasurer.rgr +331 -0
- package/dist/lib/evg/EVGHostTree.rgr +834 -0
- package/dist/lib/evg/EVGHostTreeTest.rgr +447 -0
- package/dist/lib/evg/EVGImageDecode.rgr +117 -0
- package/dist/lib/evg/EVGImageMeasurer.rgr +86 -0
- package/dist/lib/evg/EVGInspect.rgr +883 -0
- package/dist/lib/evg/EVGInvalidateTest.rgr +432 -0
- package/dist/lib/evg/EVGJsonTest.rgr +535 -0
- package/dist/lib/evg/EVGLayout.rgr +4220 -0
- package/dist/lib/evg/EVGMeasure.rgr +1267 -0
- package/dist/lib/evg/EVGOverlayTest.rgr +626 -0
- package/dist/lib/evg/EVGPatch.rgr +1721 -0
- package/dist/lib/evg/EVGPatchTest.rgr +692 -0
- package/dist/lib/evg/EVGPopoverTest.rgr +395 -0
- package/dist/lib/evg/EVGReconcile.rgr +226 -0
- package/dist/lib/evg/EVGReconcileTest.rgr +421 -0
- package/dist/lib/evg/EVGReject.rgr +126 -0
- package/dist/lib/evg/EVGRelayoutTest.rgr +375 -0
- package/dist/lib/evg/EVGRtlLayoutTest.rgr +319 -0
- package/dist/lib/evg/EVGRuler.rgr +232 -0
- package/dist/lib/evg/EVGRulerTest.rgr +172 -0
- package/dist/lib/evg/EVGSelectChrome.rgr +178 -0
- package/dist/lib/evg/EVGStyleCacheTest.rgr +419 -0
- package/dist/lib/evg/EVGStyleSheet.rgr +2148 -0
- package/dist/lib/evg/EVGStyleStateTest.rgr +407 -0
- package/dist/lib/evg/EVGStyleVarTest.rgr +471 -0
- package/dist/lib/evg/EVGText.rgr +105 -0
- package/dist/lib/evg/EVGTextEngine.rgr +536 -0
- package/dist/lib/evg/EVGTextMeasurer.rgr +720 -0
- package/dist/lib/evg/EVGTimingTest.rgr +1417 -0
- package/dist/lib/evg/EVGToolbar.rgr +1369 -0
- package/dist/lib/evg/EVGTransition.rgr +728 -0
- package/dist/lib/evg/EVGTreeJson.rgr +721 -0
- package/dist/lib/evg/EVGUnit.rgr +554 -0
- package/dist/lib/evg/EVGViewportUnitTest.rgr +236 -0
- package/dist/lib/evg/EvgApp.rgr +189 -0
- package/dist/lib/evg/EvgBitmapTracer.rgr +4277 -0
- package/dist/lib/evg/EvgBitmapTracerTest.rgr +2119 -0
- package/dist/lib/evg/EvgHost.rgr +451 -0
- package/dist/lib/evg/EvgTest.rgr +91 -0
- package/dist/lib/evg/EvgTraceColor.rgr +236 -0
- package/dist/lib/evg/EvgTraceCurve.rgr +648 -0
- package/dist/lib/evg/EvgTraceFit.rgr +767 -0
- package/dist/lib/evg/EvgTracePath.rgr +435 -0
- package/dist/lib/evg/EvgTraceTypes.rgr +559 -0
- package/dist/lib/evg/EvgViewport.rgr +313 -0
- package/dist/lib/evg/FxDemoDoc.rgr +185 -0
- package/dist/lib/evg/HOSTS.md +227 -0
- package/dist/lib/evg/ISSUES.md +835 -0
- package/dist/lib/evg/PLAN_ACCESSIBILITY.md +650 -0
- package/dist/lib/evg/PLAN_CSS_LAYOUT_AND_FONTS.md +1124 -0
- package/dist/lib/evg/PLAN_EFFECTS.md +431 -0
- package/dist/lib/evg/PLAN_EVG.md +518 -0
- package/dist/lib/evg/PLAN_EVG_RENDERER.md +1674 -0
- package/dist/lib/evg/PLAN_INSPECTOR.md +788 -0
- package/dist/lib/evg/PLAN_LINKS_AND_FORMS.md +157 -0
- package/dist/lib/evg/PLAN_NATIVE_HOSTS.md +671 -0
- package/dist/lib/evg/PLAN_VECTOR_IR.md +664 -0
- package/dist/lib/evg/PLAN_VIEW_TRANSFORM.md +322 -0
- package/dist/lib/evg/PathBuilder.rgr +333 -0
- package/dist/lib/evg/README.md +1236 -0
- package/dist/lib/evg/SPEC.md +1252 -0
- package/dist/lib/evg/SVGPathParser.rgr +1199 -0
- package/dist/lib/evg/SvgParser.rgr +1736 -0
- package/dist/lib/evg/TODO_EVG_RENDERER.md +595 -0
- package/dist/lib/evg/VectorShapes.rgr +331 -0
- package/dist/lib/evg/VectorStroke.rgr +107 -0
- package/dist/lib/evg/VectorViewBox.rgr +380 -0
- package/dist/lib/evg/agent/README.md +290 -0
- package/dist/lib/evg/agent/evg_agent.rgr +899 -0
- package/dist/lib/evg/agent/fixtures/broken.evg.json +7 -0
- package/dist/lib/evg/agent/fixtures/card.evg.json +9 -0
- package/dist/lib/evg/agent/fixtures/connector.css +63 -0
- package/dist/lib/evg/agent/fixtures/connector.evg.json +14 -0
- package/dist/lib/evg/agent/fixtures/drawn.evg.json +129 -0
- package/dist/lib/evg/agent/fixtures/gradient.evg.json +4 -0
- package/dist/lib/evg/agent/fixtures/popover.css +99 -0
- package/dist/lib/evg/agent/fixtures/popover.evg.json +30 -0
- package/dist/lib/evg/agent/roundtrip.sh +74 -0
- package/dist/lib/evg/agent/smoke.sh +230 -0
- package/dist/lib/evg/android/README.md +97 -0
- package/dist/lib/evg/android/androidstubs/AndroidStubs.kt +175 -0
- package/dist/lib/evg/android/androidstubs/Annotation.kt +10 -0
- package/dist/lib/evg/android/androidstubs/App.kt +30 -0
- package/dist/lib/evg/android/androidstubs/Content.kt +41 -0
- package/dist/lib/evg/android/androidstubs/ContentRes.kt +12 -0
- package/dist/lib/evg/android/androidstubs/InputMethod.kt +46 -0
- package/dist/lib/evg/android/androidstubs/Net.kt +6 -0
- package/dist/lib/evg/android/androidstubs/Os.kt +30 -0
- package/dist/lib/evg/android/androidstubs/Util.kt +15 -0
- package/dist/lib/evg/android/androidstubs/View.kt +113 -0
- package/dist/lib/evg/android/androidstubs/Widget.kt +16 -0
- package/dist/lib/evg/android/src/android/kotlin/fi/ranger/evg/AndroidEvgSurface.kt +323 -0
- package/dist/lib/evg/android/src/android/kotlin/fi/ranger/evg/AndroidTextMeasurer.kt +56 -0
- package/dist/lib/evg/android/src/android/kotlin/fi/ranger/evg/RippleEffect.kt +262 -0
- package/dist/lib/evg/android/src/awt/kotlin/fi/ranger/evg/AwtEvgSurface.kt +238 -0
- package/dist/lib/evg/android/src/awt/kotlin/fi/ranger/evg/AwtTextMeasurer.kt +85 -0
- package/dist/lib/evg/android/src/main/kotlin/fi/ranger/evg/EvgEngineThread.kt +115 -0
- package/dist/lib/evg/android/src/main/kotlin/fi/ranger/evg/EvgPainter.kt +231 -0
- package/dist/lib/evg/android/src/main/kotlin/fi/ranger/evg/EvgSurface.kt +117 -0
- package/dist/lib/evg/android/src/main/kotlin/fi/ranger/evg/RecordingSurface.kt +94 -0
- package/dist/lib/evg/apple/README.md +128 -0
- package/dist/lib/evg/apple/Sources/CoreGraphicsEvgSurface.swift +329 -0
- package/dist/lib/evg/apple/Sources/CoreTextMeasurer.swift +70 -0
- package/dist/lib/evg/apple/Sources/EvgEngineQueue.swift +105 -0
- package/dist/lib/evg/apple/Sources/EvgPainter.swift +225 -0
- package/dist/lib/evg/apple/Sources/EvgSurface.swift +163 -0
- package/dist/lib/evg/apple/Sources/RecordingSurface.swift +110 -0
- package/dist/lib/evg/bench/EvgLayoutBench.rgr +34 -0
- package/dist/lib/evg/bench/README.md +64 -0
- package/dist/lib/evg/bench/layout-bench.mjs +316 -0
- package/dist/lib/evg/bench/layout-cases.mjs +510 -0
- package/dist/lib/evg/bench/layout-conformance.mjs +254 -0
- package/dist/lib/evg/bin/.gitignore +17 -0
- package/dist/lib/evg/evg_test.rgr +313 -0
- package/dist/lib/evg/gl/README.md +198 -0
- package/dist/lib/evg/gl/a11y-paint-check.mjs +73 -0
- package/dist/lib/evg/gl/blur-check.mjs +399 -0
- package/dist/lib/evg/gl/boxmodel.json +1 -0
- package/dist/lib/evg/gl/demo.html +46 -0
- package/dist/lib/evg/gl/effect-presets.css +285 -0
- package/dist/lib/evg/gl/effect-presets.js +63 -0
- package/dist/lib/evg/gl/effect-shots.mjs +135 -0
- package/dist/lib/evg/gl/evg-a11y.js +566 -0
- package/dist/lib/evg/gl/evg-binary.js +160 -0
- package/dist/lib/evg/gl/evg-engine.js +296 -0
- package/dist/lib/evg/gl/evg-fx.js +237 -0
- package/dist/lib/evg/gl/evg-gestures.js +209 -0
- package/dist/lib/evg/gl/evg-list.js +167 -0
- package/dist/lib/evg/gl/evg-measure.js +186 -0
- package/dist/lib/evg/gl/evg-textinput.js +303 -0
- package/dist/lib/evg/gl/evg-view.js +144 -0
- package/dist/lib/evg/gl/evg-webgl.js +3942 -0
- package/dist/lib/evg/gl/fx-check.mjs +998 -0
- package/dist/lib/evg/gl/fx-demo.html +166 -0
- package/dist/lib/evg/gl/fx-demo.js +2 -0
- package/dist/lib/evg/gl/fx-serve.mjs +47 -0
- package/dist/lib/evg/gl/gestures-check.mjs +189 -0
- package/dist/lib/evg/gl/list-binary-check.mjs +152 -0
- package/dist/lib/evg/gl/measure-check.mjs +135 -0
- package/dist/lib/evg/gl/rotation-check.mjs +207 -0
- package/dist/lib/evg/gl/shift-check.mjs +113 -0
- package/dist/lib/evg/gl/stroke-check.mjs +168 -0
- package/dist/lib/evg/gl/text-snap-check.mjs +139 -0
- package/dist/lib/evg/gl/view-check.mjs +343 -0
- package/dist/lib/evg/gl/view-policy-check.mjs +184 -0
- package/dist/lib/evg/html/evg-dom.js +318 -0
- package/dist/lib/evg/html/evg-html.js +600 -0
- package/dist/lib/evg/inspect/README.md +415 -0
- package/dist/lib/evg/inspect/browser-smoke.mjs +115 -0
- package/dist/lib/evg/inspect/evg-inspect.js +947 -0
- package/dist/lib/evg/inspect/shots/css.png +0 -0
- package/dist/lib/evg/inspect/shots/dashboard.png +0 -0
- package/dist/lib/evg/inspect/shots/pptx-slide.png +0 -0
- package/dist/lib/evg/inspect/shots/state.png +0 -0
- package/dist/lib/evg/inspect/shots.mjs +226 -0
- package/dist/lib/evg/oracle/css-blur.json +576 -0
- package/dist/lib/evg/oracle/css-box.json +157 -0
- package/dist/lib/evg/oracle/css-timing.json +709 -0
- package/dist/lib/evg/oracle/css_blur_oracle.mjs +529 -0
- package/dist/lib/evg/oracle/css_box_oracle.mjs +106 -0
- package/dist/lib/evg/oracle/css_timing_oracle.mjs +389 -0
- package/dist/lib/evg/original/EVGColor.clj +310 -0
- package/dist/lib/evg/original/EVGColorContext.rgr +178 -0
- package/dist/lib/evg/original/SVGPath.rgr +627 -0
- package/dist/lib/evg/original/Vec2.crgr +103 -0
- package/dist/lib/evg/ranger.json +9 -0
- package/dist/lib/evg/showcase/README.md +246 -0
- package/dist/lib/evg/showcase/assets/emblem.svg +30 -0
- package/dist/lib/evg/showcase/assets/rosette.svg +22 -0
- package/dist/lib/evg/showcase/build.mjs +651 -0
- package/dist/lib/evg/showcase/pages/album.tsx +30 -0
- package/dist/lib/evg/showcase/pages/boxmodel.tsx +37 -0
- package/dist/lib/evg/showcase/pages/cards.tsx +41 -0
- package/dist/lib/evg/showcase/pages/chart_api.tsx +170 -0
- package/dist/lib/evg/showcase/pages/charts.tsx +219 -0
- package/dist/lib/evg/showcase/pages/drawing.tsx +160 -0
- package/dist/lib/evg/showcase/pages/emoji.tsx +91 -0
- package/dist/lib/evg/showcase/pages/flex.tsx +46 -0
- package/dist/lib/evg/showcase/pages/more.tsx +332 -0
- package/dist/lib/evg/showcase/pages/plots.tsx +262 -0
- package/dist/lib/evg/showcase/pages/svg.tsx +63 -0
- package/dist/lib/evg/showcase/pages/tables.tsx +209 -0
- package/dist/lib/evg/showcase/pages/typography.tsx +43 -0
- package/dist/lib/evg/showcase/pages/units.tsx +35 -0
- package/dist/lib/evg/showcase/pages/variants.tsx +233 -0
- package/dist/lib/evg/showcase/pages/vector.tsx +75 -0
- package/dist/lib/evg/showcase/pages/views.tsx +223 -0
- package/dist/lib/evg/showcase/tests/chart_api_smoke.mjs +339 -0
- package/dist/lib/evg/showcase/tests/gl_smoke.mjs +125 -0
- package/dist/lib/evg/showcase/themes/chart_api-default.css +15 -0
- package/dist/lib/evg/showcase/themes/charts-default.css +29 -0
- package/dist/lib/evg/showcase/themes/drawing-default.css +35 -0
- package/dist/lib/evg/showcase/themes/more-default.css +128 -0
- package/dist/lib/evg/showcase/themes/plots-default.css +18 -0
- package/dist/lib/evg/showcase/themes/showcase.css +508 -0
- package/dist/lib/evg/showcase/themes/tables-default.css +123 -0
- package/dist/lib/evg/showcase/themes/variants-default.css +15 -0
- package/dist/lib/evg/showcase/themes/views-default.css +15 -0
- package/dist/lib/evg/tools/bench_vs_potrace.mjs +290 -0
- package/dist/lib/evg/tools/evg_image_tool.rgr +488 -0
- package/dist/lib/evg/tools/evg_trace_bench.rgr +114 -0
- package/dist/lib/evg/tools/evg_trace_cli.rgr +662 -0
- package/dist/lib/evg/tools/evg_trace_cpp_bench.rgr +83 -0
- package/dist/lib/evg/tools/run_trace_bench.sh +74 -0
- package/dist/lib/evg/tools/run_trace_cli_smoke.sh +128 -0
- package/dist/lib/evg/web/responsive/EvgResponsiveCheck.rgr +271 -0
- package/dist/lib/evg/web/responsive/EvgResponsiveDemo.rgr +531 -0
- package/dist/lib/evg/web/responsive/README.md +97 -0
- package/dist/lib/evg/web/responsive/build.mjs +90 -0
- package/dist/lib/evg/web/responsive/dom-check.mjs +169 -0
- package/dist/lib/evg/web/responsive/index.html +177 -0
- package/dist/lib/evg/web/responsive/smoke.mjs +221 -0
- package/dist/lib/evg/web/tools/assets-client.mjs +95 -0
- package/dist/lib/evg/web/tools/boot-bench.mjs +189 -0
- package/dist/lib/evg/web/tools/inline-assets.mjs +119 -0
- package/dist/lib/evg/web/tools/minify.mjs +60 -0
- package/dist/lib/evg/web/tracer/build.mjs +87 -0
- package/dist/lib/evg/web/tracer/index.html +2805 -0
- package/dist/lib/evg/web/tracer/sample.png +0 -0
- package/dist/lib/evg/web/tracer/smoke.mjs +1162 -0
- package/dist/lib/evgr/Cargo.lock +21 -0
- package/dist/lib/evgr/Cargo.toml +19 -0
- package/dist/lib/evgr/README.md +140 -0
- package/dist/lib/evgr/bench/NativeBench.rgr +246 -0
- package/dist/lib/evgr/bench/compare.mjs +252 -0
- package/dist/lib/evgr/bench/speed.mjs +277 -0
- package/dist/lib/evgr/bin/.gitignore +3 -0
- package/dist/lib/evgr/src/bin/bench.rs +106 -0
- package/dist/lib/evgr/src/bin/smoke.rs +13 -0
- package/dist/lib/evgr/src/grid.rs +730 -0
- package/dist/lib/evgr/src/lib.rs +1003 -0
- package/dist/lib/evgr/src/style.rs +468 -0
- package/dist/lib/evgr/src/text.rs +83 -0
- package/dist/lib/image/BitReader.rgr +171 -0
- package/dist/lib/image/Buffer.rgr +173 -0
- package/dist/lib/image/DCT.rgr +283 -0
- package/dist/lib/image/Deflate.rgr +339 -0
- package/dist/lib/image/HuffmanDecoder.rgr +181 -0
- package/dist/lib/image/ImageBuffer.rgr +706 -0
- package/dist/lib/image/JPEGDecoder.rgr +808 -0
- package/dist/lib/image/PNGDecoder.rgr +544 -0
- package/dist/lib/image/PNGEncoder.rgr +388 -0
- package/dist/lib/image/PPMImage.rgr +224 -0
- package/dist/lib/image/ProgressiveJPEGDecoder.rgr +1154 -0
- package/dist/lib/image/README.md +33 -0
- package/dist/lib/image/RasterBuffer.rgr +294 -0
- package/dist/lib/image/VP8BoolDecoder.rgr +163 -0
- package/dist/lib/image/WebPDecoder.rgr +433 -0
- package/dist/lib/image/WebPLossless.rgr +1035 -0
- package/dist/lib/image/WebPLossy.rgr +1929 -0
- package/dist/lib/image/ranger.json +9 -0
- package/dist/lib/image/testdata/webp/anim_2f_24x16.webp +0 -0
- package/dist/lib/image/testdata/webp/fixtures.txt +33 -0
- package/dist/lib/image/testdata/webp/gen_fixtures.py +261 -0
- package/dist/lib/image/testdata/webp/ll_1x1.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_alpha_29x21.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_gradient_64x64.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_meta_32x32.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_noise_17x9.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_pal11_23x11.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_pal2_19x7.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_pal40_16x16.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_pal4_13x5.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_photo_40x30.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_predictors_64x32.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_1x1.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_raw_f0_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_raw_f1_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_raw_f2_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_raw_f3_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_vp8l_f0_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_vp8l_f1_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_vp8l_f2_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_vp8l_f3_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alpha_33x17.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_exif_15x11.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_i16_96x80.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_nofilter_24x20.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_odd_17x9.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_photo_48x40.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_q100_20x18.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_sharp_40x36.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_simple_filter_33x31.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_vpx_parts8_37x45.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_vpx_skip_96x80.webp +0 -0
- package/dist/lib/image/tests/WebPDecodeTool.rgr +81 -0
- package/dist/lib/image/tests/WebPDecoderTest.rgr +1162 -0
- package/dist/lib/image/tests/run_webp_tests.sh +39 -0
- package/dist/lib/rust/RsJson.rgr +468 -0
- package/dist/lib/rust/RsPrelude.rgr +1663 -0
- package/dist/lib/shell_test.rgr +7 -7
- package/dist/lib/stdlib.rgr +21 -5
- package/dist/lib/zip/ranger.json +6 -0
- package/dist/rgrc.js +87318 -67610
- package/package.json +1010 -1040
- package/dist/README.md +0 -117
- package/dist/package.json +0 -47
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
; SPDX-License-Identifier: MIT
|
|
2
|
+
|
|
3
|
+
; ==============================================================================
|
|
4
|
+
; EVGInvalidateTest — a skipped layout has to be an invisible one
|
|
5
|
+
; ==============================================================================
|
|
6
|
+
;
|
|
7
|
+
; `EVGStyleSheet` now reports what a pass did: how many elements it wrote to,
|
|
8
|
+
; how many already held what it would have written, and whether anything it
|
|
9
|
+
; wrote can have moved a box. A caller uses the last of those to skip layout.
|
|
10
|
+
;
|
|
11
|
+
; That makes the frame five times cheaper for a hover and introduces exactly one
|
|
12
|
+
; new way to be wrong: skipping a layout that was needed. The symptom would not
|
|
13
|
+
; be a crash. It would be a box drawn where it used to be — occasionally, only
|
|
14
|
+
; after certain changes, and only until something else forced a full pass. That
|
|
15
|
+
; is the worst kind of bug to find later, so it is checked here directly:
|
|
16
|
+
;
|
|
17
|
+
; for every kind of change, the frame that SKIPS layout when the sheet says
|
|
18
|
+
; it may must produce exactly what the frame that always lays out produces.
|
|
19
|
+
;
|
|
20
|
+
; Two trees, the same edits applied to both, one running the fast path and one
|
|
21
|
+
; the slow, display lists compared. Any change misclassified as paint-only shows
|
|
22
|
+
; up as a difference immediately.
|
|
23
|
+
;
|
|
24
|
+
; And the other half, which is easy to forget: the fast path has to actually
|
|
25
|
+
; skip. A version that never skips passes every comparison above and is worth
|
|
26
|
+
; nothing, so each case also states what it expected the pass to decide.
|
|
27
|
+
; ==============================================================================
|
|
28
|
+
|
|
29
|
+
Import "EVGElement.rgr"
|
|
30
|
+
Import "EVGUnit.rgr"
|
|
31
|
+
Import "EVGStyleSheet.rgr"
|
|
32
|
+
Import "EVGLayout.rgr"
|
|
33
|
+
Import "EVGDisplayList.rgr"
|
|
34
|
+
Import "EVGTransition.rgr"
|
|
35
|
+
|
|
36
|
+
class InvCheck {
|
|
37
|
+
def passed:int 0
|
|
38
|
+
def failed:int 0
|
|
39
|
+
|
|
40
|
+
fn ok:void (name:string cond:boolean) {
|
|
41
|
+
if cond {
|
|
42
|
+
passed = (passed + 1)
|
|
43
|
+
print (" PASS " + name)
|
|
44
|
+
} {
|
|
45
|
+
failed = (failed + 1)
|
|
46
|
+
print (" FAIL " + name)
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
fn eqStr:void (name:string got:string want:string) {
|
|
51
|
+
def good:boolean (got == want)
|
|
52
|
+
if (good == false) {
|
|
53
|
+
print (" got " + got)
|
|
54
|
+
print (" want " + want)
|
|
55
|
+
}
|
|
56
|
+
this.ok(name good)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
fn eqInt:void (name:string got:int want:int) {
|
|
60
|
+
this.eqStr(name (to_string got) (to_string want))
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
; One page, one sheet, one layout kept between frames — which is the shape a
|
|
65
|
+
; real host has and the shape a skip needs. A fresh `EVGLayout` every frame
|
|
66
|
+
; could not skip anything: there would be nothing to keep.
|
|
67
|
+
class Frame {
|
|
68
|
+
def sheet:EVGStyleSheet (new EVGStyleSheet())
|
|
69
|
+
def root:EVGElement (EVGElement.createDiv())
|
|
70
|
+
def lay:EVGLayout (new EVGLayout())
|
|
71
|
+
def alwaysLayout:boolean false
|
|
72
|
+
def layouts:int 0
|
|
73
|
+
def skips:int 0
|
|
74
|
+
|
|
75
|
+
Constructor () {
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
fn start:void (css:string page:EVGElement always:boolean) {
|
|
79
|
+
sheet.parse(css)
|
|
80
|
+
sheet.setViewport(400.0 600.0 false)
|
|
81
|
+
root = page
|
|
82
|
+
alwaysLayout = always
|
|
83
|
+
lay.setPageSize(400.0 600.0)
|
|
84
|
+
; The first frame always lays out: there is nothing to keep yet.
|
|
85
|
+
sheet.applyTree(root "")
|
|
86
|
+
lay.layout(root)
|
|
87
|
+
layouts = 0
|
|
88
|
+
skips = 0
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
fn draw:string () {
|
|
92
|
+
sheet.applyTree(root "")
|
|
93
|
+
def needed:boolean true
|
|
94
|
+
if (alwaysLayout == false) {
|
|
95
|
+
needed = ((sheet.layoutClean()) == false)
|
|
96
|
+
}
|
|
97
|
+
if needed {
|
|
98
|
+
layouts = (layouts + 1)
|
|
99
|
+
lay.layout(root)
|
|
100
|
+
} {
|
|
101
|
+
skips = (skips + 1)
|
|
102
|
+
}
|
|
103
|
+
def dl (new EVGDisplayList())
|
|
104
|
+
dl.setTextEngine((lay.getTextEngine()))
|
|
105
|
+
dl.build(root)
|
|
106
|
+
return (dl.toJson())
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
class EVGInvalidateTest {
|
|
111
|
+
|
|
112
|
+
sfn sheetText:string () {
|
|
113
|
+
return (""
|
|
114
|
+
+ ".page { display: flex; flex-direction: column; width: 400px; padding: 10px; }"
|
|
115
|
+
+ ".row { display: flex; flex-direction: row; height: 24px; width: 360px;"
|
|
116
|
+
+ " background-color: #eeeeee; gap: 6px; padding: 0 8px; }"
|
|
117
|
+
+ ".row:hover { background-color: #ffcc00; }"
|
|
118
|
+
+ ".row-tall { height: 48px; }"
|
|
119
|
+
+ ".cell { width: 100px; height: 16px; color: #222222; font-size: 12px; }"
|
|
120
|
+
+ ".cell-wide { width: 200px; }"
|
|
121
|
+
+ ".cell:hover { color: #cc0000; }"
|
|
122
|
+
+ ".moved { transform: translate(0, 12px); }"
|
|
123
|
+
+ ".faded { opacity: 0.5; }")
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
sfn row:EVGElement (i:int) {
|
|
127
|
+
def r (EVGElement.createDiv())
|
|
128
|
+
r.className = "row"
|
|
129
|
+
r.id = ("row" + (to_string i))
|
|
130
|
+
def j:int 0
|
|
131
|
+
while (j < 3) {
|
|
132
|
+
def c (EVGElement.createDiv())
|
|
133
|
+
c.className = "cell"
|
|
134
|
+
c.id = ((("c" + (to_string i)) + "-") + (to_string j))
|
|
135
|
+
c.textContent = (("cell " + (to_string i)) + (to_string j))
|
|
136
|
+
r.addChild(c)
|
|
137
|
+
j = (j + 1)
|
|
138
|
+
}
|
|
139
|
+
return r
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
sfn page:EVGElement () {
|
|
143
|
+
def p (EVGElement.createDiv())
|
|
144
|
+
p.className = "page"
|
|
145
|
+
p.id = "page"
|
|
146
|
+
def i:int 0
|
|
147
|
+
while (i < 6) {
|
|
148
|
+
p.addChild((EVGInvalidateTest.row(i)))
|
|
149
|
+
i = (i + 1)
|
|
150
|
+
}
|
|
151
|
+
return p
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
sfn rowOf:EVGElement (p:EVGElement i:int) {
|
|
155
|
+
return (itemAt p.children i)
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
sfn cellOf:EVGElement (p:EVGElement i:int j:int) {
|
|
159
|
+
def r:EVGElement (itemAt p.children i)
|
|
160
|
+
return (itemAt r.children j)
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
; Apply one named edit to a page. Both frames get the same one, so the
|
|
164
|
+
; comparison is of the PIPELINE and not of the edit.
|
|
165
|
+
sfn edit:void (p:EVGElement what:string) {
|
|
166
|
+
if (what == "hover-on") {
|
|
167
|
+
def r:EVGElement (EVGInvalidateTest.rowOf(p 2))
|
|
168
|
+
r.isHovered = true
|
|
169
|
+
return
|
|
170
|
+
}
|
|
171
|
+
if (what == "hover-off") {
|
|
172
|
+
def r2:EVGElement (EVGInvalidateTest.rowOf(p 2))
|
|
173
|
+
r2.isHovered = false
|
|
174
|
+
return
|
|
175
|
+
}
|
|
176
|
+
if (what == "hover-a-cell") {
|
|
177
|
+
def c:EVGElement (EVGInvalidateTest.cellOf(p 1 1))
|
|
178
|
+
c.isHovered = true
|
|
179
|
+
return
|
|
180
|
+
}
|
|
181
|
+
if (what == "transform-class") {
|
|
182
|
+
def r3:EVGElement (EVGInvalidateTest.rowOf(p 3))
|
|
183
|
+
r3.className = "row moved"
|
|
184
|
+
return
|
|
185
|
+
}
|
|
186
|
+
if (what == "fade-class") {
|
|
187
|
+
def r4:EVGElement (EVGInvalidateTest.rowOf(p 4))
|
|
188
|
+
r4.className = "row faded"
|
|
189
|
+
return
|
|
190
|
+
}
|
|
191
|
+
if (what == "height-class") {
|
|
192
|
+
def r5:EVGElement (EVGInvalidateTest.rowOf(p 1))
|
|
193
|
+
r5.className = "row row-tall"
|
|
194
|
+
return
|
|
195
|
+
}
|
|
196
|
+
if (what == "width-class") {
|
|
197
|
+
def c2:EVGElement (EVGInvalidateTest.cellOf(p 0 0))
|
|
198
|
+
c2.className = "cell cell-wide"
|
|
199
|
+
return
|
|
200
|
+
}
|
|
201
|
+
if (what == "text") {
|
|
202
|
+
def c3:EVGElement (EVGInvalidateTest.cellOf(p 0 1))
|
|
203
|
+
c3.textContent = "a much longer piece of text than before"
|
|
204
|
+
return
|
|
205
|
+
}
|
|
206
|
+
if (what == "add-child") {
|
|
207
|
+
def r6:EVGElement (EVGInvalidateTest.rowOf(p 5))
|
|
208
|
+
def extra (EVGElement.createDiv())
|
|
209
|
+
extra.className = "cell"
|
|
210
|
+
extra.id = "extra"
|
|
211
|
+
extra.textContent = "extra"
|
|
212
|
+
r6.addChild(extra)
|
|
213
|
+
return
|
|
214
|
+
}
|
|
215
|
+
if (what == "remove-child") {
|
|
216
|
+
def r7:EVGElement (EVGInvalidateTest.rowOf(p 5))
|
|
217
|
+
remove_index r7.children 0
|
|
218
|
+
return
|
|
219
|
+
}
|
|
220
|
+
if (what == "nothing") {
|
|
221
|
+
return
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
; One edit, both ways.
|
|
226
|
+
;
|
|
227
|
+
; `wantSkip` says what the classification is SUPPOSED to decide. Stating it
|
|
228
|
+
; is what stops this being a test of a pipeline that never skips: the
|
|
229
|
+
; agreement half passes trivially in that case, and only this half fails.
|
|
230
|
+
sfn bothWays:void (c:InvCheck what:string wantSkip:boolean) {
|
|
231
|
+
def fastPage:EVGElement (EVGInvalidateTest.page())
|
|
232
|
+
def fast (new Frame())
|
|
233
|
+
fast.start((EVGInvalidateTest.sheetText()) fastPage false)
|
|
234
|
+
|
|
235
|
+
def slowPage:EVGElement (EVGInvalidateTest.page())
|
|
236
|
+
def slow (new Frame())
|
|
237
|
+
slow.start((EVGInvalidateTest.sheetText()) slowPage true)
|
|
238
|
+
|
|
239
|
+
EVGInvalidateTest.edit(fastPage what)
|
|
240
|
+
EVGInvalidateTest.edit(slowPage what)
|
|
241
|
+
|
|
242
|
+
def a:string (fast.draw())
|
|
243
|
+
def b:string (slow.draw())
|
|
244
|
+
c.eqStr((what + ": skipping layout paints what laying out paints") a b)
|
|
245
|
+
if wantSkip {
|
|
246
|
+
c.eqInt((what + ": and layout was skipped") fast.skips 1)
|
|
247
|
+
} {
|
|
248
|
+
c.eqInt((what + ": and layout was run") fast.layouts 1)
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
sfn testPaintOnly:void (c:InvCheck) {
|
|
253
|
+
print "--- changes that cannot move a box ---"
|
|
254
|
+
; A `:hover` rule that sets only a colour. This is the case the whole
|
|
255
|
+
; feature exists for.
|
|
256
|
+
EVGInvalidateTest.bothWays(c "hover-on" true)
|
|
257
|
+
EVGInvalidateTest.bothWays(c "hover-a-cell" true)
|
|
258
|
+
; `transform` in EVG is applied to the display list AFTER layout, so it
|
|
259
|
+
; moves what is drawn without moving any box. Opacity likewise.
|
|
260
|
+
EVGInvalidateTest.bothWays(c "transform-class" true)
|
|
261
|
+
EVGInvalidateTest.bothWays(c "fade-class" true)
|
|
262
|
+
; And a frame where nothing at all happened.
|
|
263
|
+
EVGInvalidateTest.bothWays(c "nothing" true)
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
sfn testLayoutMoving:void (c:InvCheck) {
|
|
267
|
+
print "--- changes that do move boxes ---"
|
|
268
|
+
EVGInvalidateTest.bothWays(c "height-class" false)
|
|
269
|
+
EVGInvalidateTest.bothWays(c "width-class" false)
|
|
270
|
+
; Text is not a stylesheet property at all, so the sheet cannot see it
|
|
271
|
+
; change — which is why a caller that edits text has to force a layout.
|
|
272
|
+
; The check below is what says so out loud rather than leaving it to be
|
|
273
|
+
; discovered.
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
; The one the classification CANNOT catch, stated as a limit rather than
|
|
277
|
+
; left as a trap.
|
|
278
|
+
;
|
|
279
|
+
; `passLayoutDirty` counts what the STYLESHEET wrote. Text content, adding
|
|
280
|
+
; a child and removing one are none of the sheet's business, so a pass that
|
|
281
|
+
; only did one of those reports itself clean — and skipping layout there
|
|
282
|
+
; would be wrong. The host has to tell the pipeline about structure and
|
|
283
|
+
; content; `EVGReconcile` already reports created/dropped/moved for exactly
|
|
284
|
+
; this, and a host that edits an element by hand has to say so.
|
|
285
|
+
sfn testStructure:void (c:InvCheck) {
|
|
286
|
+
print "--- children coming and going ---"
|
|
287
|
+
; Neither of these is a property and no rule mentions them, so the
|
|
288
|
+
; classification only catches them because an element records how many
|
|
289
|
+
; children it had. An ADDED child would be caught anyway — a new
|
|
290
|
+
; element has never been styled — but a REMOVED one has no other
|
|
291
|
+
; symptom, and skipping there draws the survivors where they used to be.
|
|
292
|
+
EVGInvalidateTest.bothWays(c "add-child" false)
|
|
293
|
+
EVGInvalidateTest.bothWays(c "remove-child" false)
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
; The limit that is left, stated rather than left as a trap.
|
|
297
|
+
sfn testWhatTheSheetCannotSee:void (c:InvCheck) {
|
|
298
|
+
print "--- and the one thing it still cannot see ---"
|
|
299
|
+
; TEXT. It is not a property, it does not change the child count, and
|
|
300
|
+
; it changes how wide a run is — so a host that edits `textContent` by
|
|
301
|
+
; hand has to force a layout. Nothing in this gallery does: text comes
|
|
302
|
+
; from a rebuild, and a rebuild goes through `EVGReconcile`, which
|
|
303
|
+
; changes the element and therefore its style state.
|
|
304
|
+
def p:EVGElement (EVGInvalidateTest.page())
|
|
305
|
+
def f (new Frame())
|
|
306
|
+
f.start((EVGInvalidateTest.sheetText()) p false)
|
|
307
|
+
EVGInvalidateTest.edit(p "text")
|
|
308
|
+
f.draw()
|
|
309
|
+
c.eqInt("a bare text edit still looks clean to the sheet" f.skips 1)
|
|
310
|
+
|
|
311
|
+
; And with a layout forced, it is right — which is the contract: the
|
|
312
|
+
; sheet answers for what the SHEET did, and content the host changes
|
|
313
|
+
; behind its back is the host's to declare.
|
|
314
|
+
def p3:EVGElement (EVGInvalidateTest.page())
|
|
315
|
+
def f3 (new Frame())
|
|
316
|
+
f3.start((EVGInvalidateTest.sheetText()) p3 true)
|
|
317
|
+
EVGInvalidateTest.edit(p3 "text")
|
|
318
|
+
def forced:string (f3.draw())
|
|
319
|
+
|
|
320
|
+
def p4:EVGElement (EVGInvalidateTest.page())
|
|
321
|
+
def f4 (new Frame())
|
|
322
|
+
f4.start((EVGInvalidateTest.sheetText()) p4 true)
|
|
323
|
+
EVGInvalidateTest.edit(p4 "text")
|
|
324
|
+
c.eqStr("a forced layout gets the new text right" forced (f4.draw()))
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
; A transition writes showing values onto the element between frames, so the
|
|
328
|
+
; element stops holding what the sheet declared. If the skip did not know
|
|
329
|
+
; that, the sheet would never re-declare the target and the flight would
|
|
330
|
+
; land on its own output on the very next frame.
|
|
331
|
+
sfn testTransitionsStillRun:void (c:InvCheck) {
|
|
332
|
+
print "--- and a flight still flies ---"
|
|
333
|
+
def s (new EVGStyleSheet())
|
|
334
|
+
s.parse((""
|
|
335
|
+
+ ".box { width: 40px; height: 20px; background-color: #000000;"
|
|
336
|
+
+ " transition: background-color 200ms linear; }"
|
|
337
|
+
+ ".box:hover { background-color: #ffffff; }"))
|
|
338
|
+
s.setViewport(400.0 600.0 false)
|
|
339
|
+
def t (new EVGTransition())
|
|
340
|
+
def el (EVGElement.createDiv())
|
|
341
|
+
el.className = "box"
|
|
342
|
+
|
|
343
|
+
s.applyTree(el "")
|
|
344
|
+
t.reconcileTree(el)
|
|
345
|
+
t.advanceTree(el 1000.0)
|
|
346
|
+
s.applyTree(el "")
|
|
347
|
+
t.reconcileTree(el)
|
|
348
|
+
c.ok("nothing is moving at rest" ((t.busy(el)) == false))
|
|
349
|
+
|
|
350
|
+
el.isHovered = true
|
|
351
|
+
s.applyTree(el "")
|
|
352
|
+
t.reconcileTree(el)
|
|
353
|
+
t.advanceTree(el 40.0)
|
|
354
|
+
c.ok("the hover starts a flight" (t.busy(el)))
|
|
355
|
+
|
|
356
|
+
; Frames two and three change NOTHING the sheet can see. Without
|
|
357
|
+
; `writeBack` invalidating the element, the skip would fire here, the
|
|
358
|
+
; target would never be re-declared, and the flight would end.
|
|
359
|
+
def steps:int 0
|
|
360
|
+
while (steps < 3) {
|
|
361
|
+
s.applyTree(el "")
|
|
362
|
+
t.reconcileTree(el)
|
|
363
|
+
t.advanceTree(el 30.0)
|
|
364
|
+
steps = (steps + 1)
|
|
365
|
+
}
|
|
366
|
+
c.ok("and it is still flying three frames later" (t.busy(el)))
|
|
367
|
+
def mid:EVGColor el.backgroundColor
|
|
368
|
+
c.ok("part of the way there, not at either end"
|
|
369
|
+
(((mid.r) > 10.0) && ((mid.r) < 245.0)))
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
; The skip has to survive a transition pass.
|
|
373
|
+
;
|
|
374
|
+
; This is a PERFORMANCE assertion in a correctness test, and it is here
|
|
375
|
+
; because the bug it catches has no visible symptom: `EVGTransition.reconcile`
|
|
376
|
+
; runs on every element, and the first version of the invalidation hook sat
|
|
377
|
+
; in `writeBack` unconditionally — so every element was marked stale every
|
|
378
|
+
; frame and nothing was ever skipped, on every page in this gallery. The
|
|
379
|
+
; benchmark could not see it, because a benchmark that runs no transitions
|
|
380
|
+
; is not the page.
|
|
381
|
+
sfn testSkipSurvivesTransitions:void (c:InvCheck) {
|
|
382
|
+
print "--- and a transitioned page still skips ---"
|
|
383
|
+
def s (new EVGStyleSheet())
|
|
384
|
+
s.parse((EVGInvalidateTest.sheetText()) + ".row { transition: background-color 200ms linear; }")
|
|
385
|
+
s.setViewport(400.0 600.0 false)
|
|
386
|
+
def t (new EVGTransition())
|
|
387
|
+
def p:EVGElement (EVGInvalidateTest.page())
|
|
388
|
+
|
|
389
|
+
s.applyTree(p "")
|
|
390
|
+
t.reconcileTree(p)
|
|
391
|
+
t.advanceTree(p 1000.0)
|
|
392
|
+
s.applyTree(p "")
|
|
393
|
+
t.reconcileTree(p)
|
|
394
|
+
|
|
395
|
+
; One row lights up. Everything else is untouched, and a pass that ran
|
|
396
|
+
; `writeBack` over the whole tree must not have made it all stale.
|
|
397
|
+
def r:EVGElement (EVGInvalidateTest.rowOf(p 2))
|
|
398
|
+
r.isHovered = true
|
|
399
|
+
s.applyTree(p "")
|
|
400
|
+
t.reconcileTree(p)
|
|
401
|
+
t.advanceTree(p 30.0)
|
|
402
|
+
|
|
403
|
+
s.applyTree(p "")
|
|
404
|
+
c.ok("the flight is in the air" (t.busy(r)))
|
|
405
|
+
; 25 elements: a page, six rows, eighteen cells. Only the row that is
|
|
406
|
+
; moving may need re-declaring.
|
|
407
|
+
print ((" " + (to_string s.passStyled)) + " styled, " + (to_string s.passSkipped) + " skipped")
|
|
408
|
+
; Only the row that is actually MOVING. The five other rows declare the
|
|
409
|
+
; same transition and have finished flights sitting in them, and a
|
|
410
|
+
; finished flight is not a reason to re-declare anything.
|
|
411
|
+
c.ok("only the moving row is re-declared" (s.passStyled <= 2))
|
|
412
|
+
c.ok("and the rest of the tree is skipped" (s.passSkipped >= 23))
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
sfn main:void () {
|
|
416
|
+
def c (new InvCheck())
|
|
417
|
+
print "=== EVG invalidation: paint versus layout ==="
|
|
418
|
+
EVGInvalidateTest.testPaintOnly(c)
|
|
419
|
+
EVGInvalidateTest.testLayoutMoving(c)
|
|
420
|
+
EVGInvalidateTest.testStructure(c)
|
|
421
|
+
EVGInvalidateTest.testWhatTheSheetCannotSee(c)
|
|
422
|
+
EVGInvalidateTest.testTransitionsStillRun(c)
|
|
423
|
+
EVGInvalidateTest.testSkipSurvivesTransitions(c)
|
|
424
|
+
print ""
|
|
425
|
+
print ("passed=" + (to_string c.passed) + " failed=" + (to_string c.failed))
|
|
426
|
+
if (c.failed > 0) {
|
|
427
|
+
print "FAILURES"
|
|
428
|
+
} {
|
|
429
|
+
print "ALL PASS"
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
}
|