From ca46f9bdf0c9c09ea7583f71a128133202982240 Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Mon, 28 Apr 2025 16:21:57 -0700 Subject: [PATCH 1/3] Add `equals()` function --- dsc_lib/src/functions/equals.rs | 87 +++++++++++++++++++++++++++++++++ dsc_lib/src/functions/mod.rs | 2 + 2 files changed, 89 insertions(+) create mode 100644 dsc_lib/src/functions/equals.rs diff --git a/dsc_lib/src/functions/equals.rs b/dsc_lib/src/functions/equals.rs new file mode 100644 index 000000000..9ebb077da --- /dev/null +++ b/dsc_lib/src/functions/equals.rs @@ -0,0 +1,87 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +use crate::DscError; +use crate::configure::context::Context; +use crate::functions::AcceptedArgKind; +use super::Function; +use serde_json::Value; + +#[derive(Debug, Default)] +pub struct Equals {} + +impl Function for Equals { + fn accepted_arg_types(&self) -> Vec { + vec![AcceptedArgKind::Number, AcceptedArgKind::String, AcceptedArgKind::Array, AcceptedArgKind::Object] + } + + fn min_args(&self) -> usize { + 2 + } + + fn max_args(&self) -> usize { + 2 + } + + fn invoke(&self, args: &[Value], _context: &Context) -> Result { + Ok(Value::Bool(args[0] == args[1])) + } +} + +#[cfg(test)] +mod tests { + use crate::configure::context::Context; + use crate::parser::Statement; + use serde_json::Value; + + #[test] + fn int_equal() { + let mut parser = Statement::new().unwrap(); + let result = parser.parse_and_execute("[equals(1,1)]", &Context::new()).unwrap(); + assert_eq!(result, Value::Bool(true)); + } + + #[test] + fn int_notequal() { + let mut parser = Statement::new().unwrap(); + let result = parser.parse_and_execute("[equals(1,2]", &Context::new()).unwrap(); + assert_eq!(result, Value::Bool(false)); + } + + #[test] + fn string_equal() { + let mut parser = Statement::new().unwrap(); + let result = parser.parse_and_execute("[equals('test','test')]", &Context::new()).unwrap(); + assert_eq!(result, Value::Bool(true)); + } + + #[test] + fn string_notequal() { + let mut parser = Statement::new().unwrap(); + let result = parser.parse_and_execute("[equals('test','TEST')]", &Context::new()).unwrap(); + assert_eq!(result, Value::Bool(false)); + } + + #[test] + fn array_equal() { + let mut parser = Statement::new().unwrap(); + let result = parser.parse_and_execute("[equals([1,2,3],[1,2,3])]", &Context::new()).unwrap(); + assert_eq!(result, Value::Bool(true)); + } + + #[test] + fn array_notequal() { + let mut parser = Statement::new().unwrap(); + let result = parser.parse_and_execute("[equals([1,2,3],[1,2,4])]", &Context::new()).unwrap(); + assert_eq!(result, Value::Bool(false)); + } + + #[test] + fn different_types() { + let mut parser = Statement::new().unwrap(); + let result = parser.parse_and_execute("[equals(1,'string')]", &Context::new()).unwrap(); + assert_eq!(result, Value::Bool(false)); + } + + // TODO: Add tests for objects once `createObject()` is implemented +} diff --git a/dsc_lib/src/functions/mod.rs b/dsc_lib/src/functions/mod.rs index fd30ae19b..e7d5874ee 100644 --- a/dsc_lib/src/functions/mod.rs +++ b/dsc_lib/src/functions/mod.rs @@ -14,6 +14,7 @@ pub mod concat; pub mod create_array; pub mod div; pub mod envvar; +pub mod equals; pub mod int; pub mod max; pub mod min; @@ -73,6 +74,7 @@ impl FunctionDispatcher { functions.insert("createArray".to_string(), Box::new(create_array::CreateArray{})); functions.insert("div".to_string(), Box::new(div::Div{})); functions.insert("envvar".to_string(), Box::new(envvar::Envvar{})); + functions.insert("equals".to_string(), Box::new(equals::Equals{})); functions.insert("int".to_string(), Box::new(int::Int{})); functions.insert("max".to_string(), Box::new(max::Max{})); functions.insert("min".to_string(), Box::new(min::Min{})); From 2643a3f5d6b229ca5f936b6e9a2eb85d34797858 Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Mon, 28 Apr 2025 16:33:59 -0700 Subject: [PATCH 2/3] remove array tests --- dsc_lib/src/functions/equals.rs | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/dsc_lib/src/functions/equals.rs b/dsc_lib/src/functions/equals.rs index 9ebb077da..267f39d1f 100644 --- a/dsc_lib/src/functions/equals.rs +++ b/dsc_lib/src/functions/equals.rs @@ -69,19 +69,6 @@ mod tests { assert_eq!(result, Value::Bool(true)); } - #[test] - fn array_notequal() { - let mut parser = Statement::new().unwrap(); - let result = parser.parse_and_execute("[equals([1,2,3],[1,2,4])]", &Context::new()).unwrap(); - assert_eq!(result, Value::Bool(false)); - } - - #[test] - fn different_types() { - let mut parser = Statement::new().unwrap(); - let result = parser.parse_and_execute("[equals(1,'string')]", &Context::new()).unwrap(); - assert_eq!(result, Value::Bool(false)); - } - + // TODO: Add tests for arrays once `createArray()` is implemented // TODO: Add tests for objects once `createObject()` is implemented } From 56457adcc636193bcec0c532e980e77a0a2e0d82 Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Mon, 28 Apr 2025 16:53:55 -0700 Subject: [PATCH 3/3] fix test --- dsc_lib/src/functions/equals.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dsc_lib/src/functions/equals.rs b/dsc_lib/src/functions/equals.rs index 267f39d1f..7f6748539 100644 --- a/dsc_lib/src/functions/equals.rs +++ b/dsc_lib/src/functions/equals.rs @@ -63,10 +63,10 @@ mod tests { } #[test] - fn array_equal() { + fn different_types() { let mut parser = Statement::new().unwrap(); - let result = parser.parse_and_execute("[equals([1,2,3],[1,2,3])]", &Context::new()).unwrap(); - assert_eq!(result, Value::Bool(true)); + let result = parser.parse_and_execute("[equals(1,'string')]", &Context::new()).unwrap(); + assert_eq!(result, Value::Bool(false)); } // TODO: Add tests for arrays once `createArray()` is implemented