From 7007d4b6dec6c3b235cc57d30e35d8fb3ebc12ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BC=8A=E6=AC=A7?= Date: Wed, 11 Dec 2024 23:30:35 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=85=20Add=20some=20assertions.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/types/tests/basic.rs | 121 +++++++++++++- packages/types/tests/migration.rs | 257 ++++++++++++++++++++++++++---- 2 files changed, 344 insertions(+), 34 deletions(-) diff --git a/packages/types/tests/basic.rs b/packages/types/tests/basic.rs index 68bdc53..8889e73 100644 --- a/packages/types/tests/basic.rs +++ b/packages/types/tests/basic.rs @@ -24,7 +24,7 @@ fn decl_single_version() -> Result<()> { } #[test] -fn decl_single_version_with_suffix() { +fn decl_single_version_with_suffix() -> Result<()> { #[version("1.0.0-rc12")] #[derive(Debug, Clone, PartialEq)] struct Test { @@ -32,10 +32,21 @@ fn decl_single_version_with_suffix() { b: i32, c: i32, } + + assert_eq!( + r#"{"$version":"1.0.0-rc12","a":1,"b":2,"c":3}"#, + serde_json::to_string(&Test { a: 1, b: 2, c: 3 })? + ); + assert_eq!( + serde_json::to_string(&Test { a: 1, b: 2, c: 3 })?, + r#"{"$version":"1.0.0-rc12","a":1,"b":2,"c":3}"#, + ); + + Ok(()) } #[test] -fn decl_old_version() { +fn decl_old_version() -> Result<()> { #[version("0.2")] #[derive(Debug, Clone, PartialEq)] #[migration("0.1" => "0.2")] @@ -44,10 +55,17 @@ fn decl_old_version() { b: i32, c: i32, } + + assert_eq!( + serde_json::from_str::(r#"{"$version":"0.1","a":1,"b":2,"c":3}"#)?, + Test { a: 1, b: 2, c: 3 } + ); + + Ok(()) } #[test] -fn decl_multiple_old_versions() { +fn decl_multiple_old_versions() -> Result<()> { #[version("0.5")] #[derive(Debug, Clone, PartialEq)] #[migration("0.4" => "0.5" { @@ -66,10 +84,58 @@ fn decl_multiple_old_versions() { c: String, d: i32, } + + assert_eq!( + serde_json::from_str::(r#"{"$version":"0.5","a":1,"b":2,"c":"3","d":4}"#)?, + Test { + a: 1, + b: 2, + c: "3".to_string(), + d: 4 + } + ); + assert_eq!( + serde_json::from_str::(r#"{"$version":"0.4","a":1,"b":2,"c":"3"}"#)?, + Test { + a: 1, + b: 2, + c: "3".to_string(), + d: 0 + } + ); + assert_eq!( + serde_json::from_str::(r#"{"$version":"0.3","a":1,"b":2,"c":3}"#)?, + Test { + a: 1, + b: 2, + c: "3".to_string(), + d: 0 + } + ); + assert_eq!( + serde_json::from_str::(r#"{"$version":"0.2","a":1,"b":2}"#)?, + Test { + a: 1, + b: 2, + c: "0".to_string(), + d: 0 + } + ); + assert_eq!( + serde_json::from_str::(r#"{"$version":"0.1","a":1,"b":2}"#)?, + Test { + a: 1, + b: 2, + c: "0".to_string(), + d: 0 + } + ); + + Ok(()) } #[test] -fn decl_version_with_timestamp() { +fn decl_version_with_timestamp() -> Result<()> { #[version("2025-1-1")] #[derive(Debug, Clone, PartialEq)] struct Test { @@ -78,6 +144,15 @@ fn decl_version_with_timestamp() { c: i32, } + assert_eq!( + r#"{"$version":"2025-1-1","a":1,"b":2,"c":3}"#, + serde_json::to_string(&Test { a: 1, b: 2, c: 3 })? + ); + assert_eq!( + serde_json::to_string(&Test { a: 1, b: 2, c: 3 })?, + r#"{"$version":"2025-1-1","a":1,"b":2,"c":3}"#, + ); + #[version("2025-01-01")] #[derive(Debug, Clone, PartialEq)] struct Test2 { @@ -86,6 +161,15 @@ fn decl_version_with_timestamp() { c: i32, } + assert_eq!( + r#"{"$version":"2025-01-01","a":1,"b":2,"c":3}"#, + serde_json::to_string(&Test2 { a: 1, b: 2, c: 3 })? + ); + assert_eq!( + serde_json::to_string(&Test2 { a: 1, b: 2, c: 3 })?, + r#"{"$version":"2025-01-01","a":1,"b":2,"c":3}"#, + ); + #[version("2025-1-1 9:34")] #[derive(Debug, Clone, PartialEq)] struct Test3 { @@ -94,6 +178,15 @@ fn decl_version_with_timestamp() { c: i32, } + assert_eq!( + r#"{"$version":"2025-1-1 9:34","a":1,"b":2,"c":3}"#, + serde_json::to_string(&Test3 { a: 1, b: 2, c: 3 })? + ); + assert_eq!( + serde_json::to_string(&Test3 { a: 1, b: 2, c: 3 })?, + r#"{"$version":"2025-1-1 9:34","a":1,"b":2,"c":3}"#, + ); + #[version("2025-1-01 09:34:12")] #[derive(Debug, Clone, PartialEq)] struct Test4 { @@ -102,6 +195,15 @@ fn decl_version_with_timestamp() { c: i32, } + assert_eq!( + r#"{"$version":"2025-1-01 09:34:12","a":1,"b":2,"c":3}"#, + serde_json::to_string(&Test4 { a: 1, b: 2, c: 3 })? + ); + assert_eq!( + serde_json::to_string(&Test4 { a: 1, b: 2, c: 3 })?, + r#"{"$version":"2025-1-01 09:34:12","a":1,"b":2,"c":3}"#, + ); + #[version("12345678")] #[derive(Debug, Clone, PartialEq)] struct Test5 { @@ -109,4 +211,15 @@ fn decl_version_with_timestamp() { b: i32, c: i32, } + + assert_eq!( + r#"{"$version":"12345678","a":1,"b":2,"c":3}"#, + serde_json::to_string(&Test5 { a: 1, b: 2, c: 3 })? + ); + assert_eq!( + serde_json::to_string(&Test5 { a: 1, b: 2, c: 3 })?, + r#"{"$version":"12345678","a":1,"b":2,"c":3}"#, + ); + + Ok(()) } diff --git a/packages/types/tests/migration.rs b/packages/types/tests/migration.rs index a7a2828..38f690f 100644 --- a/packages/types/tests/migration.rs +++ b/packages/types/tests/migration.rs @@ -1,7 +1,8 @@ +use anyhow::Result; use hifumi::version; #[test] -fn add_field() { +fn add_field() -> Result<()> { #[version("0.2")] #[derive(Debug, Clone, PartialEq)] #[migration("0.1" => "0.2" { @@ -12,10 +13,21 @@ fn add_field() { b: i32, c: i32, } + + assert_eq!( + serde_json::from_str::(r#"{"$version":"0.1","a":1,"b":2}"#)?, + Test { a: 1, b: 2, c: 0 } + ); + assert_eq!( + serde_json::from_str::(r#"{"$version":"0.2","a":1,"b":2,"c":3}"#)?, + Test { a: 1, b: 2, c: 3 } + ); + + Ok(()) } #[test] -fn remove_field() { +fn remove_field() -> Result<()> { #[version("0.2")] #[derive(Debug, Clone, PartialEq)] #[migration("0.1" => "0.2" { @@ -25,10 +37,21 @@ fn remove_field() { a: i32, b: i32, } + + assert_eq!( + serde_json::from_str::(r#"{"$version":"0.1","a":1,"b":2,"c":3}"#)?, + Test { a: 1, b: 2 } + ); + assert_eq!( + serde_json::from_str::(r#"{"$version":"0.2","a":1,"b":2}"#)?, + Test { a: 1, b: 2 } + ); + + Ok(()) } #[test] -fn rename_field() { +fn rename_field() -> Result<()> { #[version("0.2")] #[derive(Debug, Clone, PartialEq)] #[migration("0.1" => "0.2" { @@ -39,10 +62,21 @@ fn rename_field() { b: i32, d: i32, } + + assert_eq!( + serde_json::from_str::(r#"{"$version":"0.1","a":1,"b":2,"c":3}"#)?, + Test { a: 1, b: 2, d: 3 } + ); + assert_eq!( + serde_json::from_str::(r#"{"$version":"0.2","a":1,"b":2,"d":3}"#)?, + Test { a: 1, b: 2, d: 3 } + ); + + Ok(()) } #[test] -fn copy_field() { +fn copy_field() -> Result<()> { #[version("0.2")] #[derive(Debug, Clone, PartialEq)] #[migration("0.1" => "0.2" { @@ -54,10 +88,31 @@ fn copy_field() { c: i32, d: i32, } + + assert_eq!( + serde_json::from_str::(r#"{"$version":"0.1","a":1,"b":2,"c":3}"#)?, + Test { + a: 1, + b: 2, + c: 3, + d: 3 + } + ); + assert_eq!( + serde_json::from_str::(r#"{"$version":"0.2","a":1,"b":2,"c":3,"d":4}"#)?, + Test { + a: 1, + b: 2, + c: 3, + d: 4 + } + ); + + Ok(()) } #[test] -fn add_field_with_default_value() { +fn add_field_with_default_value() -> Result<()> { #[version("0.2")] #[derive(Debug, Clone, PartialEq)] #[migration("0.1" => "0.2" { @@ -68,10 +123,21 @@ fn add_field_with_default_value() { b: i32, c: i32, } + + assert_eq!( + serde_json::from_str::(r#"{"$version":"0.1","a":1,"b":2}"#)?, + Test { a: 1, b: 2, c: 42 } + ); + assert_eq!( + serde_json::from_str::(r#"{"$version":"0.2","a":1,"b":2,"c":3}"#)?, + Test { a: 1, b: 2, c: 3 } + ); + + Ok(()) } #[test] -fn rename_field_with_default_value() { +fn rename_field_with_default_value() -> Result<()> { #[version("0.2")] #[derive(Debug, Clone, PartialEq)] #[migration("0.1" => "0.2" { @@ -82,10 +148,21 @@ fn rename_field_with_default_value() { b: i32, d: i32, } + + assert_eq!( + serde_json::from_str::(r#"{"$version":"0.1","a":1,"b":2,"c":3}"#)?, + Test { a: 1, b: 2, d: 42 } + ); + assert_eq!( + serde_json::from_str::(r#"{"$version":"0.2","a":1,"b":2,"d":3}"#)?, + Test { a: 1, b: 2, d: 3 } + ); + + Ok(()) } #[test] -fn change_field_type() { +fn change_field_type() -> Result<()> { #[version("0.2")] #[derive(Debug, Clone, PartialEq)] #[migration("0.1" => "0.2" { @@ -96,10 +173,29 @@ fn change_field_type() { b: i32, c: String, } + + assert_eq!( + serde_json::from_str::(r#"{"$version":"0.1","a":1,"b":2,"c":3}"#)?, + Test { + a: 1, + b: 2, + c: "3".to_string() + } + ); + assert_eq!( + serde_json::from_str::(r#"{"$version":"0.2","a":1,"b":2,"c":"3"}"#)?, + Test { + a: 1, + b: 2, + c: "3".to_string() + } + ); + + Ok(()) } #[test] -fn change_field_type_and_name() { +fn change_field_type_and_name() -> Result<()> { #[version("0.2")] #[derive(Debug, Clone, PartialEq)] #[migration("0.1" => "0.2" { @@ -110,10 +206,29 @@ fn change_field_type_and_name() { b: i32, d: String, } + + assert_eq!( + serde_json::from_str::(r#"{"$version":"0.1","a":1,"b":2,"c":3}"#)?, + Test { + a: 1, + b: 2, + d: "3".to_string() + } + ); + assert_eq!( + serde_json::from_str::(r#"{"$version":"0.2","a":1,"b":2,"d":"3"}"#)?, + Test { + a: 1, + b: 2, + d: "3".to_string() + } + ); + + Ok(()) } #[test] -fn change_field_type_and_name_with_multiple_target() { +fn change_field_type_and_name_with_multiple_target() -> Result<()> { #[version("0.2")] #[derive(Debug, Clone, PartialEq)] #[migration("0.1" => "0.2" { @@ -126,10 +241,31 @@ fn change_field_type_and_name_with_multiple_target() { e: String, f: f32, } + + assert_eq!( + serde_json::from_str::(r#"{"$version":"0.1","a":1,"b":2,"c":3}"#)?, + Test { + a: 1, + b: 2, + e: "3".to_string(), + f: 3. + } + ); + assert_eq!( + serde_json::from_str::(r#"{"$version":"0.2","a":1,"b":2,"e":"3","f":3.0}"#)?, + Test { + a: 1, + b: 2, + e: "3".to_string(), + f: 3. + } + ); + + Ok(()) } #[test] -fn change_field_type_and_name_with_multiple_source() { +fn change_field_type_and_name_with_multiple_source() -> Result<()> { #[version("0.2")] #[derive(Debug, Clone, PartialEq)] #[migration("0.1" => "0.2" { @@ -139,56 +275,117 @@ fn change_field_type_and_name_with_multiple_source() { a: i32, b: i32, e: String, - f: f32, } + + assert_eq!( + serde_json::from_str::(r#"{"$version":"0.1","a":1,"b":2,"c":3,"d":4}"#)?, + Test { + a: 1, + b: 2, + e: "7".to_string(), + } + ); + assert_eq!( + serde_json::from_str::(r#"{"$version":"0.2","a":1,"b":2,"e":"7"}"#)?, + Test { + a: 1, + b: 2, + e: "7".to_string(), + } + ); + + Ok(()) } #[test] -fn copy_field_with_multiple_target() { +fn copy_field_with_multiple_target() -> Result<()> { #[version("0.2")] #[derive(Debug, Clone, PartialEq)] #[migration("0.1" => "0.2" { - + c => e: String, - + d => f: f32, + + a=> c: String, + + b => d: f32, })] struct Test { - a: i32, - b: i32, + a: String, + b: f32, c: String, d: f32, - e: String, - f: f32, } + + assert_eq!( + serde_json::from_str::(r#"{"$version":"0.1","a":"1","b":2.0}"#)?, + Test { + a: "1".to_string(), + b: 2., + c: "1".to_string(), + d: 2., + } + ); + assert_eq!( + serde_json::from_str::(r#"{"$version":"0.2","a":"1","b":2.0,"c":"1","d":2.0}"#)?, + Test { + a: "1".to_string(), + b: 2., + c: "1".to_string(), + d: 2., + } + ); + + Ok(()) } #[test] -fn copy_field_with_multiple_source() { +fn copy_field_with_multiple_source() -> Result<()> { #[version("0.2")] #[derive(Debug, Clone, PartialEq)] #[migration("0.1" => "0.2" { - + (c: i32, d: i32) => e: String { (c + d).to_string() }, + + (a: i32, b: i32) => c: String { (a + b).to_string() }, })] struct Test { a: i32, b: i32, - c: i32, - d: i32, - e: String, - f: f32, + c: String, } + + assert_eq!( + serde_json::from_str::(r#"{"$version":"0.1","a":1,"b":2}"#)?, + Test { + a: 1, + b: 2, + c: "3".to_string(), + } + ); + assert_eq!( + serde_json::from_str::(r#"{"$version":"0.2","a":1,"b":2,"c":"3"}"#)?, + Test { + a: 1, + b: 2, + c: "3".to_string(), + } + ); + + Ok(()) } #[test] -fn remove_field_with_multiple_source() { +fn remove_field_with_multiple_source() -> Result<()> { #[version("0.2")] #[derive(Debug, Clone, PartialEq)] #[migration("0.1" => "0.2" { - (c: i32, d: i32) => e: String { (c + d).to_string() }, + (a: i32, b: i32) => c: String { (a + b).to_string() }, })] struct Test { - a: i32, - b: i32, - e: String, - f: f32, + c: String, } + + assert_eq!( + serde_json::from_str::(r#"{"$version":"0.1","a":1,"b":2}"#)?, + Test { c: "3".to_string() } + ); + assert_eq!( + serde_json::from_str::(r#"{"$version":"0.2","c":"3"}"#)?, + Test { c: "3".to_string() } + ); + + Ok(()) }