From 69a147319702df69278f4f5a304cbfb56e106ee2 Mon Sep 17 00:00:00 2001 From: Pierre Jacquier Date: Fri, 28 Feb 2025 13:55:45 -0500 Subject: [PATCH 1/2] Scheduled e2e tests on main (#5551) * WIP: Scheduled e2e tests * Update .github/workflows/e2e-tests.yml Co-authored-by: Jonathan Tran --------- Co-authored-by: Jonathan Tran --- .github/workflows/e2e-tests.yml | 36 +++++++++++++-------------------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index c5a189733..00fc1d9bb 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -3,6 +3,8 @@ on: push: branches: [ main ] pull_request: + schedule: + - cron: 0 * * * * # hourly concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} @@ -15,23 +17,6 @@ permissions: jobs: - - check-rust-changes: - runs-on: ubuntu-latest - outputs: - rust-changed: ${{ steps.filter.outputs.rust }} - - steps: - - uses: actions/checkout@v4 - - - id: filter - name: Check for Rust changes - uses: dorny/paths-filter@v3 - with: - filters: | - rust: - - 'src/wasm-lib/**' - electron: timeout-minutes: 60 name: playwright:electron:${{ matrix.os }} ${{ matrix.shardIndex }} ${{ matrix.shardTotal }} @@ -42,8 +27,8 @@ jobs: os: [namespace-profile-ubuntu-8-cores, namespace-profile-macos-8-cores, windows-16-cores] shardIndex: [1, 2, 3, 4] shardTotal: [4] + # TODO: add ref here for main and latest release tag runs-on: ${{ matrix.os }} - needs: check-rust-changes steps: - uses: actions/create-github-app-token@v1 id: app-token @@ -54,6 +39,13 @@ jobs: - uses: actions/checkout@v4 with: token: ${{ steps.app-token.outputs.token }} + - id: filter + name: Check for Rust changes + uses: dorny/paths-filter@v3 + with: + filters: | + rust: + - 'src/wasm-lib/**' - uses: actions/setup-node@v4 with: node-version-file: '.nvmrc' @@ -73,7 +65,7 @@ jobs: run: yarn playwright install --with-deps - name: Download Wasm Cache id: download-wasm - if: needs.check-rust-changes.outputs.rust-changed == 'false' + if: github.event_name != 'schedule' && steps.filter.outputs.rust == 'false' uses: dawidd6/action-download-artifact@v7 continue-on-error: true with: @@ -83,7 +75,7 @@ jobs: branch: main path: src/wasm-lib/pkg - name: copy wasm blob - if: needs.check-rust-changes.outputs.rust-changed == 'false' + if: github.event_name != 'schedule' && steps.filter.outputs.rust == 'false' shell: bash run: cp src/wasm-lib/pkg/wasm_lib_bg.wasm public continue-on-error: true @@ -93,7 +85,7 @@ jobs: with: tool: wasm-pack - name: Cache Wasm (because rust diff) - if: needs.check-rust-changes.outputs.rust-changed == 'true' + if: github.event_name == 'schedule' || steps.filter.outputs.rust == 'true' uses: Swatinem/rust-cache@v2 with: workspaces: './src/wasm-lib' @@ -126,7 +118,7 @@ jobs: cat /tmp/vector.toml ${HOME}/.vector/bin/vector --config /tmp/vector.toml & - name: Build Wasm (because rust diff) - if: needs.check-rust-changes.outputs.rust-changed == 'true' + if: github.event_name == 'schedule' || steps.filter.outputs.rust == 'true' shell: bash run: yarn build:wasm - name: OR Build Wasm (because wasm cache failed) From 3811c88b5c60c46074c191e5b185fba14608ffbd Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Fri, 28 Feb 2025 11:52:14 -0800 Subject: [PATCH 2/2] properly flush batch (#5565) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * properly flush batch Signed-off-by: Jess Frazelle * add test Signed-off-by: Jess Frazelle * add test Signed-off-by: Jess Frazelle * A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores) * only flush if not on error Signed-off-by: Jess Frazelle * better method Signed-off-by: Jess Frazelle * updates Signed-off-by: Jess Frazelle * ensure nothing in batch assembly test Signed-off-by: Jess Frazelle --------- Signed-off-by: Jess Frazelle Co-authored-by: github-actions[bot] --- src/wasm-lib/kcl/src/execution/exec_ast.rs | 6 +- src/wasm-lib/kcl/src/simulation_tests.rs | 22 + .../cube_with_error/artifact_commands.snap | 1 - .../flush_batch_on_end/artifact_commands.snap | 655 ++++++++++++ .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 35 + .../kcl/tests/flush_batch_on_end/ast.snap | 700 +++++++++++++ .../kcl/tests/flush_batch_on_end/input.kcl | 30 + .../kcl/tests/flush_batch_on_end/ops.snap | 105 ++ .../flush_batch_on_end/program_memory.snap | 975 ++++++++++++++++++ .../flush_batch_on_end/rendered_model.png | Bin 0 -> 82230 bytes src/wasm-lib/tests/executor/main.rs | 52 + 12 files changed, 2585 insertions(+), 2 deletions(-) create mode 100644 src/wasm-lib/kcl/tests/flush_batch_on_end/artifact_commands.snap create mode 100644 src/wasm-lib/kcl/tests/flush_batch_on_end/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/flush_batch_on_end/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/flush_batch_on_end/ast.snap create mode 100644 src/wasm-lib/kcl/tests/flush_batch_on_end/input.kcl create mode 100644 src/wasm-lib/kcl/tests/flush_batch_on_end/ops.snap create mode 100644 src/wasm-lib/kcl/tests/flush_batch_on_end/program_memory.snap create mode 100644 src/wasm-lib/kcl/tests/flush_batch_on_end/rendered_model.png diff --git a/src/wasm-lib/kcl/src/execution/exec_ast.rs b/src/wasm-lib/kcl/src/execution/exec_ast.rs index 0e65e3f01..5a89df107 100644 --- a/src/wasm-lib/kcl/src/execution/exec_ast.rs +++ b/src/wasm-lib/kcl/src/execution/exec_ast.rs @@ -123,7 +123,11 @@ impl ExecutorContext { }; std::mem::swap(&mut exec_state.mod_local, &mut local_state); - if !exec_kind.is_isolated() && new_units != old_units { + // We only need to reset the units if we are not on the Main path. + // If we reset at the end of the main path, then we just add on an extra + // command and we'd need to flush the batch again. + // This avoids that. + if !exec_kind.is_isolated() && new_units != old_units && *path != ModulePath::Main { self.engine.set_units(old_units.into(), Default::default()).await?; } self.engine.replace_execution_kind(original_execution).await; diff --git a/src/wasm-lib/kcl/src/simulation_tests.rs b/src/wasm-lib/kcl/src/simulation_tests.rs index e2ea794c8..baafb9bfc 100644 --- a/src/wasm-lib/kcl/src/simulation_tests.rs +++ b/src/wasm-lib/kcl/src/simulation_tests.rs @@ -2074,3 +2074,25 @@ mod import_file_parse_error { super::execute(TEST_NAME, true).await } } + +mod flush_batch_on_end { + const TEST_NAME: &str = "flush_batch_on_end"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME); + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} diff --git a/src/wasm-lib/kcl/tests/cube_with_error/artifact_commands.snap b/src/wasm-lib/kcl/tests/cube_with_error/artifact_commands.snap index 481cdc159..497cf611a 100644 --- a/src/wasm-lib/kcl/tests/cube_with_error/artifact_commands.snap +++ b/src/wasm-lib/kcl/tests/cube_with_error/artifact_commands.snap @@ -1,7 +1,6 @@ --- source: kcl/src/simulation_tests.rs description: Artifact commands cube_with_error.kcl -snapshot_kind: text --- [ { diff --git a/src/wasm-lib/kcl/tests/flush_batch_on_end/artifact_commands.snap b/src/wasm-lib/kcl/tests/flush_batch_on_end/artifact_commands.snap new file mode 100644 index 000000000..5e0be6b65 --- /dev/null +++ b/src/wasm-lib/kcl/tests/flush_batch_on_end/artifact_commands.snap @@ -0,0 +1,655 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact commands flush_batch_on_end.kcl +--- +[ + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "size": 100.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "plane_set_color", + "plane_id": "[uuid]", + "color": { + "r": 0.7, + "g": 0.28, + "b": 0.28, + "a": 0.4 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 100.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "plane_set_color", + "plane_id": "[uuid]", + "color": { + "r": 0.28, + "g": 0.7, + "b": 0.28, + "a": 0.4 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 100.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "plane_set_color", + "plane_id": "[uuid]", + "color": { + "r": 0.28, + "g": 0.28, + "b": 0.7, + "a": 0.4 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": -1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "size": 100.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 100.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": -1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 100.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "edge_lines_visible", + "hidden": false + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "set_scene_units", + "unit": "mm" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "object_visible", + "object_id": "[uuid]", + "hidden": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "object_visible", + "object_id": "[uuid]", + "hidden": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 33, + 0 + ], + "command": { + "type": "set_scene_units", + "unit": "in" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 199, + 218, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "size": 60.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 282, + 365, + 0 + ], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 282, + 365, + 0 + ], + "command": { + "type": "start_path" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 282, + 365, + 0 + ], + "command": { + "type": "move_path_pen", + "path": "[uuid]", + "to": { + "x": 0.2734375, + "y": 0.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 282, + 365, + 0 + ], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "arc", + "center": { + "x": 0.0, + "y": 0.0 + }, + "radius": 0.2734375, + "start": { + "unit": "degrees", + "value": 0.0 + }, + "end": { + "unit": "degrees", + "value": 360.0 + }, + "relative": false + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 282, + 365, + 0 + ], + "command": { + "type": "close_path", + "path_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 428, + 511, + 0 + ], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 428, + 511, + 0 + ], + "command": { + "type": "start_path" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 428, + 511, + 0 + ], + "command": { + "type": "move_path_pen", + "path": "[uuid]", + "to": { + "x": 0.182, + "y": 0.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 428, + 511, + 0 + ], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "arc", + "center": { + "x": 0.0, + "y": 0.0 + }, + "radius": 0.182, + "start": { + "unit": "degrees", + "value": 0.0 + }, + "end": { + "unit": "degrees", + "value": 360.0 + }, + "relative": false + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 428, + 511, + 0 + ], + "command": { + "type": "close_path", + "path_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 601, + 622, + 0 + ], + "command": { + "type": "solid2d_add_hole", + "object_id": "[uuid]", + "hole_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 601, + 622, + 0 + ], + "command": { + "type": "object_visible", + "object_id": "[uuid]", + "hidden": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 678, + 715, + 0 + ], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 678, + 715, + 0 + ], + "command": { + "type": "extrude", + "target": "[uuid]", + "distance": 1.5, + "faces": null + } + }, + { + "cmdId": "[uuid]", + "range": [ + 678, + 715, + 0 + ], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 678, + 715, + 0 + ], + "command": { + "type": "object_bring_to_front", + "object_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 678, + 715, + 0 + ], + "command": { + "type": "solid3d_get_extrusion_face_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 678, + 715, + 0 + ], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 678, + 715, + 0 + ], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 678, + 715, + 0 + ], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 678, + 715, + 0 + ], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + } +] diff --git a/src/wasm-lib/kcl/tests/flush_batch_on_end/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/flush_batch_on_end/artifact_graph_flowchart.snap new file mode 100644 index 000000000..f14ce9e36 --- /dev/null +++ b/src/wasm-lib/kcl/tests/flush_batch_on_end/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart flush_batch_on_end.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/flush_batch_on_end/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/flush_batch_on_end/artifact_graph_flowchart.snap.md new file mode 100644 index 000000000..09b01049a --- /dev/null +++ b/src/wasm-lib/kcl/tests/flush_batch_on_end/artifact_graph_flowchart.snap.md @@ -0,0 +1,35 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[282, 365, 0]"] + 3["Segment
[282, 365, 0]"] + 4[Solid2d] + end + subgraph path5 [Path] + 5["Path
[428, 511, 0]"] + 6["Segment
[428, 511, 0]"] + 7[Solid2d] + end + 1["Plane
[199, 218, 0]"] + 8["Sweep Extrusion
[678, 715, 0]"] + 9[Wall] + 10["Cap Start"] + 11["Cap End"] + 12["SweepEdge Opposite"] + 13["SweepEdge Adjacent"] + 1 --- 2 + 1 --- 5 + 2 --- 3 + 2 ---- 8 + 2 --- 4 + 3 --- 9 + 3 --- 12 + 3 --- 13 + 5 --- 6 + 5 --- 7 + 8 --- 9 + 8 --- 10 + 8 --- 11 + 8 --- 12 + 8 --- 13 +``` diff --git a/src/wasm-lib/kcl/tests/flush_batch_on_end/ast.snap b/src/wasm-lib/kcl/tests/flush_batch_on_end/ast.snap new file mode 100644 index 000000000..bf6738476 --- /dev/null +++ b/src/wasm-lib/kcl/tests/flush_batch_on_end/ast.snap @@ -0,0 +1,700 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing flush_batch_on_end.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 105, + "id": { + "end": 97, + "name": "innerDiameter", + "start": 84, + "type": "Identifier" + }, + "init": { + "end": 105, + "raw": "0.364", + "start": 100, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.364, + "suffix": "None" + } + }, + "start": 84, + "type": "VariableDeclarator" + }, + "end": 105, + "kind": "const", + "start": 84, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 129, + "id": { + "end": 119, + "name": "outerDiameter", + "start": 106, + "type": "Identifier" + }, + "init": { + "end": 129, + "left": { + "end": 124, + "raw": "35", + "start": 122, + "type": "Literal", + "type": "Literal", + "value": { + "value": 35.0, + "suffix": "None" + } + }, + "operator": "/", + "right": { + "end": 129, + "raw": "64", + "start": 127, + "type": "Literal", + "type": "Literal", + "value": { + "value": 64.0, + "suffix": "None" + } + }, + "start": 122, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 106, + "type": "VariableDeclarator" + }, + "end": 129, + "kind": "const", + "start": 106, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 148, + "id": { + "end": 136, + "name": "length", + "start": 130, + "type": "Identifier" + }, + "init": { + "end": 148, + "left": { + "end": 140, + "raw": "1", + "start": 139, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + }, + "operator": "+", + "right": { + "end": 148, + "left": { + "end": 144, + "raw": "1", + "start": 143, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + }, + "operator": "/", + "right": { + "end": 148, + "raw": "2", + "start": 147, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, + "start": 143, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 139, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 130, + "type": "VariableDeclarator" + }, + "end": 148, + "kind": "const", + "start": 130, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 218, + "id": { + "end": 196, + "name": "sketch000", + "start": 187, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 217, + "raw": "'XY'", + "start": 213, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 212, + "name": "startSketchOn", + "start": 199, + "type": "Identifier" + }, + "end": 218, + "start": 199, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 187, + "type": "VariableDeclarator" + }, + "end": 218, + "kind": "const", + "start": 187, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 365, + "id": { + "end": 279, + "name": "outerProfile", + "start": 267, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 344, + "properties": [ + { + "end": 312, + "key": { + "end": 299, + "name": "center", + "start": 293, + "type": "Identifier" + }, + "start": 293, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "end": 306, + "raw": "0.0", + "start": 303, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "end": 311, + "raw": "0.0", + "start": 308, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + ], + "end": 312, + "start": 302, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "end": 342, + "key": { + "end": 322, + "name": "radius", + "start": 316, + "type": "Identifier" + }, + "start": 316, + "type": "ObjectProperty", + "value": { + "end": 342, + "left": { + "end": 338, + "name": "outerDiameter", + "start": 325, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 342, + "raw": "2", + "start": 341, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, + "start": 325, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + } + ], + "start": 289, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 355, + "name": "sketch000", + "start": 346, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 364, + "start": 357, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "arc000" + } + ], + "callee": { + "end": 288, + "name": "circle", + "start": 282, + "type": "Identifier" + }, + "end": 365, + "start": 282, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 267, + "type": "VariableDeclarator" + }, + "end": 365, + "kind": "const", + "start": 267, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 511, + "id": { + "end": 425, + "name": "innerProfile", + "start": 413, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 490, + "properties": [ + { + "end": 458, + "key": { + "end": 445, + "name": "center", + "start": 439, + "type": "Identifier" + }, + "start": 439, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "end": 452, + "raw": "0.0", + "start": 449, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "end": 457, + "raw": "0.0", + "start": 454, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + ], + "end": 458, + "start": 448, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "end": 488, + "key": { + "end": 468, + "name": "radius", + "start": 462, + "type": "Identifier" + }, + "start": 462, + "type": "ObjectProperty", + "value": { + "end": 488, + "left": { + "end": 484, + "name": "innerDiameter", + "start": 471, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 488, + "raw": "2", + "start": 487, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, + "start": 471, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + } + ], + "start": 435, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 501, + "name": "sketch000", + "start": 492, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 510, + "start": 503, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "arc001" + } + ], + "callee": { + "end": 434, + "name": "circle", + "start": 428, + "type": "Identifier" + }, + "end": 511, + "start": 428, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 413, + "type": "VariableDeclarator" + }, + "end": 511, + "kind": "const", + "start": 413, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 670, + "id": { + "end": 580, + "name": "pipeProfile", + "start": 569, + "type": "Identifier" + }, + "init": { + "body": [ + { + "end": 595, + "name": "outerProfile", + "start": 583, + "type": "Identifier", + "type": "Identifier" + }, + { + "arguments": [ + { + "end": 618, + "name": "innerProfile", + "start": 606, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 621, + "start": 620, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 605, + "name": "hole", + "start": 601, + "type": "Identifier" + }, + "end": 622, + "start": 601, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 670, + "nonCodeMeta": { + "nonCodeNodes": { + "1": [ + { + "end": 670, + "start": 622, + "type": "NonCodeNode", + "value": { + "type": "newLineBlockComment", + "value": "extrude the pipe profile to create the pipe", + "style": "line" + } + } + ] + }, + "startNodes": [] + }, + "start": 583, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 569, + "type": "VariableDeclarator" + }, + "end": 670, + "kind": "const", + "start": 569, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 715, + "id": { + "end": 675, + "name": "pipe", + "start": 671, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "type": "Identifier", + "name": "length" + }, + "arg": { + "end": 714, + "name": "length", + "start": 708, + "type": "Identifier", + "type": "Identifier" + } + } + ], + "callee": { + "end": 685, + "name": "extrude", + "start": 678, + "type": "Identifier" + }, + "end": 715, + "start": 678, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "end": 697, + "name": "pipeProfile", + "start": 686, + "type": "Identifier", + "type": "Identifier" + } + }, + "start": 671, + "type": "VariableDeclarator" + }, + "end": 715, + "kind": "const", + "start": 671, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 716, + "innerAttrs": [ + { + "end": 33, + "name": { + "end": 9, + "name": "settings", + "start": 1, + "type": "Identifier" + }, + "properties": [ + { + "end": 32, + "key": { + "end": 27, + "name": "defaultLengthUnit", + "start": 10, + "type": "Identifier" + }, + "start": 10, + "type": "ObjectProperty", + "value": { + "end": 32, + "name": "in", + "start": 30, + "type": "Identifier", + "type": "Identifier" + } + } + ], + "start": 0, + "type": "Annotation" + } + ], + "nonCodeMeta": { + "nonCodeNodes": { + "2": [ + { + "end": 186, + "start": 148, + "type": "NonCodeNode", + "value": { + "type": "newLineBlockComment", + "value": "create a sketch on the 'XY' plane", + "style": "line" + } + } + ], + "3": [ + { + "end": 266, + "start": 218, + "type": "NonCodeNode", + "value": { + "type": "newLineBlockComment", + "value": "create a profile of the outside of the pipe", + "style": "line" + } + } + ], + "4": [ + { + "end": 412, + "start": 365, + "type": "NonCodeNode", + "value": { + "type": "newLineBlockComment", + "value": "create a profile of the inside of the pipe", + "style": "line" + } + } + ], + "5": [ + { + "end": 568, + "start": 511, + "type": "NonCodeNode", + "value": { + "type": "newLineBlockComment", + "value": "create a profile with holes sketch000Profile000Holes", + "style": "line" + } + } + ] + }, + "startNodes": [ + { + "end": 61, + "start": 34, + "type": "NonCodeNode", + "value": { + "type": "blockComment", + "value": "Set units in inches (in)", + "style": "line" + } + }, + { + "end": 64, + "start": 61, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + }, + { + "end": 83, + "start": 64, + "type": "NonCodeNode", + "value": { + "type": "blockComment", + "value": "Define constants", + "style": "line" + } + } + ] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/flush_batch_on_end/input.kcl b/src/wasm-lib/kcl/tests/flush_batch_on_end/input.kcl new file mode 100644 index 000000000..b7b99f6dd --- /dev/null +++ b/src/wasm-lib/kcl/tests/flush_batch_on_end/input.kcl @@ -0,0 +1,30 @@ +@settings(defaultLengthUnit = in) +// Set units in inches (in) + + +// Define constants +innerDiameter = 0.364 +outerDiameter = 35 / 64 +length = 1 + 1 / 2 + +// create a sketch on the 'XY' plane +sketch000 = startSketchOn('XY') + +// create a profile of the outside of the pipe +outerProfile = circle({ + center = [0.0, 0.0], + radius = outerDiameter / 2 +}, sketch000, $arc000) + +// create a profile of the inside of the pipe +innerProfile = circle({ + center = [0.0, 0.0], + radius = innerDiameter / 2 +}, sketch000, $arc001) + +// create a profile with holes sketch000Profile000Holes +pipeProfile = outerProfile + |> hole(innerProfile, %) + +// extrude the pipe profile to create the pipe +pipe = extrude(pipeProfile, length = length) diff --git a/src/wasm-lib/kcl/tests/flush_batch_on_end/ops.snap b/src/wasm-lib/kcl/tests/flush_batch_on_end/ops.snap new file mode 100644 index 000000000..75d0d8005 --- /dev/null +++ b/src/wasm-lib/kcl/tests/flush_batch_on_end/ops.snap @@ -0,0 +1,105 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed flush_batch_on_end.kcl +--- +[ + { + "labeledArgs": { + "data": { + "value": { + "type": "String", + "value": "XY" + }, + "sourceRange": [ + 213, + 217, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 199, + 218, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "holeSketch": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [ + 606, + 618, + 0 + ] + }, + "sketch": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [ + 620, + 621, + 0 + ] + } + }, + "name": "hole", + "sourceRange": [ + 601, + 622, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "value": { + "type": "Number", + "value": 1.5, + "ty": { + "type": "Unknown" + } + }, + "sourceRange": [ + 708, + 714, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 678, + 715, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [ + 686, + 697, + 0 + ] + } + } +] diff --git a/src/wasm-lib/kcl/tests/flush_batch_on_end/program_memory.snap b/src/wasm-lib/kcl/tests/flush_batch_on_end/program_memory.snap new file mode 100644 index 000000000..4bd2b0bbf --- /dev/null +++ b/src/wasm-lib/kcl/tests/flush_batch_on_end/program_memory.snap @@ -0,0 +1,975 @@ +--- +source: kcl/src/simulation_tests.rs +description: Variables in memory after executing flush_batch_on_end.kcl +--- +{ + "arc000": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "arc000", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 282, + 365, + 0 + ] + }, + "ccw": true, + "center": [ + 0.0, + 0.0 + ], + "from": [ + 0.2734375, + 0.0 + ], + "radius": 0.2734375, + "tag": { + "end": 364, + "start": 357, + "type": "TagDeclarator", + "value": "arc000" + }, + "to": [ + 0.2734375, + 0.0 + ], + "type": "Circle", + "units": { + "type": "Inches" + } + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 282, + 365, + 0 + ], + "tag": { + "end": 364, + "start": 357, + "type": "TagDeclarator", + "value": "arc000" + }, + "type": "extrudeArc" + } + }, + "__meta": [ + { + "sourceRange": [ + 357, + 364, + 0 + ] + } + ] + }, + "arc001": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "arc001", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 428, + 511, + 0 + ] + }, + "ccw": true, + "center": [ + 0.0, + 0.0 + ], + "from": [ + 0.182, + 0.0 + ], + "radius": 0.182, + "tag": { + "end": 510, + "start": 503, + "type": "TagDeclarator", + "value": "arc001" + }, + "to": [ + 0.182, + 0.0 + ], + "type": "Circle", + "units": { + "type": "Inches" + } + }, + "surface": null + }, + "__meta": [ + { + "sourceRange": [ + 503, + 510, + 0 + ] + } + ] + }, + "innerDiameter": { + "type": "Number", + "value": 0.364, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + }, + "__meta": [ + { + "sourceRange": [ + 100, + 105, + 0 + ] + } + ] + }, + "innerProfile": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 428, + 511, + 0 + ] + }, + "ccw": true, + "center": [ + 0.0, + 0.0 + ], + "from": [ + 0.182, + 0.0 + ], + "radius": 0.182, + "tag": { + "end": 510, + "start": 503, + "type": "TagDeclarator", + "value": "arc001" + }, + "to": [ + 0.182, + 0.0 + ], + "type": "Circle", + "units": { + "type": "Inches" + } + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "artifactId": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "units": { + "type": "Inches" + }, + "__meta": [] + }, + "start": { + "from": [ + 0.182, + 0.0 + ], + "to": [ + 0.182, + 0.0 + ], + "units": { + "type": "Inches" + }, + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 428, + 511, + 0 + ] + } + }, + "tags": { + "arc001": { + "type": "TagIdentifier", + "value": "arc001", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 428, + 511, + 0 + ] + }, + "ccw": true, + "center": [ + 0.0, + 0.0 + ], + "from": [ + 0.182, + 0.0 + ], + "radius": 0.182, + "tag": { + "end": 510, + "start": 503, + "type": "TagDeclarator", + "value": "arc001" + }, + "to": [ + 0.182, + 0.0 + ], + "type": "Circle", + "units": { + "type": "Inches" + } + }, + "surface": null + }, + "__meta": [ + { + "sourceRange": [ + 503, + 510, + 0 + ] + } + ] + } + }, + "artifactId": "[uuid]", + "originalId": "[uuid]", + "units": { + "type": "Inches" + }, + "__meta": [ + { + "sourceRange": [ + 428, + 511, + 0 + ] + } + ] + } + }, + "length": { + "type": "Number", + "value": 1.5, + "ty": { + "type": "Unknown" + }, + "__meta": [ + { + "sourceRange": [ + 139, + 140, + 0 + ] + }, + { + "sourceRange": [ + 143, + 144, + 0 + ] + }, + { + "sourceRange": [ + 147, + 148, + 0 + ] + } + ] + }, + "outerDiameter": { + "type": "Number", + "value": 0.546875, + "ty": { + "type": "Unknown" + }, + "__meta": [ + { + "sourceRange": [ + 122, + 124, + 0 + ] + }, + { + "sourceRange": [ + 127, + 129, + 0 + ] + } + ] + }, + "outerProfile": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 282, + 365, + 0 + ] + }, + "ccw": true, + "center": [ + 0.0, + 0.0 + ], + "from": [ + 0.2734, + 0.0 + ], + "radius": 0.2734375, + "tag": { + "end": 364, + "start": 357, + "type": "TagDeclarator", + "value": "arc000" + }, + "to": [ + 0.2734, + 0.0 + ], + "type": "Circle", + "units": { + "type": "Inches" + } + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "artifactId": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "units": { + "type": "Inches" + }, + "__meta": [] + }, + "start": { + "from": [ + 0.2734375, + 0.0 + ], + "to": [ + 0.2734375, + 0.0 + ], + "units": { + "type": "Inches" + }, + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 282, + 365, + 0 + ] + } + }, + "tags": { + "arc000": { + "type": "TagIdentifier", + "value": "arc000", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 282, + 365, + 0 + ] + }, + "ccw": true, + "center": [ + 0.0, + 0.0 + ], + "from": [ + 0.2734375, + 0.0 + ], + "radius": 0.2734375, + "tag": { + "end": 364, + "start": 357, + "type": "TagDeclarator", + "value": "arc000" + }, + "to": [ + 0.2734375, + 0.0 + ], + "type": "Circle", + "units": { + "type": "Inches" + } + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 282, + 365, + 0 + ], + "tag": { + "end": 364, + "start": 357, + "type": "TagDeclarator", + "value": "arc000" + }, + "type": "extrudeArc" + } + }, + "__meta": [ + { + "sourceRange": [ + 357, + 364, + 0 + ] + } + ] + } + }, + "artifactId": "[uuid]", + "originalId": "[uuid]", + "units": { + "type": "Inches" + }, + "__meta": [ + { + "sourceRange": [ + 282, + 365, + 0 + ] + } + ] + } + }, + "pipe": { + "type": "Solid", + "value": { + "type": "Solid", + "id": "[uuid]", + "artifactId": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 282, + 365, + 0 + ], + "tag": { + "end": 364, + "start": 357, + "type": "TagDeclarator", + "value": "arc000" + }, + "type": "extrudeArc" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 282, + 365, + 0 + ] + }, + "ccw": true, + "center": [ + 0.0, + 0.0 + ], + "from": [ + 0.2734, + 0.0 + ], + "radius": 0.2734375, + "tag": { + "end": 364, + "start": 357, + "type": "TagDeclarator", + "value": "arc000" + }, + "to": [ + 0.2734, + 0.0 + ], + "type": "Circle", + "units": { + "type": "Inches" + } + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "artifactId": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "units": { + "type": "Inches" + }, + "__meta": [] + }, + "start": { + "from": [ + 0.2734375, + 0.0 + ], + "to": [ + 0.2734375, + 0.0 + ], + "units": { + "type": "Inches" + }, + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 282, + 365, + 0 + ] + } + }, + "tags": { + "arc000": { + "type": "TagIdentifier", + "value": "arc000", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 282, + 365, + 0 + ] + }, + "ccw": true, + "center": [ + 0.0, + 0.0 + ], + "from": [ + 0.2734375, + 0.0 + ], + "radius": 0.2734375, + "tag": { + "end": 364, + "start": 357, + "type": "TagDeclarator", + "value": "arc000" + }, + "to": [ + 0.2734375, + 0.0 + ], + "type": "Circle", + "units": { + "type": "Inches" + } + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 282, + 365, + 0 + ], + "tag": { + "end": 364, + "start": 357, + "type": "TagDeclarator", + "value": "arc000" + }, + "type": "extrudeArc" + } + }, + "__meta": [ + { + "sourceRange": [ + 357, + 364, + 0 + ] + } + ] + } + }, + "artifactId": "[uuid]", + "originalId": "[uuid]", + "units": { + "type": "Inches" + }, + "__meta": [ + { + "sourceRange": [ + 282, + 365, + 0 + ] + } + ] + }, + "height": 1.5, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "units": { + "type": "Inches" + }, + "__meta": [ + { + "sourceRange": [ + 282, + 365, + 0 + ] + } + ] + } + }, + "pipeProfile": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 282, + 365, + 0 + ] + }, + "ccw": true, + "center": [ + 0.0, + 0.0 + ], + "from": [ + 0.2734, + 0.0 + ], + "radius": 0.2734375, + "tag": { + "end": 364, + "start": 357, + "type": "TagDeclarator", + "value": "arc000" + }, + "to": [ + 0.2734, + 0.0 + ], + "type": "Circle", + "units": { + "type": "Inches" + } + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "artifactId": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "units": { + "type": "Inches" + }, + "__meta": [] + }, + "start": { + "from": [ + 0.2734375, + 0.0 + ], + "to": [ + 0.2734375, + 0.0 + ], + "units": { + "type": "Inches" + }, + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 282, + 365, + 0 + ] + } + }, + "tags": { + "arc000": { + "type": "TagIdentifier", + "value": "arc000", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 282, + 365, + 0 + ] + }, + "ccw": true, + "center": [ + 0.0, + 0.0 + ], + "from": [ + 0.2734375, + 0.0 + ], + "radius": 0.2734375, + "tag": { + "end": 364, + "start": 357, + "type": "TagDeclarator", + "value": "arc000" + }, + "to": [ + 0.2734375, + 0.0 + ], + "type": "Circle", + "units": { + "type": "Inches" + } + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 282, + 365, + 0 + ], + "tag": { + "end": 364, + "start": 357, + "type": "TagDeclarator", + "value": "arc000" + }, + "type": "extrudeArc" + } + }, + "__meta": [ + { + "sourceRange": [ + 357, + 364, + 0 + ] + } + ] + } + }, + "artifactId": "[uuid]", + "originalId": "[uuid]", + "units": { + "type": "Inches" + }, + "__meta": [ + { + "sourceRange": [ + 282, + 365, + 0 + ] + } + ] + } + }, + "sketch000": { + "type": "Plane", + "value": { + "id": "[uuid]", + "artifactId": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "units": { + "type": "Inches" + }, + "__meta": [] + } + } +} diff --git a/src/wasm-lib/kcl/tests/flush_batch_on_end/rendered_model.png b/src/wasm-lib/kcl/tests/flush_batch_on_end/rendered_model.png new file mode 100644 index 0000000000000000000000000000000000000000..79054e0ff77c7c06b25c1cef7b05cf53d573d7ef GIT binary patch literal 82230 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

p!`aSu8oak{#~wR(S!|bVj_ptd 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 literal 0 HcmV?d00001 diff --git a/src/wasm-lib/tests/executor/main.rs b/src/wasm-lib/tests/executor/main.rs index 54b2acbf2..da64eb668 100644 --- a/src/wasm-lib/tests/executor/main.rs +++ b/src/wasm-lib/tests/executor/main.rs @@ -2024,3 +2024,55 @@ async fn kcl_test_error_no_auth_websocket() { .to_string() .contains("Please send the following object over this websocket")); } + +#[tokio::test(flavor = "multi_thread")] +async fn kcl_test_ensure_nothing_left_in_batch_single_file() { + let code = r#"@settings(defaultLengthUnit = in) +// Set units in inches (in) + + +// Define constants +innerDiameter = 0.364 +outerDiameter = 35 / 64 +length = 1 + 1 / 2 + +// create a sketch on the 'XY' plane +sketch000 = startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> line(end = [0, innerDiameter / 2]) +"#; + + let ctx = kcl_lib::ExecutorContext::new_with_default_client(Default::default()) + .await + .unwrap(); + let mut exec_state = kcl_lib::ExecState::new(&ctx.settings); + let program = kcl_lib::Program::parse_no_errs(code).unwrap(); + ctx.run_with_ui_outputs(&program, &mut exec_state).await.unwrap(); + + // Ensure nothing is left in the batch + assert!(ctx.engine.batch().read().await.is_empty()); + assert!(ctx.engine.batch_end().read().await.is_empty()); +} + +#[tokio::test(flavor = "multi_thread")] +async fn kcl_test_ensure_nothing_left_in_batch_multi_file() { + // Get the current working directory. + let current_dir = std::env::current_dir().unwrap(); + // Get the code in the test directory we need. + let path = current_dir.join("kcl/tests/assembly_non_default_units/input.kcl"); + let code = std::fs::read_to_string(&path).unwrap(); + + // Change the current working directory to the test directory. + std::env::set_current_dir(path.parent().unwrap()).unwrap(); + + let ctx = kcl_lib::ExecutorContext::new_with_default_client(Default::default()) + .await + .unwrap(); + let mut exec_state = kcl_lib::ExecState::new(&ctx.settings); + let program = kcl_lib::Program::parse_no_errs(&code).unwrap(); + ctx.run_with_ui_outputs(&program, &mut exec_state).await.unwrap(); + + // Ensure nothing is left in the batch + assert!(ctx.engine.batch().read().await.is_empty()); + assert!(ctx.engine.batch_end().read().await.is_empty()); +}