Skip to content

Commit 74b7b42

Browse files
committed
Finish typedesc tests and rename typedesc_basetype_merge_2 to typedesc_basetype_merge
Signed-off-by: Scott Wilson <scott@propersquid.com>
1 parent 90b1449 commit 74b7b42

File tree

3 files changed

+156
-6
lines changed

3 files changed

+156
-6
lines changed

src/rust/oiio-sys/include/typedesc.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ bool
117117
typedesc_lt(const TypeDesc& typedesc, const TypeDesc& x) noexcept;
118118

119119
BaseType
120-
typedesc_basetype_merge_2(TypeDesc a, TypeDesc b);
120+
typedesc_basetype_merge(TypeDesc a, TypeDesc b);
121121

122122
BaseType
123123
typedesc_basetype_merge_3(TypeDesc a, TypeDesc b, TypeDesc c);

src/rust/oiio-sys/src/typedesc.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ typedesc_lt(const TypeDesc& typedesc, const TypeDesc& x) noexcept
217217
}
218218

219219
BaseType
220-
typedesc_basetype_merge_2(TypeDesc a, TypeDesc b)
220+
typedesc_basetype_merge(TypeDesc a, TypeDesc b)
221221
{
222222
return TypeDesc::basetype_merge(a, b);
223223
}

src/rust/oiio-sys/src/typedesc.rs

