From f86c1460e90d820f6245a89c0b6507432d215608 Mon Sep 17 00:00:00 2001 From: dmackdev Date: Wed, 30 Jul 2025 20:39:47 +0100 Subject: [PATCH 01/16] add kittest snapshot tests --- .github/workflows/ci.yml | 4 +- .gitignore | 2 + Cargo.lock | 428 ++++++++++- Cargo.toml | 1 + egui_json_tree/Cargo.toml | 4 + egui_json_tree/tests/json_tree_test.rs | 719 ++++-------------- .../changing_default_expand/0_None.png | Bin 0 -> 7932 bytes .../changing_default_expand/1_All.png | Bin 0 -> 19491 bytes .../2_SearchResults(\"g\").png" | Bin 0 -> 19446 bytes .../3_SearchResults(\"gr\").png" | Bin 0 -> 19416 bytes .../changing_default_expand/4_ToLevel(2).png | Bin 0 -> 15597 bytes .../5_SearchResults(\"gre\").png" | Bin 0 -> 19344 bytes .../6_SearchResults(\"gree\").png" | Bin 0 -> 16956 bytes .../7_SearchResultsOrAll(\"null\").png" | Bin 0 -> 7889 bytes .../snapshots/default_expand_to_level/0.png | Bin 0 -> 8015 bytes .../snapshots/default_expand_to_level/1.png | Bin 0 -> 13441 bytes .../snapshots/default_expand_to_level/2.png | Bin 0 -> 15597 bytes .../snapshots/default_expand_to_level/3.png | Bin 0 -> 17313 bytes .../snapshots/default_expand_to_level/4.png | Bin 0 -> 19491 bytes .../tests/snapshots/light_theme.png | Bin 0 -> 18646 bytes .../render_array_with_abbreviated_root.png | Bin 0 -> 706 bytes .../render_object_with_abbreviated_root.png | Bin 0 -> 860 bytes .../render_object_with_default_expand_all.png | Bin 0 -> 18746 bytes ...render_object_with_default_expand_none.png | Bin 0 -> 4440 bytes .../search_results_or_all_empty_string.png | Bin 0 -> 18746 bytes justfile | 6 +- 26 files changed, 576 insertions(+), 588 deletions(-) create mode 100644 egui_json_tree/tests/snapshots/changing_default_expand/0_None.png create mode 100644 egui_json_tree/tests/snapshots/changing_default_expand/1_All.png create mode 100644 "egui_json_tree/tests/snapshots/changing_default_expand/2_SearchResults(\"g\").png" create mode 100644 "egui_json_tree/tests/snapshots/changing_default_expand/3_SearchResults(\"gr\").png" create mode 100644 egui_json_tree/tests/snapshots/changing_default_expand/4_ToLevel(2).png create mode 100644 "egui_json_tree/tests/snapshots/changing_default_expand/5_SearchResults(\"gre\").png" create mode 100644 "egui_json_tree/tests/snapshots/changing_default_expand/6_SearchResults(\"gree\").png" create mode 100644 "egui_json_tree/tests/snapshots/changing_default_expand/7_SearchResultsOrAll(\"null\").png" create mode 100644 egui_json_tree/tests/snapshots/default_expand_to_level/0.png create mode 100644 egui_json_tree/tests/snapshots/default_expand_to_level/1.png create mode 100644 egui_json_tree/tests/snapshots/default_expand_to_level/2.png create mode 100644 egui_json_tree/tests/snapshots/default_expand_to_level/3.png create mode 100644 egui_json_tree/tests/snapshots/default_expand_to_level/4.png create mode 100644 egui_json_tree/tests/snapshots/light_theme.png create mode 100644 egui_json_tree/tests/snapshots/render_array_with_abbreviated_root.png create mode 100644 egui_json_tree/tests/snapshots/render_object_with_abbreviated_root.png create mode 100644 egui_json_tree/tests/snapshots/render_object_with_default_expand_all.png create mode 100644 egui_json_tree/tests/snapshots/render_object_with_default_expand_none.png create mode 100644 egui_json_tree/tests/snapshots/search_results_or_all_empty_string.png diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e24916b..5ad6c4b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,7 +8,7 @@ on: jobs: build: - runs-on: ubuntu-latest + runs-on: macos-latest steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions-rust-lang/setup-rust-toolchain@fb51252c7ba57d633bc668f941da052e410add48 # v1.13.0 @@ -17,7 +17,7 @@ jobs: - name: Test run: cargo test --locked - name: Test json_tree_test for simd_json feature - run: cargo test --locked --features=simd_json --no-default-features --test json_tree_test + run: cargo test --locked --features=simd_json --no-default-features snapshot_tests - name: Clippy run: cargo clippy - name: Format diff --git a/.gitignore b/.gitignore index dd771b6..55e39b9 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ .vscode dist .DS_Store +**/tests/snapshots/**/*.diff.png +**/tests/snapshots/**/*.new.png diff --git a/Cargo.lock b/Cargo.lock index f048eae..6567847 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -90,8 +90,8 @@ dependencies = [ "accesskit_consumer", "hashbrown 0.15.4", "static_assertions", - "windows", - "windows-core", + "windows 0.61.3", + "windows-core 0.61.2", ] [[package]] @@ -149,7 +149,7 @@ dependencies = [ "log", "ndk", "ndk-context", - "ndk-sys", + "ndk-sys 0.6.0+11769913", "num_enum", "thiserror 1.0.69", ] @@ -160,6 +160,21 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" + [[package]] name = "arboard" version = "3.6.0" @@ -198,6 +213,15 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" +[[package]] +name = "ash" +version = "0.38.0+1.3.281" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" +dependencies = [ + "libloading", +] + [[package]] name = "async-broadcast" version = "0.7.2" @@ -421,6 +445,12 @@ dependencies = [ "serde", ] +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + [[package]] name = "block2" version = "0.5.1" @@ -565,6 +595,16 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "colored" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" +dependencies = [ + "lazy_static", + "windows-sys 0.59.0", +] + [[package]] name = "combine" version = "4.6.7" @@ -643,6 +683,25 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.21" @@ -674,6 +733,19 @@ dependencies = [ "web-sys", ] +[[package]] +name = "dify" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11217d469eafa3b809ad84651eb9797ccbb440b4a916d5d85cb1b994e89787f6" +dependencies = [ + "anyhow", + "colored", + "getopts", + "image", + "rayon", +] + [[package]] name = "dispatch" version = "0.2.0" @@ -765,6 +837,7 @@ dependencies = [ "objc2-foundation 0.2.2", "parking_lot", "percent-encoding", + "pollster", "profiling", "raw-window-handle", "static_assertions", @@ -772,6 +845,7 @@ dependencies = [ "wasm-bindgen-futures", "web-sys", "web-time", + "wgpu", "winapi", "windows-sys 0.59.0", "winit", @@ -858,10 +932,33 @@ name = "egui_json_tree" version = "0.13.0" dependencies = [ "egui", + "egui_kittest", "serde_json", "simd-json", ] +[[package]] +name = "egui_kittest" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dacd0e777f0557aebde97346a8c534e76607ce1e4f4a6e10a82d95ec5d5bca8" +dependencies = [ + "dify", + "eframe", + "egui", + "egui-wgpu", + "image", + "kittest", + "pollster", + "wgpu", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + [[package]] name = "emath" version = "0.32.0" @@ -1107,6 +1204,15 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "getopts" +version = "0.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cba6ae63eb948698e300f645f87c70f76630d505f23b8907cf1e193ee85048c1" +dependencies = [ + "unicode-width", +] + [[package]] name = "getrandom" version = "0.2.16" @@ -1221,6 +1327,57 @@ dependencies = [ "gl_generator", ] +[[package]] +name = "gpu-alloc" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" +dependencies = [ + "bitflags 2.9.1", + "gpu-alloc-types", +] + +[[package]] +name = "gpu-alloc-types" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" +dependencies = [ + "bitflags 2.9.1", +] + +[[package]] +name = "gpu-allocator" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c151a2a5ef800297b4e79efa4f4bec035c5f51d5ae587287c9b952bdf734cacd" +dependencies = [ + "log", + "presser", + "thiserror 1.0.69", + "windows 0.58.0", +] + +[[package]] +name = "gpu-descriptor" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" +dependencies = [ + "bitflags 2.9.1", + "gpu-descriptor-types", + "hashbrown 0.15.4", +] + +[[package]] +name = "gpu-descriptor-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" +dependencies = [ + "bitflags 2.9.1", +] + [[package]] name = "half" version = "2.6.0" @@ -1469,12 +1626,40 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "khronos-egl" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" +dependencies = [ + "libc", + "libloading", + "pkg-config", +] + [[package]] name = "khronos_api" version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" +[[package]] +name = "kittest" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c1bfc4cb16136b6f00fb85a281e4b53d026401cf5dff9a427c466bde5891f0b" +dependencies = [ + "accesskit", + "accesskit_consumer", + "parking_lot", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + [[package]] name = "lexical-core" version = "1.0.5" @@ -1612,6 +1797,15 @@ version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + [[package]] name = "memchr" version = "2.7.5" @@ -1636,6 +1830,21 @@ dependencies = [ "autocfg", ] +[[package]] +name = "metal" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f569fb946490b5743ad69813cb19629130ce9374034abe31614a36402d18f99e" +dependencies = [ + "bitflags 2.9.1", + "block", + "core-graphics-types", + "foreign-types", + "log", + "objc", + "paste", +] + [[package]] name = "miniz_oxide" version = "0.8.9" @@ -1665,6 +1874,7 @@ dependencies = [ "num-traits", "once_cell", "rustc-hash 1.1.0", + "spirv", "strum", "thiserror 2.0.12", "unicode-ident", @@ -1679,7 +1889,7 @@ dependencies = [ "bitflags 2.9.1", "jni-sys", "log", - "ndk-sys", + "ndk-sys 0.6.0+11769913", "num_enum", "raw-window-handle", "thiserror 1.0.69", @@ -1691,6 +1901,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" +[[package]] +name = "ndk-sys" +version = "0.5.0+25.2.9519653" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" +dependencies = [ + "jni-sys", +] + [[package]] name = "ndk-sys" version = "0.6.0+11769913" @@ -1751,6 +1970,15 @@ dependencies = [ "syn", ] +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + [[package]] name = "objc-sys" version = "0.3.5" @@ -2037,6 +2265,15 @@ dependencies = [ "libredox", ] +[[package]] +name = "ordered-float" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" +dependencies = [ + "num-traits", +] + [[package]] name = "ordered-stream" version = "0.2.0" @@ -2085,6 +2322,12 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + [[package]] name = "percent-encoding" version = "2.3.1" @@ -2167,6 +2410,12 @@ dependencies = [ "windows-sys 0.60.2", ] +[[package]] +name = "pollster" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" + [[package]] name = "portable-atomic" version = "1.11.1" @@ -2182,6 +2431,12 @@ dependencies = [ "zerovec", ] +[[package]] +name = "presser" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" + [[package]] name = "proc-macro-crate" version = "3.3.0" @@ -2240,12 +2495,38 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "range-alloc" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde" + [[package]] name = "raw-window-handle" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + [[package]] name = "redox_syscall" version = "0.4.1" @@ -2526,6 +2807,15 @@ dependencies = [ "serde", ] +[[package]] +name = "spirv" +version = "0.3.0+sdk-1.3.268.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" +dependencies = [ + "bitflags 2.9.1", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -3083,6 +3373,7 @@ dependencies = [ "hashbrown 0.15.4", "js-sys", "log", + "naga", "parking_lot", "portable-atomic", "profiling", @@ -3090,6 +3381,7 @@ dependencies = [ "smallvec", "static_assertions", "wasm-bindgen", + "wasm-bindgen-futures", "web-sys", "wgpu-core", "wgpu-hal", @@ -3120,11 +3412,31 @@ dependencies = [ "rustc-hash 1.1.0", "smallvec", "thiserror 2.0.12", + "wgpu-core-deps-apple", + "wgpu-core-deps-emscripten", "wgpu-core-deps-windows-linux-android", "wgpu-hal", "wgpu-types", ] +[[package]] +name = "wgpu-core-deps-apple" +version = "25.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfd488b3239b6b7b185c3b045c39ca6bf8af34467a4c5de4e0b1a564135d093d" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-core-deps-emscripten" +version = "25.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f09ad7aceb3818e52539acc679f049d3475775586f3f4e311c30165cf2c00445" +dependencies = [ + "wgpu-hal", +] + [[package]] name = "wgpu-core-deps-windows-linux-android" version = "25.0.0" @@ -3140,17 +3452,45 @@ version = "25.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f968767fe4d3d33747bbd1473ccd55bf0f6451f55d733b5597e67b5deab4ad17" dependencies = [ + "android_system_properties", + "arrayvec", + "ash", + "bit-set", "bitflags 2.9.1", + "block", + "bytemuck", + "cfg-if", "cfg_aliases", + "core-graphics-types", + "glow", + "glutin_wgl_sys", + "gpu-alloc", + "gpu-allocator", + "gpu-descriptor", + "hashbrown 0.15.4", + "js-sys", + "khronos-egl", + "libc", "libloading", "log", + "metal", "naga", + "ndk-sys 0.5.0+25.2.9519653", + "objc", + "ordered-float", "parking_lot", "portable-atomic", + "profiling", + "range-alloc", "raw-window-handle", "renderdoc-sys", + "smallvec", "thiserror 2.0.12", + "wasm-bindgen", + "web-sys", "wgpu-types", + "windows 0.58.0", + "windows-core 0.58.0", ] [[package]] @@ -3198,6 +3538,16 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +dependencies = [ + "windows-core 0.58.0", + "windows-targets 0.52.6", +] + [[package]] name = "windows" version = "0.61.3" @@ -3205,7 +3555,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" dependencies = [ "windows-collections", - "windows-core", + "windows-core 0.61.2", "windows-future", "windows-link", "windows-numerics", @@ -3217,7 +3567,20 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" dependencies = [ - "windows-core", + "windows-core 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement 0.58.0", + "windows-interface 0.58.0", + "windows-result 0.2.0", + "windows-strings 0.1.0", + "windows-targets 0.52.6", ] [[package]] @@ -3226,11 +3589,11 @@ version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ - "windows-implement", - "windows-interface", + "windows-implement 0.60.0", + "windows-interface 0.59.1", "windows-link", - "windows-result", - "windows-strings", + "windows-result 0.3.4", + "windows-strings 0.4.2", ] [[package]] @@ -3239,11 +3602,22 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" dependencies = [ - "windows-core", + "windows-core 0.61.2", "windows-link", "windows-threading", ] +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "windows-implement" version = "0.60.0" @@ -3255,6 +3629,17 @@ dependencies = [ "syn", ] +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "windows-interface" version = "0.59.1" @@ -3278,10 +3663,19 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" dependencies = [ - "windows-core", + "windows-core 0.61.2", "windows-link", ] +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-result" version = "0.3.4" @@ -3291,6 +3685,16 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result 0.2.0", + "windows-targets 0.52.6", +] + [[package]] name = "windows-strings" version = "0.4.2" diff --git a/Cargo.toml b/Cargo.toml index 8c96803..6a46883 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,4 +12,5 @@ repository = "https://github.com/dmackdev/egui_json_tree" [workspace.dependencies] egui = { version = "0.32", default-features = false } eframe = "0.32" +egui_kittest = "0.32" serde_json = { version = "1" } diff --git a/egui_json_tree/Cargo.toml b/egui_json_tree/Cargo.toml index 3a3bb67..892e630 100644 --- a/egui_json_tree/Cargo.toml +++ b/egui_json_tree/Cargo.toml @@ -22,3 +22,7 @@ simd-json = { version = "0.13", optional = true } default = ["serde_json"] serde_json = ["dep:serde_json"] simd_json = ["dep:simd-json"] + +[dev-dependencies] +egui = { workspace = true, default-features = true } # For egui_kittest +egui_kittest = { workspace = true, features = ["wgpu", "snapshot"] } diff --git a/egui_json_tree/tests/json_tree_test.rs b/egui_json_tree/tests/json_tree_test.rs index b8474dc..be992a7 100644 --- a/egui_json_tree/tests/json_tree_test.rs +++ b/egui_json_tree/tests/json_tree_test.rs @@ -1,602 +1,175 @@ -use std::sync::Arc; +use std::sync::LazyLock; + +use egui_json_tree::{DefaultExpand, JsonTree, JsonTreeStyle}; +use egui_kittest::Harness; -use egui::{CentralPanel, Context, FontDefinitions, Style, mutex::Mutex}; -use egui_json_tree::{DefaultExpand, JsonTree, JsonTreeStyle, render::RenderContext}; #[cfg(feature = "serde_json")] use serde_json::{Value, json}; #[cfg(all(feature = "simd_json", not(feature = "serde_json")))] use simd_json::{json, owned::Value}; -#[derive(Debug, PartialEq)] -struct ExpectedRender { - value: Value, - display_value: String, - pointer_str: String, -} - -impl<'a, 'b> From> for ExpectedRender { - fn from(ctx: RenderContext<'a, 'b, Value>) -> Self { - match ctx { - RenderContext::Property(ctx) => ExpectedRender { - value: ctx.value.clone(), - display_value: ctx.property.to_string(), - pointer_str: ctx.pointer.to_json_pointer_string(), - }, - RenderContext::BaseValue(ctx) => ExpectedRender { - value: (ctx.value.clone()), - display_value: ctx.display_value.to_string(), - pointer_str: ctx.pointer.to_json_pointer_string(), - }, - RenderContext::ExpandableDelimiter(ctx) => ExpectedRender { - value: ctx.value.clone(), - display_value: ctx.delimiter.as_ref().to_string(), - pointer_str: ctx.pointer.to_json_pointer_string(), - }, - } - } -} - -#[test] -fn json_tree_render_string() { - let value = json!("Hello World!"); - - let actual: Arc>> = Arc::new(Mutex::new(vec![])); - - egui::__run_test_ui(|ui| { - JsonTree::new("id", &value) - .on_render(|_, render_ctx| { - actual.lock().push(render_ctx.into()); - }) - .show(ui); - }); - - let expected = vec![ExpectedRender { - value: json!("Hello World!"), - display_value: "Hello World!".to_string(), - pointer_str: "".to_string(), - }]; - - assert_eq!(actual.lock().as_slice(), expected); -} - -#[test] -fn json_tree_default_expand_none() { - let value = json!({ - "foo": { - "bar": { - "fizz": true - } - } - }); - - let actual: Arc>> = Arc::new(Mutex::new(vec![])); - - egui::__run_test_ui(|ui| { - JsonTree::new("id", &value) - .default_expand(DefaultExpand::None) - .on_render(|_, render_ctx| { - actual.lock().push(render_ctx.into()); - }) - .show(ui); - }); - - let expected = vec![ - ExpectedRender { - value: value.clone(), - display_value: "{".to_string(), - pointer_str: "".to_string(), - }, - ExpectedRender { - value: json!({ - "bar": { - "fizz": true - } - }), - display_value: "foo".to_string(), - pointer_str: "/foo".to_string(), - }, - ExpectedRender { - value: json!({ - "bar": { - "fizz": true - } - }), - display_value: "{...}".to_string(), - pointer_str: "/foo".to_string(), - }, - ExpectedRender { - value: value.clone(), - display_value: "}".to_string(), - pointer_str: "".to_string(), - }, - ]; - assert_eq!(actual.lock().as_slice(), expected); -} - -#[test] -fn json_tree_default_expand_all() { - let value = json!({ - "foo": { - "bar": { - "fizz": true +// Keep all keys ordered within objects so rendering order is the same for both serde_json and simd_json. +static OBJECT: LazyLock = LazyLock::new(|| { + json!({ + "bar": { + "grep": 21, + "qux": false, + "thud": { + "a/b": [ + 4, + 5, + { + "m~n": "Greetings!" + } + ] } - } - }); - - let actual: Arc>> = Arc::new(Mutex::new(vec![])); - - egui::__run_test_ui(|ui| { - JsonTree::new("id", &value) - .default_expand(DefaultExpand::All) - .on_render(|_, render_ctx| { - actual.lock().push(render_ctx.into()); - }) - .show(ui); - }); - - let expected = vec![ - ExpectedRender { - value: value.clone(), - display_value: "{".to_string(), - pointer_str: "".to_string(), - }, - ExpectedRender { - value: json!({ - "bar": { - "fizz": true - } - }), - display_value: "foo".to_string(), - pointer_str: "/foo".to_string(), - }, - ExpectedRender { - value: json!({ - "bar": { - "fizz": true - } - }), - display_value: "{".to_string(), - pointer_str: "/foo".to_string(), - }, - ExpectedRender { - value: json!({"fizz": true}), - display_value: "bar".to_string(), - pointer_str: "/foo/bar".to_string(), - }, - ExpectedRender { - value: json!({"fizz": true}), - display_value: "{".to_string(), - pointer_str: "/foo/bar".to_string(), - }, - ExpectedRender { - value: json!(true), - display_value: "fizz".to_string(), - pointer_str: "/foo/bar/fizz".to_string(), - }, - ExpectedRender { - value: json!(true), - display_value: "true".to_string(), - pointer_str: "/foo/bar/fizz".to_string(), - }, - ExpectedRender { - value: json!({"fizz": true}), - display_value: "}".to_string(), - pointer_str: "/foo/bar".to_string(), - }, - ExpectedRender { - value: json!({ - "bar": { - "fizz": true - } - }), - display_value: "}".to_string(), - pointer_str: "/foo".to_string(), - }, - ExpectedRender { - value: value.clone(), - display_value: "}".to_string(), - pointer_str: "".to_string(), - }, - ]; - assert_eq!(actual.lock().as_slice(), expected); -} - -#[test] -fn json_tree_default_expand_to_level_one() { - let value = json!({ - "foo": { - "bar": { - "fizz": true - }, - "buzz": [ - { "qux": 50 } - ] - } - }); - - let actual: Arc>> = Arc::new(Mutex::new(vec![])); - - egui::__run_test_ui(|ui| { - JsonTree::new("id", &value) - .default_expand(DefaultExpand::ToLevel(1)) - .on_render(|_, render_ctx| { - actual.lock().push(render_ctx.into()); - }) - .show(ui); - }); - - // Level 1 would expand the top level object and "foo", so we would - // expect to see the keys "bar" and "buzz", but not "fizz" and "qux". - let expected = vec![ - ExpectedRender { - value: value.clone(), - display_value: "{".to_string(), - pointer_str: "".to_string(), - }, - ExpectedRender { - value: json!({ - "bar": { - "fizz": true - }, - "buzz": [ - { "qux": 50 } - ] - }), - display_value: "foo".to_string(), - pointer_str: "/foo".to_string(), - }, - ExpectedRender { - value: json!({ - "bar": { - "fizz": true - }, - "buzz": [ - { "qux": 50 } - ] - }), - display_value: "{".to_string(), - pointer_str: "/foo".to_string(), - }, - ExpectedRender { - value: json!({"fizz": true}), - display_value: "bar".to_string(), - pointer_str: "/foo/bar".to_string(), - }, - ExpectedRender { - value: json!({"fizz": true}), - display_value: "{...}".to_string(), - pointer_str: "/foo/bar".to_string(), - }, - ExpectedRender { - value: json!([{ "qux": 50 }]), - display_value: "buzz".to_string(), - pointer_str: "/foo/buzz".to_string(), - }, - ExpectedRender { - value: json!([{ "qux": 50 }]), - display_value: "[...]".to_string(), - pointer_str: "/foo/buzz".to_string(), - }, - ExpectedRender { - value: json!({ - "bar": { - "fizz": true - }, - "buzz": [ - { "qux": 50 } - ] - }), - display_value: "}".to_string(), - pointer_str: "/foo".to_string(), - }, - ExpectedRender { - value: value.clone(), - display_value: "}".to_string(), - pointer_str: "".to_string(), - }, - ]; - - assert_eq!(actual.lock().as_slice(), expected); -} - -#[test] -fn json_tree_default_expand_search() { - let value = json!({ - "foo": { - "bar": { - "fizz": true - }, - "baz": { - "qux": "thud" - }, - "buzz": [ - { "grep": 50 } - ] - } - }); - - let actual: Arc>> = Arc::new(Mutex::new(vec![])); - - egui::__run_test_ui(|ui| { - JsonTree::new("id", &value) - .default_expand(DefaultExpand::SearchResults("t")) - .on_render(|_, render_ctx| { - actual.lock().push(render_ctx.into()); - }) - .show(ui); - }); - - let expected = vec![ - ExpectedRender { - value: value.clone(), - display_value: "{".to_string(), - pointer_str: "".to_string(), - }, - ExpectedRender { - value: json!({ - "bar": { - "fizz": true - }, - "baz": { - "qux": "thud" - }, - "buzz": [ - { "grep": 50 } - ] - }), - display_value: "foo".to_string(), - pointer_str: "/foo".to_string(), - }, - ExpectedRender { - value: json!({ - "bar": { - "fizz": true - }, - "baz": { - "qux": "thud" - }, - "buzz": [ - { "grep": 50 } - ] - }), - display_value: "{".to_string(), - pointer_str: "/foo".to_string(), - }, - ExpectedRender { - value: json!({"fizz": true}), - display_value: "bar".to_string(), - pointer_str: "/foo/bar".to_string(), - }, - ExpectedRender { - value: json!({"fizz": true}), - display_value: "{".to_string(), - pointer_str: "/foo/bar".to_string(), - }, - ExpectedRender { - value: json!(true), - display_value: "fizz".to_string(), - pointer_str: "/foo/bar/fizz".to_string(), - }, - ExpectedRender { - value: json!(true), - display_value: "true".to_string(), - pointer_str: "/foo/bar/fizz".to_string(), - }, - ExpectedRender { - value: json!({"fizz": true}), - display_value: "}".to_string(), - pointer_str: "/foo/bar".to_string(), - }, - ExpectedRender { - value: json!({"qux": "thud"}), - display_value: "baz".to_string(), - pointer_str: "/foo/baz".to_string(), - }, - ExpectedRender { - value: json!({"qux": "thud"}), - display_value: "{".to_string(), - pointer_str: "/foo/baz".to_string(), - }, - ExpectedRender { - value: json!("thud"), - display_value: "qux".to_string(), - pointer_str: "/foo/baz/qux".to_string(), - }, - ExpectedRender { - value: json!("thud"), - display_value: "thud".to_string(), - pointer_str: "/foo/baz/qux".to_string(), - }, - ExpectedRender { - value: json!({"qux": "thud"}), - display_value: "}".to_string(), - pointer_str: "/foo/baz".to_string(), - }, - ExpectedRender { - value: json!([{ "grep": 50 }]), - display_value: "buzz".to_string(), - pointer_str: "/foo/buzz".to_string(), - }, - ExpectedRender { - value: json!([{ "grep": 50 }]), - display_value: "[...]".to_string(), - pointer_str: "/foo/buzz".to_string(), - }, - ExpectedRender { - value: json!({ - "bar": { - "fizz": true - }, - "baz": { - "qux": "thud" - }, - "buzz": [ - { "grep": 50 } - ] - }), - display_value: "}".to_string(), - pointer_str: "/foo".to_string(), - }, - ExpectedRender { - value: value.clone(), - display_value: "}".to_string(), - pointer_str: "".to_string(), - }, - ]; - - assert_eq!(actual.lock().as_slice(), expected); -} - -#[test] -fn json_tree_reset_expanded() { - let value = json!({ - "baz": { - "qux": 1 }, - "buzz": [ + "baz": null, + "foo": [ 1, + 2, + [ + "grep" + ] ] - }); - - // Reusing the same Context so the memory persists between multiple frames. - let ctx = Context::default(); - ctx.set_fonts(FontDefinitions::empty()); - ctx.set_style(Style { - animation_time: 0.0, - ..Default::default() - }); + }) +}); - let id = "id"; +mod snapshot_tests { + use super::*; - let expected_all_expanded = vec![ - ExpectedRender { - value: value.clone(), - display_value: "{".to_string(), - pointer_str: "".to_string(), - }, - ExpectedRender { - value: json!({"qux": 1}), - display_value: "baz".to_string(), - pointer_str: "/baz".to_string(), - }, - ExpectedRender { - value: json!({"qux": 1}), - display_value: "{".to_string(), - pointer_str: "/baz".to_string(), - }, - ExpectedRender { - value: json!(1), - display_value: "qux".to_string(), - pointer_str: "/baz/qux".to_string(), - }, - ExpectedRender { - value: json!(1), - display_value: "1".to_string(), - pointer_str: "/baz/qux".to_string(), - }, - ExpectedRender { - value: json!({"qux": 1}), - display_value: "}".to_string(), - pointer_str: "/baz".to_string(), - }, - ExpectedRender { - value: json!([1]), - display_value: "buzz".to_string(), - pointer_str: "/buzz".to_string(), - }, - ExpectedRender { - value: json!([1]), - display_value: "[".to_string(), - pointer_str: "/buzz".to_string(), - }, - ExpectedRender { - value: json!(1), - display_value: "0".to_string(), - pointer_str: "/buzz/0".to_string(), - }, - ExpectedRender { - value: json!(1), - display_value: "1".to_string(), - pointer_str: "/buzz/0".to_string(), - }, - ExpectedRender { - value: json!([1]), - display_value: "]".to_string(), - pointer_str: "/buzz".to_string(), - }, - ExpectedRender { - value: value.clone(), - display_value: "}".to_string(), - pointer_str: "".to_string(), - }, - ]; - - // First, render and expand everything. - // We call `abbreviate_root` to only show "{...}" when the root object is collapsed. - // We expect everything to be expanded as this is the first render. - let _ = ctx.run(Default::default(), |ctx| { - let mut actual: Vec = vec![]; - - CentralPanel::default().show(ctx, |ui| { - JsonTree::new(id, &value) + #[test] + fn render_object_with_default_expand_all() { + let mut harness = Harness::new_ui(|ui| { + JsonTree::new("id", &*OBJECT) .default_expand(DefaultExpand::All) - .auto_reset_expanded(false) - .style(JsonTreeStyle::new().abbreviate_root(true)) - .on_render(|_, render_ctx| { - actual.push(render_ctx.into()); - }) .show(ui); }); + harness.fit_contents(); + harness.snapshot("render_object_with_default_expand_all"); + } - assert_eq!(actual, expected_all_expanded); - }); - - // Next we render the same tree but change the `default_expand` setting. - // Because we already rendered the tree with everything expanded, - // we expect everything to be expanded still. - // Note that we call `reset_expanded` after rendering the tree. - let _ = ctx.run(Default::default(), |ctx| { - let mut actual: Vec = vec![]; + #[test] + fn render_object_with_default_expand_none() { + let mut harness = Harness::new_ui(|ui| { + JsonTree::new("id", &*OBJECT) + .default_expand(DefaultExpand::None) + .show(ui); + }); + harness.fit_contents(); + harness.snapshot("render_object_with_default_expand_none"); + } - CentralPanel::default().show(ctx, |ui| { - JsonTree::new(id, &value) + #[test] + fn render_object_with_abbreviated_root() { + let mut harness = Harness::new_ui(|ui| { + JsonTree::new("id", &*OBJECT) .default_expand(DefaultExpand::None) - .auto_reset_expanded(false) .style(JsonTreeStyle::new().abbreviate_root(true)) - .on_render(|_, render_ctx| { - actual.push(render_ctx.into()); - }) - .show(ui) - .reset_expanded(ui); + .show(ui); }); + harness.fit_contents(); + harness.snapshot("render_object_with_abbreviated_root"); + } - assert_eq!(actual, expected_all_expanded); - }); - - // Now we render again with the same `default_expand` setting as the last render. - // Because we called `reset_expanded` in the last frame, we now expect this setting to be respected, - // and now nothing should be expanded. - let _ = ctx.run(Default::default(), |ctx| { - let mut actual: Vec = vec![]; - - CentralPanel::default().show(ctx, |ui| { - JsonTree::new(id, &value) + #[test] + fn render_array_with_abbreviated_root() { + let mut harness = Harness::new_ui(|ui| { + JsonTree::new("id", &json!([1, 2, 3])) .default_expand(DefaultExpand::None) - .auto_reset_expanded(false) .style(JsonTreeStyle::new().abbreviate_root(true)) - .on_render(|_, render_ctx| { - actual.push(render_ctx.into()); - }) .show(ui); }); + harness.fit_contents(); + harness.snapshot("render_array_with_abbreviated_root"); + } - let expected_nothing_expanded = vec![ExpectedRender { - value: value.clone(), - display_value: "{...}".to_string(), - pointer_str: "".to_string(), - }]; + #[test] + fn render_object_with_changing_default_expand_automatically_resets_expanded() { + // Harness::fit_contents seems to cause the tree to wrap, so set a fixed size here. + let mut harness = Harness::builder().with_size([350., 400.]).build_ui_state( + |ui, default_expand| { + JsonTree::new("id", &*OBJECT) + .default_expand(*default_expand) + .show(ui); + }, + DefaultExpand::None, + ); + + let mut snapshot_errors = vec![]; + + for (idx, default_expand) in [ + DefaultExpand::None, + DefaultExpand::All, + DefaultExpand::SearchResults("g"), + DefaultExpand::SearchResults("gr"), + DefaultExpand::ToLevel(2), + DefaultExpand::SearchResults("gre"), + DefaultExpand::SearchResults("gree"), + DefaultExpand::SearchResultsOrAll("null"), + ] + .into_iter() + .enumerate() + { + *harness.state_mut() = default_expand; + harness.run(); + if let Err(err) = harness.try_snapshot(format!( + "changing_default_expand/{}_{:?}", + idx, default_expand + )) { + snapshot_errors.push(err); + } + } + + assert!(snapshot_errors.is_empty()); + } + + #[test] + fn render_object_with_default_expand_to_levels() { + // Harness::fit_contents seems to cause the tree to wrap, so set a fixed size here. + let mut harness = Harness::builder().with_size([350., 400.]).build_ui_state( + |ui, level| { + JsonTree::new("id", &*OBJECT) + .default_expand(DefaultExpand::ToLevel(*level)) + .show(ui); + }, + 0, + ); + let mut snapshot_errors = vec![]; + + for level in 0..=4 { + *harness.state_mut() = level; + harness.run(); + if let Err(err) = harness.try_snapshot(format!("default_expand_to_level/{}", level)) { + snapshot_errors.push(err); + } + } + + assert!(snapshot_errors.is_empty()); + } + + #[test] + fn render_object_with_default_expand_search_results_or_all_with_empty_string_expands_everything() + { + let mut harness = Harness::new_ui(|ui| { + JsonTree::new("id", &*OBJECT) + .default_expand(DefaultExpand::SearchResultsOrAll("")) + .show(ui); + }); + harness.fit_contents(); + harness.snapshot("search_results_or_all_empty_string"); + } - assert_eq!(actual, expected_nothing_expanded); - }); + #[test] + fn render_object_with_egui_light_theme_should_style_tree_with_light_theme() { + let mut harness = Harness::new_ui(|ui| { + ui.ctx().set_theme(egui::Theme::Light); + JsonTree::new("id", &*OBJECT) + .default_expand(DefaultExpand::All) + .show(ui); + }); + harness.fit_contents(); + harness.snapshot("light_theme"); + } } diff --git a/egui_json_tree/tests/snapshots/changing_default_expand/0_None.png b/egui_json_tree/tests/snapshots/changing_default_expand/0_None.png new file mode 100644 index 0000000000000000000000000000000000000000..d60bdc7fc1eca6112e0af78d3ae873a0da6b1257 GIT binary patch literal 7932 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 literal 0 HcmV?d00001 diff --git a/egui_json_tree/tests/snapshots/changing_default_expand/1_All.png b/egui_json_tree/tests/snapshots/changing_default_expand/1_All.png new file mode 100644 index 0000000000000000000000000000000000000000..31cdd8c59f8ed3cbae623afd28100ab7d5d874fb GIT binary patch literal 19491 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 x{$i;6&x!ZHc>OP41lM_{+5GY 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 G9r}My?6^h% literal 0 HcmV?d00001 diff --git "a/egui_json_tree/tests/snapshots/changing_default_expand/6_SearchResults(\"gree\").png" "b/egui_json_tree/tests/snapshots/changing_default_expand/6_SearchResults(\"gree\").png" new file mode 100644 index 0000000000000000000000000000000000000000..274c8cb55392940a3af66f8fe809b949b0a25c2d GIT binary patch literal 16956 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 F{|_pDhM@oe literal 0 HcmV?d00001 diff --git "a/egui_json_tree/tests/snapshots/changing_default_expand/7_SearchResultsOrAll(\"null\").png" "b/egui_json_tree/tests/snapshots/changing_default_expand/7_SearchResultsOrAll(\"null\").png" new file mode 100644 index 0000000000000000000000000000000000000000..2082aa2a3afa38beae56dbc1670fa4d8cfd40a2a GIT binary patch literal 7889 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 literal 0 HcmV?d00001 diff --git a/egui_json_tree/tests/snapshots/default_expand_to_level/0.png b/egui_json_tree/tests/snapshots/default_expand_to_level/0.png new file mode 100644 index 0000000000000000000000000000000000000000..657f6f659d0f64bcd2a4b01cff3ba2f4beea2ef7 GIT binary patch literal 8015 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 J_;7o|zW}Zx)$;%V literal 0 HcmV?d00001 diff --git a/egui_json_tree/tests/snapshots/default_expand_to_level/1.png b/egui_json_tree/tests/snapshots/default_expand_to_level/1.png new file mode 100644 index 0000000000000000000000000000000000000000..b32b4c0f43af8c18e08c2190f050f2411a3fa3f6 GIT binary patch literal 13441 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 q|I>-1RfKB&UH9(yoY@w{QZNPFcGi`+4re`+nco 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 p|HnZQ@aQMA1Kwl{Pu)MbMMQ{- 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 literal 0 HcmV?d00001 diff --git a/egui_json_tree/tests/snapshots/render_object_with_default_expand_none.png b/egui_json_tree/tests/snapshots/render_object_with_default_expand_none.png new file mode 100644 index 0000000000000000000000000000000000000000..1103a8358c85f0d79bc689d5c04dfa9dcae11696 GIT binary patch literal 4440 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 P2@tj~a&Ps2eSZEQI9?Tm literal 0 HcmV?d00001 diff --git a/egui_json_tree/tests/snapshots/search_results_or_all_empty_string.png b/egui_json_tree/tests/snapshots/search_results_or_all_empty_string.png new file mode 100644 index 0000000000000000000000000000000000000000..89ad9652d7bd2ea6881da82180ff7fbf287fb0cd GIT binary patch literal 18746 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 literal 0 HcmV?d00001 diff --git a/justfile b/justfile index bcbd588..4117cf7 100644 --- a/justfile +++ b/justfile @@ -1,6 +1,10 @@ test: cargo test - cargo test --features=simd_json --no-default-features --test json_tree_test + cargo test --features=simd_json --no-default-features snapshot_tests + +update_snapshots: + UPDATE_SNAPSHOTS=1 cargo test snapshot_tests + cargo test --features=simd_json --no-default-features snapshot_tests demo: cargo run -p demo From c4d0afb6720e3b0c94ab44473bba47c5d223dc48 Mon Sep 17 00:00:00 2001 From: dmackdev Date: Fri, 1 Aug 2025 17:12:49 +0100 Subject: [PATCH 02/16] fix editor demo - check for valid object key when pressing enter --- demo/src/apps/editor.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/demo/src/apps/editor.rs b/demo/src/apps/editor.rs index 08155e5..eff6adf 100644 --- a/demo/src/apps/editor.rs +++ b/demo/src/apps/editor.rs @@ -84,7 +84,9 @@ impl Editor { .is_some_and(|obj| !obj.contains_key(&state.new_key_input)); ui.add_enabled_ui(valid_key, |ui| { - if ui.small_button("✅").clicked() || enter_was_pressed_with_focus { + if ui.small_button("✅").clicked() + || (valid_key && enter_was_pressed_with_focus) + { edit_events.push(EditEvent::SaveObjectKeyEdit); } }); From 3db6eac787fbe82b52073fb20ec802bb66468a78 Mon Sep 17 00:00:00 2001 From: dmackdev Date: Fri, 1 Aug 2025 17:13:12 +0100 Subject: [PATCH 03/16] add editor demo kittest tests --- Cargo.lock | 1 + demo/Cargo.toml | 3 + demo/src/apps/editor.rs | 171 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 175 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 6567847..76728b2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -727,6 +727,7 @@ dependencies = [ "eframe", "egui", "egui_json_tree", + "egui_kittest", "log", "serde_json", "wasm-bindgen-futures", diff --git a/demo/Cargo.toml b/demo/Cargo.toml index 772d253..c6f0862 100644 --- a/demo/Cargo.toml +++ b/demo/Cargo.toml @@ -19,3 +19,6 @@ serde_json = { workspace = true } log = "0.4" wasm-bindgen-futures = "0.4" web-sys = "0.3.70" # to access the DOM (to hide the loading text) + +[dev-dependencies] +egui_kittest = { workspace = true } diff --git a/demo/src/apps/editor.rs b/demo/src/apps/editor.rs index eff6adf..d25b28c 100644 --- a/demo/src/apps/editor.rs +++ b/demo/src/apps/editor.rs @@ -468,3 +468,174 @@ impl Show for JsonEditorExample { self.editor.apply_events(&mut self.value); } } + +#[cfg(test)] +mod tests { + use egui::accesskit::Role; + use egui_kittest::{Harness, kittest::Queryable}; + use serde_json::json; + + use crate::apps::{Show, editor::JsonEditorExample}; + + #[test] + fn add_to_array() { + let mut app = JsonEditorExample::new(json!({ "abc": 123, "def": [5, 6, 7] })); + let mut harness = Harness::new_ui(|ui| { + app.show(ui); + }); + + let array_node = harness.query_by_label_contains("def").unwrap(); + array_node.click_secondary(); + harness.run(); + + harness + .get_by_role_and_label(Role::Button, "Add to array") + .click(); + harness.run(); + + drop(harness); + + assert_eq!(app.value, json!({ "abc": 123, "def": [5, 6, 7, null] })) + } + + #[test] + fn delete_from_array() { + let mut app = JsonEditorExample::new(json!({ "abc": 123, "def": [5, 6, 7] })); + let mut harness = Harness::new_ui(|ui| { + app.show(ui); + }); + + let array_element_to_delete = harness.query_by_label_contains("6").unwrap(); + array_element_to_delete.click_secondary(); + harness.run(); + + harness + .get_by_role_and_label(Role::Button, "Delete") + .click(); + harness.run(); + + drop(harness); + + assert_eq!(app.value, json!({ "abc": 123, "def": [5, 7] })) + } + + #[test] + fn edit_array_element() { + let mut app = JsonEditorExample::new(json!({ "abc": 123, "def": [5, 6, 7] })); + let mut harness = Harness::new_ui(|ui| { + app.show(ui); + }); + + let array_element_to_edit = harness.query_by_label_contains("6").unwrap(); + array_element_to_edit.click_secondary(); + harness.run(); + + harness + .get_by_role_and_label(Role::Button, "Edit value") + .click(); + harness.run(); + + assert!(harness.get_by_role(Role::TextInput).is_focused()); + + // Text input is focussed and we can trigger text input event via any node. + harness.root().type_text("foo"); + harness.run(); + + harness.get_by_role_and_label(Role::Button, "✅").click(); + harness.run(); + + drop(harness); + + assert_eq!(app.value, json!({ "abc": 123, "def": [5, "foo", 7] })) + } + + #[test] + fn add_to_object() { + let mut app = JsonEditorExample::new(json!({ "abc": { "baz": "qux" }, "def": [5, 6, 7] })); + let mut harness = Harness::new_ui(|ui| { + app.show(ui); + }); + + let object_node = harness.get_by_label_contains("abc"); + object_node.click_secondary(); + harness.run(); + + harness + .get_by_role_and_label(Role::Button, "Add to object") + .click(); + harness.run(); + + assert!(harness.get_by_role(Role::TextInput).is_focused()); + + // Text input is focussed and we can trigger text input event via any node. + harness.root().type_text("foo"); + harness.run(); + + harness.get_by_role_and_label(Role::Button, "✅").click(); + harness.run(); + + drop(harness); + + assert_eq!( + app.value, + json!({ "abc": { "baz": "qux", "foo": null }, "def": [5, 6, 7] }) + ) + } + + #[test] + fn edit_object_key() { + let mut app = JsonEditorExample::new(json!({ "abc": { "baz": "qux" }, "def": [5, 6, 7] })); + let mut harness = Harness::new_ui(|ui| { + app.show(ui); + }); + + let object_node = harness.get_by_label_contains("abc"); + object_node.click_secondary(); + harness.run(); + + harness + .get_by_role_and_label(Role::Button, "Edit key") + .click(); + harness.run(); + + assert!(harness.get_by_role(Role::TextInput).is_focused()); + + // Text input is focussed and we can trigger text input event via any node. + harness.root().type_text("foo"); + harness.run(); + + harness.get_by_role_and_label(Role::Button, "✅").click(); + harness.run(); + + drop(harness); + + assert_eq!( + app.value, + json!({ "foo": { "baz": "qux" }, "def": [5, 6, 7] }) + ) + } + + #[test] + fn delete_from_object() { + let mut app = JsonEditorExample::new(json!({ "abc": { "baz": "qux" }, "def": [5, 6, 7] })); + let mut harness = Harness::new_ui(|ui| { + app.show(ui); + }); + + let element_to_delete = harness.get_by_label_contains("qux"); + element_to_delete.click_secondary(); + harness.run(); + + harness + .get_by_role_and_label(Role::Button, "Delete") + .click(); + harness.run(); + + drop(harness); + + assert_eq!(app.value, json!({ "abc": {}, "def": [5, 6, 7] })) + } +} + +// let nodes: Vec<_> = harness.query_all(By::new()).collect(); +// println!("{:#?}", nodes); From 416b33c65a469d376fa3ed5ef5439d1bd3cf32e9 Mon Sep 17 00:00:00 2001 From: dmackdev Date: Sat, 2 Aug 2025 09:50:44 +0100 Subject: [PATCH 04/16] add ci caching --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5ad6c4b..ad0ba50 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,6 +12,7 @@ jobs: steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions-rust-lang/setup-rust-toolchain@fb51252c7ba57d633bc668f941da052e410add48 # v1.13.0 + - uses: Swatinem/rust-cache@98c8021b550208e191a6a3145459bfc9fb29c4c0 # v2.8.0 - name: Build run: cargo build --locked --workspace - name: Test @@ -32,6 +33,7 @@ jobs: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions-rust-lang/setup-rust-toolchain@fb51252c7ba57d633bc668f941da052e410add48 # v1.13.0 - uses: jetli/trunk-action@1346cc09eace4beb84e403e199a471346d4684c9 # v0.5.1 + - uses: Swatinem/rust-cache@98c8021b550208e191a6a3145459bfc9fb29c4c0 # v2.8.0 with: version: "v0.21.14" - name: Trunk build From e9c4244d89a5c797e79be01aa98905f321142a56 Mon Sep 17 00:00:00 2001 From: dmackdev Date: Sat, 2 Aug 2025 09:56:51 +0100 Subject: [PATCH 05/16] reorder ci steps separate test job --- .github/workflows/ci.yml | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ad0ba50..325df01 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,32 +8,40 @@ on: jobs: build: - runs-on: macos-latest + runs-on: ubuntu-latest steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions-rust-lang/setup-rust-toolchain@fb51252c7ba57d633bc668f941da052e410add48 # v1.13.0 - uses: Swatinem/rust-cache@98c8021b550208e191a6a3145459bfc9fb29c4c0 # v2.8.0 + - name: Format + run: cargo fmt --all -- --check + - name: Clippy + run: cargo clippy - name: Build run: cargo build --locked --workspace + + test: + needs: build + runs-on: macos-15 # For snapshot testing. + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - uses: actions-rust-lang/setup-rust-toolchain@fb51252c7ba57d633bc668f941da052e410add48 # v1.13.0 + - uses: Swatinem/rust-cache@98c8021b550208e191a6a3145459bfc9fb29c4c0 # v2.8.0 - name: Test run: cargo test --locked - - name: Test json_tree_test for simd_json feature + - name: Test for simd_json feature run: cargo test --locked --features=simd_json --no-default-features snapshot_tests - - name: Clippy - run: cargo clippy - - name: Format - run: cargo fmt --all -- --check web-demo: - needs: build + needs: test permissions: contents: write runs-on: ubuntu-latest steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions-rust-lang/setup-rust-toolchain@fb51252c7ba57d633bc668f941da052e410add48 # v1.13.0 - - uses: jetli/trunk-action@1346cc09eace4beb84e403e199a471346d4684c9 # v0.5.1 - uses: Swatinem/rust-cache@98c8021b550208e191a6a3145459bfc9fb29c4c0 # v2.8.0 + - uses: jetli/trunk-action@1346cc09eace4beb84e403e199a471346d4684c9 # v0.5.1 with: version: "v0.21.14" - name: Trunk build From 3ab9600f8b9206f8d2ffecea3205860bec6856ea Mon Sep 17 00:00:00 2001 From: dmackdev Date: Sat, 2 Aug 2025 10:15:05 +0100 Subject: [PATCH 06/16] replace query/unwrap with get --- demo/src/apps/editor.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/demo/src/apps/editor.rs b/demo/src/apps/editor.rs index d25b28c..23b5063 100644 --- a/demo/src/apps/editor.rs +++ b/demo/src/apps/editor.rs @@ -484,7 +484,7 @@ mod tests { app.show(ui); }); - let array_node = harness.query_by_label_contains("def").unwrap(); + let array_node = harness.get_by_label_contains("def"); array_node.click_secondary(); harness.run(); @@ -505,7 +505,7 @@ mod tests { app.show(ui); }); - let array_element_to_delete = harness.query_by_label_contains("6").unwrap(); + let array_element_to_delete = harness.get_by_label_contains("6"); array_element_to_delete.click_secondary(); harness.run(); @@ -526,7 +526,7 @@ mod tests { app.show(ui); }); - let array_element_to_edit = harness.query_by_label_contains("6").unwrap(); + let array_element_to_edit = harness.get_by_label_contains("6"); array_element_to_edit.click_secondary(); harness.run(); From cd87918136f3822216d01c6870b73bfa2139b424 Mon Sep 17 00:00:00 2001 From: dmackdev Date: Sat, 2 Aug 2025 11:28:31 +0100 Subject: [PATCH 07/16] rename test file --- .github/workflows/ci.yml | 2 +- egui_json_tree/tests/image_snapshot_tests.rs | 170 ++++++++++++++++++ egui_json_tree/tests/json_tree_test.rs | 175 ------------------- justfile | 6 +- 4 files changed, 174 insertions(+), 179 deletions(-) create mode 100644 egui_json_tree/tests/image_snapshot_tests.rs delete mode 100644 egui_json_tree/tests/json_tree_test.rs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 325df01..e5476f9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -30,7 +30,7 @@ jobs: - name: Test run: cargo test --locked - name: Test for simd_json feature - run: cargo test --locked --features=simd_json --no-default-features snapshot_tests + run: cargo test --locked --features=simd_json --no-default-features --test image_snapshot_tests web-demo: needs: test diff --git a/egui_json_tree/tests/image_snapshot_tests.rs b/egui_json_tree/tests/image_snapshot_tests.rs new file mode 100644 index 0000000..7ebb4ba --- /dev/null +++ b/egui_json_tree/tests/image_snapshot_tests.rs @@ -0,0 +1,170 @@ +use std::sync::LazyLock; + +use egui_json_tree::{DefaultExpand, JsonTree, JsonTreeStyle}; +use egui_kittest::Harness; + +#[cfg(feature = "serde_json")] +use serde_json::{Value, json}; + +#[cfg(all(feature = "simd_json", not(feature = "serde_json")))] +use simd_json::{json, owned::Value}; + +// Keep all keys ordered within objects so rendering order is the same for both serde_json and simd_json. +static OBJECT: LazyLock = LazyLock::new(|| { + json!({ + "bar": { + "grep": 21, + "qux": false, + "thud": { + "a/b": [ + 4, + 5, + { + "m~n": "Greetings!" + } + ] + } + }, + "baz": null, + "foo": [ + 1, + 2, + [ + "grep" + ] + ] + }) +}); + +#[test] +fn render_object_with_default_expand_all() { + let mut harness = Harness::new_ui(|ui| { + JsonTree::new("id", &*OBJECT) + .default_expand(DefaultExpand::All) + .show(ui); + }); + harness.fit_contents(); + harness.snapshot("render_object_with_default_expand_all"); +} + +#[test] +fn render_object_with_default_expand_none() { + let mut harness = Harness::new_ui(|ui| { + JsonTree::new("id", &*OBJECT) + .default_expand(DefaultExpand::None) + .show(ui); + }); + harness.fit_contents(); + harness.snapshot("render_object_with_default_expand_none"); +} + +#[test] +fn render_object_with_abbreviated_root() { + let mut harness = Harness::new_ui(|ui| { + JsonTree::new("id", &*OBJECT) + .default_expand(DefaultExpand::None) + .style(JsonTreeStyle::new().abbreviate_root(true)) + .show(ui); + }); + harness.fit_contents(); + harness.snapshot("render_object_with_abbreviated_root"); +} + +#[test] +fn render_array_with_abbreviated_root() { + let mut harness = Harness::new_ui(|ui| { + JsonTree::new("id", &json!([1, 2, 3])) + .default_expand(DefaultExpand::None) + .style(JsonTreeStyle::new().abbreviate_root(true)) + .show(ui); + }); + harness.fit_contents(); + harness.snapshot("render_array_with_abbreviated_root"); +} + +#[test] +fn render_object_with_changing_default_expand_automatically_resets_expanded() { + // Harness::fit_contents seems to cause the tree to wrap, so set a fixed size here. + let mut harness = Harness::builder().with_size([350., 400.]).build_ui_state( + |ui, default_expand| { + JsonTree::new("id", &*OBJECT) + .default_expand(*default_expand) + .show(ui); + }, + DefaultExpand::None, + ); + + let mut snapshot_errors = vec![]; + + for (idx, default_expand) in [ + DefaultExpand::None, + DefaultExpand::All, + DefaultExpand::SearchResults("g"), + DefaultExpand::SearchResults("gr"), + DefaultExpand::ToLevel(2), + DefaultExpand::SearchResults("gre"), + DefaultExpand::SearchResults("gree"), + DefaultExpand::SearchResultsOrAll("null"), + ] + .into_iter() + .enumerate() + { + *harness.state_mut() = default_expand; + harness.run(); + if let Err(err) = harness.try_snapshot(format!( + "changing_default_expand/{}_{:?}", + idx, default_expand + )) { + snapshot_errors.push(err); + } + } + + assert!(snapshot_errors.is_empty()); +} + +#[test] +fn render_object_with_default_expand_to_levels() { + // Harness::fit_contents seems to cause the tree to wrap, so set a fixed size here. + let mut harness = Harness::builder().with_size([350., 400.]).build_ui_state( + |ui, level| { + JsonTree::new("id", &*OBJECT) + .default_expand(DefaultExpand::ToLevel(*level)) + .show(ui); + }, + 0, + ); + let mut snapshot_errors = vec![]; + + for level in 0..=4 { + *harness.state_mut() = level; + harness.run(); + if let Err(err) = harness.try_snapshot(format!("default_expand_to_level/{}", level)) { + snapshot_errors.push(err); + } + } + + assert!(snapshot_errors.is_empty()); +} + +#[test] +fn render_object_with_default_expand_search_results_or_all_with_empty_string_expands_everything() { + let mut harness = Harness::new_ui(|ui| { + JsonTree::new("id", &*OBJECT) + .default_expand(DefaultExpand::SearchResultsOrAll("")) + .show(ui); + }); + harness.fit_contents(); + harness.snapshot("search_results_or_all_empty_string"); +} + +#[test] +fn render_object_with_egui_light_theme_should_style_tree_with_light_theme() { + let mut harness = Harness::new_ui(|ui| { + ui.ctx().set_theme(egui::Theme::Light); + JsonTree::new("id", &*OBJECT) + .default_expand(DefaultExpand::All) + .show(ui); + }); + harness.fit_contents(); + harness.snapshot("light_theme"); +} diff --git a/egui_json_tree/tests/json_tree_test.rs b/egui_json_tree/tests/json_tree_test.rs deleted file mode 100644 index be992a7..0000000 --- a/egui_json_tree/tests/json_tree_test.rs +++ /dev/null @@ -1,175 +0,0 @@ -use std::sync::LazyLock; - -use egui_json_tree::{DefaultExpand, JsonTree, JsonTreeStyle}; -use egui_kittest::Harness; - -#[cfg(feature = "serde_json")] -use serde_json::{Value, json}; - -#[cfg(all(feature = "simd_json", not(feature = "serde_json")))] -use simd_json::{json, owned::Value}; - -// Keep all keys ordered within objects so rendering order is the same for both serde_json and simd_json. -static OBJECT: LazyLock = LazyLock::new(|| { - json!({ - "bar": { - "grep": 21, - "qux": false, - "thud": { - "a/b": [ - 4, - 5, - { - "m~n": "Greetings!" - } - ] - } - }, - "baz": null, - "foo": [ - 1, - 2, - [ - "grep" - ] - ] - }) -}); - -mod snapshot_tests { - use super::*; - - #[test] - fn render_object_with_default_expand_all() { - let mut harness = Harness::new_ui(|ui| { - JsonTree::new("id", &*OBJECT) - .default_expand(DefaultExpand::All) - .show(ui); - }); - harness.fit_contents(); - harness.snapshot("render_object_with_default_expand_all"); - } - - #[test] - fn render_object_with_default_expand_none() { - let mut harness = Harness::new_ui(|ui| { - JsonTree::new("id", &*OBJECT) - .default_expand(DefaultExpand::None) - .show(ui); - }); - harness.fit_contents(); - harness.snapshot("render_object_with_default_expand_none"); - } - - #[test] - fn render_object_with_abbreviated_root() { - let mut harness = Harness::new_ui(|ui| { - JsonTree::new("id", &*OBJECT) - .default_expand(DefaultExpand::None) - .style(JsonTreeStyle::new().abbreviate_root(true)) - .show(ui); - }); - harness.fit_contents(); - harness.snapshot("render_object_with_abbreviated_root"); - } - - #[test] - fn render_array_with_abbreviated_root() { - let mut harness = Harness::new_ui(|ui| { - JsonTree::new("id", &json!([1, 2, 3])) - .default_expand(DefaultExpand::None) - .style(JsonTreeStyle::new().abbreviate_root(true)) - .show(ui); - }); - harness.fit_contents(); - harness.snapshot("render_array_with_abbreviated_root"); - } - - #[test] - fn render_object_with_changing_default_expand_automatically_resets_expanded() { - // Harness::fit_contents seems to cause the tree to wrap, so set a fixed size here. - let mut harness = Harness::builder().with_size([350., 400.]).build_ui_state( - |ui, default_expand| { - JsonTree::new("id", &*OBJECT) - .default_expand(*default_expand) - .show(ui); - }, - DefaultExpand::None, - ); - - let mut snapshot_errors = vec![]; - - for (idx, default_expand) in [ - DefaultExpand::None, - DefaultExpand::All, - DefaultExpand::SearchResults("g"), - DefaultExpand::SearchResults("gr"), - DefaultExpand::ToLevel(2), - DefaultExpand::SearchResults("gre"), - DefaultExpand::SearchResults("gree"), - DefaultExpand::SearchResultsOrAll("null"), - ] - .into_iter() - .enumerate() - { - *harness.state_mut() = default_expand; - harness.run(); - if let Err(err) = harness.try_snapshot(format!( - "changing_default_expand/{}_{:?}", - idx, default_expand - )) { - snapshot_errors.push(err); - } - } - - assert!(snapshot_errors.is_empty()); - } - - #[test] - fn render_object_with_default_expand_to_levels() { - // Harness::fit_contents seems to cause the tree to wrap, so set a fixed size here. - let mut harness = Harness::builder().with_size([350., 400.]).build_ui_state( - |ui, level| { - JsonTree::new("id", &*OBJECT) - .default_expand(DefaultExpand::ToLevel(*level)) - .show(ui); - }, - 0, - ); - let mut snapshot_errors = vec![]; - - for level in 0..=4 { - *harness.state_mut() = level; - harness.run(); - if let Err(err) = harness.try_snapshot(format!("default_expand_to_level/{}", level)) { - snapshot_errors.push(err); - } - } - - assert!(snapshot_errors.is_empty()); - } - - #[test] - fn render_object_with_default_expand_search_results_or_all_with_empty_string_expands_everything() - { - let mut harness = Harness::new_ui(|ui| { - JsonTree::new("id", &*OBJECT) - .default_expand(DefaultExpand::SearchResultsOrAll("")) - .show(ui); - }); - harness.fit_contents(); - harness.snapshot("search_results_or_all_empty_string"); - } - - #[test] - fn render_object_with_egui_light_theme_should_style_tree_with_light_theme() { - let mut harness = Harness::new_ui(|ui| { - ui.ctx().set_theme(egui::Theme::Light); - JsonTree::new("id", &*OBJECT) - .default_expand(DefaultExpand::All) - .show(ui); - }); - harness.fit_contents(); - harness.snapshot("light_theme"); - } -} diff --git a/justfile b/justfile index 4117cf7..3dbf77f 100644 --- a/justfile +++ b/justfile @@ -1,10 +1,10 @@ test: cargo test - cargo test --features=simd_json --no-default-features snapshot_tests + cargo test --features=simd_json --no-default-features --test image_snapshot_tests update_snapshots: - UPDATE_SNAPSHOTS=1 cargo test snapshot_tests - cargo test --features=simd_json --no-default-features snapshot_tests + UPDATE_SNAPSHOTS=1 cargo test --test image_snapshot_tests + cargo test --features=simd_json --no-default-features --test image_snapshot_tests demo: cargo run -p demo From 4efcc87a8f00f3091f20aaf0db61350fc006e405 Mon Sep 17 00:00:00 2001 From: dmackdev Date: Sat, 2 Aug 2025 11:50:03 +0100 Subject: [PATCH 08/16] treat warnings as errors in CI add docs check step --- .github/workflows/ci.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e5476f9..2c6bac0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,6 +6,10 @@ on: - main pull_request: +env: + RUSTFLAGS: -D warnings + RUSTDOCFLAGS: -D warnings + jobs: build: runs-on: ubuntu-latest @@ -15,6 +19,8 @@ jobs: - uses: Swatinem/rust-cache@98c8021b550208e191a6a3145459bfc9fb29c4c0 # v2.8.0 - name: Format run: cargo fmt --all -- --check + - name: Docs + run: cargo doc --lib --no-deps --all-features - name: Clippy run: cargo clippy - name: Build From ddef64b377f296feb69b675d5bcb458bc5f7472c Mon Sep 17 00:00:00 2001 From: dmackdev Date: Sat, 2 Aug 2025 13:15:03 +0100 Subject: [PATCH 09/16] add accessibility widget info under test predicate for collapsing headers, with json pointer as label --- egui_json_tree/src/node.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/egui_json_tree/src/node.rs b/egui_json_tree/src/node.rs index 989850a..adc5455 100644 --- a/egui_json_tree/src/node.rs +++ b/egui_json_tree/src/node.rs @@ -206,7 +206,15 @@ impl<'a, 'b, T: ToJsonTreeValue> JsonTreeNode<'a, 'b, T> { if let Some(enabled) = style.toggle_buttons_state.enabled() { ui.add_enabled_ui(enabled, |ui| { - state.show_toggle_button(ui, paint_default_icon) + let _response = state.show_toggle_button(ui, paint_default_icon); + #[cfg(test)] + _response.widget_info(|| { + egui::WidgetInfo::labeled( + egui::WidgetType::CollapsingHeader, + ui.is_enabled(), + JsonPointer(path_segments).to_json_pointer_string(), + ) + }); }); } From 35e4b55a3fd65b81296deb263fbe2a4e6fa8330a Mon Sep 17 00:00:00 2001 From: dmackdev Date: Sat, 2 Aug 2025 13:17:38 +0100 Subject: [PATCH 10/16] add tests --- egui_json_tree/src/tree.rs | 126 +++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) diff --git a/egui_json_tree/src/tree.rs b/egui_json_tree/src/tree.rs index 06f14a6..8b1e197 100644 --- a/egui_json_tree/src/tree.rs +++ b/egui_json_tree/src/tree.rs @@ -109,3 +109,129 @@ impl<'a, T: ToJsonTreeValue> JsonTree<'a, T> { JsonTreeNode::show(self, ui) } } + +#[cfg(test)] +mod tests { + use std::sync::LazyLock; + + use egui::accesskit::Role; + use egui_kittest::Node; + use egui_kittest::kittest::NodeT; + use egui_kittest::{Harness, kittest::Queryable}; + use serde_json::{Value, json}; + + use crate::{DefaultExpand, JsonTree, JsonTreeStyle, ToggleButtonsState}; + + static OBJECT: LazyLock = LazyLock::new(|| { + json!({ + "bar": { + "grep": 21, + "qux": false, + }, + "baz": null, + "foo": [ + 1, + "two" + ] + }) + }); + + #[test] + fn render_object_with_toggle_buttons_visible_disabled() { + let harness = Harness::new_ui(|ui| { + JsonTree::new("id", &*OBJECT) + .default_expand(DefaultExpand::All) + .style( + JsonTreeStyle::new().toggle_buttons_state(ToggleButtonsState::VisibleDisabled), + ) + .show(ui); + }); + + assert_eq!(query_all_collapsing_headers(&harness).count(), 3); + assert!( + query_all_collapsing_headers(&harness).all(|node| node.accesskit_node().is_disabled()) + ) + } + + #[test] + fn render_object_with_toggle_buttons_visible_enabled() { + let harness = Harness::new_ui(|ui| { + JsonTree::new("id", &*OBJECT) + .default_expand(DefaultExpand::All) + .style( + JsonTreeStyle::new().toggle_buttons_state(ToggleButtonsState::VisibleEnabled), + ) + .show(ui); + }); + + assert_eq!(query_all_collapsing_headers(&harness).count(), 3); + assert!( + query_all_collapsing_headers(&harness).all(|node| !node.accesskit_node().is_disabled()) + ) + } + + #[test] + fn render_object_with_toggle_buttons_hidden() { + let harness = Harness::new_ui(|ui| { + JsonTree::new("id", &*OBJECT) + .default_expand(DefaultExpand::All) + .style(JsonTreeStyle::new().toggle_buttons_state(ToggleButtonsState::Hidden)) + .show(ui); + }); + + assert_eq!(query_all_collapsing_headers(&harness).count(), 0); + } + + #[test] + fn render_object_with_interaction_and_manual_reset_expanded() { + let mut harness = Harness::new_ui_state( + |ui, should_reset_expanded| { + let response = JsonTree::new("id", &*OBJECT) + .default_expand(DefaultExpand::None) + .style(JsonTreeStyle::new().abbreviate_root(true)) + .show(ui); + + if *should_reset_expanded { + response.reset_expanded(ui); + } + }, + false, + ); + + assert_eq!(query_all_collapsing_headers(&harness).count(), 1); + assert_eq!(harness.query_all_by_role(Role::Label).count(), 1); + + get_collapsing_header_node(&harness, "").click(); + harness.run(); + assert_eq!(query_all_collapsing_headers(&harness).count(), 3); + assert_eq!(harness.query_all_by_role(Role::Label).count(), 11); + + get_collapsing_header_node(&harness, "/bar").click(); + harness.run(); + assert_eq!(harness.query_all_by_role(Role::Label).count(), 18); + assert!(harness.query_by_label("\"grep\"").is_some()); + assert!(harness.query_by_label("21").is_some()); + assert!(harness.query_by_label("\"qux\"").is_some()); + assert!(harness.query_by_label("false").is_some()); + + *harness.state_mut() = true; + // Resetting expanded manually has a one frame delay, since the reset call happens after the tree renders, hence two runs. + harness.run(); + harness.run(); + assert_eq!(query_all_collapsing_headers(&harness).count(), 1); + assert_eq!(harness.query_all_by_role(Role::Label).count(), 1); + } + + fn query_all_collapsing_headers<'a, S>( + harness: &'a Harness<'_, S>, + ) -> impl Iterator> { + harness.query_all_by_role(Role::Button) + } + + fn get_collapsing_header_node<'a, S>( + harness: &'a Harness<'_, S>, + pointer: &'a str, + ) -> Node<'a> { + harness.get_by_role_and_label(Role::Button, pointer) + } +} From 76232e79d9f7d28f085d66279b395f787abff109 Mon Sep 17 00:00:00 2001 From: dmackdev Date: Sat, 2 Aug 2025 13:21:23 +0100 Subject: [PATCH 11/16] convert two snapshot tests --- egui_json_tree/src/tree.rs | 24 ++++++++++++++++ egui_json_tree/tests/image_snapshot_tests.rs | 26 +----------------- .../render_array_with_abbreviated_root.png | Bin 706 -> 0 bytes .../render_object_with_abbreviated_root.png | Bin 860 -> 0 bytes 4 files changed, 25 insertions(+), 25 deletions(-) delete mode 100644 egui_json_tree/tests/snapshots/render_array_with_abbreviated_root.png delete mode 100644 egui_json_tree/tests/snapshots/render_object_with_abbreviated_root.png diff --git a/egui_json_tree/src/tree.rs b/egui_json_tree/src/tree.rs index 8b1e197..eee9c21 100644 --- a/egui_json_tree/src/tree.rs +++ b/egui_json_tree/src/tree.rs @@ -222,6 +222,30 @@ mod tests { assert_eq!(harness.query_all_by_role(Role::Label).count(), 1); } + #[test] + fn render_object_with_default_expand_none_and_abbreviated_root() { + let harness = Harness::new_ui(|ui| { + JsonTree::new("id", &*OBJECT) + .default_expand(DefaultExpand::None) + .style(JsonTreeStyle::new().abbreviate_root(true)) + .show(ui); + }); + assert_eq!(query_all_collapsing_headers(&harness).count(), 1); + assert_eq!(harness.get_by_role(Role::Label).value().unwrap(), "{...}"); + } + + #[test] + fn render_array_with_default_expand_none_and_abbreviated_root() { + let harness = Harness::new_ui(|ui| { + JsonTree::new("id", &json!([1, 2, 3])) + .default_expand(DefaultExpand::None) + .style(JsonTreeStyle::new().abbreviate_root(true)) + .show(ui); + }); + assert_eq!(query_all_collapsing_headers(&harness).count(), 1); + assert_eq!(harness.get_by_role(Role::Label).value().unwrap(), "[...]"); + } + fn query_all_collapsing_headers<'a, S>( harness: &'a Harness<'_, S>, ) -> impl Iterator> { diff --git a/egui_json_tree/tests/image_snapshot_tests.rs b/egui_json_tree/tests/image_snapshot_tests.rs index 7ebb4ba..8f5ccd1 100644 --- a/egui_json_tree/tests/image_snapshot_tests.rs +++ b/egui_json_tree/tests/image_snapshot_tests.rs @@ -1,6 +1,6 @@ use std::sync::LazyLock; -use egui_json_tree::{DefaultExpand, JsonTree, JsonTreeStyle}; +use egui_json_tree::{DefaultExpand, JsonTree}; use egui_kittest::Harness; #[cfg(feature = "serde_json")] @@ -58,30 +58,6 @@ fn render_object_with_default_expand_none() { harness.snapshot("render_object_with_default_expand_none"); } -#[test] -fn render_object_with_abbreviated_root() { - let mut harness = Harness::new_ui(|ui| { - JsonTree::new("id", &*OBJECT) - .default_expand(DefaultExpand::None) - .style(JsonTreeStyle::new().abbreviate_root(true)) - .show(ui); - }); - harness.fit_contents(); - harness.snapshot("render_object_with_abbreviated_root"); -} - -#[test] -fn render_array_with_abbreviated_root() { - let mut harness = Harness::new_ui(|ui| { - JsonTree::new("id", &json!([1, 2, 3])) - .default_expand(DefaultExpand::None) - .style(JsonTreeStyle::new().abbreviate_root(true)) - .show(ui); - }); - harness.fit_contents(); - harness.snapshot("render_array_with_abbreviated_root"); -} - #[test] fn render_object_with_changing_default_expand_automatically_resets_expanded() { // Harness::fit_contents seems to cause the tree to wrap, so set a fixed size here. diff --git a/egui_json_tree/tests/snapshots/render_array_with_abbreviated_root.png b/egui_json_tree/tests/snapshots/render_array_with_abbreviated_root.png deleted file mode 100644 index 29dfa3832af65d1b516df7f7912dacb01cf5806e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 706 zcmeAS@N?(olHy`uVBq!ia0vp^u0Slu!3HF&j$D>yU|{O>ba4!+V0?Rkd4Wpgv|}It zm%r;hab|guck;U2+uNWhvuEBkul4hcjFsN~EZd${wXEGb`|A3ltIUi6J6|<2tcdyQ zz!0*oN`XNu+*W{L>S{TThEt*ZEDldsu`@0Bq`%|iG3m4a4a@IUF0c5ykNfQNV!t^S z2lM|u%V#QhcgOOd@!jh8d;ffm|8L5${^zXqCrz)%9DXeK-6D>ILF+#+P}#q>|6IFw z?|$>{9n*(Z>wm4>+BeCScOJ_fU;p>k z`j0z~+xGou2D;GN_S?q(r(gxucOL)P8vol=?)#48ANNZ@eYgKI$ilj}*Xw#g4*es~ z05Y+#zglMhx9t7LK$8C!#}uD6-ShVLKHd5c?DYrk|Gj(vqr>%>V&44U+wxD#|2ZiC zp}hWkxy=QT`)}`id;1eRP~o4u_y5ZN=VM^`?-u{rG#>1+f68<1YG)lyI@oJ|??kb6 z?Jtw=qfOHJdnP_F`}HMLtee&RUWM|1KVV=?99e=;w zzIp%t^PND4_CNl1J3qa?e*W`sAkW^;-#_>7-&(mBPfkv@`Eih+ZNaru-3$$<>K8sO zI{EYS^U9Cn^@R+1d%uR|?S5+}mjTo$o&qDDmpwZp8TaRCyi9}lbiKm&d%u6uXK?t# woww(s+voZ-bIb2(&a-DY0#68d(@Q-|w%MF#^=A|vfN7J#)78&qol`;+05S4-!TyU|?4Eba4!+V0?Rkd4Wpgv|}It zm%r;hab|guck;U2+uNWhvuEBkul4hcjFsN~EZd${wXEGb`|A3ltIUi6J6|<2tcdyQ zz!0*oN`XNu+*W{L>S{TThEt*ZEDldsu`@0Bq`%|iG3m4a4a@IUF0c5rN;_YM%- zybA1pv}|_XqfGy5ssBt2P4$cWf34_$w6VWd=YP~v5r&-4@kh;;io~%ng#7E3`+ej1 zryIxZrX9C^SNP}F`oB^j8!H0eym>QW=AZCWKHIi$uM}hm_*q`{CRzS;vi$D|x$irU zf6U(hE!*Z@VgKWwJAodp+!|hOx^Cw)sd>MyEdLb$GXMX#{K})@HLmxb#@=fM84YsT z9tH-M|E^)HMaA`E5@g(gCjWdN;FUN_Esldh>%Sk^t6SrLn}RJkG{?SvUi|;B@y}oS z*IVU(6w5zYzf`<>qxfTxzwEyk+aKT0&~R%1#m92rE$ZH0uj>W-AX{g;x5~#qF~w(1 z_q@HmPq+R9d;Nj?fA8M^=x{xzm^c6Tw*1rbe-6rjD6jusZgau(dd%V5``+IE#12&W z=kEQ#vgg;nw&LUCs}N)m_#<6=_IeF3*j?A9jte$)JlHwcu6EYZq=UWY_f8aB*Zwl; zKH4Omzh~m}vR_{^#kyI|?^P(D?^jut`N);Q;pzSxKR-X;c-DIVXY0>L)a@pMqUu2% z$h;kYzumrh|Nirxz@X`W{OxvrdVT%;=ihc5x9z)~zke<;g~+{_7M=Idu)mUL^UWTR z7$jw!dE#F8#QnzIyQ$UHv!8FjG($;5UII{o2G3k7h p|HnZQ@aQMA1Kwl{Pu)M Date: Sat, 2 Aug 2025 13:28:15 +0100 Subject: [PATCH 12/16] convert snapshot test --- egui_json_tree/src/tree.rs | 12 ++++++++++++ egui_json_tree/tests/image_snapshot_tests.rs | 11 ----------- .../search_results_or_all_empty_string.png | Bin 18746 -> 0 bytes 3 files changed, 12 insertions(+), 11 deletions(-) delete mode 100644 egui_json_tree/tests/snapshots/search_results_or_all_empty_string.png diff --git a/egui_json_tree/src/tree.rs b/egui_json_tree/src/tree.rs index eee9c21..4c5999f 100644 --- a/egui_json_tree/src/tree.rs +++ b/egui_json_tree/src/tree.rs @@ -246,6 +246,18 @@ mod tests { assert_eq!(harness.get_by_role(Role::Label).value().unwrap(), "[...]"); } + #[test] + fn render_object_with_default_expand_search_results_or_all_when_empty_string_expands_everything() + { + let harness = Harness::new_ui(|ui| { + JsonTree::new("id", &*OBJECT) + .default_expand(DefaultExpand::SearchResultsOrAll("")) + .show(ui); + }); + assert_eq!(query_all_collapsing_headers(&harness).count(), 3); + assert_eq!(harness.query_all_by_role(Role::Label).count(), 25); + } + fn query_all_collapsing_headers<'a, S>( harness: &'a Harness<'_, S>, ) -> impl Iterator> { diff --git a/egui_json_tree/tests/image_snapshot_tests.rs b/egui_json_tree/tests/image_snapshot_tests.rs index 8f5ccd1..de9bc4e 100644 --- a/egui_json_tree/tests/image_snapshot_tests.rs +++ b/egui_json_tree/tests/image_snapshot_tests.rs @@ -122,17 +122,6 @@ fn render_object_with_default_expand_to_levels() { assert!(snapshot_errors.is_empty()); } -#[test] -fn render_object_with_default_expand_search_results_or_all_with_empty_string_expands_everything() { - let mut harness = Harness::new_ui(|ui| { - JsonTree::new("id", &*OBJECT) - .default_expand(DefaultExpand::SearchResultsOrAll("")) - .show(ui); - }); - harness.fit_contents(); - harness.snapshot("search_results_or_all_empty_string"); -} - #[test] fn render_object_with_egui_light_theme_should_style_tree_with_light_theme() { let mut harness = Harness::new_ui(|ui| { diff --git a/egui_json_tree/tests/snapshots/search_results_or_all_empty_string.png b/egui_json_tree/tests/snapshots/search_results_or_all_empty_string.png deleted file mode 100644 index 89ad9652d7bd2ea6881da82180ff7fbf287fb0cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18746 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 From c5189c16acbd460f117a5163b62177dcd0a84e2d Mon Sep 17 00:00:00 2001 From: dmackdev Date: Sat, 2 Aug 2025 13:34:16 +0100 Subject: [PATCH 13/16] refactor snapshot tests --- egui_json_tree/tests/image_snapshot_tests.rs | 42 ++++++++++++++++-- .../{4_ToLevel(2).png => 1_ToLevel(2).png} | Bin .../2_SearchResults(\"gree\").png" | Bin .../{1_All.png => 3_All.png} | Bin .../4_SearchResultsOrAll(\"null\").png" | Bin .../0_SearchResults(\"\").png" | Bin 0 -> 7932 bytes .../1_SearchResults(\"g\").png" | Bin .../2_SearchResults(\"gr\").png" | Bin .../3_SearchResults(\"gre\").png" | Bin .../4_SearchResults(\"gree\").png" | Bin 0 -> 16956 bytes 10 files changed, 38 insertions(+), 4 deletions(-) rename egui_json_tree/tests/snapshots/changing_default_expand/{4_ToLevel(2).png => 1_ToLevel(2).png} (100%) rename "egui_json_tree/tests/snapshots/changing_default_expand/6_SearchResults(\"gree\").png" => "egui_json_tree/tests/snapshots/changing_default_expand/2_SearchResults(\"gree\").png" (100%) rename egui_json_tree/tests/snapshots/changing_default_expand/{1_All.png => 3_All.png} (100%) rename "egui_json_tree/tests/snapshots/changing_default_expand/7_SearchResultsOrAll(\"null\").png" => "egui_json_tree/tests/snapshots/changing_default_expand/4_SearchResultsOrAll(\"null\").png" (100%) create mode 100644 "egui_json_tree/tests/snapshots/default_expand_search_results/0_SearchResults(\"\").png" rename "egui_json_tree/tests/snapshots/changing_default_expand/2_SearchResults(\"g\").png" => "egui_json_tree/tests/snapshots/default_expand_search_results/1_SearchResults(\"g\").png" (100%) rename "egui_json_tree/tests/snapshots/changing_default_expand/3_SearchResults(\"gr\").png" => "egui_json_tree/tests/snapshots/default_expand_search_results/2_SearchResults(\"gr\").png" (100%) rename "egui_json_tree/tests/snapshots/changing_default_expand/5_SearchResults(\"gre\").png" => "egui_json_tree/tests/snapshots/default_expand_search_results/3_SearchResults(\"gre\").png" (100%) create mode 100644 "egui_json_tree/tests/snapshots/default_expand_search_results/4_SearchResults(\"gree\").png" diff --git a/egui_json_tree/tests/image_snapshot_tests.rs b/egui_json_tree/tests/image_snapshot_tests.rs index de9bc4e..8f8cd7f 100644 --- a/egui_json_tree/tests/image_snapshot_tests.rs +++ b/egui_json_tree/tests/image_snapshot_tests.rs @@ -58,6 +58,43 @@ fn render_object_with_default_expand_none() { harness.snapshot("render_object_with_default_expand_none"); } +#[test] +fn render_object_search_results() { + // Harness::fit_contents seems to cause the tree to wrap, so set a fixed size here. + let mut harness = Harness::builder().with_size([350., 400.]).build_ui_state( + |ui, default_expand| { + JsonTree::new("id", &*OBJECT) + .default_expand(*default_expand) + .show(ui); + }, + DefaultExpand::SearchResults(""), + ); + + let mut snapshot_errors = vec![]; + + for (idx, search_default_expand) in [ + DefaultExpand::SearchResults(""), + DefaultExpand::SearchResults("g"), + DefaultExpand::SearchResults("gr"), + DefaultExpand::SearchResults("gre"), + DefaultExpand::SearchResults("gree"), + ] + .into_iter() + .enumerate() + { + *harness.state_mut() = search_default_expand; + harness.run(); + if let Err(err) = harness.try_snapshot(format!( + "default_expand_search_results/{}_{:?}", + idx, search_default_expand + )) { + snapshot_errors.push(err); + } + } + + assert!(snapshot_errors.is_empty()); +} + #[test] fn render_object_with_changing_default_expand_automatically_resets_expanded() { // Harness::fit_contents seems to cause the tree to wrap, so set a fixed size here. @@ -74,12 +111,9 @@ fn render_object_with_changing_default_expand_automatically_resets_expanded() { for (idx, default_expand) in [ DefaultExpand::None, - DefaultExpand::All, - DefaultExpand::SearchResults("g"), - DefaultExpand::SearchResults("gr"), DefaultExpand::ToLevel(2), - DefaultExpand::SearchResults("gre"), DefaultExpand::SearchResults("gree"), + DefaultExpand::All, DefaultExpand::SearchResultsOrAll("null"), ] .into_iter() diff --git a/egui_json_tree/tests/snapshots/changing_default_expand/4_ToLevel(2).png b/egui_json_tree/tests/snapshots/changing_default_expand/1_ToLevel(2).png similarity index 100% rename from egui_json_tree/tests/snapshots/changing_default_expand/4_ToLevel(2).png rename to egui_json_tree/tests/snapshots/changing_default_expand/1_ToLevel(2).png diff --git "a/egui_json_tree/tests/snapshots/changing_default_expand/6_SearchResults(\"gree\").png" "b/egui_json_tree/tests/snapshots/changing_default_expand/2_SearchResults(\"gree\").png" similarity index 100% rename from "egui_json_tree/tests/snapshots/changing_default_expand/6_SearchResults(\"gree\").png" rename to "egui_json_tree/tests/snapshots/changing_default_expand/2_SearchResults(\"gree\").png" diff --git a/egui_json_tree/tests/snapshots/changing_default_expand/1_All.png b/egui_json_tree/tests/snapshots/changing_default_expand/3_All.png similarity index 100% rename from egui_json_tree/tests/snapshots/changing_default_expand/1_All.png rename to egui_json_tree/tests/snapshots/changing_default_expand/3_All.png diff --git "a/egui_json_tree/tests/snapshots/changing_default_expand/7_SearchResultsOrAll(\"null\").png" "b/egui_json_tree/tests/snapshots/changing_default_expand/4_SearchResultsOrAll(\"null\").png" similarity index 100% rename from "egui_json_tree/tests/snapshots/changing_default_expand/7_SearchResultsOrAll(\"null\").png" rename to "egui_json_tree/tests/snapshots/changing_default_expand/4_SearchResultsOrAll(\"null\").png" diff --git "a/egui_json_tree/tests/snapshots/default_expand_search_results/0_SearchResults(\"\").png" "b/egui_json_tree/tests/snapshots/default_expand_search_results/0_SearchResults(\"\").png" new file mode 100644 index 0000000000000000000000000000000000000000..d60bdc7fc1eca6112e0af78d3ae873a0da6b1257 GIT binary patch literal 7932 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 literal 0 HcmV?d00001 diff --git "a/egui_json_tree/tests/snapshots/changing_default_expand/2_SearchResults(\"g\").png" "b/egui_json_tree/tests/snapshots/default_expand_search_results/1_SearchResults(\"g\").png" similarity index 100% rename from "egui_json_tree/tests/snapshots/changing_default_expand/2_SearchResults(\"g\").png" rename to "egui_json_tree/tests/snapshots/default_expand_search_results/1_SearchResults(\"g\").png" diff --git "a/egui_json_tree/tests/snapshots/changing_default_expand/3_SearchResults(\"gr\").png" "b/egui_json_tree/tests/snapshots/default_expand_search_results/2_SearchResults(\"gr\").png" similarity index 100% rename from "egui_json_tree/tests/snapshots/changing_default_expand/3_SearchResults(\"gr\").png" rename to "egui_json_tree/tests/snapshots/default_expand_search_results/2_SearchResults(\"gr\").png" diff --git "a/egui_json_tree/tests/snapshots/changing_default_expand/5_SearchResults(\"gre\").png" "b/egui_json_tree/tests/snapshots/default_expand_search_results/3_SearchResults(\"gre\").png" similarity index 100% rename from "egui_json_tree/tests/snapshots/changing_default_expand/5_SearchResults(\"gre\").png" rename to "egui_json_tree/tests/snapshots/default_expand_search_results/3_SearchResults(\"gre\").png" diff --git "a/egui_json_tree/tests/snapshots/default_expand_search_results/4_SearchResults(\"gree\").png" "b/egui_json_tree/tests/snapshots/default_expand_search_results/4_SearchResults(\"gree\").png" new file mode 100644 index 0000000000000000000000000000000000000000..274c8cb55392940a3af66f8fe809b949b0a25c2d GIT binary patch literal 16956 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 F{|_pDhM@oe literal 0 HcmV?d00001 From aa05278b8fceb977b0e43545c32a0e875df17fd8 Mon Sep 17 00:00:00 2001 From: dmackdev Date: Sat, 2 Aug 2025 13:39:30 +0100 Subject: [PATCH 14/16] update comment --- egui_json_tree/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/egui_json_tree/Cargo.toml b/egui_json_tree/Cargo.toml index 892e630..b6a879e 100644 --- a/egui_json_tree/Cargo.toml +++ b/egui_json_tree/Cargo.toml @@ -24,5 +24,5 @@ serde_json = ["dep:serde_json"] simd_json = ["dep:simd-json"] [dev-dependencies] -egui = { workspace = true, default-features = true } # For egui_kittest +egui = { workspace = true, default-features = true } # egui_kittest snapshot testing needs default features egui_kittest = { workspace = true, features = ["wgpu", "snapshot"] } From e1eb73225c136ae890b4f0c9fe6463ea4e84ed12 Mon Sep 17 00:00:00 2001 From: dmackdev Date: Sat, 2 Aug 2025 13:51:46 +0100 Subject: [PATCH 15/16] fix running snapshot tests with simd_json --- .github/workflows/ci.yml | 2 +- justfile | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2c6bac0..7c4d8e5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,7 +36,7 @@ jobs: - name: Test run: cargo test --locked - name: Test for simd_json feature - run: cargo test --locked --features=simd_json --no-default-features --test image_snapshot_tests + run: cargo test --locked --package egui_json_tree --test image_snapshot_tests --features simd_json --no-default-features web-demo: needs: test diff --git a/justfile b/justfile index 3dbf77f..9d9337e 100644 --- a/justfile +++ b/justfile @@ -1,10 +1,10 @@ test: cargo test - cargo test --features=simd_json --no-default-features --test image_snapshot_tests + cargo test --package egui_json_tree --test image_snapshot_tests --features simd_json --no-default-features update_snapshots: UPDATE_SNAPSHOTS=1 cargo test --test image_snapshot_tests - cargo test --features=simd_json --no-default-features --test image_snapshot_tests + cargo test --package egui_json_tree --test image_snapshot_tests --features simd_json --no-default-features demo: cargo run -p demo From 278257892685cc6d71404d2efabc2ef30bd13441 Mon Sep 17 00:00:00 2001 From: dmackdev Date: Sat, 2 Aug 2025 14:05:03 +0100 Subject: [PATCH 16/16] add editor test and asserts --- demo/src/apps/editor.rs | 75 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 71 insertions(+), 4 deletions(-) diff --git a/demo/src/apps/editor.rs b/demo/src/apps/editor.rs index 23b5063..b671b6c 100644 --- a/demo/src/apps/editor.rs +++ b/demo/src/apps/editor.rs @@ -471,7 +471,7 @@ impl Show for JsonEditorExample { #[cfg(test)] mod tests { - use egui::accesskit::Role; + use egui::{Key, accesskit::Role}; use egui_kittest::{Harness, kittest::Queryable}; use serde_json::json; @@ -543,6 +543,7 @@ mod tests { harness.get_by_role_and_label(Role::Button, "✅").click(); harness.run(); + assert!(harness.query_by_role(Role::TextInput).is_none()); drop(harness); @@ -573,6 +574,7 @@ mod tests { harness.get_by_role_and_label(Role::Button, "✅").click(); harness.run(); + assert!(harness.query_by_role(Role::TextInput).is_none()); drop(harness); @@ -606,6 +608,7 @@ mod tests { harness.get_by_role_and_label(Role::Button, "✅").click(); harness.run(); + assert!(harness.query_by_role(Role::TextInput).is_none()); drop(harness); @@ -615,6 +618,73 @@ mod tests { ) } + #[test] + fn when_edit_object_key_can_save_with_enter_key() { + let mut app = JsonEditorExample::new(json!({ "abc": { "baz": "qux" }, "def": [5, 6, 7] })); + let mut harness = Harness::new_ui(|ui| { + app.show(ui); + }); + + let object_node = harness.get_by_label_contains("abc"); + object_node.click_secondary(); + harness.run(); + + harness + .get_by_role_and_label(Role::Button, "Edit key") + .click(); + harness.run(); + + assert!(harness.get_by_role(Role::TextInput).is_focused()); + + // Text input is focussed and we can trigger text input event via any node. + harness.root().type_text("foo"); + harness.run(); + + harness.key_press(Key::Enter); + harness.run(); + assert!(harness.query_by_role(Role::TextInput).is_none()); + + drop(harness); + + assert_eq!( + app.value, + json!({ "foo": { "baz": "qux" }, "def": [5, 6, 7] }) + ) + } + + #[test] + fn when_edit_object_key_and_press_cancel_does_not_change_json() { + let original_json = json!({ "abc": { "baz": "qux" }, "def": [5, 6, 7] }); + + let mut app = JsonEditorExample::new(original_json.clone()); + let mut harness = Harness::new_ui(|ui| { + app.show(ui); + }); + + let object_node = harness.get_by_label_contains("abc"); + object_node.click_secondary(); + harness.run(); + + harness + .get_by_role_and_label(Role::Button, "Edit key") + .click(); + harness.run(); + + assert!(harness.get_by_role(Role::TextInput).is_focused()); + + // Text input is focussed and we can trigger text input event via any node. + harness.root().type_text("foo"); + harness.run(); + + harness.get_by_role_and_label(Role::Button, "❌").click(); + harness.run(); + assert!(harness.query_by_role(Role::TextInput).is_none()); + + drop(harness); + + assert_eq!(app.value, original_json) + } + #[test] fn delete_from_object() { let mut app = JsonEditorExample::new(json!({ "abc": { "baz": "qux" }, "def": [5, 6, 7] })); @@ -636,6 +706,3 @@ mod tests { assert_eq!(app.value, json!({ "abc": {}, "def": [5, 6, 7] })) } } - -// let nodes: Vec<_> = harness.query_all(By::new()).collect(); -// println!("{:#?}", nodes);