use spacetimedb_codegen::{generate, CodegenOptions, Csharp, Rust, TypeScript}; use spacetimedb_data_structures::map::HashMap; use spacetimedb_schema::def::ModuleDef; use spacetimedb_testing::modules::{CompilationMode, CompiledModule}; use std::sync::OnceLock; fn compiled_module() -> &'static ModuleDef { static COMPILED_MODULE: OnceLock = OnceLock::new(); COMPILED_MODULE .get_or_init(|| CompiledModule::compile("module-test", CompilationMode::Debug).extract_schema_blocking()) } macro_rules! declare_tests { ($($name:ident => $lang:expr,)*) => ($( #[test] fn $name() { let module = compiled_module(); let outfiles = generate(&module, &$lang, &CodegenOptions::default()) .into_iter() .map(|f| (f.filename, f.code)) .collect::>(); let mut settings = insta::Settings::clone_current(); settings.set_sort_maps(true); // Ignore the autogenerated comments with version info, since it changes with every // build. settings.add_filter(r"// This was generated using spacetimedb cli version \d+\.\d+\.\d+ .*", "VERSION_COMMENT"); // Ignore the place where the CLI version is put in the typescript REMOTE_MODULE info, // so it isn't constantly changing. settings.add_filter(r#"cliVersion: "\d+\.\d+\.\d+","#, r#"cliVersion: "X.Y.Z","#); settings.bind(|| { insta::assert_toml_snapshot!(outfiles); }); } )*); } declare_tests! { test_codegen_csharp => Csharp { namespace: "SpacetimeDB" }, test_codegen_typescript => TypeScript, test_codegen_rust => Rust, } #[test] fn test_typescript_table_handles_are_camel_case() { let module = compiled_module(); let index = generate(module, &TypeScript, &CodegenOptions::default()) .into_iter() .find(|file| file.filename == "index.ts") .expect("typescript codegen should emit index.ts") .code; assert!(index.contains("loggedOutPlayer: __table({")); assert!(!index.contains("logged_out_player: __table({")); assert!(index.contains("myPlayer: __table({")); assert!(!index.contains("my_player: __table({")); assert!(index.contains(r#""logged_out_player": "loggedOutPlayer""#)); assert!(index.contains(r#"readonly "logged_out_player": __TablesBase["loggedOutPlayer"];"#)); assert!(index.contains(r#"readonly "logged_out_player": __DbViewBase["loggedOutPlayer"];"#)); assert!(index.contains( r#"/** @deprecated Use `loggedOutPlayer` instead. This alias will be removed in the next major version. */"# )); }