#[cfg(test)] mod test_examples_show { #[tokio::test(flavor = "multi_thread")] async fn test_mock_example_show0() { let tokens = crate::token::lexer("This is another code block.\nyes sirrr.\nshow").unwrap(); let parser = crate::parser::Parser::new(tokens); let program = parser.ast().unwrap(); let ctx = crate::executor::ExecutorContext { engine: std::sync::Arc::new(Box::new( crate::engine::conn_mock::EngineConnection::new() .await .unwrap(), )), fs: std::sync::Arc::new(crate::fs::FileManager::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()), settings: Default::default(), is_mock: true, }; ctx.run(&program, None).await.unwrap(); } #[tokio::test(flavor = "multi_thread", worker_threads = 5)] async fn serial_test_example_show0() { let user_agent = concat!(env!("CARGO_PKG_NAME"), ".rs/", env!("CARGO_PKG_VERSION"),); let http_client = reqwest::Client::builder() .user_agent(user_agent) .timeout(std::time::Duration::from_secs(600)) .connect_timeout(std::time::Duration::from_secs(60)); let ws_client = reqwest::Client::builder() .user_agent(user_agent) .timeout(std::time::Duration::from_secs(600)) .connect_timeout(std::time::Duration::from_secs(60)) .connection_verbose(true) .tcp_keepalive(std::time::Duration::from_secs(600)) .http1_only(); let token = std::env::var("KITTYCAD_API_TOKEN").expect("KITTYCAD_API_TOKEN not set"); let mut client = kittycad::Client::new_from_reqwest(token, http_client, ws_client); if let Ok(addr) = std::env::var("LOCAL_ENGINE_ADDR") { client.set_base_url(addr); } let tokens = crate::token::lexer("This is another code block.\nyes sirrr.\nshow").unwrap(); let parser = crate::parser::Parser::new(tokens); let program = parser.ast().unwrap(); let ctx = crate::executor::ExecutorContext::new(&client, Default::default()) .await .unwrap(); ctx.run(&program, None).await.unwrap(); let results = program.lint_all().unwrap(); if !results.is_empty() { panic!("Linting failed: {:?}", results); } ctx.engine .send_modeling_cmd( uuid::Uuid::new_v4(), crate::executor::SourceRange::default(), kittycad::types::ModelingCmd::ZoomToFit { object_ids: Default::default(), padding: 0.1, }, ) .await .unwrap(); let resp = ctx .engine .send_modeling_cmd( uuid::Uuid::new_v4(), crate::executor::SourceRange::default(), kittycad::types::ModelingCmd::TakeSnapshot { format: kittycad::types::ImageFormat::Png, }, ) .await .unwrap(); let output_file = std::env::temp_dir().join(format!("kcl_output_{}.png", uuid::Uuid::new_v4())); if let kittycad::types::OkWebSocketResponseData::Modeling { modeling_response: kittycad::types::OkModelingCmdResponse::TakeSnapshot { data }, } = &resp { std::fs::write(&output_file, &data.contents.0).unwrap(); } else { panic!("Unexpected response from engine: {:?}", resp); } let actual = image::io::Reader::open(output_file) .unwrap() .decode() .unwrap(); twenty_twenty::assert_image( &format!("tests/outputs/{}.png", "serial_test_example_show0"), &actual, 0.99, ); } #[tokio::test(flavor = "multi_thread")] async fn test_mock_example_show1() { let tokens = crate::token::lexer("This is code.\nIt does other shit.\nshow").unwrap(); let parser = crate::parser::Parser::new(tokens); let program = parser.ast().unwrap(); let ctx = crate::executor::ExecutorContext { engine: std::sync::Arc::new(Box::new( crate::engine::conn_mock::EngineConnection::new() .await .unwrap(), )), fs: std::sync::Arc::new(crate::fs::FileManager::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()), settings: Default::default(), is_mock: true, }; ctx.run(&program, None).await.unwrap(); } #[tokio::test(flavor = "multi_thread", worker_threads = 5)] async fn serial_test_example_show1() { let user_agent = concat!(env!("CARGO_PKG_NAME"), ".rs/", env!("CARGO_PKG_VERSION"),); let http_client = reqwest::Client::builder() .user_agent(user_agent) .timeout(std::time::Duration::from_secs(600)) .connect_timeout(std::time::Duration::from_secs(60)); let ws_client = reqwest::Client::builder() .user_agent(user_agent) .timeout(std::time::Duration::from_secs(600)) .connect_timeout(std::time::Duration::from_secs(60)) .connection_verbose(true) .tcp_keepalive(std::time::Duration::from_secs(600)) .http1_only(); let token = std::env::var("KITTYCAD_API_TOKEN").expect("KITTYCAD_API_TOKEN not set"); let mut client = kittycad::Client::new_from_reqwest(token, http_client, ws_client); if let Ok(addr) = std::env::var("LOCAL_ENGINE_ADDR") { client.set_base_url(addr); } let tokens = crate::token::lexer("This is code.\nIt does other shit.\nshow").unwrap(); let parser = crate::parser::Parser::new(tokens); let program = parser.ast().unwrap(); let ctx = crate::executor::ExecutorContext::new(&client, Default::default()) .await .unwrap(); ctx.run(&program, None).await.unwrap(); let results = program.lint_all().unwrap(); if !results.is_empty() { panic!("Linting failed: {:?}", results); } ctx.engine .send_modeling_cmd( uuid::Uuid::new_v4(), crate::executor::SourceRange::default(), kittycad::types::ModelingCmd::ZoomToFit { object_ids: Default::default(), padding: 0.1, }, ) .await .unwrap(); let resp = ctx .engine .send_modeling_cmd( uuid::Uuid::new_v4(), crate::executor::SourceRange::default(), kittycad::types::ModelingCmd::TakeSnapshot { format: kittycad::types::ImageFormat::Png, }, ) .await .unwrap(); let output_file = std::env::temp_dir().join(format!("kcl_output_{}.png", uuid::Uuid::new_v4())); if let kittycad::types::OkWebSocketResponseData::Modeling { modeling_response: kittycad::types::OkModelingCmdResponse::TakeSnapshot { data }, } = &resp { std::fs::write(&output_file, &data.contents.0).unwrap(); } else { panic!("Unexpected response from engine: {:?}", resp); } let actual = image::io::Reader::open(output_file) .unwrap() .decode() .unwrap(); twenty_twenty::assert_image( &format!("tests/outputs/{}.png", "serial_test_example_show1"), &actual, 0.99, ); } } #[allow(non_camel_case_types, missing_docs)] #[doc = "Std lib function: show\nThis is some function.\nIt does shit."] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, schemars :: JsonSchema, ts_rs :: TS)] #[ts(export)] pub(crate) struct Show {} #[allow(non_upper_case_globals, missing_docs)] #[doc = "Std lib function: show\nThis is some function.\nIt does shit."] pub(crate) const Show: Show = Show {}; fn boxed_show( args: crate::std::Args, ) -> std::pin::Pin< Box< dyn std::future::Future< Output = anyhow::Result, > + Send, >, > { Box::pin(show(args)) } impl crate::docs::StdLibFn for Show { fn name(&self) -> String { "show".to_string() } fn summary(&self) -> String { "This is some function.".to_string() } fn description(&self) -> String { "It does shit.".to_string() } fn tags(&self) -> Vec { vec![] } fn args(&self) -> Vec { let mut settings = schemars::gen::SchemaSettings::openapi3(); settings.inline_subschemas = true; let mut generator = schemars::gen::SchemaGenerator::new(settings); vec![crate::docs::StdLibFnArg { name: "args".to_string(), type_: "[number]".to_string(), schema: <[f64; 2usize]>::json_schema(&mut generator), required: true, }] } fn return_value(&self) -> Option { let mut settings = schemars::gen::SchemaSettings::openapi3(); settings.inline_subschemas = true; let mut generator = schemars::gen::SchemaGenerator::new(settings); Some(crate::docs::StdLibFnArg { name: "".to_string(), type_: "number".to_string(), schema: ::json_schema(&mut generator), required: true, }) } fn unpublished(&self) -> bool { false } fn deprecated(&self) -> bool { false } fn examples(&self) -> Vec { let code_blocks = vec![ "This is another code block.\nyes sirrr.\nshow", "This is code.\nIt does other shit.\nshow", ]; code_blocks .iter() .map(|cb| { let tokens = crate::token::lexer(cb).unwrap(); let parser = crate::parser::Parser::new(tokens); let program = parser.ast().unwrap(); let mut options: crate::ast::types::FormatOptions = Default::default(); options.insert_final_newline = false; program.recast(&options, 0) }) .collect::>() } fn std_lib_fn(&self) -> crate::std::StdFn { boxed_show } fn clone_box(&self) -> Box { Box::new(self.clone()) } } #[doc = r" This is some function."] #[doc = r" It does shit."] #[doc = r""] #[doc = r" This is code."] #[doc = r" It does other shit."] #[doc = r" show"] #[doc = r""] #[doc = r" ```"] #[doc = r" This is another code block."] #[doc = r" yes sirrr."] #[doc = r" show"] #[doc = r" ```"] fn inner_show(#[doc = r" The args to do shit to."] args: [f64; 2]) -> Result> { args }