Skip to content

Commit 4f5faba

Browse files
committed
test_set_or_list_elem_type_errors: Test all containers
This introduces a regression test for HashSet/BTreeSet issue fixed a few commits ago.
1 parent c5ed2ba commit 4f5faba

File tree

1 file changed

+35
-31
lines changed

1 file changed

+35
-31
lines changed

scylla-cql/src/deserialize/value_tests.rs

Lines changed: 35 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1989,38 +1989,42 @@ fn test_set_or_list_general_type_errors() {
19891989

19901990
#[test]
19911991
fn test_set_or_list_elem_type_errors() {
1992-
let err = deserialize::<Vec<i64>>(
1993-
&ColumnType::Collection {
1994-
frozen: false,
1995-
typ: CollectionType::List(Box::new(ColumnType::Native(NativeType::Varint))),
1996-
},
1997-
&Bytes::new(),
1998-
)
1999-
.unwrap_err();
2000-
let err = get_typeck_err(&err);
2001-
assert_eq!(err.rust_name, std::any::type_name::<Vec<i64>>());
2002-
assert_eq!(
2003-
err.cql_type,
2004-
ColumnType::Collection {
2005-
frozen: false,
2006-
typ: CollectionType::List(Box::new(ColumnType::Native(NativeType::Varint))),
2007-
},
2008-
);
2009-
let BuiltinTypeCheckErrorKind::SetOrListError(
2010-
SetOrListTypeCheckErrorKind::ElementTypeCheckFailed(ref err),
2011-
) = err.kind
2012-
else {
2013-
panic!("unexpected error kind: {}", err.kind)
1992+
let cql_type = ColumnType::Collection {
1993+
frozen: false,
1994+
typ: CollectionType::Set(Box::new(ColumnType::Native(NativeType::Varint))),
20141995
};
2015-
let err = get_typeck_err_inner(err.0.as_ref());
2016-
assert_eq!(err.rust_name, std::any::type_name::<i64>());
2017-
assert_eq!(err.cql_type, ColumnType::Native(NativeType::Varint));
2018-
assert_matches!(
2019-
err.kind,
2020-
BuiltinTypeCheckErrorKind::MismatchedType {
2021-
expected: &[ColumnType::Native(NativeType::BigInt)]
2022-
}
2023-
);
1996+
// Explicitly passing frame and meta from outside is the only way I know to satisfy
1997+
// the borrow checker. The issue otherwise is that the lifetime (specified by the caller)
1998+
// could be bigger than lifetime of local arguments (frame, column type), and so they can't
1999+
// be borrowed for so long.
2000+
fn verify_elem_typck_err<'meta, 'frame, T: DeserializeValue<'frame, 'meta> + Debug>(
2001+
frame: &'frame Bytes,
2002+
meta: &'meta ColumnType<'meta>,
2003+
) {
2004+
let err = deserialize::<T>(meta, frame).unwrap_err();
2005+
let err = get_typeck_err(&err);
2006+
assert_eq!(err.rust_name, std::any::type_name::<T>());
2007+
assert_eq!(err.cql_type, *meta);
2008+
let BuiltinTypeCheckErrorKind::SetOrListError(
2009+
SetOrListTypeCheckErrorKind::ElementTypeCheckFailed(ref err),
2010+
) = err.kind
2011+
else {
2012+
panic!("unexpected error kind: {}", err.kind)
2013+
};
2014+
let err = get_typeck_err_inner(err.0.as_ref());
2015+
assert_eq!(err.rust_name, std::any::type_name::<i64>());
2016+
assert_eq!(err.cql_type, ColumnType::Native(NativeType::Varint));
2017+
assert_matches!(
2018+
err.kind,
2019+
BuiltinTypeCheckErrorKind::MismatchedType {
2020+
expected: &[ColumnType::Native(NativeType::BigInt)]
2021+
}
2022+
);
2023+
}
2024+
verify_elem_typck_err::<Vec<i64>>(&Bytes::new(), &cql_type);
2025+
verify_elem_typck_err::<BTreeSet<i64>>(&Bytes::new(), &cql_type);
2026+
verify_elem_typck_err::<HashSet<i64>>(&Bytes::new(), &cql_type);
2027+
verify_elem_typck_err::<ListlikeIterator<i64>>(&Bytes::new(), &cql_type);
20242028
}
20252029

20262030
#[test]

0 commit comments

Comments
 (0)