END_TEST;
}
-
Note that **there must be no extra whitespace in the method signature** (i.e., it must violate our coding convention and follow __exactly__ this pattern: `int UtcDaliMyTestcaseName(void)`), as it's parsed by an awk script to auto-generate the testcase arrays in the main header file.
You can contine to use the TET api, e.g. `tet_infoline`, `tet_result` and our test check methods `DALI_TEST_CHECK`, `DALI_TEST_EQUALS`, etc.
If you are adding new test files, then you need to add the filename to the SET(TC_SOURCES...
section of CMakeLists.txt (this is also parsed by an awk script prior to building)
+Good Practices
+--------------
+Use DALI_TEST_EQUALS to test actual value against expected value, like this:
+
+ DALI_TEST_EQUALS( actor.GetProperty< float >( Actor::Property::COLOR_ALPHA ), 0.9f, TEST_LOCATION );
+
+This will speed up debugging in case the test some day fails. There is also a variant to test that value is greater than expected:
+
+ DALI_TEST_GREATER( textureBindIndex[1], textureBindIndex[2], TEST_LOCATION );
+
+When doing negative tests where your code uses DALI_ASSERT_ALWAYS, use the DALI_TEST_ASSERTION macro, like below:
+
+ DALI_TEST_ASSERTION(
+ {
+ animation.AnimateTo( Property( actor, Actor::Property::PARENT_ORIGIN ), targetParentOrigin );
+ }, "IsPropertyAnimatable( index )" );
+
+This macro will catch the DALi Exception and check that the correct assert message was included. It will also fail the test in case the assert did not occur. It also reduces the amount of false positive error logging whilst the is being thrown making it easier to see the real errors.
+
+Note, DALI_ASSERT_DEBUG cannot be tested as tests execute against release version of the code.
+
+Use additional scope to control the life of stack allocated objects, such as DALi handles
+
+ // try reparenting an orphaned child
+ {
+ Actor temporaryParent = Actor::New();
+ temporaryParent.Add( child );
+ DALI_TEST_EQUALS( parent2.GetChildCount(), 0u, TEST_LOCATION );
+ }
+ // temporaryParent has now died, reparent the orphaned child
+ parent2.Add( child );
+ DALI_TEST_EQUALS( parent2.GetChildCount(), 1u, TEST_LOCATION );
+
+Always test the output of your test by making your code fail!!!
+
Debugging
=========
tet_printf("Assertion %s failed at %s\n", e.condition, e.location );
}
+/**
+ * Test that given piece of code triggers the right assertion
+ * Fails the test if the assert didn't occur.
+ * Turns off logging during the execution of the code to avoid excessive false positive log output from the assertions
+ * @param expressions code to execute
+ * @param assertstring the substring expected in the assert
+ */
+#define DALI_TEST_ASSERTION( expressions, assertstring ) \
+try \
+{ \
+ TestApplication::EnableLogging( false ); \
+ expressions; \
+ TestApplication::EnableLogging( true ); \
+ fprintf(stderr, "Test failed in %s, expected assert: '%s' didn't occur\n", __FILELINE__, assertstring ); \
+ tet_result(TET_FAIL); \
+ throw("TET_FAIL"); } \
+catch( Dali::DaliException& e ) \
+{ \
+ DALI_TEST_ASSERT( e, assertstring, TEST_LOCATION ); \
+}
+
// Functor to test whether an Applied signal is emitted
struct ConstraintAppliedCheck
{
namespace Dali
{
+bool TestApplication::mLoggingEnabled = true;
TestApplication::TestApplication( uint32_t surfaceWidth,
uint32_t surfaceHeight,
{
if( start )
{
- fprintf(stderr, "INFO: Trace Start: %s", tag);
+ fprintf(stderr, "INFO: Trace Start: %s\n", tag);
}
else
{
- fprintf(stderr, "INFO: Trace End: %s", tag);
+ fprintf(stderr, "INFO: Trace End: %s\n", tag);
}
}
void TestApplication::LogMessage(Dali::Integration::Log::DebugPriority level, std::string& message)
{
- switch(level)
+ if( mLoggingEnabled )
{
- case Dali::Integration::Log::DebugInfo:
- fprintf(stderr, "INFO: %s", message.c_str());
- break;
- case Dali::Integration::Log::DebugWarning:
- fprintf(stderr, "WARN: %s", message.c_str());
- break;
- case Dali::Integration::Log::DebugError:
- fprintf(stderr, "ERROR: %s", message.c_str());
- break;
- default:
- fprintf(stderr, "DEFAULT: %s", message.c_str());
- break;
+ switch(level)
+ {
+ case Dali::Integration::Log::DebugInfo:
+ fprintf(stderr, "INFO: %s", message.c_str());
+ break;
+ case Dali::Integration::Log::DebugWarning:
+ fprintf(stderr, "WARN: %s", message.c_str());
+ break;
+ case Dali::Integration::Log::DebugError:
+ fprintf(stderr, "ERROR: %s", message.c_str());
+ break;
+ default:
+ fprintf(stderr, "DEFAULT: %s", message.c_str());
+ break;
+ }
}
}
void ResetContext();
bool GetRenderNeedsUpdate();
uint32_t Wait( uint32_t durationToWait );
+ static void EnableLogging( bool enabled )
+ {
+ mLoggingEnabled = enabled;
+ }
private:
void DoUpdate( uint32_t intervalMilliseconds, const char* location=NULL );
struct { uint32_t x; uint32_t y; } mDpi;
uint32_t mLastVSyncTime;
ResourcePolicy::DataRetention mDataRetentionPolicy;
+ static bool mLoggingEnabled;
};
} // Dali