Lines changed: 154 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ unsafe impl cxx::ExternType for TypeDesc {
1717

1818
#[cxx::bridge(namespace = oiio_ffi)]
1919
mod ffi {
20-
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
20+
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
2121
#[repr(u32)]
2222
pub enum BaseType {
2323
UNKNOWN = 0,
@@ -39,7 +39,7 @@ mod ffi {
3939
LASTBASE = 16,
4040
}
4141

42-
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
42+
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
4343
#[repr(u32)]
4444
pub enum Aggregate {
4545
SCALAR = 1,
@@ -50,7 +50,7 @@ mod ffi {
5050
MATRIX44 = 16,
5151
}
5252

53-
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
53+
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
5454
#[repr(u32)]
5555
pub enum VecSemantics {
5656
NOSEMANTICS = 0,
@@ -150,7 +150,7 @@ mod ffi {
150150

151151
fn typedesc_lt(typedesc: &TypeDesc, x: &TypeDesc) -> bool;
152152

153-
fn typedesc_basetype_merge_2(a: TypeDesc, b: TypeDesc) -> BaseType;
153+
fn typedesc_basetype_merge(a: TypeDesc, b: TypeDesc) -> BaseType;
154154

155155
fn typedesc_basetype_merge_3(a: TypeDesc, b: TypeDesc, c: TypeDesc) -> BaseType;
156156

@@ -725,5 +725,155 @@ mod tests {
725725

726726
}
727727
}
728+
729+
#[test]
730+
fn test_typedesc_unarray_success(
731+
btype in basetypes(),
732+
agg in aggregates(),
733+
semantics in vecsemantics(),
734+
arraylen in i32::MIN..i32::MAX
735+
) {
736+
let mut result = typedesc_new(btype, agg, semantics, arraylen);
737+
typedesc_unarray(&mut result);
738+
739+
prop_assert_eq!(result.arraylen, 0);
740+
}
741+
742+
#[test]
743+
fn test_typedesc_lt_success(
744+
btype_a in basetypes(),
745+
agg_a in aggregates(),
746+
semantics_a in vecsemantics(),
747+
arraylen_a in i32::MIN..i32::MAX,
748+
btype_b in basetypes(),
749+
agg_b in aggregates(),
750+
semantics_b in vecsemantics(),
751+
arraylen_b in i32::MIN..i32::MAX,
752+
) {
753+
let typedesc_a = typedesc_new(btype_a, agg_a, semantics_a, arraylen_a);
754+
let typedesc_b = typedesc_new(btype_b, agg_b, semantics_b, arraylen_b);
755+
756+
if btype_a != btype_b {
757+
prop_assert_eq!(typedesc_lt(&typedesc_a, &typedesc_b), btype_a < btype_b);
758+
} else if agg_a != agg_b {
759+
prop_assert_eq!(typedesc_lt(&typedesc_a, &typedesc_b), agg_a < agg_b);
760+
} else if arraylen_a != arraylen_b {
761+
prop_assert_eq!(typedesc_lt(&typedesc_a, &typedesc_b), arraylen_a < arraylen_b);
762+
} else if semantics_a != semantics_b {
763+
prop_assert_eq!(typedesc_lt(&typedesc_a, &typedesc_b), semantics_a < semantics_b);
764+
} else {
765+
prop_assert_eq!(typedesc_lt(&typedesc_a, &typedesc_b), false);
766+
}
767+
}
768+
769+
#[test]
770+
fn test_typedesc_basetype_merge_success(
771+
mut btype_a in basetypes(),
772+
agg_a in aggregates(),
773+
semantics_a in vecsemantics(),
774+
arraylen_a in i32::MIN..i32::MAX,
775+
mut btype_b in basetypes(),
776+
agg_b in aggregates(),
777+
semantics_b in vecsemantics(),
778+
arraylen_b in i32::MIN..i32::MAX,
779+
) {
780+
let typedesc_a = typedesc_new(btype_a, agg_a, semantics_a, arraylen_a);
781+
let typedesc_b = typedesc_new(btype_b, agg_b, semantics_b, arraylen_b);
782+
let result = typedesc_basetype_merge(typedesc_a, typedesc_b);
783+
784+
if btype_a == btype_b {
785+
prop_assert_eq!(result, btype_a);
786+
prop_assert_eq!(result, btype_b);
787+
} else if btype_a == BaseType::UNKNOWN {
788+
prop_assert_eq!(result, btype_b);
789+
} else if btype_b == BaseType::UNKNOWN {
790+
prop_assert_eq!(result, btype_a);
791+
} else {
792+
let size_a = typedesc_size(&typedesc_new(btype_a, Aggregate::SCALAR, VecSemantics::NOSEMANTICS, 0));
793+
let size_b = typedesc_size(&typedesc_new(btype_b, Aggregate::SCALAR, VecSemantics::NOSEMANTICS, 0));
794+
795+
if size_a < size_b {
796+
std::mem::swap(&mut btype_a, &mut btype_b);
797+
}
798+
799+
if btype_a == BaseType::DOUBLE || btype_a == BaseType::FLOAT {
800+
prop_assert_eq!(result, btype_a);
801+
} else if btype_a == BaseType::UINT32 && (btype_b == BaseType::UINT16 || btype_b == BaseType::UINT8) {
802+
prop_assert_eq!(result, btype_a);
803+
} else if btype_a == BaseType::INT32 && (btype_b == BaseType::INT16 || btype_b == BaseType::INT8 || btype_b == BaseType::UINT16 || btype_b == BaseType::UINT8) {
804+
prop_assert_eq!(result, btype_a);
805+
} else if (btype_a == BaseType::UINT16 || btype_a == BaseType::HALF) && btype_b == BaseType::UINT8 {
806+
prop_assert_eq!(result, btype_a);
807+
} else if (btype_a == BaseType::INT16 || btype_a == BaseType::HALF) && (btype_b == BaseType::INT8 || btype_b == BaseType::UINT8) {
808+
prop_assert_eq!(result, btype_a);
809+
} else {
810+
prop_assert_eq!(result, BaseType::FLOAT);
811+
}
812+
}
813+
}
814+
815+
#[test]
816+
fn test_typedesc_basetype_merge_3_success(
817+
btype_a in basetypes(),
818+
agg_a in aggregates(),
819+
semantics_a in vecsemantics(),
820+
arraylen_a in i32::MIN..i32::MAX,
821+
btype_b in basetypes(),
822+
agg_b in aggregates(),
823+
semantics_b in vecsemantics(),
824+
arraylen_b in i32::MIN..i32::MAX,
825+
mut btype_c in basetypes(),
826+
agg_c in aggregates(),
827+
semantics_c in vecsemantics(),
828+
arraylen_c in i32::MIN..i32::MAX,
829+
) {
830+
let typedesc_a = typedesc_new(btype_a, agg_a, semantics_a, arraylen_a);
831+
let typedesc_b = typedesc_new(btype_b, agg_b, semantics_b, arraylen_b);
832+
let typedesc_c = typedesc_new(btype_c, agg_c, semantics_c, arraylen_c);
833+
let result = typedesc_basetype_merge_3(typedesc_a, typedesc_b, typedesc_c);
834+
let mut btype_inner = typedesc_basetype_merge(typedesc_a, typedesc_b);
835+
836+
if btype_inner == btype_c {
837+
prop_assert_eq!(result, btype_inner);
838+
prop_assert_eq!(result, btype_c);
839+
} else if btype_inner == BaseType::UNKNOWN {
840+
prop_assert_eq!(result, btype_c);
841+
} else if btype_c == BaseType::UNKNOWN {
842+
prop_assert_eq!(result, btype_inner);
843+
} else {
844+
let size_a = typedesc_size(&typedesc_new(btype_inner, Aggregate::SCALAR, VecSemantics::NOSEMANTICS, 0));
845+
let size_b = typedesc_size(&typedesc_new(btype_c, Aggregate::SCALAR, VecSemantics::NOSEMANTICS, 0));
846+
847+
if size_a < size_b {
848+
std::mem::swap(&mut btype_inner, &mut btype_c);
849+
}
850+
851+
if btype_inner == BaseType::DOUBLE || btype_inner == BaseType::FLOAT {
852+
prop_assert_eq!(result, btype_inner);
853+
} else if btype_inner == BaseType::UINT32 && (btype_c == BaseType::UINT16 || btype_c == BaseType::UINT8) {
854+
prop_assert_eq!(result, btype_inner);
855+
} else if btype_inner == BaseType::INT32 && (btype_c == BaseType::INT16 || btype_c == BaseType::INT8 || btype_c == BaseType::UINT16 || btype_c == BaseType::UINT8) {
856+
prop_assert_eq!(result, btype_inner);
857+
} else if (btype_inner == BaseType::UINT16 || btype_inner == BaseType::HALF) && btype_c == BaseType::UINT8 {
858+
prop_assert_eq!(result, btype_inner);
859+
} else if (btype_inner == BaseType::INT16 || btype_inner == BaseType::HALF) && (btype_c == BaseType::INT8 || btype_c == BaseType::UINT8) {
860+
prop_assert_eq!(result, btype_inner);
861+
} else {
862+
prop_assert_eq!(result, BaseType::FLOAT);
863+
}
864+
}
865+
}
866+
867+
#[test]
868+
fn test_typedesc_convert_type_success(
869+
value_in in i32::MIN..i32::MAX,
870+
) {
871+
let mut value_out = 0.0f32.to_ne_bytes();
872+
let src_type = typedesc_new(BaseType::INT32, Aggregate::SCALAR, VecSemantics::NOSEMANTICS, 0);
873+
let dst_type = typedesc_new(BaseType::FLOAT, Aggregate::SCALAR, VecSemantics::NOSEMANTICS, 0);
874+
875+
prop_assert!(typedesc_convert_type(src_type, &value_in.to_ne_bytes(), dst_type, &mut value_out, 1));
876+
prop_assert_eq!(f32::from_ne_bytes(value_out), value_in as f32);
877+
}
728878
}
729879
}

0 commit comments

Comments
 (0)