aboutsummaryrefslogtreecommitdiff
path: root/examples/example-unit-test
diff options
context:
space:
mode:
Diffstat (limited to 'examples/example-unit-test')
-rw-r--r--examples/example-unit-test/Cargo.lock76
-rw-r--r--examples/example-unit-test/Cargo.toml7
-rw-r--r--examples/example-unit-test/src/main.rs122
3 files changed, 205 insertions, 0 deletions
diff --git a/examples/example-unit-test/Cargo.lock b/examples/example-unit-test/Cargo.lock
new file mode 100644
index 0000000..712440e
--- /dev/null
+++ b/examples/example-unit-test/Cargo.lock
@@ -0,0 +1,76 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 4
+
+[[package]]
+name = "example-unit-test"
+version = "0.1.0"
+dependencies = [
+ "mingling",
+]
+
+[[package]]
+name = "just_fmt"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5454cda0d57db59778608d7a47bff5b16c6705598265869fb052b657f66cf05e"
+
+[[package]]
+name = "mingling"
+version = "0.1.9"
+dependencies = [
+ "mingling_core",
+ "mingling_macros",
+]
+
+[[package]]
+name = "mingling_core"
+version = "0.1.9"
+dependencies = [
+ "just_fmt",
+]
+
+[[package]]
+name = "mingling_macros"
+version = "0.1.9"
+dependencies = [
+ "just_fmt",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.106"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.117"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
diff --git a/examples/example-unit-test/Cargo.toml b/examples/example-unit-test/Cargo.toml
new file mode 100644
index 0000000..4a82503
--- /dev/null
+++ b/examples/example-unit-test/Cargo.toml
@@ -0,0 +1,7 @@
+[package]
+name = "example-unit-test"
+version = "0.1.0"
+edition = "2024"
+
+[dependencies]
+mingling = { path = "../../mingling" }
diff --git a/examples/example-unit-test/src/main.rs b/examples/example-unit-test/src/main.rs
new file mode 100644
index 0000000..d0e1b90
--- /dev/null
+++ b/examples/example-unit-test/src/main.rs
@@ -0,0 +1,122 @@
+//! Example Unit Test
+//!
+//! > This example shows how to write unit tests for Chain and Renderer in Mingling
+//!
+//! ```bash
+//! cargo test --manifest-path examples/example-unit-test/Cargo.toml
+//! ```
+
+use mingling::prelude::*;
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use mingling::{assert_member_id, assert_render_result};
+
+ // --------- IMPORTANT ---------
+ #[test]
+ fn test_handle_hello() {
+ let hello_without_args = handle_hello(entry!()).into();
+ assert_render_result!(hello_without_args);
+ assert_member_id!(hello_without_args, ThisProgram::ErrorNoNameProvided);
+
+ let hello_with_registered_name = handle_hello(entry!("Alice")).into();
+ assert_render_result!(hello_with_registered_name);
+ assert_member_id!(
+ hello_with_registered_name,
+ ThisProgram::ErrorNameNotAvailable
+ );
+
+ let hello_with_long_name = handle_hello(entry!("It's a VeryLongName")).into();
+ assert_render_result!(hello_with_long_name);
+ assert_member_id!(hello_with_long_name, ThisProgram::ErrorNameTooLong);
+
+ let hello_with_valid_name = handle_hello(entry!("Peter")).into();
+ assert_render_result!(hello_with_valid_name);
+ }
+
+ #[test]
+ fn test_render_result_name() {
+ let r = render_result_name(ResultName::new("Peter".into()));
+ assert_eq!(r, "Hello, Peter!\n")
+ }
+
+ #[test]
+ fn test_render_error_no_name_provided() {
+ let r = render_error_no_name_provided(ErrorNoNameProvided::default());
+ assert_eq!(r, "No name provided\n")
+ }
+
+ #[test]
+ fn test_render_error_name_not_available() {
+ let r = render_error_name_not_available(ErrorNameNotAvailable::default());
+ assert_eq!(r, "Name not available\n")
+ }
+
+ #[test]
+ fn test_render_error_name_too_long() {
+ let r = render_error_name_too_long(ErrorNameTooLong::new(17));
+ assert_eq!(r, "Name too long: 17 > 10\n")
+ }
+ // --------- IMPORTANT ---------
+}
+
+dispatcher!("hello", CMDHello => EntryHello);
+
+pack!(ErrorNoNameProvided = ());
+pack!(ErrorNameTooLong = u16);
+pack!(ErrorNameNotAvailable = ());
+
+pack!(ResultName = String);
+
+static VEC_REGISTERED_NAMES: &[&str] = &["Alice", "Bob", "Charlie", "David", "Eve"];
+
+#[chain]
+fn handle_hello(args: EntryHello) -> Next {
+ let Some(name) = args.inner.first().cloned() else {
+ return ErrorNoNameProvided::default().to_render();
+ };
+
+ if name.len() > 10 {
+ return ErrorNameTooLong::new(name.len() as u16).to_render();
+ }
+
+ if VEC_REGISTERED_NAMES.contains(&name.as_str()) {
+ return ErrorNameNotAvailable::default().to_render();
+ }
+
+ ResultName::new(name).to_render()
+}
+
+#[renderer]
+fn render_result_name(name: ResultName) -> String {
+ r_println!("Hello, {}!", *name);
+}
+
+#[renderer]
+fn render_error_no_name_provided(_: ErrorNoNameProvided) -> String {
+ r_println!("No name provided");
+}
+
+#[renderer]
+fn render_error_name_not_available(_: ErrorNameNotAvailable) -> String {
+ r_println!("Name not available");
+}
+
+#[renderer]
+fn render_error_name_too_long(len: ErrorNameTooLong) -> String {
+ r_println!("Name too long: {} > 10", *len);
+}
+
+#[renderer]
+fn render_dispatcher_not_found(err: DispatcherNotFound) {
+ r_println!("Command not found: \"{}\"", err.inner.join(" "));
+}
+
+gen_program!();
+
+fn main() {
+ let mut program = ThisProgram::new();
+ program.with_dispatcher(CMDHello);
+ program.exec_and_exit();
+}