#![allow(dead_code)]
use std::marker::PhantomData;
use struct_reflection::StructReflection;
use struct_reflection::StructReflectionHelper;
#[derive(StructReflection)]
struct BasicTupleStruct(
i32, String, bool, );
#[derive(StructReflection)]
struct GenericTupleStruct<T>(
T, usize, bool, );
#[derive(StructReflection)]
struct MultiGenericTupleStruct<T, U>(
T, U, String, );
#[derive(StructReflection)]
struct OuterTupleStruct(
String, BasicTupleStruct, );
#[derive(StructReflection)]
struct ArrayTupleStruct(
[i32; 5], [String; 2], );
#[derive(StructReflection)]
struct NestedArrayTupleStruct(
[[i32; 3]; 2], [[String; 2]; 2], String, );
#[derive(StructReflection)]
struct GenericArrayTupleStruct<T>(
[T; 4], [[T; 3]; 2], i32, );
#[derive(StructReflection)]
struct MixedArrayTupleStruct<T>(
[T; 3], [[i32; 2]; 3], [[i32; 2]; 4], PhantomData<T>, );
#[derive(StructReflection)]
struct MultiGenericArrayTupleStruct<T, U>(
[T; 3], [U; 2], String, );
#[derive(StructReflection)]
struct NestedMultiGenericTupleStruct<T, U>(
[[T; 2]; 2], [[U; 3]; 1], u32, );
#[derive(StructReflection)]
struct ComplexMultiGenericTupleStruct<T, U, V>(
[T; 2], [U; 3], [(T, U); 2], PhantomData<(T, U, V)>, );
#[derive(StructReflection)]
struct OptionalFieldsTuple(
u64, String, Option<i32>, Option<bool>, );
#[derive(StructReflection)]
struct NestedOptionalTuple(
u64, Option<BasicTupleStruct>, );
#[derive(StructReflection)]
struct OptionalGenericTuple<T>(
u64, Option<T>, Option<[T; 2]>, );
#[derive(StructReflection)]
struct NestedArrayOfTupleStructs([[BasicTupleStruct; 3]; 2], String);
#[derive(StructReflection)]
#[allow(dead_code)]
struct NestedArrayOfGenericTupleStructs<T>([[GenericTupleStruct<T>; 2]; 2], String);
#[test]
fn test_basic_tuple_struct() {
let names = BasicTupleStruct::struct_reflection();
assert_eq!(names.unwrap(), vec!["0", "1", "2"]);
}
#[test]
fn test_generic_tuple_struct() {
let names = GenericTupleStruct::<i32>::struct_reflection();
assert_eq!(names.unwrap(), vec!["0", "1", "2"]);
}
#[test]
fn test_multi_generic_tuple_struct() {
let names = MultiGenericTupleStruct::<i32, String>::struct_reflection();
assert_eq!(names.unwrap(), vec!["0", "1", "2"]);
}
#[test]
fn test_outer_tuple_struct() {
let names = OuterTupleStruct::struct_reflection();
assert_eq!(names.unwrap(), vec!["0", "1__0", "1__1", "1__2"]);
}
#[test]
fn test_array_tuple_struct() {
let names = ArrayTupleStruct::struct_reflection();
assert_eq!(
names.unwrap(),
vec!["0__0", "0__1", "0__2", "0__3", "0__4", "1__0", "1__1"]
);
}
#[test]
fn test_nested_array_tuple_struct() {
let names = NestedArrayTupleStruct::struct_reflection();
assert_eq!(
names.unwrap(),
vec![
"0__0__0", "0__0__1", "0__0__2", "0__1__0", "0__1__1", "0__1__2", "1__0__0", "1__0__1",
"1__1__0", "1__1__1", "2"
]
);
}
#[test]
fn test_generic_array_tuple_struct() {
let names = GenericArrayTupleStruct::<i32>::struct_reflection();
assert_eq!(
names.unwrap(),
vec![
"0__0", "0__1", "0__2", "0__3", "1__0__0", "1__0__1", "1__0__2", "1__1__0", "1__1__1",
"1__1__2", "2"
]
);
}
#[test]
fn test_mixed_array_tuple_struct() {
let names = MixedArrayTupleStruct::<String>::struct_reflection();
assert_eq!(
names.unwrap(),
vec![
"0__0", "0__1", "0__2", "1__0__0", "1__0__1", "1__1__0", "1__1__1", "1__2__0",
"1__2__1", "2__0__0", "2__0__1", "2__1__0", "2__1__1", "2__2__0", "2__2__1", "2__3__0",
"2__3__1", "3"
]
);
}
#[test]
fn test_multi_generic_array_tuple_struct() {
let names = MultiGenericArrayTupleStruct::<i32, String>::struct_reflection();
assert_eq!(
names.unwrap(),
vec!["0__0", "0__1", "0__2", "1__0", "1__1", "2"]
);
}
#[test]
fn test_nested_multi_generic_tuple_struct() {
let names = NestedMultiGenericTupleStruct::<bool, f64>::struct_reflection();
assert_eq!(
names.unwrap(),
vec!["0__0__0", "0__0__1", "0__1__0", "0__1__1", "1__0__0", "1__0__1", "1__0__2", "2"]
);
}
#[test]
fn test_complex_multi_generic_tuple_struct() {
let names = ComplexMultiGenericTupleStruct::<i32, String, f32>::struct_reflection();
assert_eq!(
names.unwrap(),
vec![
"0__0", "0__1", "1__0", "1__1", "1__2",
"2__0__0", "2__0__1", "2__1__0", "2__1__1", "3"
]
);
}
#[test]
fn test_optional_fields_tuple() {
let names = OptionalFieldsTuple::struct_reflection();
assert_eq!(names.unwrap(), vec!["0", "1", "2__optional", "3__optional"]);
}
#[test]
fn test_nested_optional_tuple() {
let names = NestedOptionalTuple::struct_reflection();
assert_eq!(names.unwrap(), vec!["0", "1__optional"]);
}
#[test]
fn test_optional_generic_tuple() {
let names = OptionalGenericTuple::<i32>::struct_reflection();
assert_eq!(names.unwrap(), vec!["0", "1__optional", "2__optional"]);
}
#[test]
fn test_nested_array_of_tuple_structs() {
let names = NestedArrayOfTupleStructs::struct_reflection();
assert_eq!(
names.unwrap(),
vec![
"0__0__0__0",
"0__0__0__1",
"0__0__0__2",
"0__0__1__0",
"0__0__1__1",
"0__0__1__2",
"0__0__2__0",
"0__0__2__1",
"0__0__2__2",
"0__1__0__0",
"0__1__0__1",
"0__1__0__2",
"0__1__1__0",
"0__1__1__1",
"0__1__1__2",
"0__1__2__0",
"0__1__2__1",
"0__1__2__2",
"1"
]
);
}
#[test]
fn test_nested_array_of_generic_tuple_structs() {
let names = NestedArrayOfGenericTupleStructs::<i32>::struct_reflection();
assert_eq!(
names.unwrap(),
vec![
"0__0__0__0",
"0__0__0__1",
"0__0__0__2",
"0__0__1__0",
"0__0__1__1",
"0__0__1__2",
"0__1__0__0",
"0__1__0__1",
"0__1__0__2",
"0__1__1__0",
"0__1__1__1",
"0__1__1__2",
"1"
]
);
}