diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#FFI.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#FFI.verified.cs index e6df8c9e52a..8ae73ee287e 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#FFI.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#FFI.verified.cs @@ -3584,7 +3584,7 @@ public static void Main() var value = new SpacetimeDB.BSATN.F32(); __memoryStream.Position = 0; __memoryStream.SetLength(0); - value.Write(__writer, 2); + value.Write(__writer, 2F); var array = __memoryStream.ToArray(); SpacetimeDB.Internal.Module.RegisterTableDefaultValue( "TestDefaultFieldValues", diff --git a/crates/bindings-csharp/Runtime/Attrs.cs b/crates/bindings-csharp/Runtime/Attrs.cs index 38b3c45edd9..3865f925a2a 100644 --- a/crates/bindings-csharp/Runtime/Attrs.cs +++ b/crates/bindings-csharp/Runtime/Attrs.cs @@ -172,6 +172,10 @@ public string Value { return value.ToString()?.ToLower()!; } + if (value is float f) + { + return $"{f.ToString("R", System.Globalization.CultureInfo.InvariantCulture)}F"; + } var str = value.ToString(); if (value is string) { diff --git a/crates/bindings-macro/src/table.rs b/crates/bindings-macro/src/table.rs index 1cbba4c5ca1..f25e044358c 100644 --- a/crates/bindings-macro/src/table.rs +++ b/crates/bindings-macro/src/table.rs @@ -1026,10 +1026,14 @@ pub(crate) fn table_impl(mut args: TableArgs, item: &syn::DeriveInput) -> syn::R let col_defaults: Vec = columns.iter().filter_map(|col| { if let Some(val) = &col.default_value { let col_id = col.index; + let ty = &col.ty; Some(quote! { spacetimedb::table::ColumnDefault { col_id: #col_id, - value: #val.serialize(spacetimedb::sats::algebraic_value::ser::ValueSerializer).expect("default value serialization failed"), + value: { + let value: #ty = #val; + value.serialize(spacetimedb::sats::algebraic_value::ser::ValueSerializer).expect("default value serialization failed") + }, }, }) } else { diff --git a/crates/bindings/tests/defaults.rs b/crates/bindings/tests/defaults.rs new file mode 100644 index 00000000000..0b1ea46c07e --- /dev/null +++ b/crates/bindings/tests/defaults.rs @@ -0,0 +1,23 @@ +use spacetimedb::sats::{F32, F64}; +use spacetimedb::table::TableInternal; +use spacetimedb::AlgebraicValue; + +#[spacetimedb::table(accessor = defaults)] +pub struct Defaults { + pub id: u32, + #[default(32.5)] + pub f32_value: f32, + #[default(64.25)] + pub f64_value: f64, +} + +#[test] +fn float_defaults_use_the_column_type() { + let defaults = defaults__TableHandle::get_default_col_values(); + + assert_eq!(defaults.len(), 2); + assert_eq!(defaults[0].col_id, 1); + assert_eq!(defaults[0].value, AlgebraicValue::F32(F32::from(32.5))); + assert_eq!(defaults[1].col_id, 2); + assert_eq!(defaults[1].value, AlgebraicValue::F64(F64::from(64.25))); +} diff --git a/crates/smoketests/tests/smoketests/column_defaults.rs b/crates/smoketests/tests/smoketests/column_defaults.rs index fb4bcb6d2e2..83af4e28afa 100644 --- a/crates/smoketests/tests/smoketests/column_defaults.rs +++ b/crates/smoketests/tests/smoketests/column_defaults.rs @@ -5,41 +5,17 @@ use spacetimedb_smoketests::{ const EXPECTED_DEFAULTS: &[(&str, &str)] = &[ ("bool_value", "true"), ("u8_value", "8"), - // TODO: uncomment this once negative defaults are fixed in Rust - // https://github.com/clockworklabs/SpacetimeDB/issues/5622 - //("i8_value", "-8"), + ("i8_value", "-8"), ("u16_value", "16"), - // TODO: uncomment this once negative defaults are fixed in Rust - // https://github.com/clockworklabs/SpacetimeDB/issues/5622 - //("i16_value", "-16"), + ("i16_value", "-16"), ("u32_value", "32"), - // TODO: uncomment this once negative defaults are fixed in Rust - // https://github.com/clockworklabs/SpacetimeDB/issues/5622 - //("i32_value", "-32"), - - // TODO: uncomment once u64s are fixed. - // https://github.com/clockworklabs/SpacetimeDB/issues/5623 - //("u64_value", "64"), - - // TODO: uncomment this once negative defaults are fixed in Rust - // https://github.com/clockworklabs/SpacetimeDB/issues/5622 - //("i64_value", "-64"), - - // TODO: uncomment once floats are fixed in C# and f32s are fixed in Rust - // https://github.com/clockworklabs/SpacetimeDB/issues/5624 - // https://github.com/clockworklabs/SpacetimeDB/issues/5627 - //("f32_positive_value", "32.5"), - - // TODO: uncomment once floats are fixed in C#, f32s are fixed in Rust, and negative defaults are fixed in Rust - // https://github.com/clockworklabs/SpacetimeDB/issues/5624 - // https://github.com/clockworklabs/SpacetimeDB/issues/5627 - // https://github.com/clockworklabs/SpacetimeDB/issues/5622 - //("f32_negative_value", "-32.5"), + ("i32_value", "-32"), + ("u64_value", "64"), + ("i64_value", "-64"), + ("f32_positive_value", "32.5"), + ("f32_negative_value", "-32.5"), ("f64_positive_value", "64.25"), - // TODO: uncomment once negative defaults are fixed in Rust - // https://github.com/clockworklabs/SpacetimeDB/issues/5622 - //("f64_negative_value", "-64.25"), - + ("f64_negative_value", "-64.25"), // TODO: uncomment this once string default values are fixed in Rust //("string_value", r#""default string""#), ]; @@ -134,30 +110,30 @@ pub struct DefaultsTestTable { pub id: u32, #[default(true)] pub bool_value: bool, -// #[default(-8)] -// pub i8_value: i8, + #[default(-8)] + pub i8_value: i8, #[default(8)] pub u8_value: u8, -// #[default(-16)] -// pub i16_value: i16, + #[default(-16)] + pub i16_value: i16, #[default(16)] pub u16_value: u16, -// #[default(-32)] -// pub i32_value: i32, + #[default(-32)] + pub i32_value: i32, #[default(32)] pub u32_value: u32, -// #[default(-64)] -// pub i64_value: i64, -// #[default(64)] -// pub u64_value: u64, + #[default(-64)] + pub i64_value: i64, + #[default(64)] + pub u64_value: u64, #[default(32.5)] pub f32_positive_value: f32, -// #[default(-32.5)] -// pub f32_negative_value: f32, + #[default(-32.5)] + pub f32_negative_value: f32, #[default(64.25)] pub f64_positive_value: f64, -// #[default(-64.25)] -// pub f64_negative_value: f64, + #[default(-64.25)] + pub f64_negative_value: f64, // #[default("default string")] // pub string_value: String, } @@ -232,8 +208,8 @@ public static partial class Module [Default(32U)] public uint u32_value; [Default(-64L)] public long i64_value; [Default(64UL)] public ulong u64_value; - //[Default(32.5f)] public float f32_positive_value; - //[Default(-32.5f)] public float f32_negative_value; + [Default(32.5f)] public float f32_positive_value; + [Default(-32.5f)] public float f32_negative_value; [Default(64.25)] public double f64_positive_value; [Default(-64.25)] public double f64_negative_value; [Default("default string")] public string string_value;