Add offset of members to assetstructtests

This commit is contained in:
Jan 2021-03-04 09:04:25 +01:00
parent a10b3b7d3c
commit 29b962e949
4 changed files with 24 additions and 3 deletions

View File

@ -4,6 +4,7 @@ Variable::Variable(std::string name, std::unique_ptr<TypeDeclaration> typeDeclar
: m_name(std::move(name)),
m_has_alignment_override(false),
m_alignment_override(0),
m_offset(0),
m_type_declaration(std::move(typeDeclaration))
{
}

View File

@ -3,6 +3,7 @@
#include <memory>
#include <string>
#include "Utils/ClassUtils.h"
#include "TypeDeclaration.h"
class Variable
@ -11,10 +12,11 @@ public:
std::string m_name;
bool m_has_alignment_override;
unsigned m_alignment_override;
unsigned m_offset;
std::unique_ptr<TypeDeclaration> m_type_declaration;
Variable(std::string name, std::unique_ptr<TypeDeclaration> typeDeclaration);
unsigned GetAlignment() const;
bool GetForceAlignment() const;
_NODISCARD unsigned GetAlignment() const;
_NODISCARD bool GetForceAlignment() const;
};

View File

@ -13,8 +13,19 @@ class AssetStructTestsTemplate::Internal final : BaseTemplate
LINE("TEST_CASE(\""<<m_env.m_game<<"::"<<m_env.m_asset->m_definition->GetFullName()<<": Tests for "<<structure->m_definition->GetFullName()<<"\", \"[assetstruct]\")")
LINE("{")
m_intendation++;
for(const auto& member : structure->m_ordered_members)
{
if(!member->m_member->m_name.empty() && !member->m_member->m_type_declaration->m_has_custom_bit_size)
{
LINE("REQUIRE(offsetof(" << structure->m_definition->GetFullName() << ", " << member->m_member->m_name << ") == " << member->m_member->m_offset << ");")
}
}
LINE("")
LINE("REQUIRE("<<structure->m_definition->GetSize()<<"u == sizeof("<<structure->m_definition->GetFullName()<<"));")
LINE("// REQUIRE("<<structure->m_definition->GetAlignment()<<"u == alignof("<<structure->m_definition->GetFullName()<<"));")
LINE("REQUIRE("<<structure->m_definition->GetAlignment()<<"u == alignof("<<structure->m_definition->GetFullName()<<"));")
m_intendation--;
LINE("}")
}
@ -34,6 +45,7 @@ public:
LINE("// ====================================================================")
LINE("")
LINE("#include <catch2/catch.hpp>")
LINE("#include <cstddef>")
LINE("#include \"Game/" << m_env.m_game << "/" << m_env.m_game << ".h\"")
LINE("")
LINE("using namespace " << m_env.m_game << ";")

View File

@ -129,6 +129,7 @@ bool CalculateSizeAndAlignPostProcessor::CalculateSize(IDataRepository* reposito
if (member->m_type_declaration->m_has_custom_bit_size)
{
member->m_offset = definition->m_size + currentBitOffset / 8;
currentBitOffset += member->m_type_declaration->m_custom_bit_size;
}
else
@ -141,6 +142,9 @@ bool CalculateSizeAndAlignPostProcessor::CalculateSize(IDataRepository* reposito
}
definition->m_size = AlignmentUtils::Align(definition->m_size, member->GetForceAlignment() ? member->GetAlignment() : std::min(member->GetAlignment(), definition->m_pack));
member->m_offset = definition->m_size;
definition->m_size += member->m_type_declaration->GetSize();
}
}
@ -165,6 +169,8 @@ bool CalculateSizeAndAlignPostProcessor::CalculateSize(IDataRepository* reposito
if (!CalculateFields(repository, member->m_type_declaration.get()))
return false;
member->m_offset = 0;
const auto memberSize = member->m_type_declaration->GetSize();
if (memberSize > definition->m_size)
definition->m_size = memberSize;