2#include <Core/Utils/Attribs.hpp>
3#include <Core/Utils/ContainerIntrospectionInterface.hpp>
4#include <Core/Utils/Index.hpp>
7#include <catch2/catch_test_macros.hpp>
12using namespace Ra::Core::Utils;
14TEST_CASE(
"Core/Utils/Attibs",
"[unittests][Core][Utils][Attribs]" ) {
16 enum Enum1 { A, B, C };
17 enum class Enum2 :
char { A =
'a', B, C };
26 SECTION(
"type check" ) {
27 REQUIRE( attr1.isFloat() );
28 REQUIRE( !attr1.isType<
int>() );
29 REQUIRE( attr2.isVector3() );
31 REQUIRE( attr4.isType<Enum1>() );
32 REQUIRE( attr5.isType<Enum2>() );
33 REQUIRE( !attr5.isType<
char>() );
34 REQUIRE( attr6.isType<VectorNd>() );
36 REQUIRE( attr1.getNumberOfComponents() == 1 );
37 REQUIRE( attr2.getNumberOfComponents() == 3 );
38 REQUIRE( attr3.getNumberOfComponents() == 0 );
39 REQUIRE( attr4.getNumberOfComponents() == 1 );
40 REQUIRE( attr5.getNumberOfComponents() == 1 );
41 REQUIRE( attr6.getNumberOfComponents() == 0 );
43 REQUIRE( attr1.getStride() ==
sizeof( Scalar ) );
44 REQUIRE( attr2.getStride() ==
sizeof( Vector3 ) );
45 REQUIRE( attr3.getStride() ==
sizeof(
std::string ) );
46 REQUIRE( attr4.getStride() ==
sizeof( Enum1 ) );
47 REQUIRE( attr5.getStride() ==
sizeof( Enum2 ) );
48 REQUIRE( attr6.getStride() ==
sizeof( VectorNd ) );
51 SECTION(
"const ref setData" ) {
54 { 1_ra, 1_ra, 1_ra }, { 2_ra, 2_ra, 2_ra }, { 3_ra, 3_ra, 3_ra } };
59 attr1.setData( attr1content );
60 attr2.setData( attr2content );
61 attr3.setData( attr3content );
62 attr4.setData( attr4content );
63 attr5.setData( attr5content );
65 REQUIRE( attr1.getSize() == 3 );
66 REQUIRE( attr2.getSize() == 3 );
67 REQUIRE( attr3.getSize() == 3 );
68 REQUIRE( attr4.getSize() == 3 );
69 REQUIRE( attr5.getSize() == 3 );
71 auto& cont1 = attr1.data();
72 auto& cont2 = attr2.data();
73 auto& cont3 = attr3.data();
74 auto& cont4 = attr4.data();
75 auto& cont5 = attr5.data();
76 REQUIRE( cont1.data() == attr1.dataPtr() );
77 REQUIRE( cont2.data() == attr2.dataPtr() );
78 REQUIRE( cont3.data() == attr3.dataPtr() );
79 REQUIRE( cont4.data() == attr4.dataPtr() );
80 REQUIRE( cont5.data() == attr5.dataPtr() );
82 REQUIRE( attr1.getBufferSize() == 3 *
sizeof( Scalar ) );
83 REQUIRE( attr2.getBufferSize() == 3 *
sizeof( Vector3 ) );
84 REQUIRE( attr3.getBufferSize() == 3 *
sizeof(
std::string ) );
85 REQUIRE( attr4.getBufferSize() == 3 *
sizeof( Enum1 ) );
86 REQUIRE( attr5.getBufferSize() == 3 *
sizeof( Enum2 ) );
90 attr6.setData( { x } );
91 REQUIRE( attr6.getBufferSize() == 1 *
sizeof( VectorNd ) );
93 SECTION(
"move setData" ) {
96 { 1_ra, 1_ra, 1_ra }, { 2_ra, 2_ra, 2_ra }, { 3_ra, 3_ra, 3_ra } };
101 attr1.setData(
std::move( attr1content ) );
102 attr2.setData(
std::move( attr2content ) );
103 attr3.setData(
std::move( attr3content ) );
104 attr4.setData(
std::move( attr4content ) );
105 attr5.setData(
std::move( attr5content ) );
107 REQUIRE( attr1.getSize() == 3 );
108 REQUIRE( attr2.getSize() == 3 );
109 REQUIRE( attr3.getSize() == 3 );
110 REQUIRE( attr4.getSize() == 3 );
111 REQUIRE( attr5.getSize() == 3 );
113 auto& cont1 = attr1.data();
114 auto& cont2 = attr2.data();
115 auto& cont3 = attr3.data();
116 auto& cont4 = attr4.data();
117 auto& cont5 = attr5.data();
118 REQUIRE( cont1.data() == attr1.dataPtr() );
119 REQUIRE( cont2.data() == attr2.dataPtr() );
120 REQUIRE( cont3.data() == attr3.dataPtr() );
121 REQUIRE( cont4.data() == attr4.dataPtr() );
122 REQUIRE( cont5.data() == attr5.dataPtr() );
126TEST_CASE(
"Core/Utils/AttibManager",
"[unittests][Core][Utils][Attribs][AttribManager]" ) {
127 SECTION(
"init and clear" ) {
129 auto m1attr1 = m1.
addAttrib<
float>(
"float" );
130 auto m1attr2 = m1.
addAttrib<
double>(
"double" );
133 REQUIRE( m1.
isValid( m1attr1 ) );
134 REQUIRE( m1.
isValid( m1attr2 ) );
135 REQUIRE( !( m1attr1 == m1attr2 ) );
137 auto m1attr1bis = m1.
findAttrib<
float>(
"float" );
138 auto m1attr2bis = m1.
findAttrib<
double>(
"double" );
139 REQUIRE( m1.
isValid( m1attr1bis ) );
140 REQUIRE( m1.
isValid( m1attr2bis ) );
141 REQUIRE( m1attr1 == m1attr1bis );
142 REQUIRE( m1attr1.idx() == m1attr1bis.idx() );
143 REQUIRE( m1attr2.idx() == m1attr2bis.idx() );
146 REQUIRE( !m1.
contains(
"double" ) );
147 REQUIRE( !m1.
isValid( m1attr1 ) );
148 REQUIRE( !m1.
isValid( m1attr2 ) );
151 m1attr2bis = m1.
findAttrib<
double>(
"double" );
152 REQUIRE( !m1.
isValid( m1attr1bis ) );
153 REQUIRE( !m1.
isValid( m1attr2bis ) );
155 SECTION(
"init and remove" ) {
157 auto m1attr1 = m1.
addAttrib<
float>(
"float" );
158 auto m1attr2 = m1.
addAttrib<
double>(
"double" );
161 REQUIRE( m1.
isValid( m1attr1 ) );
162 REQUIRE( m1.
isValid( m1attr2 ) );
166 REQUIRE( !m1.
isValid( m1attr1 ) );
167 REQUIRE( m1.
isValid( m1attr2 ) );
169 auto m1attr1bis = m1.
findAttrib<
float>(
"float" );
170 auto m1attr2bis = m1.
findAttrib<
double>(
"double" );
171 REQUIRE( !m1.
isValid( m1attr1bis ) );
172 REQUIRE( m1.
isValid( m1attr2bis ) );
173 REQUIRE( m1attr2bis.idx() == m1attr2.idx() );
175 SECTION(
"get attrib and data" ) {
179 auto m1attr1 = m1.
addAttrib<Vector3>(
"vec3" );
180 auto attr1ptr = m1.getAttribPtr( m1attr1 );
185 auto invalidPtrFromIdx = m1.
getAttribBase( Index::Invalid() );
186 const auto baseConstPtrFromName = m1Const.
getAttribBase(
"vec3" );
187 const auto baseConstPtrFromIdx = m1Const.
getAttribBase( m1attr1.idx() );
188 const auto invalidConstPtrFromName = m1Const.
getAttribBase(
"invalid" );
189 const auto invalidConstPtrFromIdx = m1Const.
getAttribBase( Index::Invalid() );
191 REQUIRE( basePtrFromName == attr1ptr );
192 REQUIRE( baseConstPtrFromName == attr1ptr );
193 REQUIRE( basePtrFromIdx == attr1ptr );
194 REQUIRE( baseConstPtrFromIdx == attr1ptr );
195 REQUIRE( invalidPtrFromName ==
nullptr );
196 REQUIRE( invalidConstPtrFromName ==
nullptr );
197 REQUIRE( invalidPtrFromIdx ==
nullptr );
198 REQUIRE( invalidConstPtrFromIdx ==
nullptr );
The AttribManager provides attributes management by handles.
AttribBase * getAttribBase(const std::string &name)
int getNumAttribs() const
Return the number of attributes.
AttribHandle< T > addAttrib(const std::string &name)
bool contains(const std::string &name) const
contains Check if an attribute with the given name exists.
bool isValid(const AttribHandle< T > &h) const
Return true if h correspond to an existing attribute in *this.
void clear()
clear all attribs, invalidate handles.
void removeAttrib(AttribHandle< T > &h)
AttribHandle< T > findAttrib(const std::string &name) const
findAttrib Grab an attribute handler by name.
This namespace contains everything "low level", related to data, datastuctures, and computation.