#![cfg(feature = "json")]
use redis::ErrorKind;
use redis::json::{FphaType, JsonSetOptions, RedisJsonType};
use redis::{ExistenceCheck, TypedCommands};
use redis_test::server::Module;
use redis_test::{REDIS_CE_8_8, REDIS_JSON_8_8, TestContextBuilder, run_test_if_version_supported};
use serde::Serialize;
use std::assert_eq;
use std::collections::HashMap;
use std::f32::consts::PI;
mod support;
use serde_json::json;
const TEST_KEY: &str = "my_json";
#[test]
fn test_module_json_serialize_error() {
let ctx = TestContextBuilder::new().module(Module::Json).build();
let mut con = ctx.connection();
#[derive(Debug, Serialize)]
struct InvalidSerializedStruct {
pub invalid_json: HashMap<Option<bool>, i64>,
}
let mut test_invalid_value: InvalidSerializedStruct = InvalidSerializedStruct {
invalid_json: HashMap::new(),
};
test_invalid_value.invalid_json.insert(None, 2i64);
let set_invalid =
redis::Commands::json_set::<_, _, _, bool>(&mut con, TEST_KEY, "$", &test_invalid_value)
.unwrap_err();
assert_eq!(set_invalid.kind(), ErrorKind::Serialize);
assert_eq!(
set_invalid.to_string(),
String::from("key must be a string")
);
}
#[test]
fn test_module_json_arr_append() {
let ctx = TestContextBuilder::new().module(Module::Json).build();
let mut con = ctx.connection();
let setup = con
.json_set(
TEST_KEY,
"$",
&json!({"a":[1], "nested": {"a": [1, 2]}, "nested2": {"a": 42}}),
)
.unwrap();
assert!(setup);
let result = con.json_arr_append(TEST_KEY, ".a", &4711).unwrap();
assert_eq!(*result, vec![Some(2)]);
let result = con.json_arr_append(TEST_KEY, "$..a", &3).unwrap();
assert_eq!(*result, vec![Some(3), Some(3), None]); }
#[test]
fn test_module_json_arr_index() {
let ctx = TestContextBuilder::new().module(Module::Json).build();
let mut con = ctx.connection();
let setup = con
.json_set(
TEST_KEY,
"$",
&json!({"a":[1, 2, 3, 2], "nested": {"a": [3, 4]}, "nested2": {"a": 42}}),
)
.unwrap();
assert!(setup);
let result = con.json_arr_index(TEST_KEY, ".a", &2).unwrap();
assert_eq!(*result, vec![Some(1)]);
let result = con.json_arr_index(TEST_KEY, "$..a", &2).unwrap();
assert_eq!(*result, vec![Some(1), Some(-1), None]);
}
#[test]
fn test_module_json_arr_index_ss() {
let ctx = TestContextBuilder::new().module(Module::Json).build();
let mut con = ctx.connection();
let setup = con
.json_set(
TEST_KEY,
"$",
&json!({"a":[1, 2, 3, 2], "nested": {"a": "foo"}, "nested2": {"a": 42}}),
)
.unwrap();
assert!(setup);
let result = con.json_arr_index_ss(TEST_KEY, ".a", &2, &2, &4).unwrap();
assert_eq!(*result, vec![Some(3)]);
let result = con.json_arr_index_ss(TEST_KEY, "$..a", &2, &2, &4).unwrap();
assert_eq!(*result, vec![Some(3), None, None]);
}
#[test]
fn test_module_json_arr_insert() {
let ctx = TestContextBuilder::new().module(Module::Json).build();
let mut con = ctx.connection();
let setup = con
.json_set(
TEST_KEY,
"$",
&json!({"a":[1, 2, 3, 2], "nested": {"a": "foo"}, "nested2": {"a": 42}}),
)
.unwrap();
assert!(setup);
let result = con.json_arr_insert(TEST_KEY, ".a", 2, &1).unwrap();
assert_eq!(*result, vec![Some(5)]);
let result = con.json_arr_insert(TEST_KEY, "$..a", 0, &1).unwrap();
assert_eq!(*result, vec![Some(6), None, None]); }
#[test]
fn test_module_json_arr_len() {
let ctx = TestContextBuilder::new().module(Module::Json).build();
let mut con = ctx.connection();
let setup = con
.json_set(
TEST_KEY,
"$",
&json!({"a":[1, 2, 3, 2], "nested": {"a": "foo"}, "nested2": {"a": 42}}),
)
.unwrap();
assert!(setup);
let result = con.json_arr_len(TEST_KEY, ".a").unwrap();
assert_eq!(*result, vec![Some(4)]);
let result = con.json_arr_len(TEST_KEY, "$..a").unwrap();
assert_eq!(*result, vec![Some(4), None, None]);
}
#[test]
fn test_module_json_arr_pop() {
let ctx = TestContextBuilder::new().module(Module::Json).build();
let mut con = ctx.connection();
let setup = con
.json_set(
TEST_KEY,
"$",
&json!({"a":[1, 2, 3, 2], "nested": {"a": "foo"}, "nested2": {"a": 42}}),
)
.unwrap();
assert!(setup);
let result = con.json_arr_pop(TEST_KEY, ".a", -1).unwrap();
assert_eq!(*result, vec![Some("2".to_string())]);
let result = con.json_arr_pop(TEST_KEY, "$..a", -1).unwrap();
assert_eq!(*result, vec![Some("3".to_string()), None, None]); }
#[test]
fn test_module_json_arr_trim() {
let ctx = TestContextBuilder::new().module(Module::Json).build();
let mut con = ctx.connection();
let setup = con
.json_set(
TEST_KEY,
"$",
&json!({"a":[1, 2, 3, 2], "nested": {"a": "foo"}, "nested2": {"a": 42}}),
)
.unwrap();
assert!(setup);
let result = con.json_arr_trim(TEST_KEY, ".a", 1, 2).unwrap();
assert_eq!(*result, vec![Some(2)]);
let result = con.json_arr_trim(TEST_KEY, "$..a", 1, 2).unwrap();
assert_eq!(*result, vec![Some(1), None, None]); }
#[test]
fn test_module_json_clear() {
let ctx = TestContextBuilder::new().module(Module::Json).build();
let mut con = ctx.connection();
let setup = con
.json_set(
TEST_KEY,
"$",
&json!({"a":[1, 2, 3, 2], "nested": {"a": "foo"}, "nested2": {"a": 42}}),
)
.unwrap();
assert!(setup);
let result = con.json_clear(TEST_KEY, ".a").unwrap();
assert_eq!(result, 1);
let result = con.json_clear(TEST_KEY, "$..a").unwrap();
assert_eq!(result, 1); }
#[test]
fn test_module_json_del() {
let ctx = TestContextBuilder::new().module(Module::Json).build();
let mut con = ctx.connection();
let setup = con
.json_set(
TEST_KEY,
"$",
&json!({"a":[1, 2, 3, 2], "nested": {"a": "foo"}, "nested2": {"a": 42}}),
)
.unwrap();
assert!(setup);
let result = con.json_del(TEST_KEY, ".a").unwrap();
assert_eq!(result, 1);
let result = con.json_del(TEST_KEY, "$..a").unwrap();
assert_eq!(result, 2); }
#[test]
fn test_module_json_get() {
let ctx = TestContextBuilder::new().module(Module::Json).build();
let mut con = ctx.connection();
let setup = con
.json_set(
TEST_KEY,
"$",
&json!({"a":[1, 2, 3, 2], "nested": {"a": "foo"}, "nested2": {"a": 42}}),
)
.unwrap();
assert!(setup);
let result = con.json_get(TEST_KEY, ".a").unwrap();
assert_eq!(result, "[1,2,3,2]");
let result = con.json_get(TEST_KEY, "$..a").unwrap();
assert_eq!(result, "[[1,2,3,2],\"foo\",42]");
let paths = [".nested.a", "$..a", ".nested2"];
let result = con.json_get(TEST_KEY, &paths).unwrap();
let parsed_result: serde_json::Value = serde_json::from_str(&result).unwrap();
assert_eq!(
parsed_result,
json!({
".nested.a": ["foo"],
"$..a": [[1, 2, 3, 2], "foo", 42],
".nested2": [{"a": 42}],
})
);
}
#[test]
fn test_module_json_mget() {
let ctx = TestContextBuilder::new().module(Module::Json).build();
let mut con = ctx.connection();
let keys = [
format!("{TEST_KEY}-a"),
format!("{TEST_KEY}-b"),
format!("{TEST_KEY}-c"),
];
let setup = con
.json_mset(&[
(
&keys[0],
"$",
&json!({"a":1, "b": 2, "nested": {"a": 3, "b": null}}),
),
(
&keys[1],
"$",
&json!({"a":4, "b": 5, "nested": {"a": 6, "b": null}}),
),
])
.unwrap();
assert!(setup);
let result = con.json_mget(&keys, ".a").unwrap();
assert_eq!(
result,
vec![Some("1".to_string()), Some("4".to_string()), None]
);
let result = con.json_mget(&keys, "$..a").unwrap();
assert_eq!(
result,
vec![Some("[1,3]".to_string()), Some("[4,6]".to_string()), None]
);
}
#[test]
fn test_module_json_num_incr_by() {
let ctx = TestContextBuilder::new().module(Module::Json).build();
let mut con = ctx.connection();
let setup = con
.json_set(
TEST_KEY,
"$",
&json!({"a": 4711, "nested": {"a": "foo"}, "nested2": {"a": 42}}),
)
.unwrap();
assert!(setup);
if ctx.protocol.supports_resp3() {
let result = con.json_num_incr_by(TEST_KEY, ".a", 42).unwrap();
assert_eq!(*result, vec![Some("4753".to_string())]);
let result = con.json_num_incr_by(TEST_KEY, "$..a", 42).unwrap();
assert_eq!(
*result,
vec![Some("4795".to_string()), None, Some("84".to_string())]
); } else {
let result = con.json_num_incr_by(TEST_KEY, ".a", 42).unwrap();
assert_eq!(*result, vec![Some("4753".to_string())]);
let result = con.json_num_incr_by(TEST_KEY, "$..a", 42).unwrap();
assert_eq!(*result, vec![Some("[4795,null,84]".to_string())]); }
}
#[test]
fn test_module_json_obj_keys() {
let ctx = TestContextBuilder::new().module(Module::Json).build();
let mut con = ctx.connection();
let setup = con
.json_set(
TEST_KEY,
"$",
&json!({"a":[3], "nested": {"a": {"b":2, "c": 1}}}),
)
.unwrap();
assert!(setup);
let result = con.json_obj_keys(TEST_KEY, ".nested.a").unwrap();
assert_eq!(*result, vec![Some(vec!["b".to_string(), "c".to_string()])]);
let result = con.json_obj_keys(TEST_KEY, "$..a").unwrap();
assert_eq!(
*result,
vec![None, Some(vec!["b".to_string(), "c".to_string()])]
);
}
#[test]
fn test_module_json_obj_len() {
let ctx = TestContextBuilder::new().module(Module::Json).build();
let mut con = ctx.connection();
let setup = con
.json_set(
TEST_KEY,
"$",
&json!({"a":{ "foo": 42, "bar": 4711, "nested": {"a": 23}}}),
)
.unwrap();
assert!(setup);
let result = con.json_obj_len(TEST_KEY, ".a").unwrap();
assert_eq!(*result, vec![Some(3)]);
let result = con.json_obj_len(TEST_KEY, "$..a").unwrap();
assert_eq!(*result, vec![Some(3), None]);
}
#[test]
fn test_module_json_set() {
let ctx = TestContextBuilder::new().module(Module::Json).build();
let mut con = ctx.connection();
let result = con
.json_set(
TEST_KEY,
"$",
&json!({"a": 4711, "nested": {"a": "foo"}, "nested2": {"a": 42}}),
)
.unwrap();
assert!(result);
}
#[test]
fn test_module_json_str_append() {
let ctx = TestContextBuilder::new().module(Module::Json).build();
let mut con = ctx.connection();
let setup = con
.json_set(
TEST_KEY,
"$",
&json!({"a": 4711, "nested": {"a": "foo"}, "nested2": {"a": 42}}),
)
.unwrap();
assert!(setup);
let result = con
.json_str_append(TEST_KEY, ".nested.a", "\"bar\"")
.unwrap();
assert_eq!(*result, vec![Some(6)]);
let result = con.json_str_append(TEST_KEY, "$..a", "\"baz\"").unwrap();
assert_eq!(*result, vec![None, Some(9), None]); }
#[test]
fn test_module_json_str_len() {
let ctx = TestContextBuilder::new().module(Module::Json).build();
let mut con = ctx.connection();
let setup = con
.json_set(
TEST_KEY,
"$",
&json!({"a": 4711, "nested": {"a": "foo"}, "nested2": {"a": 42}}),
)
.unwrap();
assert!(setup);
let result = con.json_str_len(TEST_KEY, ".nested.a").unwrap();
assert_eq!(*result, vec![Some(3)]);
let result = con.json_str_len(TEST_KEY, "$..a").unwrap();
assert_eq!(*result, vec![None, Some(3), None]); }
#[test]
fn test_module_json_toggle() {
let ctx = TestContextBuilder::new().module(Module::Json).build();
let mut con = ctx.connection();
let setup = con
.json_set(
TEST_KEY,
"$",
&json!({"a": true, "nested": {"a": "foo"}, "nested2": {"a": true}}),
)
.unwrap();
assert!(setup);
let result = con.json_toggle(TEST_KEY, ".a").unwrap();
assert_eq!(*result, vec![Some(false)]);
let result = con.json_toggle(TEST_KEY, "$..a").unwrap();
assert_eq!(*result, vec![Some(true), None, Some(false)]); }
#[test]
fn test_module_json_type() {
let ctx = TestContextBuilder::new().module(Module::Json).build();
let mut con = ctx.connection();
let setup = con
.json_set(
TEST_KEY,
"$",
&json!({"a": true, "nested": {"a": "foo"}, "nested2": {"a": 4711}}),
)
.unwrap();
assert!(setup);
let result = con.json_type(TEST_KEY, ".a").unwrap();
assert_eq!(*result, vec![RedisJsonType::Boolean]);
let result = con.json_type(TEST_KEY, "$..a").unwrap();
assert_eq!(
*result,
vec![
RedisJsonType::Boolean,
RedisJsonType::String,
RedisJsonType::Integer,
]
);
}
#[test]
fn test_module_json_set_options_json_value() {
let ctx = TestContextBuilder::new().modules(&[Module::Json]).build();
let mut con = ctx.connection();
let set_result = con
.json_set_options(
TEST_KEY,
"$",
&json!({"a": 1, "b": [2, 3]}),
&JsonSetOptions::default(),
)
.unwrap();
assert!(set_result);
let get_result = con.json_get(TEST_KEY, "$").unwrap();
assert_eq!(&get_result, r#"[{"a":1,"b":[2,3]}]"#);
}
#[test]
fn test_module_json_set_options_nx_xx() {
let ctx = TestContextBuilder::new().modules(&[Module::Json]).build();
let mut con = ctx.connection();
let opts_xx = JsonSetOptions::default().conditional_set(ExistenceCheck::XX);
let opts_nx = JsonSetOptions::default().conditional_set(ExistenceCheck::NX);
let set_result = con
.json_set_options(TEST_KEY, "$", &json!({"v": 0}), &opts_xx)
.unwrap();
assert!(!set_result);
let key_exists = con.exists(TEST_KEY).unwrap();
assert!(!key_exists);
let set_result = con
.json_set_options(TEST_KEY, "$", &json!({"v": 1}), &opts_nx)
.unwrap();
assert!(set_result);
let key_exists = con.exists(TEST_KEY).unwrap();
assert!(key_exists);
let set_result = con
.json_set_options(TEST_KEY, "$", &json!({"v": 999}), &opts_nx)
.unwrap();
assert!(!set_result);
let get_result = con.json_get(TEST_KEY, "$.v").unwrap();
assert_eq!(&get_result, "[1]");
let set_result = con
.json_set_options(TEST_KEY, "$", &json!({"v": 2}), &opts_xx)
.unwrap();
assert!(set_result);
let get_result = con.json_get(TEST_KEY, "$.v").unwrap();
assert_eq!(&get_result, "[2]");
}
#[rstest::rstest]
#[case::fp32(FphaType::Fp32)]
#[case::fp64(FphaType::Fp64)]
#[case::bf16(FphaType::Bf16)]
#[case::fp16(FphaType::Fp16)]
fn test_module_json_set_fpha_roundtrip(#[case] fpha_type: FphaType) {
let ctx =
run_test_if_version_supported!([&[REDIS_CE_8_8][..], &[REDIS_JSON_8_8]], &[Module::Json]);
let mut con = ctx.connection();
let set_result = con
.json_set_options(
TEST_KEY,
"$",
&[1.0_f32, 2.0, -3.5],
&JsonSetOptions::default().fpha(fpha_type),
)
.unwrap();
assert!(set_result);
let get_result = con.json_get(TEST_KEY, "$").unwrap();
assert_eq!(&get_result, "[[1.0,2.0,-3.5]]");
}
#[test]
fn test_module_json_set_fpha_empty_payload() {
let ctx =
run_test_if_version_supported!([&[REDIS_CE_8_8][..], &[REDIS_JSON_8_8]], &[Module::Json]);
let mut con = ctx.connection();
let set_result = con
.json_set_options(
TEST_KEY,
"$",
&[0_f32; 0],
&JsonSetOptions::default().fpha(FphaType::Fp32),
)
.unwrap();
assert!(set_result);
let get_result = con.json_get(TEST_KEY, "$").unwrap();
assert_eq!(&get_result, "[[]]");
}
#[test]
fn test_module_json_set_fpha_with_existence_check() {
let ctx =
run_test_if_version_supported!([&[REDIS_CE_8_8][..], &[REDIS_JSON_8_8]], &[Module::Json]);
let mut con = ctx.connection();
let opts_xx = JsonSetOptions::default()
.fpha(FphaType::Fp32)
.conditional_set(ExistenceCheck::XX);
let set_result = con
.json_set_options(TEST_KEY, "$", &[1.0_f32], &opts_xx)
.unwrap();
assert!(!set_result);
let key_exists: bool = con.exists(TEST_KEY).unwrap();
assert!(!key_exists);
let opts_nx = JsonSetOptions::default()
.fpha(FphaType::Fp32)
.conditional_set(ExistenceCheck::NX);
let set_result = con
.json_set_options(TEST_KEY, "$", &[1.0_f32, 2.0, 3.0], &opts_nx)
.unwrap();
assert!(set_result);
let get_result = con.json_get(TEST_KEY, "$").unwrap();
assert_eq!(&get_result, "[[1.0,2.0,3.0]]");
}
#[test]
fn test_module_json_set_fpha_fp16_overflow() {
let ctx =
run_test_if_version_supported!([&[REDIS_CE_8_8][..], &[REDIS_JSON_8_8]], &[Module::Json]);
let mut con = ctx.connection();
let error = con
.json_set_options(
TEST_KEY,
"$",
&[70000.0_f32],
&JsonSetOptions::default().fpha(FphaType::Fp16),
)
.unwrap_err();
assert!(
error.to_string().contains("out of range for F16"),
"unexpected error message: {error}",
);
let key_exists = con.exists(TEST_KEY).unwrap();
assert!(!key_exists);
}
#[test]
fn test_module_json_set_fpha_fp16_partial_overflow() {
let ctx =
run_test_if_version_supported!([&[REDIS_CE_8_8][..], &[REDIS_JSON_8_8]], &[Module::Json]);
let mut con = ctx.connection();
con.json_set_options(
TEST_KEY,
"$",
&[1.0_f32, 2.0, 70000.0, 3.0],
&JsonSetOptions::default().fpha(FphaType::Fp16),
)
.unwrap_err();
let key_exists = con.exists(TEST_KEY).unwrap();
assert!(!key_exists);
}
#[test]
fn test_module_json_set_fpha_fp16_max_boundary() {
let ctx =
run_test_if_version_supported!([&[REDIS_CE_8_8][..], &[REDIS_JSON_8_8]], &[Module::Json]);
let mut con = ctx.connection();
let set_result = con
.json_set_options(
TEST_KEY,
"$",
&[65504.0_f32],
&JsonSetOptions::default().fpha(FphaType::Fp16),
)
.unwrap();
assert!(set_result);
let get_result = con.json_get(TEST_KEY, "$").unwrap();
assert_eq!(&get_result, "[[65504.0]]");
}
#[test]
fn test_module_json_set_fpha_fp32_max_boundary() {
let ctx =
run_test_if_version_supported!([&[REDIS_CE_8_8][..], &[REDIS_JSON_8_8]], &[Module::Json]);
let mut con = ctx.connection();
let set_result = con
.json_set_options(
TEST_KEY,
"$",
&[3.4e38_f32],
&JsonSetOptions::default().fpha(FphaType::Fp32),
)
.unwrap();
assert!(set_result);
let get_result = con.json_get(TEST_KEY, "$").unwrap();
assert_eq!(&get_result, "[[3.4e38]]");
}
#[test]
fn test_module_json_set_fpha_bf16_above_fp16_range() {
let ctx =
run_test_if_version_supported!([&[REDIS_CE_8_8][..], &[REDIS_JSON_8_8]], &[Module::Json]);
let mut con = ctx.connection();
let set_result = con
.json_set_options(
TEST_KEY,
"$",
&[1048576.0_f32],
&JsonSetOptions::default().fpha(FphaType::Bf16),
)
.unwrap();
assert!(set_result);
let get_result = con.json_get(TEST_KEY, "$").unwrap();
assert_eq!(&get_result, "[[1048576.0]]");
}
#[test]
fn test_module_json_set_fpha_fp32_scientific_notation() {
let ctx =
run_test_if_version_supported!([&[REDIS_CE_8_8][..], &[REDIS_JSON_8_8]], &[Module::Json]);
let mut con = ctx.connection();
let set_result = con
.json_set_options(
TEST_KEY,
"$",
&[1e-10_f32, 6.022e23_f32],
&JsonSetOptions::default().fpha(FphaType::Fp32),
)
.unwrap();
assert!(set_result);
let get_result = con.json_get(TEST_KEY, "$").unwrap();
assert_eq!(&get_result, "[[1e-10,6.022e23]]");
}
#[test]
fn test_module_json_set_fpha_bf16_truncation() {
let ctx =
run_test_if_version_supported!([&[REDIS_CE_8_8][..], &[REDIS_JSON_8_8]], &[Module::Json]);
let mut con = ctx.connection();
let set_result = con
.json_set_options(
TEST_KEY,
"$",
&[100.7_f32, PI],
&JsonSetOptions::default().fpha(FphaType::Bf16),
)
.unwrap();
assert!(set_result);
let get_result = con.json_get(TEST_KEY, "$").unwrap();
assert_eq!(&get_result, "[[100.5,3.14]]");
}
#[test]
fn test_module_json_set_fpha_fp16_truncation() {
let ctx =
run_test_if_version_supported!([&[REDIS_CE_8_8][..], &[REDIS_JSON_8_8]], &[Module::Json]);
let mut con = ctx.connection();
let set_result = con
.json_set_options(
TEST_KEY,
"$",
&[1.0009766_f32, PI],
&JsonSetOptions::default().fpha(FphaType::Fp16),
)
.unwrap();
assert!(set_result);
let get_result = con.json_get(TEST_KEY, "$").unwrap();
assert_eq!(&get_result, "[[1.001,3.14]]");
}
#[test]
fn test_module_json_set_fpha_matrix() {
let ctx =
run_test_if_version_supported!([&[REDIS_CE_8_8][..], &[REDIS_JSON_8_8]], &[Module::Json]);
let mut con = ctx.connection();
let matrix: &[&[f32]] = &[&[1.0, 100.7], &[PI, 4.0]];
let set_result = con
.json_set_options(
TEST_KEY,
"$",
&matrix,
&JsonSetOptions::default().fpha(FphaType::Bf16),
)
.unwrap();
assert!(set_result);
let get_result = con.json_get(TEST_KEY, "$").unwrap();
assert_eq!(&get_result, "[[[1.0,100.5],[3.14,4.0]]]");
}
#[test]
fn test_module_json_set_fpha_object_with_array_fields() {
let ctx =
run_test_if_version_supported!([&[REDIS_CE_8_8][..], &[REDIS_JSON_8_8]], &[Module::Json]);
let mut con = ctx.connection();
let set_result = con
.json_set_options(
TEST_KEY,
"$",
&serde_json::json!({"weights": [1.0, 2.0, 3.0], "bias": [0.5, 0.25]}),
&JsonSetOptions::default().fpha(FphaType::Fp16),
)
.unwrap();
assert!(set_result);
let get_result = con.json_get(TEST_KEY, "$").unwrap();
assert_eq!(
&get_result,
r#"[{"bias":[0.5,0.25],"weights":[1.0,2.0,3.0]}]"#,
);
}
#[test]
fn test_module_json_set_fpha_nested_partial_overflow() {
let ctx =
run_test_if_version_supported!([&[REDIS_CE_8_8][..], &[REDIS_JSON_8_8]], &[Module::Json]);
let mut con = ctx.connection();
let matrix: &[&[f32]] = &[&[1.0, 2.0], &[70000.0, 3.0]];
con.json_set_options(
TEST_KEY,
"$",
&matrix,
&JsonSetOptions::default().fpha(FphaType::Fp16),
)
.unwrap_err();
let key_exists = con.exists(TEST_KEY).unwrap();
assert!(!key_exists);
}
#[test]
fn test_module_json_set_fpha_scalar() {
let ctx =
run_test_if_version_supported!([&[REDIS_CE_8_8][..], &[REDIS_JSON_8_8]], &[Module::Json]);
let mut con = ctx.connection();
let set_result = con
.json_set_options(
TEST_KEY,
"$",
&1.5_f32,
&JsonSetOptions::default().fpha(FphaType::Fp32),
)
.unwrap();
assert!(set_result);
let get_result = con.json_get(TEST_KEY, "$").unwrap();
assert_eq!(&get_result, "[1.5]");
}