data: Tests for DataType

* Added Array and Reference Modifier for DataType.
* Created basic tests for DataType.
* Fixed bug where qualifiers of modifiers were not copied correctly.
* Fixed bug where DataType modifiers were applied in the wrong (reverse) order.
This commit is contained in:
malte_langkabel
2014-07-14 11:29:44 +02:00
parent 9284397d46
commit ce54bd50ed
18 changed files with 228 additions and 69 deletions
+5
View File
@@ -99,8 +99,13 @@ add_files(
data/type/modifier/DataTypeModifier.cpp
data/type/modifier/DataTypeModifier.h
data/type/modifier/DataTypeModifierArray.cpp
data/type/modifier/DataTypeModifierArray.h
data/type/modifier/DataTypeModifierPointer.cpp
data/type/modifier/DataTypeModifierPointer.h
data/type/modifier/DataTypeModifierReference.cpp
data/type/modifier/DataTypeModifierReference.h
data/type/DataType.cpp
data/type/DataType.h
data/type/DataTypeModifierStack.cpp
+19
View File
@@ -1,7 +1,9 @@
#include "data/parser/cxx/utilityCxx.h"
#include "data/type/DataType.h"
#include "data/type/modifier/DataTypeModifierArray.h"
#include "data/type/modifier/DataTypeModifierPointer.h"
#include "data/type/modifier/DataTypeModifierReference.h"
#include "data/type/DataTypeModifierStack.h"
#include "data/type/DataTypeQualifierList.h"
@@ -25,6 +27,23 @@ namespace utility
qualType = type->getPointeeType();
}
else if (type->isArrayType())
{
std::shared_ptr<DataTypeModifier> modifier = std::make_shared<DataTypeModifierArray>();
if (qualType.isConstQualified())
modifier->addQualifier(DataTypeQualifierList::QUALIFIER_CONST);
modifierStack.push(modifier);
qualType = clang::dyn_cast<clang::ArrayType>(type)->getElementType();
}
else if (type->isReferenceType())
{
std::shared_ptr<DataTypeModifier> modifier = std::make_shared<DataTypeModifierReference>();
// references can not be const qualified
modifierStack.push(modifier);
qualType = type->getPointeeType();
}
else if (type->isStructureOrClassType() || type->isEnumeralType())
{
typeName = qualType.getAsString();
+12 -1
View File
@@ -1,7 +1,18 @@
#include "data/type/DataType.h"
DataType::DataType(const std::string& typeName)
: m_typeName(typeName)
{
}
DataType::DataType(const std::string& typeName, const DataTypeQualifierList& qualifierList)
: m_typeName(typeName)
, m_qualifierList(qualifierList)
{
}
DataType::DataType(
const std::string& typeName, const DataTypeQualifierList qualifierList, const DataTypeModifierStack modifierStack
const std::string& typeName, const DataTypeQualifierList& qualifierList, const DataTypeModifierStack& modifierStack
)
: m_typeName(typeName)
, m_qualifierList(qualifierList)
+3 -1
View File
@@ -10,8 +10,10 @@
class DataType
{
public:
DataType(const std::string& typeName);
DataType(const std::string& typeName, const DataTypeQualifierList& qualifierList);
DataType(
const std::string& typeName, const DataTypeQualifierList qualifierList, const DataTypeModifierStack modifierStack
const std::string& typeName, const DataTypeQualifierList& qualifierList, const DataTypeModifierStack& modifierStack
);
~DataType();
+16 -2
View File
@@ -12,6 +12,19 @@ DataTypeModifierStack::DataTypeModifierStack(const DataTypeModifierStack& o)
}
}
DataTypeModifierStack& DataTypeModifierStack::operator=(const DataTypeModifierStack &o)
{
if (this != &o)
{
m_modifiers.clear();
for (std::shared_ptr<DataTypeModifier> modifier: o.m_modifiers)
{
m_modifiers.push_back(modifier->copy());
}
}
return *this;
}
DataTypeModifierStack::~DataTypeModifierStack()
{
}
@@ -23,10 +36,11 @@ void DataTypeModifierStack::push(std::shared_ptr<DataTypeModifier> modifier)
std::string DataTypeModifierStack::applyTo(const std::string& typeName) const
{
typedef std::vector<std::shared_ptr<DataTypeModifier>>::const_reverse_iterator StackIterator;
std::string modifiedTypeName = typeName;
for (std::shared_ptr<DataTypeModifier> modifier: m_modifiers)
for (StackIterator it = m_modifiers.rbegin(); it != m_modifiers.rend(); it++)
{
modifier->applyTo(modifiedTypeName);
(*it)->applyTo(modifiedTypeName);
}
return modifiedTypeName;
}
@@ -12,8 +12,10 @@ class DataTypeModifierStack
public:
DataTypeModifierStack();
DataTypeModifierStack(const DataTypeModifierStack& o);
DataTypeModifierStack& operator=(const DataTypeModifierStack &o);
~DataTypeModifierStack();
void push(std::shared_ptr<DataTypeModifier> modifier);
std::string applyTo(const std::string& typeName) const;
@@ -8,6 +8,13 @@ DataTypeModifier::~DataTypeModifier()
{
}
std::shared_ptr<DataTypeModifier> DataTypeModifier::copy() const
{
std::shared_ptr<DataTypeModifier> copy = doCopy();
copy->m_qualifierList = m_qualifierList;
return copy;
}
void DataTypeModifier::applyTo(std::string& typeName) const
{
doApplyTo(typeName);
@@ -11,7 +11,7 @@ public:
DataTypeModifier();
virtual ~DataTypeModifier();
virtual std::shared_ptr<DataTypeModifier> copy() const = 0;
std::shared_ptr<DataTypeModifier> copy() const;
void applyTo(std::string& typeName) const;
@@ -20,6 +20,7 @@ public:
bool hasQualifier(DataTypeQualifierList::QualifierType qualifier) const;
private:
virtual std::shared_ptr<DataTypeModifier> doCopy() const = 0;
virtual void doApplyTo(std::string& typeName) const = 0;
DataTypeQualifierList m_qualifierList;
@@ -0,0 +1,19 @@
#include "data/type/modifier/DataTypeModifierArray.h"
DataTypeModifierArray::DataTypeModifierArray()
{
}
DataTypeModifierArray::~DataTypeModifierArray()
{
}
std::shared_ptr<DataTypeModifier> DataTypeModifierArray::doCopy() const
{
return std::make_shared<DataTypeModifierArray>();
}
void DataTypeModifierArray::doApplyTo(std::string& typeName) const
{
typeName.append(" []");
}
@@ -0,0 +1,17 @@
#ifndef DATA_TYPE_MODIFIER_ARRAY_H
#define DATA_TYPE_MODIFIER_ARRAY_H
#include "data/type/modifier/DataTypeModifier.h"
class DataTypeModifierArray: public DataTypeModifier
{
public:
DataTypeModifierArray();
virtual ~DataTypeModifierArray();
private:
virtual std::shared_ptr<DataTypeModifier> doCopy() const;
virtual void doApplyTo(std::string& typeName) const;
};
#endif // DATA_TYPE_MODIFIER_ARRAY_H
@@ -8,7 +8,7 @@ DataTypeModifierPointer::~DataTypeModifierPointer()
{
}
std::shared_ptr<DataTypeModifier> DataTypeModifierPointer::copy() const
std::shared_ptr<DataTypeModifier> DataTypeModifierPointer::doCopy() const
{
return std::make_shared<DataTypeModifierPointer>();
}
@@ -9,9 +9,8 @@ public:
DataTypeModifierPointer();
virtual ~DataTypeModifierPointer();
virtual std::shared_ptr<DataTypeModifier> copy() const;
private:
virtual std::shared_ptr<DataTypeModifier> doCopy() const;
virtual void doApplyTo(std::string& typeName) const;
};
@@ -1,33 +0,0 @@
#include "data/type/modifier/DataTypeModifierQualifier.h"
DataTypeModifierQualifier::DataTypeModifierQualifier()
: m_qualifiers(QUALIFIER_NONE)
{
}
DataTypeModifierQualifier::~DataTypeModifierQualifier()
{
}
void DataTypeModifierQualifier::addQualifier(QualifierType qualifier)
{
m_qualifiers = m_qualifiers | qualifier;
}
void DataTypeModifierQualifier::removeQualifier(QualifierType qualifier)
{
m_qualifiers = m_qualifiers & ~qualifier;
}
bool DataTypeModifierQualifier::hasQualifier(QualifierType qualifier) const
{
return (m_qualifiers & qualifier) > 0;
}
void DataTypeModifierQualifier::applyTo(std::string& typeName) const
{
if (hasQualifier)
{
typeName.append(" const");
}
}
@@ -1,28 +0,0 @@
#ifndef DATA_TYPE_MODIFIER_QUALIFIER_H
#define DATA_TYPE_MODIFIER_QUALIFIER_H
#include "data/type/modifier/DataTypeModifier.h"
class DataTypeModifierQualifier: public DataTypeModifier
{
public:
enum QualifierType
{
QUALIFIER_NONE = 0,
QUALIFIER_CONST = 1
};
DataTypeModifierQualifier();
virtual ~DataTypeModifierQualifier();
void addQualifier(QualifierType qualifier);
void removeQualifier(QualifierType qualifier);
bool hasQualifier(QualifierType qualifier) const;
virtual void applyTo(std::string& typeName) const;
private:
char m_qualifiers;
};
#endif // DATA_TYPE_MODIFIER_QUALIFIER_H
@@ -0,0 +1,19 @@
#include "data/type/modifier/DataTypeModifierReference.h"
DataTypeModifierReference::DataTypeModifierReference()
{
}
DataTypeModifierReference::~DataTypeModifierReference()
{
}
std::shared_ptr<DataTypeModifier> DataTypeModifierReference::doCopy() const
{
return std::make_shared<DataTypeModifierReference>();
}
void DataTypeModifierReference::doApplyTo(std::string& typeName) const
{
typeName.append(" &");
}
@@ -0,0 +1,17 @@
#ifndef DATA_TYPE_MODIFIER_REFERENCE_H
#define DATA_TYPE_MODIFIER_REFERENCE_H
#include "data/type/modifier/DataTypeModifier.h"
class DataTypeModifierReference: public DataTypeModifier
{
public:
DataTypeModifierReference();
virtual ~DataTypeModifierReference();
private:
virtual std::shared_ptr<DataTypeModifier> doCopy() const;
virtual void doApplyTo(std::string& typeName) const;
};
#endif // DATA_TYPE_MODIFIER_REFERENCE_H
+1
View File
@@ -3,6 +3,7 @@ add_files(
ConfigManagerTestSuite.h
CxxParserTestSuite.h
DataTypeTestSuite.h
FileSystemTestSuite.h
GraphTestSuite.h
LogManagerTestSuite.h
+87
View File
@@ -0,0 +1,87 @@
#include "cxxtest/TestSuite.h"
#include "data/type/DataType.h"
#include "data/type/modifier/DataTypeModifierArray.h"
#include "data/type/modifier/DataTypeModifierPointer.h"
#include "data/type/modifier/DataTypeModifierReference.h"
class DataTypeTestSuite: public CxxTest::TestSuite
{
public:
void test_datatype_created_with_name_has_no_qualifiers_or_modifiers()
{
DataType dataType("int");
TS_ASSERT_EQUALS("int", dataType.getFullTypeName());
}
void test_datatype_created_with_name_and_empty_qualifiers_has_no_qualifiers_or_modifiers()
{
DataTypeQualifierList qualifierList;
DataType dataType("int", qualifierList);
TS_ASSERT_EQUALS("int", dataType.getFullTypeName());
}
void test_datatype_created_with_name_and_const_qualifier_has_no_modifiers()
{
DataTypeQualifierList qualifierList;
qualifierList.addQualifier(DataTypeQualifierList::QUALIFIER_CONST);
DataType dataType("int", qualifierList);
TS_ASSERT_EQUALS("int const", dataType.getFullTypeName());
}
void test_datatype_created_with_name_and_empty_modifierstack_has_no_modifiers()
{
DataTypeQualifierList qualifierList;
DataTypeModifierStack modifierStack;
DataType dataType("int", qualifierList, modifierStack);
TS_ASSERT_EQUALS("int", dataType.getFullTypeName());
}
void test_datatype_created_with_name_and_array_modifier_has_array_modifier()
{
DataTypeQualifierList qualifierList;
DataTypeModifierStack modifierStack;
modifierStack.push(std::make_shared<DataTypeModifierArray>());
DataType dataType("int", qualifierList, modifierStack);
TS_ASSERT_EQUALS("int []", dataType.getFullTypeName());
}
void test_datatype_created_with_name_and_pointer_modifier_has_pointer_modifier()
{
DataTypeQualifierList qualifierList;
DataTypeModifierStack modifierStack;
modifierStack.push(std::make_shared<DataTypeModifierPointer>());
DataType dataType("int", qualifierList, modifierStack);
TS_ASSERT_EQUALS("int *", dataType.getFullTypeName());
}
void test_datatype_created_with_name_and_reference_modifier_has_reference_modifier()
{
DataTypeQualifierList qualifierList;
DataTypeModifierStack modifierStack;
modifierStack.push(std::make_shared<DataTypeModifierReference>());
DataType dataType("int", qualifierList, modifierStack);
TS_ASSERT_EQUALS("int &", dataType.getFullTypeName());
}
void test_datatype_created_with_name_and_const_pointer_modifier_has_const_pointer_modifier()
{
DataTypeQualifierList qualifierList;
DataTypeModifierStack modifierStack;
std::shared_ptr<DataTypeModifier> modifier = std::make_shared<DataTypeModifierPointer>();
modifier->addQualifier(DataTypeQualifierList::QUALIFIER_CONST);
modifierStack.push(modifier);
DataType dataType("int", qualifierList, modifierStack);
TS_ASSERT_EQUALS("int * const", dataType.getFullTypeName());
}
void test_datatype_created_with_name_and_pointer_pointer_modifier_has_pointer_pointer_modifier()
{
DataTypeQualifierList qualifierList;
DataTypeModifierStack modifierStack;
modifierStack.push(std::make_shared<DataTypeModifierPointer>());
modifierStack.push(std::make_shared<DataTypeModifierPointer>());
DataType dataType("int", qualifierList, modifierStack);
TS_ASSERT_EQUALS("int * *", dataType.getFullTypeName());
}
};