ranger-compiler 3.5.1 → 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 +1064 -20
- package/LICENSE +3 -1
- package/README.md +123 -28
- package/dist/Lang.rgr +1188 -290
- package/dist/api.d.ts +2343 -879
- package/dist/api.js +79923 -56921
- 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,399 @@
|
|
|
1
|
+
; SPDX-License-Identifier: MIT
|
|
2
|
+
|
|
3
|
+
; ==============================================================================
|
|
4
|
+
; EVGFocusTest — Tab is an order, an arrow is a direction
|
|
5
|
+
; ==============================================================================
|
|
6
|
+
;
|
|
7
|
+
; The two rules `EVGFocus` exists to keep apart:
|
|
8
|
+
;
|
|
9
|
+
; TAB IS TREE ORDER. The order the page was written in, wrapping at both
|
|
10
|
+
; ends, which is what a browser does and what the a11y
|
|
11
|
+
; mirror publishes.
|
|
12
|
+
;
|
|
13
|
+
; AN ARROW IS SPATIAL. Tree order is wrong for a grid — the thing under a
|
|
14
|
+
; button is not the thing after it — so the arrows go
|
|
15
|
+
; by the boxes. The layout under test is a three by
|
|
16
|
+
; three grid written ROW BY ROW, so "down" and "next"
|
|
17
|
+
; disagree on every cell, which is the only way to
|
|
18
|
+
; tell the two rules apart.
|
|
19
|
+
;
|
|
20
|
+
; And the things that stop a ring pointing at nothing: a disabled control, a
|
|
21
|
+
; hidden subtree, a zero-sized box and an element with no id are not focusable,
|
|
22
|
+
; and a focus whose element has gone is dropped on the next settle.
|
|
23
|
+
; ==============================================================================
|
|
24
|
+
|
|
25
|
+
Import "EVGElement.rgr"
|
|
26
|
+
Import "EVGFocus.rgr"
|
|
27
|
+
|
|
28
|
+
class FocusCheck {
|
|
29
|
+
def passed:int 0
|
|
30
|
+
def failed:int 0
|
|
31
|
+
|
|
32
|
+
fn ok:void (name:string cond:boolean) {
|
|
33
|
+
if cond {
|
|
34
|
+
passed = (passed + 1)
|
|
35
|
+
print (" PASS " + name)
|
|
36
|
+
} {
|
|
37
|
+
failed = (failed + 1)
|
|
38
|
+
print (" FAIL " + name)
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
fn eqStr:void (name:string got:string want:string) {
|
|
43
|
+
def good:boolean (got == want)
|
|
44
|
+
if (good == false) {
|
|
45
|
+
print (((" got '" + got) + "' want '") + want + "'")
|
|
46
|
+
}
|
|
47
|
+
this.ok(name good)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
fn eqInt:void (name:string got:int want:int) {
|
|
51
|
+
def good:boolean (got == want)
|
|
52
|
+
if (good == false) {
|
|
53
|
+
print ((" got " + (to_string got)) + " want " + (to_string want))
|
|
54
|
+
}
|
|
55
|
+
this.ok(name good)
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
class EVGFocusTest {
|
|
60
|
+
|
|
61
|
+
sfn box:EVGElement (id:string x:double y:double w:double h:double) {
|
|
62
|
+
def el (new EVGElement())
|
|
63
|
+
el.id = id
|
|
64
|
+
el.a11yFocusable = true
|
|
65
|
+
el.calculatedX = x
|
|
66
|
+
el.calculatedY = y
|
|
67
|
+
el.calculatedWidth = w
|
|
68
|
+
el.calculatedHeight = h
|
|
69
|
+
return el
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
; Three by three, a hundred pixels apart, written ROW BY ROW:
|
|
73
|
+
;
|
|
74
|
+
; a b c
|
|
75
|
+
; d e f
|
|
76
|
+
; g h i
|
|
77
|
+
;
|
|
78
|
+
; so tree order runs across and the arrows have to disagree with it.
|
|
79
|
+
sfn grid:EVGElement () {
|
|
80
|
+
def root (new EVGElement())
|
|
81
|
+
def names:[string]
|
|
82
|
+
push names "a"
|
|
83
|
+
push names "b"
|
|
84
|
+
push names "c"
|
|
85
|
+
push names "d"
|
|
86
|
+
push names "e"
|
|
87
|
+
push names "f"
|
|
88
|
+
push names "g"
|
|
89
|
+
push names "h"
|
|
90
|
+
push names "i"
|
|
91
|
+
def i:int 0
|
|
92
|
+
while (i < 9) {
|
|
93
|
+
def col:int (i % 3)
|
|
94
|
+
def row:int (to_int ((int2double i) / 3.0))
|
|
95
|
+
def x:double ((int2double col) * 100.0)
|
|
96
|
+
def y:double ((int2double row) * 100.0)
|
|
97
|
+
root.addChild((EVGFocusTest.box((itemAt names i) x y 80.0 60.0)))
|
|
98
|
+
i = (i + 1)
|
|
99
|
+
}
|
|
100
|
+
return root
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
sfn testTreeOrder:void (c:FocusCheck) {
|
|
104
|
+
print "--- Tab is the order the page was written in ---"
|
|
105
|
+
def root:EVGElement (EVGFocusTest.grid())
|
|
106
|
+
def f (new EVGFocus())
|
|
107
|
+
f.scan(root)
|
|
108
|
+
c.eqInt("nine focusable" (f.count()) 9)
|
|
109
|
+
c.eqStr("the first is the first" (f.idAt(0)) "a")
|
|
110
|
+
|
|
111
|
+
; Entering from nothing: forwards starts at the first, backwards at
|
|
112
|
+
; the last, as a browser enters a page from either end.
|
|
113
|
+
c.eqStr("Tab from nothing" (f.key(root "Tab" false)) "a")
|
|
114
|
+
c.eqStr("then the next" (f.key(root "Tab" false)) "b")
|
|
115
|
+
c.eqStr("and the next" (f.key(root "Tab" false)) "c")
|
|
116
|
+
; ACROSS THE ROW, not down the column: this is the whole difference.
|
|
117
|
+
c.eqStr("past the end of the row it keeps going" (f.key(root "Tab" false)) "d")
|
|
118
|
+
c.eqStr("Shift+Tab goes back" (f.key(root "Tab" true)) "c")
|
|
119
|
+
|
|
120
|
+
f.clear()
|
|
121
|
+
c.eqStr("Shift+Tab from nothing takes the last" (f.key(root "Tab" true)) "i")
|
|
122
|
+
c.eqStr("and wraps round the end" (f.key(root "Tab" false)) "a")
|
|
123
|
+
c.eqStr("and round the start" (f.key(root "Tab" true)) "i")
|
|
124
|
+
|
|
125
|
+
c.eqStr("Home is the first" (f.key(root "Home" false)) "a")
|
|
126
|
+
c.eqStr("End is the last" (f.key(root "End" false)) "i")
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
sfn testDirections:void (c:FocusCheck) {
|
|
130
|
+
print "--- an arrow is a direction, not a step ---"
|
|
131
|
+
def root:EVGElement (EVGFocusTest.grid())
|
|
132
|
+
def f (new EVGFocus())
|
|
133
|
+
f.place(root "e")
|
|
134
|
+
|
|
135
|
+
; The four neighbours of the middle. Tree order would answer "d" and
|
|
136
|
+
; "f" for up and down, which is exactly the bug this is here to stop.
|
|
137
|
+
c.eqStr("down is below" (f.key(root "ArrowDown" false)) "h")
|
|
138
|
+
f.place(root "e")
|
|
139
|
+
c.eqStr("up is above" (f.key(root "ArrowUp" false)) "b")
|
|
140
|
+
f.place(root "e")
|
|
141
|
+
c.eqStr("right is beside" (f.key(root "ArrowRight" false)) "f")
|
|
142
|
+
f.place(root "e")
|
|
143
|
+
c.eqStr("left is the other side" (f.key(root "ArrowLeft" false)) "d")
|
|
144
|
+
|
|
145
|
+
; Directly below beats further along: `h` is under `e`, `g` and `i`
|
|
146
|
+
; are the same distance down and one column out.
|
|
147
|
+
f.place(root "b")
|
|
148
|
+
c.eqStr("straight down beats diagonal" (f.key(root "ArrowDown" false)) "e")
|
|
149
|
+
|
|
150
|
+
; NOTHING THAT WAY IS NOWHERE, not a wrap: an arrow off the edge of a
|
|
151
|
+
; screen must not jump to the far side, because the eye does not.
|
|
152
|
+
f.place(root "a")
|
|
153
|
+
c.eqStr("up from the top row is nothing" (f.key(root "ArrowUp" false)) "")
|
|
154
|
+
c.eqStr("and the focus did not move" f.focusId "a")
|
|
155
|
+
f.place(root "c")
|
|
156
|
+
c.eqStr("right from the last column is nothing" (f.key(root "ArrowRight" false)) "")
|
|
157
|
+
|
|
158
|
+
; An arrow with nothing focused enters, like Tab.
|
|
159
|
+
f.clear()
|
|
160
|
+
c.eqStr("an arrow from nothing enters" (f.key(root "ArrowDown" false)) "a")
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
; A page with a dialog over it: the grid, and a box holding two buttons
|
|
164
|
+
; that says it is modal.
|
|
165
|
+
sfn withDialog:EVGElement (modal:boolean) {
|
|
166
|
+
def page:EVGElement (EVGFocusTest.grid())
|
|
167
|
+
def sheet (new EVGElement())
|
|
168
|
+
sheet.id = "sheet"
|
|
169
|
+
sheet.a11yModal = modal
|
|
170
|
+
sheet.addChild((EVGFocusTest.box("ok" 400.0 400.0 80.0 60.0)))
|
|
171
|
+
sheet.addChild((EVGFocusTest.box("cancel" 500.0 400.0 80.0 60.0)))
|
|
172
|
+
page.addChild(sheet)
|
|
173
|
+
return page
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
sfn testModalTraps:void (c:FocusCheck) {
|
|
177
|
+
print "--- a dialog traps the keyboard ---"
|
|
178
|
+
; The same tree twice: once where the sheet says it is modal and once
|
|
179
|
+
; where it does not. Only the declaration differs, which is the claim.
|
|
180
|
+
def loose:EVGElement (EVGFocusTest.withDialog(false))
|
|
181
|
+
def f (new EVGFocus())
|
|
182
|
+
f.scan(loose)
|
|
183
|
+
c.eqInt("without the declaration everything is reachable" (f.count()) 11)
|
|
184
|
+
c.ok("and nothing is trapped" ((f.isTrapped()) == false))
|
|
185
|
+
|
|
186
|
+
def page:EVGElement (EVGFocusTest.withDialog(true))
|
|
187
|
+
def g (new EVGFocus())
|
|
188
|
+
g.scan(page)
|
|
189
|
+
c.eqInt("with it, only the dialog's own" (g.count()) 2)
|
|
190
|
+
c.ok("and it says where" ((g.trapId()) == "sheet"))
|
|
191
|
+
c.eqStr("the first is the dialog's first" (g.idAt(0)) "ok")
|
|
192
|
+
|
|
193
|
+
; ROUND AND ROUND. Tab past the last is the first again, not the page
|
|
194
|
+
; behind — walking out is the whole bug.
|
|
195
|
+
c.eqStr("Tab enters the dialog" (g.key(page "Tab" false)) "ok")
|
|
196
|
+
c.eqStr("then its other button" (g.key(page "Tab" false)) "cancel")
|
|
197
|
+
c.eqStr("and wraps back inside it" (g.key(page "Tab" false)) "ok")
|
|
198
|
+
c.eqStr("Shift+Tab wraps the other way" (g.key(page "Tab" true)) "cancel")
|
|
199
|
+
c.eqStr("End is the dialog's last" (g.key(page "End" false)) "cancel")
|
|
200
|
+
c.eqStr("Home is the dialog's first" (g.key(page "Home" false)) "ok")
|
|
201
|
+
; An arrow cannot leave either: the grid is above and to the left of
|
|
202
|
+
; the sheet, so "up" would land in it if the page were in the walk.
|
|
203
|
+
c.eqStr("up from the dialog is nothing" (g.key(page "ArrowUp" false)) "")
|
|
204
|
+
c.eqStr("and the ring is still in it" g.focusId "ok")
|
|
205
|
+
|
|
206
|
+
; A page element cannot be focused BY HAND either, or a press behind
|
|
207
|
+
; the dialog would put the ring where the keys cannot follow.
|
|
208
|
+
c.ok("the page behind cannot be focused" ((g.place(page "e")) == false))
|
|
209
|
+
c.ok("but the dialog's own can" (g.place(page "cancel")))
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
sfn testTrapLifts:void (c:FocusCheck) {
|
|
213
|
+
print "--- and lets go when the dialog does ---"
|
|
214
|
+
; The sheet is the page's last child — `withDialog` puts it there —
|
|
215
|
+
; so it is held rather than searched for.
|
|
216
|
+
def page:EVGElement (EVGFocusTest.withDialog(true))
|
|
217
|
+
def sheet:EVGElement (page.getChild(((page.getChildCount()) - 1)))
|
|
218
|
+
def f (new EVGFocus())
|
|
219
|
+
f.place(page "cancel")
|
|
220
|
+
c.eqStr("focused inside it" f.focusId "cancel")
|
|
221
|
+
|
|
222
|
+
; The dialog closes. Nothing is told to lift the trap: the tree stops
|
|
223
|
+
; saying it is modal and the walk is the whole page again.
|
|
224
|
+
sheet.a11yModal = false
|
|
225
|
+
f.scan(page)
|
|
226
|
+
c.ok("nothing is trapped now" ((f.isTrapped()) == false))
|
|
227
|
+
c.eqInt("and the page is reachable" (f.count()) 11)
|
|
228
|
+
|
|
229
|
+
; A dialog that is drawn but hidden does not trap: the mirror hides
|
|
230
|
+
; the page behind a dialog that is UP, and a hidden one is not.
|
|
231
|
+
sheet.a11yModal = true
|
|
232
|
+
sheet.a11yHidden = true
|
|
233
|
+
f.scan(page)
|
|
234
|
+
c.ok("a hidden dialog does not trap" ((f.isTrapped()) == false))
|
|
235
|
+
sheet.a11yHidden = false
|
|
236
|
+
sheet.display = "none"
|
|
237
|
+
f.scan(page)
|
|
238
|
+
c.ok("nor one folded away by the stylesheet" ((f.isTrapped()) == false))
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
sfn testInnermostTraps:void (c:FocusCheck) {
|
|
242
|
+
print "--- a dialog over a dialog is the one that traps ---"
|
|
243
|
+
; The review sheet over the add sheet: overlays are appended, so the
|
|
244
|
+
; later one is the one on top.
|
|
245
|
+
def page:EVGElement (EVGFocusTest.withDialog(true))
|
|
246
|
+
def second (new EVGElement())
|
|
247
|
+
second.id = "review"
|
|
248
|
+
second.a11yModal = true
|
|
249
|
+
second.addChild((EVGFocusTest.box("add" 600.0 600.0 80.0 60.0)))
|
|
250
|
+
page.addChild(second)
|
|
251
|
+
|
|
252
|
+
def f (new EVGFocus())
|
|
253
|
+
f.scan(page)
|
|
254
|
+
c.ok("the later one traps" ((f.trapId()) == "review"))
|
|
255
|
+
c.eqInt("and only its own is reachable" (f.count()) 1)
|
|
256
|
+
c.ok("the sheet under it is not" ((f.place(page "ok")) == false))
|
|
257
|
+
|
|
258
|
+
; …and a dialog INSIDE a dialog, which is the other way it nests.
|
|
259
|
+
def inner (new EVGElement())
|
|
260
|
+
inner.id = "confirm"
|
|
261
|
+
inner.a11yModal = true
|
|
262
|
+
inner.addChild((EVGFocusTest.box("yes" 620.0 620.0 60.0 40.0)))
|
|
263
|
+
second.addChild(inner)
|
|
264
|
+
f.scan(page)
|
|
265
|
+
c.ok("a nested one wins over the one holding it" ((f.trapId()) == "confirm"))
|
|
266
|
+
c.eqStr("and it is what a key moves to" (f.key(page "Tab" false)) "yes")
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
sfn testWhatCannotBeFocused:void (c:FocusCheck) {
|
|
270
|
+
print "--- what a ring must never point at ---"
|
|
271
|
+
def root (new EVGElement())
|
|
272
|
+
root.addChild((EVGFocusTest.box("one" 0.0 0.0 80.0 60.0)))
|
|
273
|
+
|
|
274
|
+
def off:EVGElement (EVGFocusTest.box("off" 0.0 100.0 80.0 60.0))
|
|
275
|
+
off.a11yDisabled = true
|
|
276
|
+
root.addChild(off)
|
|
277
|
+
|
|
278
|
+
def gone:EVGElement (EVGFocusTest.box("gone" 0.0 200.0 80.0 60.0))
|
|
279
|
+
gone.a11yHidden = true
|
|
280
|
+
root.addChild(gone)
|
|
281
|
+
|
|
282
|
+
; A hidden BRANCH, not only a hidden leaf: the children of a
|
|
283
|
+
; `display: none` box are not on the screen either.
|
|
284
|
+
def branch (new EVGElement())
|
|
285
|
+
branch.display = "none"
|
|
286
|
+
branch.addChild((EVGFocusTest.box("inside" 0.0 300.0 80.0 60.0)))
|
|
287
|
+
root.addChild(branch)
|
|
288
|
+
|
|
289
|
+
; No id: a focus nobody can press is a focus that goes nowhere.
|
|
290
|
+
def nameless:EVGElement (EVGFocusTest.box("" 0.0 400.0 80.0 60.0))
|
|
291
|
+
root.addChild(nameless)
|
|
292
|
+
|
|
293
|
+
; Laid out to nothing.
|
|
294
|
+
root.addChild((EVGFocusTest.box("empty" 0.0 500.0 0.0 0.0)))
|
|
295
|
+
|
|
296
|
+
; And an element that simply does not say it takes the keyboard.
|
|
297
|
+
def plain:EVGElement (EVGFocusTest.box("plain" 0.0 600.0 80.0 60.0))
|
|
298
|
+
plain.a11yFocusable = false
|
|
299
|
+
root.addChild(plain)
|
|
300
|
+
|
|
301
|
+
def f (new EVGFocus())
|
|
302
|
+
f.scan(root)
|
|
303
|
+
c.eqInt("only the one that can be" (f.count()) 1)
|
|
304
|
+
c.eqStr("and it is that one" (f.idAt(0)) "one")
|
|
305
|
+
c.ok("a disabled control cannot be placed on" ((f.place(root "off")) == false))
|
|
306
|
+
c.ok("nor a hidden one" ((f.place(root "gone")) == false))
|
|
307
|
+
c.ok("nor one inside a hidden branch" ((f.place(root "inside")) == false))
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
sfn testSurvivesARebuild:void (c:FocusCheck) {
|
|
311
|
+
print "--- a focus outlives a rebuild, or is dropped ---"
|
|
312
|
+
; The tree is rebuilt every frame in these apps, so the focus is kept
|
|
313
|
+
; by ID and not by position. Same id in a different place: kept.
|
|
314
|
+
def first:EVGElement (EVGFocusTest.grid())
|
|
315
|
+
def f (new EVGFocus())
|
|
316
|
+
f.place(first "e")
|
|
317
|
+
|
|
318
|
+
def second (new EVGElement())
|
|
319
|
+
second.addChild((EVGFocusTest.box("z" 0.0 0.0 80.0 60.0)))
|
|
320
|
+
second.addChild((EVGFocusTest.box("e" 300.0 300.0 80.0 60.0)))
|
|
321
|
+
f.settle(second)
|
|
322
|
+
c.eqStr("moved, and still focused" f.focusId "e")
|
|
323
|
+
; Tab from it is the tree order of the NEW tree.
|
|
324
|
+
c.eqStr("and the order is the new one" (f.key(second "Tab" false)) "z")
|
|
325
|
+
|
|
326
|
+
; Gone: the ring goes with it.
|
|
327
|
+
def third (new EVGElement())
|
|
328
|
+
third.addChild((EVGFocusTest.box("z" 0.0 0.0 80.0 60.0)))
|
|
329
|
+
f.place(second "e")
|
|
330
|
+
f.settle(third)
|
|
331
|
+
c.eqStr("an element that has gone takes the focus with it" f.focusId "")
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
sfn testNothingToFocus:void (c:FocusCheck) {
|
|
335
|
+
print "--- a screen with nothing on it ---"
|
|
336
|
+
def root (new EVGElement())
|
|
337
|
+
def f (new EVGFocus())
|
|
338
|
+
c.eqStr("Tab does nothing" (f.key(root "Tab" false)) "")
|
|
339
|
+
c.eqStr("and so does an arrow" (f.key(root "ArrowDown" false)) "")
|
|
340
|
+
; A key that is not one of these is not taken, so the host can let it
|
|
341
|
+
; through — refusing a key you did nothing with is how a page stops
|
|
342
|
+
; scrolling.
|
|
343
|
+
def grid:EVGElement (EVGFocusTest.grid())
|
|
344
|
+
c.eqStr("a key it does not know is not taken" (f.key(grid "PageDown" false)) "")
|
|
345
|
+
c.eqStr("and Enter is the host's" (f.key(grid "Enter" false)) "")
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
sfn testPointerAndKeyboardShareIt:void (c:FocusCheck) {
|
|
349
|
+
print "--- the pointer moves the focus, the keyboard draws it ---"
|
|
350
|
+
; ONE FOCUS, TWO WAYS IN. A click that left the focus alone meant Tab
|
|
351
|
+
; carried on from wherever the keys had last been, which is somewhere
|
|
352
|
+
; else on the screen — so the pointer moves it too. What the pointer
|
|
353
|
+
; does not do is draw a ring: the person can see what they clicked,
|
|
354
|
+
; and a ring round every button the mouse touches is not what a focus
|
|
355
|
+
; ring is for. Same rule as `:focus-visible`.
|
|
356
|
+
def grid:EVGElement (EVGFocusTest.grid())
|
|
357
|
+
def f (new EVGFocus())
|
|
358
|
+
c.ok("a click takes the focus" (f.pointAt(grid "e")))
|
|
359
|
+
c.eqStr("and it is where the click was" f.focusId "e")
|
|
360
|
+
c.eqStr("with nothing to draw" (f.ringId()) "")
|
|
361
|
+
; …and the keys carry on from there rather than from the beginning.
|
|
362
|
+
c.eqStr("Tab goes on from what was clicked" (f.key(grid "Tab" false)) "f")
|
|
363
|
+
c.eqStr("and now there is a ring" (f.ringId()) "f")
|
|
364
|
+
; A click after a key puts the ring away again.
|
|
365
|
+
c.ok("a click again" (f.pointAt(grid "a")))
|
|
366
|
+
c.eqStr("and the ring is gone" (f.ringId()) "")
|
|
367
|
+
c.eqStr("though the focus is not" f.focusId "a")
|
|
368
|
+
; Something nothing focusable carries leaves the focus where it was.
|
|
369
|
+
c.ok("a click on nothing is refused" ((f.pointAt(grid "nope")) == false))
|
|
370
|
+
c.eqStr("and the focus stays" f.focusId "a")
|
|
371
|
+
; A reader that moves its own cursor is not a pointer: `place` shows
|
|
372
|
+
; the ring, because there the person cannot see where it went.
|
|
373
|
+
c.ok("a reader's cursor lands" (f.place(grid "i")))
|
|
374
|
+
c.eqStr("and is drawn" (f.ringId()) "i")
|
|
375
|
+
f.clear()
|
|
376
|
+
c.eqStr("clearing takes both" ((f.ringId()) + f.focusId) "")
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
sfn main:void () {
|
|
380
|
+
def c (new FocusCheck())
|
|
381
|
+
print "=== EVG: the keyboard ==="
|
|
382
|
+
EVGFocusTest.testTreeOrder(c)
|
|
383
|
+
EVGFocusTest.testDirections(c)
|
|
384
|
+
EVGFocusTest.testModalTraps(c)
|
|
385
|
+
EVGFocusTest.testTrapLifts(c)
|
|
386
|
+
EVGFocusTest.testInnermostTraps(c)
|
|
387
|
+
EVGFocusTest.testWhatCannotBeFocused(c)
|
|
388
|
+
EVGFocusTest.testSurvivesARebuild(c)
|
|
389
|
+
EVGFocusTest.testNothingToFocus(c)
|
|
390
|
+
EVGFocusTest.testPointerAndKeyboardShareIt(c)
|
|
391
|
+
print ""
|
|
392
|
+
print (("passed=" + (to_string c.passed)) + " failed=" + (to_string c.failed))
|
|
393
|
+
if (c.failed > 0) {
|
|
394
|
+
print "FAILURES"
|
|
395
|
+
} {
|
|
396
|
+
print "ALL PASS"
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
}
|