aboutsummaryrefslogtreecommitdiff
path: root/pw_format/rust/pw_format_test_macros_test.rs
diff options
context:
space:
mode:
Diffstat (limited to 'pw_format/rust/pw_format_test_macros_test.rs')
-rw-r--r--pw_format/rust/pw_format_test_macros_test.rs168
1 files changed, 168 insertions, 0 deletions
diff --git a/pw_format/rust/pw_format_test_macros_test.rs b/pw_format/rust/pw_format_test_macros_test.rs
new file mode 100644
index 000000000..3ae1f546d
--- /dev/null
+++ b/pw_format/rust/pw_format_test_macros_test.rs
@@ -0,0 +1,168 @@
+// Copyright 2023 The Pigweed Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy of
+// the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+
+use pw_format::macros::IntegerDisplayType;
+
+// Used to record calls into the test generator from `generator_test_macro!`.
+#[derive(Debug, PartialEq)]
+pub enum TestGeneratorOps {
+ Finalize,
+ StringFragment(String),
+ IntegerConversion {
+ display_type: IntegerDisplayType,
+ type_width: u8,
+ },
+ StringConversion,
+ CharConversion,
+}
+
+// Used to record calls into the test generator from `printf_generator_test_macro!` and friends.
+#[derive(Debug, PartialEq)]
+pub enum PrintfTestGeneratorOps {
+ Finalize,
+ StringFragment(String),
+ IntegerConversion { ty: String },
+ StringConversion,
+ CharConversion,
+}
+
+#[cfg(test)]
+mod tests {
+ use pw_format::macros::IntegerDisplayType;
+ use pw_format_test_macros::{
+ char_sub_printf_generator_test_macro, generator_test_macro,
+ integer_sub_printf_generator_test_macro, printf_generator_test_macro,
+ string_sub_printf_generator_test_macro,
+ };
+
+ // Create an alias to ourselves so that the proc macro can name our crate.
+ use crate as pw_format_test_macros_test;
+
+ use super::*;
+
+ #[test]
+ fn generate_calls_generator_correctly() {
+ assert_eq!(
+ generator_test_macro!("test %ld %s %c", 5, "test", 'c'),
+ vec![
+ TestGeneratorOps::StringFragment("test ".to_string()),
+ TestGeneratorOps::IntegerConversion {
+ display_type: IntegerDisplayType::Signed,
+ type_width: 32,
+ },
+ TestGeneratorOps::StringFragment(" ".to_string()),
+ TestGeneratorOps::StringConversion,
+ TestGeneratorOps::StringFragment(" ".to_string()),
+ TestGeneratorOps::CharConversion,
+ TestGeneratorOps::Finalize
+ ]
+ );
+ }
+
+ #[test]
+ fn generate_printf_calls_generator_correctly() {
+ assert_eq!(
+ printf_generator_test_macro!("test %ld %s %c", 5, "test", 'c'),
+ (
+ // %ld gets converted to %d because they are equivalent for 32 bit
+ // systems.
+ "test %d %s %c",
+ vec![
+ PrintfTestGeneratorOps::StringFragment("test ".to_string()),
+ PrintfTestGeneratorOps::IntegerConversion {
+ ty: "i32".to_string(),
+ },
+ PrintfTestGeneratorOps::StringFragment(" ".to_string()),
+ PrintfTestGeneratorOps::StringConversion,
+ PrintfTestGeneratorOps::StringFragment(" ".to_string()),
+ PrintfTestGeneratorOps::CharConversion,
+ PrintfTestGeneratorOps::Finalize
+ ]
+ )
+ );
+ }
+
+ // Test that a generator returning an overridden integer conversion specifier
+ // changes that and only that conversion specifier in the format string.
+ #[test]
+ fn generate_printf_substitutes_integer_conversion() {
+ assert_eq!(
+ integer_sub_printf_generator_test_macro!("test %ld %s %c", 5, "test", 'c'),
+ (
+ "test %K %s %c",
+ vec![
+ PrintfTestGeneratorOps::StringFragment("test ".to_string()),
+ PrintfTestGeneratorOps::IntegerConversion {
+ ty: "i32".to_string(),
+ },
+ PrintfTestGeneratorOps::StringFragment(" ".to_string()),
+ PrintfTestGeneratorOps::StringConversion,
+ PrintfTestGeneratorOps::StringFragment(" ".to_string()),
+ PrintfTestGeneratorOps::CharConversion,
+ PrintfTestGeneratorOps::Finalize
+ ]
+ )
+ );
+ }
+
+ // Test that a generator returning an overridden string conversion specifier
+ // changes that and only that conversion specifier in the format string.
+ #[test]
+ fn generate_printf_substitutes_string_conversion() {
+ assert_eq!(
+ string_sub_printf_generator_test_macro!("test %ld %s %c", 5, "test", 'c'),
+ (
+ // %ld gets converted to %d because they are equivalent for 32 bit
+ // systems.
+ "test %d %K %c",
+ vec![
+ PrintfTestGeneratorOps::StringFragment("test ".to_string()),
+ PrintfTestGeneratorOps::IntegerConversion {
+ ty: "i32".to_string(),
+ },
+ PrintfTestGeneratorOps::StringFragment(" ".to_string()),
+ PrintfTestGeneratorOps::StringConversion,
+ PrintfTestGeneratorOps::StringFragment(" ".to_string()),
+ PrintfTestGeneratorOps::CharConversion,
+ PrintfTestGeneratorOps::Finalize
+ ]
+ )
+ );
+ }
+
+ // Test that a generator returning an overridden character conversion specifier
+ // changes that and only that conversion specifier in the format string.
+ #[test]
+ fn generate_printf_substitutes_char_conversion() {
+ assert_eq!(
+ char_sub_printf_generator_test_macro!("test %ld %s %c", 5, "test", 'c'),
+ (
+ // %ld gets converted to %d because they are equivalent for 32 bit
+ // systems.
+ "test %d %s %K",
+ vec![
+ PrintfTestGeneratorOps::StringFragment("test ".to_string()),
+ PrintfTestGeneratorOps::IntegerConversion {
+ ty: "i32".to_string(),
+ },
+ PrintfTestGeneratorOps::StringFragment(" ".to_string()),
+ PrintfTestGeneratorOps::StringConversion,
+ PrintfTestGeneratorOps::StringFragment(" ".to_string()),
+ PrintfTestGeneratorOps::CharConversion,
+ PrintfTestGeneratorOps::Finalize
+ ]
+ )
+ );
+ }
+}