From cd679f4be3d4e4dba9c5f261691646ff5ff60d7b Mon Sep 17 00:00:00 2001 From: Jonathan Tran Date: Wed, 19 Feb 2025 00:11:11 -0500 Subject: [PATCH] Fix units not getting set properly with whole module imports (#5418) * Add test for whole modules with non-default units * Update output files since adding test * Fix to not drop batched commands due to isolated mode * Update output after fix * Update other sim test outputs --- src/wasm-lib/kcl/src/engine/conn.rs | 31 +- src/wasm-lib/kcl/src/engine/conn_wasm.rs | 38 +- src/wasm-lib/kcl/src/engine/mod.rs | 10 + src/wasm-lib/kcl/src/execution/exec_ast.rs | 3 +- src/wasm-lib/kcl/src/simulation_tests.rs | 22 + .../artifact_commands.snap | 556 ++++++++++++++++++ .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 21 + .../tests/assembly_non_default_units/ast.snap | 143 +++++ .../assembly_non_default_units/globals.kcl | 3 + .../assembly_non_default_units/input.kcl | 10 + .../tests/assembly_non_default_units/ops.snap | 5 + .../assembly_non_default_units/other1.kcl | 8 + .../assembly_non_default_units/other2.kcl | 6 + .../program_memory.snap | 64 ++ .../rendered_model.png | Bin 0 -> 37735 bytes .../artifact_commands.snap | 300 ---------- .../import_side_effect/artifact_commands.snap | 119 ---- 18 files changed, 857 insertions(+), 488 deletions(-) create mode 100644 src/wasm-lib/kcl/tests/assembly_non_default_units/artifact_commands.snap create mode 100644 src/wasm-lib/kcl/tests/assembly_non_default_units/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/assembly_non_default_units/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/assembly_non_default_units/ast.snap create mode 100644 src/wasm-lib/kcl/tests/assembly_non_default_units/globals.kcl create mode 100644 src/wasm-lib/kcl/tests/assembly_non_default_units/input.kcl create mode 100644 src/wasm-lib/kcl/tests/assembly_non_default_units/ops.snap create mode 100644 src/wasm-lib/kcl/tests/assembly_non_default_units/other1.kcl create mode 100644 src/wasm-lib/kcl/tests/assembly_non_default_units/other2.kcl create mode 100644 src/wasm-lib/kcl/tests/assembly_non_default_units/program_memory.snap create mode 100644 src/wasm-lib/kcl/tests/assembly_non_default_units/rendered_model.png diff --git a/src/wasm-lib/kcl/src/engine/conn.rs b/src/wasm-lib/kcl/src/engine/conn.rs index 25eaca2f9..ea7f06785 100644 --- a/src/wasm-lib/kcl/src/engine/conn.rs +++ b/src/wasm-lib/kcl/src/engine/conn.rs @@ -13,7 +13,7 @@ use kcmc::{ }, ModelingCmd, }; -use kittycad_modeling_cmds::{self as kcmc, ok_response::OkModelingCmdResponse, websocket::ModelingBatch}; +use kittycad_modeling_cmds::{self as kcmc}; use tokio::sync::{mpsc, oneshot, RwLock}; use tokio_tungstenite::tungstenite::Message as WsMsg; use uuid::Uuid; @@ -415,35 +415,6 @@ impl EngineManager for EngineConnection { cmd: WebSocketRequest, _id_to_source_range: HashMap, ) -> Result { - // In isolated mode, we don't send the command to the engine. - if self.execution_kind().await.is_isolated() { - return match &cmd { - WebSocketRequest::ModelingCmdBatchReq(ModelingBatch { requests, .. }) => { - let mut responses = HashMap::with_capacity(requests.len()); - for request in requests { - responses.insert( - request.cmd_id, - BatchResponse::Success { - response: OkModelingCmdResponse::Empty {}, - }, - ); - } - Ok(WebSocketResponse::Success(SuccessWebSocketResponse { - request_id: Some(id), - resp: OkWebSocketResponseData::ModelingBatch { responses }, - success: true, - })) - } - _ => Ok(WebSocketResponse::Success(SuccessWebSocketResponse { - request_id: Some(id), - resp: OkWebSocketResponseData::Modeling { - modeling_response: OkModelingCmdResponse::Empty {}, - }, - success: true, - })), - }; - } - let (tx, rx) = oneshot::channel(); // Send the request to the engine, via the actor. diff --git a/src/wasm-lib/kcl/src/engine/conn_wasm.rs b/src/wasm-lib/kcl/src/engine/conn_wasm.rs index 02a0fc8e9..266adfece 100644 --- a/src/wasm-lib/kcl/src/engine/conn_wasm.rs +++ b/src/wasm-lib/kcl/src/engine/conn_wasm.rs @@ -4,19 +4,12 @@ use std::{collections::HashMap, sync::Arc}; use anyhow::Result; use indexmap::IndexMap; -use kcmc::{ - ok_response::OkModelingCmdResponse, - websocket::{ - BatchResponse, ModelingBatch, OkWebSocketResponseData, SuccessWebSocketResponse, WebSocketRequest, - WebSocketResponse, - }, -}; +use kcmc::websocket::{WebSocketRequest, WebSocketResponse}; use kittycad_modeling_cmds as kcmc; use tokio::sync::RwLock; use uuid::Uuid; use wasm_bindgen::prelude::*; -use crate::engine::EngineManager; use crate::{ engine::ExecutionKind, errors::{KclError, KclErrorDetails}, @@ -82,35 +75,6 @@ impl EngineConnection { cmd: WebSocketRequest, id_to_source_range: HashMap, ) -> Result { - // In isolated mode, we don't send the command to the engine. - if self.execution_kind().await.is_isolated() { - return match &cmd { - WebSocketRequest::ModelingCmdBatchReq(ModelingBatch { requests, .. }) => { - let mut responses = HashMap::with_capacity(requests.len()); - for request in requests { - responses.insert( - request.cmd_id, - BatchResponse::Success { - response: OkModelingCmdResponse::Empty {}, - }, - ); - } - Ok(WebSocketResponse::Success(SuccessWebSocketResponse { - request_id: Some(id), - resp: OkWebSocketResponseData::ModelingBatch { responses }, - success: true, - })) - } - _ => Ok(WebSocketResponse::Success(SuccessWebSocketResponse { - request_id: Some(id), - resp: OkWebSocketResponseData::Modeling { - modeling_response: OkModelingCmdResponse::Empty {}, - }, - success: true, - })), - }; - } - let source_range_str = serde_json::to_string(&source_range).map_err(|e| { KclError::Engine(KclErrorDetails { message: format!("Failed to serialize source range: {:?}", e), diff --git a/src/wasm-lib/kcl/src/engine/mod.rs b/src/wasm-lib/kcl/src/engine/mod.rs index efa4f0762..2964a2a79 100644 --- a/src/wasm-lib/kcl/src/engine/mod.rs +++ b/src/wasm-lib/kcl/src/engine/mod.rs @@ -227,6 +227,11 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { source_range: SourceRange, cmd: &ModelingCmd, ) -> Result<(), crate::errors::KclError> { + // In isolated mode, we don't send the command to the engine. + if self.execution_kind().await.is_isolated() { + return Ok(()); + } + let req = WebSocketRequest::ModelingCmdReq(ModelingCmdReq { cmd: cmd.clone(), cmd_id: id.into(), @@ -247,6 +252,11 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { source_range: SourceRange, cmd: &ModelingCmd, ) -> Result<(), crate::errors::KclError> { + // In isolated mode, we don't send the command to the engine. + if self.execution_kind().await.is_isolated() { + return Ok(()); + } + let req = WebSocketRequest::ModelingCmdReq(ModelingCmdReq { cmd: cmd.clone(), cmd_id: id.into(), diff --git a/src/wasm-lib/kcl/src/execution/exec_ast.rs b/src/wasm-lib/kcl/src/execution/exec_ast.rs index 861f566c9..2451dadb0 100644 --- a/src/wasm-lib/kcl/src/execution/exec_ast.rs +++ b/src/wasm-lib/kcl/src/execution/exec_ast.rs @@ -1720,13 +1720,12 @@ impl JsonSchema for FunctionParam<'_> { #[cfg(test)] mod test { + use super::*; use crate::{ execution::{memory::ProgramMemory, parse_execute}, parsing::ast::types::{DefaultParamVal, Identifier, Parameter}, }; - use super::*; - #[test] fn test_assign_args_to_params() { // Set up a little framework for this test. diff --git a/src/wasm-lib/kcl/src/simulation_tests.rs b/src/wasm-lib/kcl/src/simulation_tests.rs index 06b5ad818..9df7944f6 100644 --- a/src/wasm-lib/kcl/src/simulation_tests.rs +++ b/src/wasm-lib/kcl/src/simulation_tests.rs @@ -949,6 +949,28 @@ mod import_foreign { super::execute(TEST_NAME, false).await } } +mod assembly_non_default_units { + const TEST_NAME: &str = "assembly_non_default_units"; + + /// 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 + } +} + mod array_elem_push_fail { const TEST_NAME: &str = "array_elem_push_fail"; diff --git a/src/wasm-lib/kcl/tests/assembly_non_default_units/artifact_commands.snap b/src/wasm-lib/kcl/tests/assembly_non_default_units/artifact_commands.snap new file mode 100644 index 000000000..193bd827f --- /dev/null +++ b/src/wasm-lib/kcl/tests/assembly_non_default_units/artifact_commands.snap @@ -0,0 +1,556 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact commands assembly_non_default_units.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": [ + 0, + 33, + 1 + ], + "command": { + "type": "set_scene_units", + "unit": "in" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 172, + 191, + 1 + ], + "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": 60.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 197, + 239, + 1 + ], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 197, + 239, + 1 + ], + "command": { + "type": "start_path" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 197, + 239, + 1 + ], + "command": { + "type": "move_path_pen", + "path": "[uuid]", + "to": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 197, + 239, + 1 + ], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "arc", + "center": { + "x": 0.0, + "y": 0.0 + }, + "radius": 1.0, + "start": { + "unit": "degrees", + "value": 0.0 + }, + "end": { + "unit": "degrees", + "value": 360.0 + }, + "relative": false + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 197, + 239, + 1 + ], + "command": { + "type": "close_path", + "path_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 33, + 2 + ], + "command": { + "type": "set_scene_units", + "unit": "in" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 89, + 108, + 2 + ], + "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": 60.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 114, + 156, + 2 + ], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 114, + 156, + 2 + ], + "command": { + "type": "start_path" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 114, + 156, + 2 + ], + "command": { + "type": "move_path_pen", + "path": "[uuid]", + "to": { + "x": 1.0, + "y": 2.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 114, + 156, + 2 + ], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "arc", + "center": { + "x": 0.0, + "y": 2.0 + }, + "radius": 1.0, + "start": { + "unit": "degrees", + "value": 0.0 + }, + "end": { + "unit": "degrees", + "value": 360.0 + }, + "relative": false + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 114, + 156, + 2 + ], + "command": { + "type": "close_path", + "path_id": "[uuid]" + } + } +] diff --git a/src/wasm-lib/kcl/tests/assembly_non_default_units/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/assembly_non_default_units/artifact_graph_flowchart.snap new file mode 100644 index 000000000..e73d7ca95 --- /dev/null +++ b/src/wasm-lib/kcl/tests/assembly_non_default_units/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart assembly_non_default_units.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/assembly_non_default_units/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/assembly_non_default_units/artifact_graph_flowchart.snap.md new file mode 100644 index 000000000..510f3b091 --- /dev/null +++ b/src/wasm-lib/kcl/tests/assembly_non_default_units/artifact_graph_flowchart.snap.md @@ -0,0 +1,21 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[197, 239, 1]"] + 3["Segment
[197, 239, 1]"] + 4[Solid2d] + end + subgraph path6 [Path] + 6["Path
[114, 156, 2]"] + 7["Segment
[114, 156, 2]"] + 8[Solid2d] + end + 1["Plane
[172, 191, 1]"] + 5["Plane
[89, 108, 2]"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 5 --- 6 + 6 --- 7 + 6 --- 8 +``` diff --git a/src/wasm-lib/kcl/tests/assembly_non_default_units/ast.snap b/src/wasm-lib/kcl/tests/assembly_non_default_units/ast.snap new file mode 100644 index 000000000..ab39fa8fe --- /dev/null +++ b/src/wasm-lib/kcl/tests/assembly_non_default_units/ast.snap @@ -0,0 +1,143 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing assembly_non_default_units.kcl +--- +{ + "Ok": { + "body": [ + { + "end": 172, + "path": { + "type": "Kcl", + "filename": "other1.kcl" + }, + "selector": { + "type": "None", + "alias": null + }, + "start": 153, + "type": "ImportStatement", + "type": "ImportStatement" + }, + { + "end": 192, + "path": { + "type": "Kcl", + "filename": "other2.kcl" + }, + "selector": { + "type": "None", + "alias": null + }, + "start": 173, + "type": "ImportStatement", + "type": "ImportStatement" + }, + { + "end": 200, + "expression": { + "end": 200, + "name": "other1", + "start": 194, + "type": "Identifier", + "type": "Identifier" + }, + "start": 194, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 207, + "expression": { + "end": 207, + "name": "other2", + "start": 201, + "type": "Identifier", + "type": "Identifier" + }, + "start": 201, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 208, + "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": { + "1": [ + { + "end": 194, + "start": 192, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [ + { + "end": 36, + "start": 33, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + }, + { + "end": 87, + "start": 36, + "type": "NonCodeNode", + "value": { + "type": "blockComment", + "value": "Use a default unit that isn't the default of mm.", + "style": "line" + } + }, + { + "end": 152, + "start": 88, + "type": "NonCodeNode", + "value": { + "type": "blockComment", + "value": "This should look like two circles barely touching each other.", + "style": "line" + } + } + ] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/assembly_non_default_units/globals.kcl b/src/wasm-lib/kcl/tests/assembly_non_default_units/globals.kcl new file mode 100644 index 000000000..ff6cb9c25 --- /dev/null +++ b/src/wasm-lib/kcl/tests/assembly_non_default_units/globals.kcl @@ -0,0 +1,3 @@ +@settings(defaultLengthUnit = in) + +export radius = 1 diff --git a/src/wasm-lib/kcl/tests/assembly_non_default_units/input.kcl b/src/wasm-lib/kcl/tests/assembly_non_default_units/input.kcl new file mode 100644 index 000000000..d999ad9d8 --- /dev/null +++ b/src/wasm-lib/kcl/tests/assembly_non_default_units/input.kcl @@ -0,0 +1,10 @@ +@settings(defaultLengthUnit = in) + + +// Use a default unit that isn't the default of mm. +// This should look like two circles barely touching each other. +import "other1.kcl" +import "other2.kcl" + +other1 +other2 diff --git a/src/wasm-lib/kcl/tests/assembly_non_default_units/ops.snap b/src/wasm-lib/kcl/tests/assembly_non_default_units/ops.snap new file mode 100644 index 000000000..05db3b267 --- /dev/null +++ b/src/wasm-lib/kcl/tests/assembly_non_default_units/ops.snap @@ -0,0 +1,5 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed assembly_non_default_units.kcl +--- +[] diff --git a/src/wasm-lib/kcl/tests/assembly_non_default_units/other1.kcl b/src/wasm-lib/kcl/tests/assembly_non_default_units/other1.kcl new file mode 100644 index 000000000..d05a54965 --- /dev/null +++ b/src/wasm-lib/kcl/tests/assembly_non_default_units/other1.kcl @@ -0,0 +1,8 @@ +@settings(defaultLengthUnit = in) + +// This is not used, but it triggers the problem. +import radius from "globals.kcl" + +// Use the same units as in the main importing file. +startSketchOn('XZ') + |> circle({ center = [0, 0], radius = 1 }, %) diff --git a/src/wasm-lib/kcl/tests/assembly_non_default_units/other2.kcl b/src/wasm-lib/kcl/tests/assembly_non_default_units/other2.kcl new file mode 100644 index 000000000..139063e02 --- /dev/null +++ b/src/wasm-lib/kcl/tests/assembly_non_default_units/other2.kcl @@ -0,0 +1,6 @@ +@settings(defaultLengthUnit = in) + + +// Use the same units as in the main importing file. +startSketchOn('XZ') + |> circle({ center = [0, 2], radius = 1 }, %) diff --git a/src/wasm-lib/kcl/tests/assembly_non_default_units/program_memory.snap b/src/wasm-lib/kcl/tests/assembly_non_default_units/program_memory.snap new file mode 100644 index 000000000..487751a97 --- /dev/null +++ b/src/wasm-lib/kcl/tests/assembly_non_default_units/program_memory.snap @@ -0,0 +1,64 @@ +--- +source: kcl/src/simulation_tests.rs +description: Variables in memory after executing assembly_non_default_units.kcl +--- +{ + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "ty": { + "type": "Unknown" + }, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "ty": { + "type": "Unknown" + }, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "ty": { + "type": "Unknown" + }, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Unknown" + }, + "__meta": [] + }, + "other1": { + "type": "Module", + "value": 1, + "__meta": [ + { + "sourceRange": [ + 153, + 172, + 0 + ] + } + ] + }, + "other2": { + "type": "Module", + "value": 2, + "__meta": [ + { + "sourceRange": [ + 173, + 192, + 0 + ] + } + ] + } +} diff --git a/src/wasm-lib/kcl/tests/assembly_non_default_units/rendered_model.png b/src/wasm-lib/kcl/tests/assembly_non_default_units/rendered_model.png new file mode 100644 index 0000000000000000000000000000000000000000..18a99df832b97c5b900502aa5db0fa364723c06d GIT binary patch literal 37735 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