Files
unison/src/core/examples/test-string-value-formatting.cc
2023-01-26 15:32:58 +00:00

209 lines
6.8 KiB
C++

/*
* Copyright (c) 2016 Tom Henderson
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation;
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "ns3/core-module.h"
/**
* \defgroup string-value-formatting StringValue parsing tests
* Check that StringValue parses complex values correctly.
*/
/**
* \file
* \ingroup core-examples
* \ingroup string-value-formatting
* Check that StringValue parses complex values correctly.
* \todo This should really be turned into a TestSuite
*/
using namespace ns3;
NS_LOG_COMPONENT_DEFINE("TestStringValueFormatting");
namespace
{
/**
* \ingroup string-value-formatting
*
* StringValue formatting example test object.
*
* We use an attribute containing a pointer to a random variable
* to stress StringValue.
*/
class FormattingTestObject : public Object
{
public:
/**
* \brief Register this type and get the TypeId.
* \return the object TypeId
*/
static TypeId GetTypeId();
/** Default constructor */
FormattingTestObject();
/**
* Get the test variable
* \returns the test variable
*/
Ptr<RandomVariableStream> GetTestVariable() const;
private:
Ptr<RandomVariableStream> m_testVariable; //!< The test variable
};
NS_OBJECT_ENSURE_REGISTERED(FormattingTestObject);
TypeId
FormattingTestObject::GetTypeId()
{
static TypeId tid =
TypeId("ns3::FormattingTestObject")
.SetParent<Object>()
.AddConstructor<FormattingTestObject>()
.AddAttribute("OnTime",
"A RandomVariableStream used to pick the duration of the 'On' state.",
StringValue("ns3::ConstantRandomVariable[Constant=1.0]"),
MakePointerAccessor(&FormattingTestObject::m_testVariable),
MakePointerChecker<RandomVariableStream>());
return tid;
}
FormattingTestObject::FormattingTestObject()
{
}
Ptr<RandomVariableStream>
FormattingTestObject::GetTestVariable() const
{
return m_testVariable;
}
/**
* \ingroup string-value-formatting
*
* StringValue formatting example test helper class.
*/
class FormattingTestObjectHelper
{
public:
/** Default constructor */
FormattingTestObjectHelper();
/**
* Set an attribute by name
* \param name the attribute
* \param value the attribute value
*/
void SetAttribute(std::string name, const AttributeValue& value);
/**
* Create an Object as configured by SetAttribute
* \returns the newly created Object
*/
Ptr<Object> CreateFromFactory();
private:
ObjectFactory m_factory; //!< Object factory
};
FormattingTestObjectHelper::FormattingTestObjectHelper()
{
m_factory.SetTypeId(FormattingTestObject::GetTypeId());
}
void
FormattingTestObjectHelper::SetAttribute(std::string name, const AttributeValue& value)
{
m_factory.Set(name, value);
}
Ptr<Object>
FormattingTestObjectHelper::CreateFromFactory()
{
return m_factory.Create();
}
} // unnamed namespace
int
main(int argc, char* argv[])
{
// CreateObject parsing
Ptr<FormattingTestObject> obj = CreateObject<FormattingTestObject>();
obj->SetAttribute("OnTime", StringValue("ns3::UniformRandomVariable"));
obj->SetAttribute("OnTime", StringValue("ns3::UniformRandomVariable[Min=0.]"));
obj->SetAttribute("OnTime", StringValue("ns3::UniformRandomVariable[Min=0.|Max=1.]"));
obj->SetAttribute("OnTime", StringValue("ns3::UniformRandomVariable[Min=50.|Max=100.]"));
Ptr<RandomVariableStream> rvStream = obj->GetTestVariable();
// Either GetObject () or DynamicCast may be used to get subclass pointer
Ptr<UniformRandomVariable> uniformStream = rvStream->GetObject<UniformRandomVariable>();
NS_ASSERT(uniformStream);
// Check that the last setting of Min to 50 and Max to 100 worked
DoubleValue val;
uniformStream->GetAttribute("Min", val);
NS_ASSERT_MSG(val.Get() == 50, "Minimum not set to 50");
uniformStream->GetAttribute("Max", val);
NS_ASSERT_MSG(val.Get() == 100, "Maximum not set to 100");
// The following malformed values should result in an error exit
// if uncommented
// Attribute doesn't exist
// obj->SetAttribute ("OnTime", StringValue ("ns3::UniformRandomVariable[A=0.]"));
// Missing right bracket
// obj->SetAttribute ("OnTime", StringValue ("ns3::UniformRandomVariable[Min=0."));
// Comma delimiter fails
// obj->SetAttribute ("OnTime", StringValue ("ns3::UniformRandomVariable[Min=0.,Max=1.]"));
// Incomplete specification
// obj->SetAttribute ("OnTime", StringValue ("ns3::UniformRandomVariable[Min=0.|Max=]"));
// Incomplete specification
// obj->SetAttribute ("OnTime", StringValue ("ns3::UniformRandomVariable[Min=0.|Max]"));
// ObjectFactory parsing
FormattingTestObjectHelper formattingHelper;
formattingHelper.SetAttribute("OnTime",
StringValue("ns3::UniformRandomVariable[Min=30.|Max=60.0]"));
// Attribute doesn't exist
// formattingHelper.SetAttribute ("OnTime", StringValue ("ns3::UniformRandomVariable[A=0.]"));
// Missing right bracket
// formattingHelper.SetAttribute ("OnTime", StringValue ("ns3::UniformRandomVariable[Min=30."));
// Comma delimiter fails
// formattingHelper.SetAttribute ("OnTime", StringValue
// ("ns3::UniformRandomVariable[Min=30.,Max=60.]"));
// Incomplete specification
// formattingHelper.SetAttribute ("OnTime", StringValue
// ("ns3::UniformRandomVariable[Min=30.|Max=]"));
// Incomplete specification
// formattingHelper.SetAttribute ("OnTime", StringValue
// ("ns3::UniformRandomVariable[Min=30.|Max]"));
// verify that creation occurs correctly
Ptr<Object> outputObj = formattingHelper.CreateFromFactory();
Ptr<FormattingTestObject> fto = DynamicCast<FormattingTestObject>(outputObj);
NS_ASSERT_MSG(fto, "object creation failed");
rvStream = fto->GetTestVariable();
uniformStream = rvStream->GetObject<UniformRandomVariable>();
NS_ASSERT(uniformStream);
// Check that the last setting of Min to 30 and Max to 60 worked
uniformStream->GetAttribute("Min", val);
NS_ASSERT_MSG(val.Get() == 30, "Minimum not set to 30");
uniformStream->GetAttribute("Max", val);
NS_ASSERT_MSG(val.Get() == 60, "Maximum not set to 60");
return 0;
}